


var IASearch = 
{
fl:null,
reply:null,
sorter:null,
table:true,



main:function(url)
{
  var head = document.getElementsByTagName("head")[0];
  script = document.createElement('script');
  script.id = 'uploadScript';
  script.type = 'text/javascript';
  script.src = url;
  head.appendChild(script);
},



mysort:function(ain, bin)
{
  var ret = 0;

  var sortkey = IASearch.sorter;
  if (sortkey.charAt(0)=='-')
  {
    sortkey = sortkey.substr(1);
    var tmp=ain;
    ain=bin;
    bin=tmp;
  }

  var a = ain[sortkey];
  a = a ? a.toString() : '';
  
  var b = bin[sortkey];
  b = b ? b.toString() : '';
  
  ret = natcompare(a, b);
  //console.log(a+','+b+','+ret);
  
  return ret;
},


eatJason:function(replyIn)
{
  this.reply = replyIn;
  this.draw('');
},


eatJasonCSV:function(replyIn)
{
  this.reply = replyIn;
  this.table = false;
  this.draw('');
},


toggle:function(i)
{
  e=document.getElementById(i);
  e.style.display=(e.style.display=='none'?'block':'none');
  return false;
},



draw:function(sorterIn)
{
  this.sorter = sorterIn;
  if (!this.fl)
    this.fl = this.reply.responseHeader.params.fl.split(',');

  
  if (this.table)
  {
    // HTML table!
    var tmp = this.reply.responseHeader.params.rows;
    var str = '<h3>' + this.reply.response.numFound + ' results ' +
      (tmp >= this.reply.response.numFound ? '' : '(first ' + tmp + ' shown) ') +
      'for query: <i>' + this.reply.responseHeader.params.qin + '</i></h3>';
    
    str +=
      "<style>div#help dl dt { font-size:12pt; font-weight:bold; }</style>\n" +
      '<div style="position:relative;"><a href="http://www.archive.org/about/javascript-required.htm" onclick="return IASearch.toggle(\'help\')">help</a><div style="position:absolute; margin:0px 50px 0px 25px; border:2px solid gray; padding:5px; ; background-color:white; display:none;" id="help"><dl><dt>Truncated column values</dt><dd>To keep the columns from getting too wide, we stop displaying after 20 characters.  You may "mouse over" the column to see the full value.</dd><dt>Sorting</dt><dd>You may click the links on the top of the columns to sort "up/down" the values in that column.  NOTE that it sorts <i>*only*</i> the rows shown -- it will not rerun your search and sort all the results if the number of total results exceeds the number of results shown on this page.</dd></dl></div></div>';
  
  
    str += '<table border="1" class="se"><tr>';
    for (var j=0, field; field=this.fl[j]; j++)
    {
      var sortkey = (field==this.sorter ? "-"+field : field);
      str += "<th><a href=\""+sortkey+"\" onclick=\"return IASearch.draw('"+
        sortkey +"');\">"+
        (field==this.sorter ? "+" : ("-"+field==this.sorter ? "-" : "")) +
        field+"</a></th>\n";
    }
    str += '</tr>';
    
    var rows = (this.sorter ? this.reply.response.docs.sort(IASearch.mysort) :
                this.reply.response.docs);
    

    for (var i=0, row; row=rows[i]; i++)
    {
      //console.log(row);
      str += "<tr class=\"" + (i%2==0?'eve':'odd') +"\">";
      for (var j=0, field; field=this.fl[j]; j++)
      {
        str += "\n<td>";
        var val=row[field];
        if (val)
        {
          val = val.toString();
          var valesc = val.replace(/</g,'&lt;').replace(/>/g,'&gt;');
          var valshort = (valesc.length >= 20 ? valesc.substr(0,20)+".." :valesc);
          
          var valshow =
            '<a class="hoverShower" href="more" onclick="return false;">'+
            '  <span class="hoverShower">'+
            '    <div class="showOnHover">'+valesc+'</div>'+
            '    <span class="nobr">'+valshort+'</span>'+
            '  </span>'+
            '</a>';
          
          if (field=='identifier')
            str += '<a href="/details/'+val+'">'+valshort+'</a>';
          else
            str += valshow;
          //console.log(valshow);
        }
        str += "</td>";
      }
      str += "</tr>\n";
    }
    
    str += '</table>';
    o=document.getElementById('fillme');
    o.innerHTML=str;
    return false;
  }
  else
  {
    // CSV!  (NOTE: this runs as SSJS)
    var str='';
    
    for (var j=0, field; field=this.fl[j]; j++)
      str += (j?",":"")+'"'+field+'"';
    str += "\n";
    
    for (var i=0, row; row=this.reply.response.docs[i]; i++)
    {
      //console.log(row);
      for (var j=0, field; field=this.fl[j]; j++)
      {
        var val=row[field];
        if (typeof(val)!='undefined')
        {
          val = val.toString();
          val = val.replace(/</g,'&lt;').replace(/>/g,'&gt;').
            replace(/\"/g,'""');
        }
        else
        {
          val = '';
        }
            
        str += (j?",":"")+'"'+val+'"';
      }
      str += "\n";
    }

    print(str);
    return false;
  }
}

}; // end IASearch

  


// natural comparison
// minified FROM http://sourcefrog.net/projects/natsort/natcompare.js
function isWhitespaceChar(B){var A;A=B.charCodeAt(0);if(A<=32){return true}else{return false}}function isDigitChar(B){var A;A=B.charCodeAt(0);if(A>=48&&A<=57){return true}else{return false}}function compareRight(E,B){var G=0;var F=0;var D=0;var C;var A;for(;;F++,D++){C=E.charAt(F);A=B.charAt(D);if(!isDigitChar(C)&&!isDigitChar(A)){return G}else{if(!isDigitChar(C)){return -1}else{if(!isDigitChar(A)){return +1}else{if(C<A){if(G==0){G=-1}}else{if(C>A){if(G==0){G=+1}}else{if(C==0&&A==0){return G}}}}}}}}function natcompare(I,H){var C=0,A=0;var D=0,B=0;var F,E;var G;while(true){D=B=0;F=I.charAt(C);E=H.charAt(A);while(isWhitespaceChar(F)||F=="0"){if(F=="0"){D++}else{D=0}F=I.charAt(++C)}while(isWhitespaceChar(E)||E=="0"){if(E=="0"){B++}else{B=0}E=H.charAt(++A)}if(isDigitChar(F)&&isDigitChar(E)){if((G=compareRight(I.substring(C),H.substring(A)))!=0){return G}}if(F==0&&E==0){return D-B}if(F<E){return -1}else{if(F>E){return +1}}++C;++A}};
