// Search Results pager

// TODO: use DcoResultSet to back one or more SearchResultsPager instances
function DcoResultSet()
{
  this.searchQS;
  this.search_cons;
  this.col_names;
  this.col_types;
  this.col_numeric;
  this.col_idx;
  this.rows = [];
  this.layerName;
  this.branchName;
  this.num_total_results;
}

DcoResultSet.resolveRows = function(row_num_min, row_num_max, callback)
{
  if (this.rows.length < row_num_max)
  {
    // TODO: issue async fetch for rows from this.rows.length to row_num_max
  }

}


function SearchResultsPager(container, orientation)
{
  this.curPage = 0;
  this.pageFetchStatus = [];
  this.searchQS = null;
  this.search_cons = null;
  this.region_log_func = null;
  this.col_names = null;
  this.col_types = null;
  this.col_numeric = null;
  this.col_idx = null;
  this.rows2 = [];
  this.layerName = null;
  this.branchName = null;
  this.num_total_results = null;
  this.rs = null;
  this.container = container; // DOM element containing search results
  this.orientation = orientation; // whether to draw vertical or horizontal table
}

SearchResultsPager.HORIZ = 1;
SearchResultsPager.VERT = 2;
  
SearchResultsPager.FS_FETCHING = 1;
SearchResultsPager.FS_FETCHED = 2;

SearchResultsPager.http_req_pool = new Object();

SearchResultsPager.col_type_numeric = { 'int8':1, 'float8':1, 'int4':1, 'money':1, 'numeric':1, 'float4':1, 'int2':1 };

SearchResultsPager.ucfirst = function (str)
{
  var uc = '';
  var w = str.split(/ /);
  for (var i=0; i<w.length; ++i)
  {
    if (w[i].length > 0)
    {
      uc += w[i].substr(0,1).toUpperCase();
    }
    uc += w[i].substr(1);
    uc += ' ';
  }
  return uc;
}

/*
SearchResultsPager.RowVisDisplayVal = 'table-row';
if (navigator.appVersion.indexOf("MSIE") != -1)
{
  SearchResultsPager.RowVisDisplayVal = 'block';
}
*/

/*
SearchResultsPager.prototype.getRows = function()
{
  var resElems = new Array();
  var src = document.getElementById(SearchResultsPager.id);
  if (src)
  {
    var cnodes = src.childNodes;
    var cnodes_len = cnodes.length;
    for (var i=0; i<cnodes_len; ++i)
    {
      var cn = cnodes[i];
      if (cn.nodeName.toLowerCase() == 'table')
      {
        resElems.push(cn);
      }
    }
  }
  return resElems;
}
*/

/*
SearchResultsPager.prototype.setDisplayOfPageRows = function(displayValue)
{
  var startRecIdx = (this.curPage * SearchResultsPager.recsPerPage);
  var recLength = this.getNumTotalResults();
  var endRecIdx = Math.min(startRecIdx + SearchResultsPager.recsPerPage, recLength) - 1;
  var rows = this.getRows();
  //if (!rows.length) return null;

  for (var i=startRecIdx; i <= endRecIdx; ++i)
  {
    //rows[i].style.display = displayValue;
    rows[i].setAttribute('style', 'display: ' + displayValue);
  }
  return [startRecIdx + 1, endRecIdx + 1];
}
*/

SearchResultsPager.prototype.pageTo = function(goToPage)
{
  this.curPage = goToPage;
  if (!this.pageFetchStatus[goToPage] && !this.pageFetchStatus[-1])
  {
    this.fetchPage(goToPage);
  } else {
    this.render_page(goToPage);
  }
}

SearchResultsPager.prototype.pagePrevious = function()
{
  if (this.curPage - 1 >= 0)
  {
    this.pageTo(this.curPage - 1);
  }
}

SearchResultsPager.prototype.numRecsPerPage = function()
{
  if (this.orientation == SearchResultsPager.HORIZ)
  {
    return 15;
  }
  else if (this.orientation == SearchResultsPager.VERT)
  {
    return 1;
  }
}

SearchResultsPager.prototype.pageNext = function()
{
  var numPages = Math.ceil(this.num_total_results / this.numRecsPerPage());
  //var destPage = Math.min(this.curPage + 1, numPages - 1);
  if (this.curPage + 1 < numPages)
  {
    this.pageTo(this.curPage + 1);
    //document.location.hash += '&sr_page=' + (parseInt(this.curPage) + 1);
  }
}

SearchResultsPager.prototype.searchByMainForm = function()
{
  dd_clear();

  var searchParams = new Object();
  var nonempty = new Array();
  var form = document.getElementById('searchForm');
  for (var i=0; i<form.elements.length; ++i)
  {
    var formElem = form.elements[i];
    if (formElem.name != '' && formElem.value != '' && formElem.name != 'address_or_owner' && formElem.type != 'submit')
    {
      searchParams[formElem.name] = formElem.value;
      /*
      if (searchQS != '') searchQS += '&';
      searchQS += formElem.name + '=' + formElem.value;
      */
      if (formElem.type != 'hidden' && formElem.name != 'region' || formElem.name == 'spatialSearch')
      {
	nonempty.push(formElem.name);
      }
    }
  }
  if (!searchParams['region'])
  {
    alert("You must enter a county or state before performing an address or owner search.");
  }
  else if (nonempty.length > 0)
  {
    // log searched regions to recent_region object
    var f_region = jQuery(formElem).find(':input[name="region"]');
    if (f_region.length > 0 && this.region_log_func)
    {
      this.region_log_func(f_region.val());
    }

    this.search(searchParams);
  }
  else
  {
    alert('Enter some search values to perform a search.');
  }

  return false;
}

SearchResultsPager.prototype.search = function(searchParams)
{
  this.pageFetchStatus = new Object();
  this.num_total_results = 0;
  this.rows2 = [];
  if (this.container) $(this.container).empty();
  Highlighting.clear();

  this.searchQS = '';
  for (var sp in searchParams)
  {
    if (this.searchQS != '')
    {
      this.searchQS += '&';
    }
    this.searchQS += sp + '=' + searchParams[sp];
  }

  //document.location.hash = 'tab=search&' + this.searchQS;
  var hl = 'tab=search&' + this.searchQS;
  if (document.location.hash != '#' + hl)
  {
    $.historyLoad(hl);
  }
  else
  {
    this.pageTo(0);
  }
}

SearchResultsPager.getElemTextContent = function(r, elemName)
{
  var elem = r.getElementsByTagName(elemName)[0];
  var tCont = elem.textContent;
  if (typeof elem.text == 'string')
  {
    tCont = elem.text;
  }
  return tCont;
}

SearchResultsPager.setDocElemTextContent = function(elemName, text)
{
  var srt = document.getElementById(elemName);
  if (srt)
  {
    srt.textContent = text;
    if (typeof srt.innerText == 'string')
    {
      srt.innerText = text;
    }
  }
}

/*
SearchResultsPager.ready_state_change = function(r, page, srpObj)
{
  srpObj.procFetchedPage(r, page);
}
*/

// page == -1 should get all pages
SearchResultsPager.prototype.fetchPage = function(page)
{
  var action = '/json/results2?' + this.searchQS;
  if (page != -1)
  {
    var startRecIdx = (page * this.numRecsPerPage());
    action += '&rec_idx_start=' + startRecIdx;
  }

  this.pageFetchStatus[page] = SearchResultsPager.FS_FETCHING;

  var this2 = this;
  jQuery.getJSON(action, function(data, textStatus) { 
    if (textStatus == "success" || textStatus == "notmodified")
    {
      this2.apply_fetched_result(data, page);
    } else {
      alert("error getting search result: " + textStatus);
    }
  });

  /*
  var r = new XMLHttpRequest();
  r.open('GET', action, true);
  r.onreadystatechange = function () { 
    SearchResultsPager.ready_state_change(r, page, this2); 
  }
  r.send(null);
  */

  jQuery(this.container).empty();

  jQuery(".srLoading").css('display','');

  if (page == 0 || page == -1)
  {
    var clr_id;
    if (tab_get_active() == 'map')
    {
      clr_id = [ 'sr_side' ];
    }
    else if (tab_get_active() == 'search')
    {
      clr_id = [ 'sr_full' ];
    }
    for (var i=0; i<clr_id.length; ++i)
    {
      var elem = document.getElementById(clr_id[i]);
      if (elem) elem.style.display = '';
    }
    var src = this.container;
    if (src.style.display == 'none')
    {
      src.style.display = 'block';
    }
  }

}

SearchResultsPager.prototype.apply_fetched_result = function(resp, page)
{
  var res = resp.results;

  if (typeof(resp.numTotalResults) != 'undefined')
  {
    this.num_total_results = resp.numTotalResults;
    jQuery('.sr_total').text(this.num_total_results);
  }

  if (resp.result_col_names && resp.result_col_types)
  {
    this.col_names = resp.result_col_names;
    this.col_types = resp.result_col_types;

    var num_cols = this.col_names.length;
    this.col_numeric = [];
    for (var i=0; i<num_cols; ++i)
    {
      this.col_numeric[i] = SearchResultsPager.col_type_numeric[this.col_types[i]];
    }

    // build col index
    this.col_idx = new Object();
    for (var i=0; i<num_cols; ++i)
    {
      var col_name = this.col_names[i];
      this.col_idx[col_name] = i;
    }
  }

  var startRecIdx = (page * this.numRecsPerPage());
  for (var i=0; i<res.length; ++i)
  {
    var cur_res = res[i];
    this.rows2[startRecIdx + i] = cur_res;
  }

  if (resp.searchConstraints)
  {
    this.search_cons = resp.searchConstraints;
    var sc_arr = [];
    for (var i=0; i<this.search_cons.length; ++i)
    {
      var sc = this.search_cons[i];
      var sc_f_spc = sc.indexOf(' ');
      if (sc && sc_f_spc != -1)
      {
        var sc_t = '<span class="sr_sc_key">';
	var sc_name = sc.substr(0, sc_f_spc);
	var sc_point_ex = /POINT\([-0-9\. ]*\)/;
        sc_t += sc_name;
        sc_t += '</span>: ';
        sc_t += '<span class="sr_sc_val">';
        var sc_val = sc.substr(sc_f_spc + 1);
        if (sc_val.match(/^POLYGON\(/))
        {
          sc_t += '<img src="images/roi_rectangle.png" width="20" height="20" alt="point or polygon" title="' + sc_val + '" />';
        }
        else if (sc_val.match(/^POINT\(/))
        {
          sc_t += '<img src="images/point.png" width="20" height="20" alt="point" title="' + sc_val + '" />';
        }
	else if (sc_name == 'geom' && sc_val.match(sc_point_ex))
	{
	  var pt = sc_val.match(sc_point_ex)[0];
          sc_t += '<img src="images/point.png" width="20" height="20" alt="point" title="' + pt + '" />';
	}
        else
        {
          sc_t += sc_val;
        }
        sc_t += '</span>';
        sc_arr.push(sc_t);
      }
    }
    jQuery(".sr_search_val").html(sc_arr.join(', '));
  }
  if (typeof(resp.time_total) != 'undefined')
  {
    jQuery(".sr_time_total").text(parseFloat(resp.time_total).toFixed(2));
  }
  if (typeof(resp.layerName) != 'undefined')
  {
    this.layerName = resp.layerName;
    jQuery(".sr_layer_name").text(this.layerName);
  }
  if (typeof(resp.branchName) != 'undefined')
  {
    this.branchName = resp.branchName;
    jQuery(".sr_branch_name").text(this.branchName);
  }

  this.render_page(page);

  this.add_geometries_for_page(page);

  jQuery(".srLoading").css('display','none');

}

/*
SearchResultsPager.prototype.procFetchedPage = function(r, page)
{
  var respXml = null;
  var respText = null;
  try 
  {
    if (r.readyState == 4) 
    {
      if (r.status == 200)
      {
        //alert('readyState: ' + r.readyState + ', status: ' + r.status);
        respXml = r.responseXML;
	respText = r.responseText;
      } else {
        alert("The server returned an error (" + r.status + ") when attempting to perform your search");
      }
    }
    else
    {
      return;
    }
  } catch (e) {
    alert("A communication error occurred: " + e.message);
  }

  if (respText)
  {
    var resp = JSON.parse(respText); // can throw a SyntaxError exception

    this.apply_fetched_result(resp, page);

  }
}
*/

SearchResultsPager.prototype.add_geometries_for_page = function(page)
{
  var row_start_idx = (page * this.numRecsPerPage());
  var num_rows_render = Math.min(this.numRecsPerPage(), this.num_total_results - row_start_idx);
  for (var i=row_start_idx; i < row_start_idx + num_rows_render; ++i)
  {
    //var g_elem = document.getElementById('geom_' + i);
    var inp_d = this.rows2[i][this.col_idx['geom_as_wkt']];
    Highlighting.addGeometry(inp_d, this.branchName, this.layerName);
  }
}


SearchResultsPager.prototype.render_page = function(page)
{
  var row_start_idx = (page * this.numRecsPerPage());
  var num_rows_render = Math.min(this.numRecsPerPage(), this.num_total_results - row_start_idx);
  if (this.orientation == SearchResultsPager.HORIZ)
  {
    this.render_table_horiz(row_start_idx, num_rows_render);
  }
  else if (this.orientation == SearchResultsPager.VERT)
  {
    this.render_table_vert(row_start_idx, Math.min(this.num_total_results, 1));
  }

  var disp_st_idx = (num_rows_render == 0) ? 0 : (row_start_idx + 1);
  var disp_end_idx = row_start_idx + num_rows_render;
  var disp_st_end_txt = (disp_st_idx != disp_end_idx) ? (disp_st_idx + ' - ' + disp_end_idx) : disp_st_idx;
  jQuery('.sr_range').text(disp_st_end_txt);
}

SearchResultsPager.layer_templates = new Object();

SearchResultsPager.layer_templates['US Counties'] = {
  'cols_custom': {
    'parcel_attrs': function(cur_res,col_idx,i)
    {
      return cur_res[col_idx['parcel_attrs']].replace(/,/g,', ');
    }
  }
}

SearchResultsPager.layer_templates['US Counties'] = {
  'cols_addl' : {
    'Real Estate Portal USA Site': function(cur_res, col_idx)
    {
      var link = "http://" + cur_res[col_idx['county_name']].replace(/ /g, '').toLowerCase() + "." + cur_res[col_idx['state_abbr']].toLowerCase() + ".reportallusa.com/";
      var t = "<a href='" + link + "'>" + link + "</a>";
      return t;
    }
  }
}

SearchResultsPager.layer_templates['US Counties Loaded'] = SearchResultsPager.layer_templates['US Counties'];

SearchResultsPager.layer_templates['States'] = {
  'cols_addl': {
    'Real Estate Portal USA Site': function(cur_res, col_idx)
    {
      var link = "http://" + cur_res[col_idx['state_abbr']].toLowerCase() + ".reportallusa.com/";
      var t = "<a href='" + link + "'>" + link + "</a>";
      return t;
    }
  }
}

SearchResultsPager.layer_templates['Parcels'] = {
  'col_n_map': { 'addr_number': 'Address', 'county_name': 'County', 'muni_name': 'Muni', 'land_use_code': 'Land Use', 'cama_link': 'Data', 'county_links': 'Data', 'geom_as_wkt': 'Map', 'trans_date': 'Trans Date', 'ngh_code': 'Neigh', 'parcel_id': 'Parcel', 'mkt_val_tot': 'mkt_val' },
  'cols_hidden': { 'state_abbr':1, 'ctid':1, 'geom_mbr':1, 'county_id':1, 'addr_number':1, 'addr_street_prefix':1, 'addr_street_name':1, 'addr_street_suffix':1, 'addr_street_type':1, 'mkt_val_bldg':1, 'mkt_val_land':1, 'muni_id':1, 'school_dist_id':1 },
  'cols_custom': {
    'parcel_id': function(cur_res, col_idx, i)
    {
      var p_id = cur_res[col_idx['parcel_id']];
      var has_aud_link = (!(!(cur_res[col_idx['county_links']].match(/(^|,)auditor($|,)/)))) && p_id;
      var t = '';
      if (has_aud_link)
      {
      t += '<a title="County info for this parcel" href="#" onclick="CountyLink.follow_link(' + cur_res[col_idx['county_id']] + ",'" + p_id + "', 'auditor'); return false;\">";
      }
      t += p_id;
      if (has_aud_link)
      {
        t += '</a>';
      }
      t += '<span class="ctid">' + cur_res[col_idx['ctid']] + '</span>';
      return t;
    },
    'county_links': function(cur_res, col_idx)
    {
      var t = '';
      var cl = cur_res[col_idx['county_links']];
      if (cl && cur_res[col_idx['parcel_id']] != null)
      {
        t += "<a href='#' onmouseover='dl_dropdown(event);' onmouseout='dd_mouseout(event)' onclick='return false;'><img class='map_dd_chooser' src='/images/hotlink_dd.png' width='30' height='20' title='" + cur_res[col_idx['county_name']] + " County info for parcel " + cur_res[col_idx['parcel_id']] + "'";
        //t += " onclick=\"CountyLink.follow_link(" + cur_res[col_idx['county_id']] + ",'" + cur_res[col_idx['parcel_id']] + "', 'auditor'); return false;\"";
        t += "/></a>";
      }
      return t;
    },
    'addr_number': function(cur_res, col_idx)
    {
      var t = '';
      if (cur_res[col_idx['addr_number']] != null) t += cur_res[col_idx['addr_number']];
      if (cur_res[col_idx['addr_street_prefix']] != null) t += ' ' + cur_res[col_idx['addr_street_prefix']];
      if (cur_res[col_idx['addr_street_name']] != null) t += ' ' + cur_res[col_idx['addr_street_name']];
      if (cur_res[col_idx['addr_street_suffix']] != null) t += ' ' + cur_res[col_idx['addr_street_suffix']];
      if (cur_res[col_idx['addr_street_type']] != null) t += ' ' + cur_res[col_idx['addr_street_type']];
      var u = '<a href="#" title="Real Estate Portal USA Map" onclick="alt_map_choose(\'Real Estate Portal USA Map\'); zoomTo(event); return false;">' + t + '</a>';
      return u;
    },
    'land_use_code': function(cur_res, col_idx)
    {
      var luc = cur_res[col_idx['land_use_code']];
      var t = luc + "";
      if (luc && luc.length)
      {
        var luc_map = { '1': 'agricultural', '2': 'mineral', '3': 'industrial', '4': 'commercial', '5': 'residential', '6': 'tax_exempt', '7': 'tax_exempt', '8': 'tax_exempt', '9': 'tax_exempt' };
	var luc_txt = luc_map[luc.charAt(0)];
        if (luc_txt)
	{
          t += '<img style="vertical-align: middle;" src="images/land_use/' + luc_txt + '.png" width="22" height="22" alt="' + luc_txt + '" title="' + luc_txt + '"/>';
	}
      }
      return t;
    },
    'county_name': function(cur_res, col_idx)
    {
      return cur_res[col_idx['county_name']] + ', ' + cur_res[col_idx['state_abbr']];
    },
    'geom_as_wkt': function(cur_res, col_idx, i)
    {
      var geom = cur_res[col_idx['geom_as_wkt']];
      var t = '';
      if (geom != null)
      {
        t += '<a href="#" onmouseover="alt_map_dropdown(event);" onmouseout="dd_mouseout(event)"><img class="map_dd_chooser" src="/images/zoom_to_dd.png" width="30" height="20" alt="Choose map" title="Choose map" /></a>';
        t += '<path id="geom_' + i + '" d="' + geom + '"/>';
      }
      return t;
    },
    'mkt_val_tot': function(cur_res, col_idx, i)
    {
      var t = '';
      var land = cur_res[col_idx['mkt_val_land']];
      var bldg = cur_res[col_idx['mkt_val_bldg']];
      if (land != null || bldg != null)
      {
        t += '<span title="';
	if (land != null)
	{
	  t += 'mkt_val_land: ' + land;
	}
	if (bldg != null)
	{
	  if (land != null)
	  {
            t += ', ';
	  }
	  t += 'mkt_val_bldg: ' + bldg;
	}
	t += '">';
      }
      t += cur_res[col_idx['mkt_val_tot']];
      if (land != null || bldg != null)
      {
        t += '</span>';
      }
      return t;
    }
  }

};

SearchResultsPager.prototype.render_table_vert = function(row_start_idx, num_rows)
{
  var col_names = this.col_names;
  var col_numeric = this.col_numeric;
  var rows = this.rows2;
  var num_cols = col_names.length;
  jQuery(this.container).empty();

  var col_n_map = new Object();
  var cols_hidden = {'geom_as_wkt': 1, 'ctid': 1 };
  var cols_custom = new Object();
  var cols_addl = new Object();
  var lt = SearchResultsPager.layer_templates[this.layerName];
  if (lt)
  {
    if (lt.col_n_map) col_n_map = lt.col_n_map;
    if (lt.cols_hidden) cols_hidden = lt.cols_hidden;
    if (lt.cols_custom) cols_custom = lt.cols_custom;
    if (lt.cols_addl) cols_addl = lt.cols_addl;
  }

  var col_idx = this.col_idx;

  var t = '<table class="search_res_tbl_vert"><tbody>';
  for (var i=row_start_idx; i < row_start_idx + num_rows; ++i)
  {
    t += '<tr><td>';
    t += '<table id="row_' + i + '"><tbody>';

    var row = rows[i];

    for (var j=0; j<num_cols; ++j)
    {
      var col_name = col_names[j];
      var cc_func = cols_custom[col_name];
      if (!cols_hidden[col_name] || cc_func)
      {
        t += '<tr>';
	t += '<th>';
	t += (col_n_map[col_name]) ? col_n_map[col_name] : SearchResultsPager.ucfirst(col_name.replace(/_/g,' '));
        t += '</th>';
	t += '<td>';
	if (cc_func)
	{
	  var val = cc_func(row, col_idx, i);
          if (typeof(val) === "string")
          {
            val = val.replace(/&/g,'&amp;');
	  }
	  t += val;
	}
	else
	{
          var val = row[j];
          if (typeof(val) === "string")
          {
            val = val.replace(/&/g,'&amp;');
	  }
	  t += val;
	}
	t += '</td>';
        t += '</tr>';
      }
    }
    for (var addl_key in cols_addl)
    {
      t += '<tr><th>' + addl_key + '</th><td>';
      t += cols_addl[addl_key](row, col_idx);
      t += '</td></tr>';
    }

    t += '</tbody></table>';
    t += '</td></tr>';
  }
  t += '</tbody></table>';
  
  jQuery(this.container).html(t);
}


SearchResultsPager.prototype.render_table_horiz = function(row_start_idx, num_rows)
{
  var col_names = this.col_names;
  var col_numeric = this.col_numeric;
  var rows = this.rows2;
  var num_cols = col_names.length;
  jQuery(this.container).empty();

  var col_n_map = new Object();
  var cols_hidden = {'geom_as_wkt': 1, 'ctid': 1 };
  var cols_custom = new Object();
  var lt = SearchResultsPager.layer_templates[this.layerName];
  if (lt)
  {
    col_n_map = lt.col_n_map;
    cols_hidden = lt.cols_hidden;
    cols_custom = lt.cols_custom;
  }
  
  var col_idx = this.col_idx;

  var t_str = '<table id="search_res_table">';
  t_str += '<tbody>';
  t_str += '<tr>';
  for (var i=0; i<num_cols; ++i)
  {
    var col_name = col_names[i];

    if (!cols_hidden[col_name] || cols_custom[col_name])
    {
      t_str += '<th>';
      if (col_n_map[col_name])
      {
        t_str += col_n_map[col_name];
      }
      else
      {
        t_str += col_name;
      }
      t_str += '</th>';
    }
  }
  //t_str += '<th>map</th>'; // for zoom icon
  t_str += '</tr>\n';

  for (var i=row_start_idx; i < row_start_idx + num_rows; ++i)
  {
    t_str += '<tr id="row_' + i + '">';
    var cur_res = rows[i];
    for (var r=0; r<num_cols; ++r)
    {
      var col_name = col_names[r];
      var cc_func = cols_custom[col_name];
      if (cc_func)
      {
	t_str += "<td";
	if (col_numeric[r])
	{
          t_str += " style='text-align: right'";
	}
	t_str += ">";
        t_str += cc_func(cur_res, col_idx, i).replace(/&/g,'&amp;');
	t_str += "</td>";
      }
      else if (!cols_hidden[col_name])
      {
        t_str += '<td';
	if (col_numeric[r])
	{
          t_str += " style='text-align: right'";
	}
	t_str += ">";
	var cr = cur_res[r];
	if (typeof(cr) === "string")
	{
          cr = cr.replace(/&/g,'&amp;');
	}
	if (cr !== null)
	{
	  t_str += (cr + '');
	}
	t_str += '</td>';
      } 
    }
    /*
    t_str += '<td class="zoomIconCell" onclick="zoomTo(event)" >';
    t_str += "<img src='images/zoom_to.png' width='19' height='20' alt='zoom' />";
    t_str += "<path id='geom_" + i + "' d='" + cur_res[col_idx['geom_as_svg']] + "' />";
    t_str += "</td>";
    */
    t_str += '</tr>\n';
  }
  t_str += '</tbody></table>';

  jQuery(this.container).html(t_str);
}

/*
SearchResultsPager.prototype.fetchFullGeometries = function(ctid_buf)
{
  var action = 'results_ctid.php?layerName=';
  action += Highlighting.getSRLayerName();
  action += '&ctidList=' + ctid_buf.join('|');

  var respXml = null;
  // TODO: eliminate redundant code in fetchPage
  var r = new XMLHttpRequest();
  r.open('GET', action, false);
  r.send(null);
  try 
  {
    if (r.readyState == 4) 
    {
      if (r.status == 200)
      {
        respXml = r.responseXML;
      } else {
        alert("The server returned an error (" + r.status + ") when attempting to perform your search");
      }
    } else {
      alert("Error: the ready state is " + r.readyState + " when it was expected to be 4 (loaded)");
    }
  } catch (e) {
    alert("A communication error occurred: " + e.message);
  }
  
  var de = respXml.documentElement;

  var hlElem = document.getElementById(Highlighting.elemId);

  var paths = de.getElementsByTagName('path');
  for (var i=0; i<paths.length; ++i)
  {
    var geomElem = paths[i];
    var ex_geom = document.getElementById(geomElem.id);
    hlElem.removeChild(ex_geom);
    document.importNode(geomElem,false);

    // TODO: remove redundant code in fetchPage
    Highlighting.addGeometry(geomElem);

    var ctid = geomElem.getElementNS(null,'id').match(/^geom_(\d+,\d+)$/)[1];
    var rowElem = Highlighting.hlRowGeomPairs[ctid][0];
    Highlighting.hlRowGeomPairs[ctid] = [ rowElem, geomElem ];
  
    rowElem.addEventListener('mouseover', Highlighting.hlByTable, true);
    rowElem.addEventListener('mouseout', Highlighting.hlByTable, true);
  }
}

SearchResultsPager.nodeListToArray = function(nl)
{
  var a = new Array();
  for (var i=0; i<nl.length; ++i) a.push(nl[i]);
  return a;
}

SearchResultsPager.geomElemByResultRow = function(rr)
{
  var rowParent = rr;
  if (rr.childNodes.length > 0 && rr.childNodes[0].nodeName.toLowerCase() == 'tbody')
  {
    rowParent = rr.childNodes[0];
  }
  var tmp_cn = SearchResultsPager.nodeListToArray(rowParent.childNodes);
  var firstTr;
  while(firstTr = tmp_cn.shift())
  {
    if (firstTr && firstTr.nodeName.toLowerCase() == 'tr') break;
  }

  var tmp_trc = SearchResultsPager.nodeListToArray(firstTr.childNodes);
  var lastTd;
  while(lastTd = tmp_trc.pop())
  {
    if (lastTd && lastTd.nodeName.toLowerCase() == 'td') break;
  }

  var p_elem = lastTd.childNodes[0];
  //return p_elem.textContent ? p_elem.textContent : p_elem.text;
  return p_elem;
}
*/

