var AjaxQueue = new Array();

function createRequestObject() {
    // find the correct xmlHTTP, works with IE, FF and Opera
    var xmlhttp;
    try {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
        try {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch(e) {
            xmlhttp = null;
        }
    }

    if (!xmlhttp && typeof XMLHttpRequest!="undefined") {
        xmlhttp = new XMLHttpRequest();
    }

    return xmlhttp;
}

function getElem(id)
{
    if (document.getElementById) {
        return document.getElementById(id);
    } else if (document.all) {
        return document.all[id];
    }
}

function AddAjaxQueue(expr)
{
    AjaxQueue[AjaxQueue.length] = expr;
}

function DoAjaxQueue()
{
    for (var i=0; i<AjaxQueue.length; i++) {
       eval(AjaxQueue[i]);
    }
}

function getFindingAids(url, query)
{
  query = query.replace (/&#.*?;/, " ");

  var findingAidList = getElem('findingAidList');
  var loading = getElem('findingAidLoading');
  var totalHtml = '';
  var linkData;
  var http = createRequestObject();
  http.open("GET", url + encodeURIComponent (query), true);
  http.onreadystatechange = function()
  {
    if ((http.readyState == 4) && (http.status == 200)) {
      var response = http.responseText;
      if (response)
      {
        var findingAids = eval ('(' + response + ')');
        linkData = findingAids.links;
        if (linkData)
        {
          for (var i = 0; i < linkData.length; i++)
          {
            var link = linkData[i];
            totalHtml += '<dd><a href="' + link.href + '">' + link.title + '</a></dd>';
          }
          totalHtml += '<dd><a href="' + findingAids.more + '">more...</a></dd>';
          findingAidList.innerHTML = totalHtml;
        }
        else
        {
          findingAidList.innerHTML = "No finding aids found.";
        }
      }
      loading.style.display = 'none';
    }
  }
  http.send(null);

}

function queryFullText (url, query, page, callback)
{
  var http = createRequestObject();

  http.open("GET", url + encodeURIComponent (query) + '&page=' + page, true);
  http.onreadystatechange = function() {
    if ((http.readyState == 4) && (http.status == 200)) {
      var response = http.responseText;
      if (response) {
        var fulltext = eval ('(' + response + ')');

        callback (fulltext);
      }
    }
  }

  http.send (null);
}


function getFullText(url, query, page)
{
  query = query.replace (/&#.*?;/, " ");

  var fulltextList = getElem('fulltextList');
  var loading = getElem('fulltextLoading');
  var totalHtml = '';
  var linkData;

  queryFullText (url, query, page, function (obj) {
      var fulltext = obj.fulltext;

      if (fulltext && fulltext.hits.length > 0) {
          var link_fragment = "javascript:getFullText(" + "'" + encodeURIComponent (url) + "', " + 
                              "'" + encodeURIComponent (query) + "', ";

          if (!obj.atBeginning || !obj.atEnd) {
              totalHtml += '<div class="nextprev">';
              totalHtml += '<table width="90%"><tr>';
          }

          if (!obj.atBeginning) {
              var link = (link_fragment + (page - 1) + ")")
              totalHtml += '<td width="50%"><span class="prevLink"><a href="' + link + '">&laquo; ' + (page - 1) + '</a></span></td>';
          } else if (!obj.atEnd) {
              totalHtml += '<td width="50%">&nbsp</td>';
          }

          if (!obj.atEnd) {
              var link = (link_fragment + (page + 1) + ")")
              totalHtml += '<td width="50%" align="right"><span class="nextLink">';
              if (page == 1) {
                  totalHtml += '<a href="' + link + '"> more &raquo;</a>';
              } else {
                  totalHtml += '<a href="' + link + '"> ' + (page + 1) + '&raquo;</a>';
              }
              totalHtml += '</span></td>';
          }

          if (!obj.atBeginning || !obj.atEnd) {
              totalHtml += '</tr></table>';
              totalHtml += '</div>';
          }

          fulltext.hits.each (function (hit) {
              totalHtml += '<dd><a href="' + hit.url + '">' + hit.title + '</a><br>' +
                  (hit.creator ? '<span style="font-size: 90%">' + ' by ' + hit.creator + '</span><br>' : "");

              totalHtml += '<span style="font-size: 80%; color: gray">';
              if (hit.collection == 'hathi') {
                  totalHtml += 'Hathi Trust';
              } else if (hit.collection == 'gutenberg') {
                  totalHtml += 'Project Gutenberg';
              } else if (hit.collection == 'openlibrary') {
                  totalHtml += 'Open Library';
              }

            totalHtml += '</span></dd>';
          });


          fulltextList.innerHTML = totalHtml;
      } else {
          fulltextList.innerHTML = "No hits found.";
      }

      loading.style.display = 'none';
  });
}


function getFindingAidNote(url, query)
{
  var response = '';
  var note = getElem("findingAidNote");

  var http = createRequestObject();

  http.open("GET", url + encodeURIComponent (query), true);
  http.onreadystatechange = function()
    {
      if ((http.readyState == 4) && (http.status == 200)) {
        response = http.responseText;
        if (response)
          {
            var findingAids = eval ('(' + response + ')');
            if (findingAids.total && findingAids.more)
            {
              note.style.visibility = 'visible';
              note.innerHTML = '<b>However,</b> your search matched ' + findingAids.total +
                ' items in our Manuscripts <a href="' +  findingAids.more +
                '">finding aids</a>.';
            }
          }
      }
    }
  http.send(null);
}


function getNarrowOptions(query, fquery, limit, optionLimit)
{
    var narrowList = getElem('narrowList');
    var loading = getElem('narrowLoading');
    var responseHTML = '';
    var totalHTML = '';
    var facet;
    var facetText;
    var facetCnt;
    var http = createRequestObject();

    http.open("GET", path + "/Search/AJAX?method=GetNarrowOptions&query=" + encodeURIComponent (query) + "&filter=" + encodeURIComponent (fquery) + "&limit=" + limit + "&optionLimit=" + optionLimit + "&v=" + getTimestamp(), true);
    http.onreadystatechange = function()
    {
        var loc = window.location.href;
        loc = loc.replace(/&page=[0-9]+/, '');

        if ((http.readyState == 4) && (http.status == 200)) {
            var response = http.responseXML.documentElement;
            if (options = response.getElementsByTagName('Cluster')) {
                for (i=0; i<options.length; i++) {
                    facetCnt = 0;
                    facets = options.item(i).childNodes;
                    if (facets.length) {
                        responseHTML += '<dt>' + options.item(i).getAttribute('display') + '</dt>';

                        for (j=0; j<facets.length; j++) {
                            // Darn browser non compliance!
                            dummy = document.createTextNode('test');
                            if (dummy.textContent) { // FF
                                facetText = facets[j].textContent;
                            } else if (dummy.innerText != undefined) { // IE6
                                facetText = facets[j].text;
                            } else if (facets[j].childNodes(0)) { // IE7, Safari1
                                facetText = facets[j].childNodes(0).nodeValue;
                            } else if (facets[j].firstNode) { // Safari2
                                facetText = facets[j].firstNode.nodeValue;
                            } else { // Anything Else
                                facetText = facets[j].innerHTML;
                            }
                            if (facetText == undefined) {
                                facetText = '';
                            }

                            if (facets[j].attributes && (facets[j].getAttribute('count') > 0) && (facetText != '')) {

                                var facetName = options.item(i).getAttribute('name');
                                var facetLink = facets[j].getAttribute('link');

                                if (facetCnt++ == 5) {
                                    totalHTML += '<dl class="narrowList navmenu narrow_begin" id="facet_begin_' + facetName + '">';
                                    totalHTML += responseHTML;
                                    totalHTML += '</dd><dd>';
                                    totalHTML += '<a href="" onclick="hideThese(\'facet_begin_' + facetName  + '\'); showThese(\'facet_end_' + facetName + '\'); event.returnValue = false; return false;">more...</a></dd></dl>';
                                    totalHTML += '<dl class="narrowList navmenu narrow_end" id="facet_end_' + facetName + '">';
                                    totalHTML += responseHTML;
                                    responseHTML = '';
                                }

                                if (facetLink) {
                                    responseHTML += '<dd><a href="'+loc+'&filter[]='+options.item(i).getAttribute('name')+':%22'+encodeURIComponent(facetLink).replace(/%22/g, '\\%22')+'%22">';
                                } else {
                                    responseHTML += '<dd><a href="'+loc+'&filter[]='+options.item(i).getAttribute('name')+':%22'+encodeURIComponent(facetText).replace(/%22/g, '\\%22')+'%22">';
                                }
                                responseHTML += facetText;
                                responseHTML += '</a> ('+facets[j].getAttribute('count')+')</dd>';
                            }
                        }
                        totalHTML += responseHTML;
                        responseHTML = '';
                        if (facetCnt > 5) {
                           totalHTML += '<dd><a href="" onclick="hideThese(\'facet_end_' + facetName  + '\'); showThese(\'facet_begin_' + facetName + '\'); event.returnValue = false; return false;">less...</a></dd></dl>';
                           totalHTML += '</dl>';
                        }
                    }
                }
            }

            loading.style.display = 'none';
            narrowList.innerHTML = totalHTML;
        }
    }
    http.send(null);
}

function setCookie(c_name,value,expiredays)
{
    var exdate = new Date();
    exdate.setDate(exdate.getDate()+ expiredays);
    document.cookie = c_name + "=" + escape(value) +
        ((expiredays==null) ? "" : ";expires=" + exdate.toGMTString())
}

function getCookie(c_name)
{
    if (document.cookie.length > 0)
    {
        c_start = document.cookie.indexOf(c_name + "=")
        if (c_start != -1)
        {
            c_start = c_start + c_name.length + 1;
            c_end = document.cookie.indexOf(";",c_start);
            if (c_end == -1)
                c_end = document.cookie.length;
            return unescape(document.cookie.substring(c_start,c_end));
        }
    }
    return "";
}

function showThese(elemId)
{
   var el = getElem(elemId);
   el.style.display='block';
}

function hideThese(elemId)
{
   var el = getElem(elemId);
   el.style.display='none';
}

function storeCrumbs (bookdata)
{
    var span = $("crumbs");

    if (span == null) {
        return;
    }

    var crumbs = "";
    for (var isbn in bookdata['gbooks']) {
        var book = bookdata['gbooks'][isbn];

        if (book && book.preview && book.preview != "noview") {
            crumbs = (crumbs +
                      "<img style=\"visibility: hidden; display: none\" " +
                      "src=\"/images/crumb.jpg?" +
                      escape (book.bib_key) +
                      "\">");
        }
    }

    span.innerHTML = crumbs;
}

function showAvailability (status)
{
    for (var bibid in status) {
        var elt = document.getElementById ("availability_" + bibid);

        var colour;
        var message;
        var icon = "";

        if (record_formats[('fmt' + bibid)].any (function (fmt) { return (fmt == "Audio" || fmt == "Manuscript" || fmt == "Picture") })) {
            icon = "orange";
            colour = "#0066cc;";
            message = "Check availability";
        } else if (status[bibid] == "1") {
            message = "Available";
            colour = "green";
        } else if (record_formats[('fmt' + bibid)].any (function (fmt) { return (fmt == "Online") })) {
                colour = "orange";
                message = "Available online only";
        } else {
            colour = "red";
            message = "Not currently available";
        }

        icon = (icon || colour);

        elt.innerHTML = "<span style=\"color: " + colour + "\"><table style=\"margin-right: 0px; margin-left: auto;\" valign=\"middle\"><tr><td><img src=\"" + path + "/images/bullet_" + icon + ".png\"><td><a style=\"color: " + colour + "\" href=\"" + path + '/Record/' + bibid + '"' + '>' + message + "</a></td></tr></span>";
    }
}



function show_bio ()
{
    var bio_snippet = document.getElementById ("bio_snippet");

    bio_snippet.style.display = "none";
    Effect.SlideDown('bio_full', { duration: 0.5 });
}

function hide_bio (attop)
{

    document.getElementById ("bio_snippet").style.display = "block";
    document.getElementById ("bio_full").style.display = "none";
    if (!attop) {
        Effect.ScrollTo('bio_snippet', { duration: 0.5, offset: -100, queue: 'end'});
    }
}
