var pqUrl = "http://proquest.umi.com/pqdweb";
var query;
var baseDataHostUrl = 'jsonMw?';
var defaultPageSize = 30;
var resizing = false;

function __escape(val) {
  val = escape(val);
  val = val.replace("?", '%3F');
  val = val.replace("#", '%23');
  val = val.replace("&", '%26');
  return val;
}

function fileSize(size, mag, orig) {
  if (typeof size == 'undefined')
     return "";
  if (typeof size != 'number')
     size = parseInt(size+"");
  if ((typeof size != 'number') || (isNaN(size )))
     return "";

  if (!mag) {
    return fileSize(size, 1, size);
  }
  if (size < 1024) {
    var sizes = ['', 'bytes', 'KB', 'MB', 'GB', 'TB'];
    size = size.toPrecision(3);
    return size+" "+sizes[mag];
  } else return fileSize(size / 1024, mag+1, orig);
}

var linkViews = {
        "application/x-abstract": {cls:"rslt_abstract", title: "Abstract", img: "images/common/ab.gif"},
        //"application/x-citation": {cls:"rslt_citation", title: "Citation", img: "images/common/ab.gif"},
        //"application/x-preview": {cls:"rslt_preview", title: "Preview", img: "images/common/pi.gif"},
        "application/x-supplemental-files": {cls:"rslt_supp", title: "Supplemental files", img: "images/common/icon_paperclip.gif"},
        "application/x-pageimage": {cls:"rslt_pageimage", title: "Full Text - PDF", img: "images/common/pi.gif"},
        //"application/pdf": {cls:"rslt_pdf", title: "Full Text - PDF", img: "images/common/pi.gif"},
        "application/zip": {cls:"rslt_supp", title: "Supplemental Files", img: "/images/common/icon_paperclip.gif"}
};


    var resizing = false;
    function resizeIFrame() {
      if (resizing) return;
      if ($("#pdfPage").length == 0)
         return;
      resizing = true;
      if (jQuery.browser.msie) {
        var container = $("body")[0];
        var header = $("#pdfView")[0];
        var h = $('html')[0].offsetHeight - ($('#pdfView')[0].offsetHeight + $('#pdfView')[0].offsetTop);
        $("#pdfPage")[0].style.height = h + "px";
      } else {
        var container = $("html")[0];
        var header = $("#pdfView")[0];
        var h = (container.clientHeight - $('#pdfView')[0].clientHeight)-24;
        $("#pdfPage")[0].style.height = h + "px";
      }
      $("#pdfPage")[0].style.width = "100%";
      $("html")[0].style.overflow = "hidden";
      resizing = false;
    }

    function delayResize() {
      if (!resizing)
         window.setTimeout(resizeIFrame, 200)
    }


function openCopyLink(context, pubno) {
    var loc = document.location.toString();
    loc = loc.substring(0, loc.indexOf("#"));
    copyLinkWindow("basic.htm", loc+"#"+context+"?dispub="+pubno);
}


function openAbstractCopyLink(pubno) {
  openCopyLink('abstract', pubno);
}

function openViewPDFCopyLink(pubno) {
  openCopyLink('viewpdf', pubno);
}

function openSearchTips() {
  helpWindow("http://www.proquest.com/go/pqdtopen_searchtips");
}

function getHelpPage() {
  var pages = {
     "abstract": "http://www.proquest.com/go/pqdtopen_view",
     "viewpdf": "http://www.proquest.com/go/pqdtopen_view",
     "results": "http://www.proquest.com/go/pqdtopen_results",
     "default": "http://www.proquest.com/go/pqdtopen_help",
     "search": "http://www.proquest.com/go/pqdtopen_searchtips"
   }
  if (!pages[window.hashState.context]) {
    return pages['default'];
  } else {
    return pages[window.hashState.context];
  }
}

function openHelpWindow(helpcontext) {
  helpWindow(getHelpPage());
}

/************************************************************
                 Abstract Transform
************************************************************/

function rep(src, what, clsname) {
   var o = new RegExp("\\+"+what, "gi");
   var c = new RegExp("\\-"+what, "gi");
   if (clsname == "") {
     src = src.replace(o, "")
     src = src.replace(c, "")
   } else {
     src = src.replace(o, "<span class=\""+clsname+"\">")
     src = src.replace(c, "</span>")
   }
   return src;
}

function transformAbstractParagraph(src) {
  src = rep(src, "italic", "italic");
  src = rep(src, "bold", "bold");
  src = rep(src, "superscript", "superscript");
  src = rep(src, "subscript", "subscript");
  src = rep(src, "underline", "underline");
  src = rep(src, "strikeout", "strikeout");
  src = rep(src, "blink", "blink");
  src = rep(src, "monospace", "monospace");
  src = rep(src, "typographic_error", "");
  src = rep(src, "\\(null\\)", "");
  return src;
}

function transformAbstractText(paragraphs) {
  var text = "";
  for(var x=0;x<paragraphs.length;x++)  {
     var t = $(paragraphs[x]);
     text += "<p>"+transformAbstractParagraph(t.text())+"</p>";
   }
  return text;
}

/************************************************************
                 Data Handlers
************************************************************/

function onAbstractDataReceived(e, doc) {
  var data = {
      abstract: transformAbstractText($("paragraph", doc)),
      title: $("doctitle", doc).text(),
      author: $("auths", doc).text(),
      degree: $("PaperDegreeName", doc).text(),
      school: $("SchoolCodeName", doc).text(),
      year: $("PaperDegreeDate", doc).text(),
      pagecount: $("pgcount", doc).text(),
      pubno: $("extdocid>cht", doc).text(),
      advisor: $("PaperAdvisor> cht", doc).text(),
      schoolloc: $("SchoolLocation", doc).text(),
      source: $("LocalPc", doc).text(),
      sourcetype: $("esrctype", doc).text(),
      subjects: $("PaperSubjectExp", doc),
      isbn: $("docisbn", doc).text(),
      committee: $("CommitteeMember-ss", doc),
      keywords: $("PaperKeyword", doc),
      department: $("ScholarlyPaper>Department", doc).text()
  }

  var searchResult = $('#resultsDataSource')[0].data.hashByPub[data.pubno];

  searchResult.abstract = data; // point the search result to the abstract...
  data.searchResult = searchResult; // point abstract to the search result so we can traverse the results (next/prev buttons)
}

function onFormatDetailsReceived(e, doc) {
  var embargoDate = $("OpenAccessLiftDate", doc);
  var data = {};
  if (embargoDate.length > 0) {
      data.embargo = $(embargoDate[0]).text();
  }


  var pubno = e.currentTarget.pubno;
  var searchResult = $('#resultsDataSource')[0].data.hashByPub[pubno];
  searchResult.formatDetails = data;

}

function fetchNextOrPrevious(searchResult) {
  // speaking of which, does the previous/next item exist? (needed for templates)
  var options = $('#resultsDataSource')[0].options;
  if ((searchResult.absIdx > 0) && (!searchResult.parent.results[searchResult.absIdx-1])) {
     options.startAt = Math.floor((searchResult.absIdx-1) / options.pageSize)*options.pageSize;
     fetchDataPage(options);
     return true;
  }
  if ((searchResult.absIdx < searchResult.parent.hitCount-1) && (!searchResult.parent.results[searchResult.absIdx+1])) {
     options.startAt = Math.floor((searchResult.absIdx+1) / options.pageSize)*options.pageSize;

    fetchDataPage(options);
    return true;
  }
  return false;
}

function fetchDataPage(options) {
   var url = getSearchQuery(options);
   $('#resultsDataSource').setDatasourceUrl(url, options);
   $('#resultsDataSource').refresh();
}

function setupResult(dataSource, x) {
       dataSource.results[x].resultFormats = [];
       dataSource.results[x].resultFormatsHash = {};
       dataSource.results[x].absIdx = x;
       dataSource.results[x].hitCount = dataSource.hitCount;
       dataSource.results[x].parent = dataSource;
       for(var y=0;y<dataSource.results[x].fmts.length;y++) {
           var format = dataSource.results[x].fmts[y];
           if (!linkViews[format.fmt])
              continue;

           resultFormat = {};

           var url = getDownloadUrl(dataSource.results[x].pubno, format.fmt);
           if (format.fmt == "application/x-pageimage") {
               url = '#viewpdf?dispub='+dataSource.results[x].pubno;
               dataSource.results[x].pdfUrl = url;
           }
           if (format.fmt == "application/x-abstract") {
               url = '#abstract?dispub='+dataSource.results[x].pubno;
               dataSource.results[x].citeUrl = url;
           }
           if (format.fmt == "application/x-supplemental-files") {
               url = '#abstract/supplemental?dispub='+dataSource.results[x].pubno;
               dataSource.results[x].suppUrl = url;
           }

          resultFormat = jQuery.extend(resultFormat, linkViews[format.fmt]);
          if (format.fmt == "application/x-pageimage") {
            resultFormat.filesize = dataSource.results[x].filesize;
            resultFormat.parent = dataSource.results[x];
          }
          resultFormat.url = url;


          dataSource.results[x].resultFormats.push(resultFormat);
          dataSource.results[x].resultFormatsHash[format.fmt] = resultFormat;

       }
       dataSource.hashByPub[dataSource.results[x].pubno] = dataSource.results[x];
}

function mergeResultData(dataSource, data) {
  if (data && data.results && data.results.length)
  for(var x=0;x<data.results.length;x++) {
     dataSource.results[dataSource.parent.target.options.startAt+x] = data.results[x];
     setupResult(dataSource, dataSource.parent.target.options.startAt+x);
  }
}

// the page information for the templates must be calculated from the context,
// not the datasource as the datasource might be have had to go do something
// else (for cacheing or pagination reasons)
function setupTemplatePageData(data) {
  data.pageInfo = {};
  data.pageInfo.page = parseInt(window.hashState.params.page || 0);

  data.pageInfo.pageSize = defaultPageSize;
  //data.pageInfo.query = window.hashState.params.q;
  data.pageInfo.query = query;

  var pgInfo = getPageRange(data.pageInfo.page, data.pageInfo.pageSize, data.hitCount);
  // TODO at some point the end point could reflect incomplete datasets in order to give
  // progressive returning results. (we would need to calc based knowing what is available in the dataset)
  data.pageInfo.startAt = pgInfo.startAt;
  data.pageInfo.endAt = pgInfo.startAt+pgInfo.len;
  data.pageInfo.totalPages = pgInfo.totalPages;
}

function setupResultsDataSource(dataSource) {
  dataSource.hashByPub = {};
  for(var x=0;x<dataSource.hitCount;x++) {
     if (x < dataSource.parent.target.options.startAt) {
       dataSource.results.unshift(null);
     } else if (x >= dataSource.parent.target.options.endAt) {
       dataSource.results.push(null);
     } else { // ((x >= dataSource.startAt) && (x <= dataSource.endAt))
       setupResult(dataSource, x);
     }
  }
}

function onResultsReceived(e, data) {
  if (!this.data) {
    this.data = data;
    data.hashByPub={};
    data.parent=e;
    setupResultsDataSource(this.data);
    return;
  }
  mergeResultData(this.data, data);
}

/************************************************************
                     Module Visibility...
************************************************************/

function showMoreOptions() {
  $('#moreOpt').toggle();
  $('#moreOptButtonsClosed').toggle();
  $('#moreOptButtonsOpen').toggle();
}

function showRefine() {
   $('#moreOpt').show();
   $('#SQ').focus();
   scrollTo(0, 99999);
}

function showSearch(giveFocus) {
  $('#searchBox').show();
  if (giveFocus)
     $('#SQ').focus();
}

function showAbstract() {
  $("#abstract").show();
}

function showResults() {
  $('#results').show();
}

function hideSearch() {
  $('#searchBox').hide();
}

function hideAbstract() {
  $("#abstract").hide();
}

function hideResults() {
  $('#results').hide();
}

/************************************************************
                   Search Functions
************************************************************/
function clearSearch() {
  $("#SQ")[0].value = "";
  $("#au")[0].value = "";
  $("#ti")[0].value = "";
  $("#dispub")[0].value = "";
  $("#sch")[0].value = "";
  $("#ad")[0].value = "";
  //$("#cmt")[0].value = "";
  $("#if")[0].value = "";
  $("#fromDate")[0].selectedIndex = 0;
  $("#toDate")[0].selectedIndex = 0;
}

function addToQuery(query, val, c, mnemonic, forAppUrl, label) {
  if ((!val) || (val == ""))
     return query;
  var what;
  if (forAppUrl) {
    return query + "&"+(label?label:mnemonic)+'='+__escape(val);
  } else what = mnemonic+"("+__escape(val)+")"
  return query+(query?' '+c+' ':'')+what;
}

// For app URL means the application facing URL -- it is for keeping track of
// the input boxes, as opposed to the !forAppUrl, which is the search query being sent
function getQuery(forAppUrl) {
    var query = "";
    var error = "";
    var fromDate = $('#fromDate')[0].options[$('#fromDate')[0].selectedIndex].value;
    var toDate = $('#toDate')[0].options[$('#toDate')[0].selectedIndex].value;
    if (parseInt(fromDate.substring(1)) > parseInt(toDate.substring(1))) {
      return ["", "From date must be earlier than the to date."];
    }

    if (($("#SQ").length > 0) && $("#SQ")[0].value)
        query += __escape($('#SQ')[0].value);

    query = addToQuery(query, $('#au')[0].value, "and", "au", forAppUrl);
    query = addToQuery(query, $('#ti')[0].value, "and", "ti", forAppUrl);
    query = addToQuery(query, $('#dispub')[0].value, "and", "dispub", forAppUrl);
    query = addToQuery(query, $('#sch')[0].value, "and", "sch", forAppUrl);
    query = addToQuery(query, $('#ad')[0].value, "and", "ad", forAppUrl);
    //query = addToQuery(query, $('#cmt')[0].value, "and", "cmt", forAppUrl);
    query = addToQuery(query, $('#if')[0].value, "and", "if", forAppUrl);
    query = addToQuery(query, fromDate, "and", "PDN", forAppUrl, "fromDate");
    query = addToQuery(query, toDate, "and", "PDN", forAppUrl, "toDate");

    if (!query) {
      error = "Blank search, please enter keywords to perform search.";
    }
    query = query;
    return [query, error];
}

function getOrder() {
    if ($('#sortby_drp').length > 0) {
       return $('#sortby_drp')[0].options[$('#sortby_drp')[0].selectedIndex].value
     }
    return "";
}

function getPageRange(page, pageSize, hitCount) {
  pageCount = Math.ceil(hitCount / pageSize);
  return {startAt: page*pageSize,
          len:(page == pageCount?hitCount-((pageCount-1)*pageSize):pageSize),
          totalPages:pageCount
         }
}

function getSearchOptions(idx, pageSize) {
  var page;
  if (!pageSize)
     pageSize = defaultPageSize;
  if (idx) {
    page =Math.floor(idx/pageSize);
  }
  if (!page)
     page = window.hashState.params.page || 0;

  var options = {
      busySelector:"#searchActivity",
      pageSize: pageSize,
      page: page
    };

  var pgInfo = getPageRange(options.page, options.pageSize, (options.page*options.pageSize)+options.pageSize);
  options.startAt = pgInfo.startAt;
  options.endAt = pgInfo.startAt+pgInfo.len;
  options.len = pgInfo.len;
  options.totalPages = pgInfo.totalPages;
  options.query = getQuery(false)[0];
  options.order = getOrder();
  return options;
}

function getAppSearchQuery(idx, pageSize, page) {
  var order = getOrder();
  if (!page) {
    if (!pageSize)
       pageSize = defaultPageSize;
    page = Math.floor(idx/pageSize);
  }
  return getQuery(true)[0]+(order?"&ord="+order:"")+(page>0?"&page="+page:"");
}

function getGroups() {
  if ($.cookie('groups')) {
    return "&groups="+$.cookie('groups');
  } else return "";
}

function getSearchQuery(options) {
  return baseDataHostUrl+"&act=search&query="+options.query+(options.order!=""?"&ord="+options.order:"")+"&strt="+options.startAt+"&len="+options.len+getGroups()+"&callback=?";
}

function changeOrder() {
  var dataSource = $('#resultsDataSource')[0];
  dataSource.data = null;
  setSearchParamsFromUrl();
  $.historyLoad("results?q="+getAppSearchQuery());
}

function performSearch() {
  // Update the datasource with the parameters using the value of the search field
  queryArray = getQuery(false)
  if (!queryArray[0]) {
      alert(queryArray[1]);
      return;
  }
  $.historyLoad("results?q="+getAppSearchQuery());
}

/************************************************************
                     Context Handlers
************************************************************/
function setSelected(oSel, val) {
  var len = oSel.options.length;
  for(var i=0; i<len; i++){
    if (oSel.options[i].value == val){
      oSel.selectedIndex = i;
      break;
    }
  }
}

function getParam(param) {
  return (window.hashState.params[param]?unescape(window.hashState.params[param]):"");
}

function anyAreUsed(selectors) {
  selectors = selectors.split(',');
  for(var x=0;x<selectors.length;x++)
    if ($('#'+selectors[x])[0].value != "")
       return true;
  return false;
}

function setSearchParamsFromUrl() {
  $('#SQ')[0].value = getParam("q");
  $('#au')[0].value = getParam("au");
  $('#ti')[0].value = getParam("ti");
  $('#dispub')[0].value = getParam("dispub");
  $('#sch')[0].value = getParam("sch");
  $('#ad')[0].value = getParam("ad");
  //$('#cmt')[0].value = getParam("cmt");
  $('#if')[0].value = getParam("if");

  setSelected($('#fromDate')[0], getParam("fromDate"));
  setSelected($('#toDate')[0], getParam("toDate"));
  if (anyAreUsed('au,ti,dispub,sch,ad,if'))
     $('#moreOpt').show();
     else $('#moreOpt').hide();
}

var retry = false;
// ******* Results Module
function handleResultsContext(cmd) {
  var dataSource = $('#resultsDataSource')[0];
  var oldQuery = query;
  setSearchParamsFromUrl();

  // setup the search, and send request for search (if necessary)
  if (cmd.visits == 1) {
    if (!anyAreUsed('SQ,au,ti,dispub,sch,ad,if,fromDate,toDate')) {
             alert('Empty search. Please try again with a valid query.');
             showSearch(true);
             return;
      }
      showSearch(false);

      // clear the data results if we have a new search
      query = getQuery(false)[0];
      if (dataSource) {
        if ( (!dataSource.data) || (!dataSource.data.pageInfo) || (!dataSource.data.pageInfo.query) ||
             (oldQuery != query)
           ) {
          dataSource.data = null;
        }
      }

      var options = getSearchOptions();

      if (!dataSource.data || !dataSource.data.results ||
          !dataSource.data.results[options.startAt] || !dataSource.data.results[options.endAt-1]) {
        $('#resultsDataSource').setDatasourceUrl(getSearchQuery(options), options);
        $('#resultsDataSource').refresh();
        return -1;
      }
  }

  if (dataSource.data == null) {
      if (retry) {
         alert('Search service failure. Please retry your search in a moment or two. Thank you.');
         retry = false;
         return;
      }
      retry = true;
      $('#resultsDataSource').refresh();
      return;
  }

  if (dataSource.data.errorMsg) {
      if (!dataSource.data.errorDisplayed) {
      alert(dataSource.data.errorMsg);
      dataSource.data.errorDisplayed = true;
      showSearch(true);
    }
    return;
  }

  if (dataSource.data.hitCount == 0) {
      setupTemplatePageData(dataSource.data);
      clearSearch(); // this could be the most annoying "feature" ever
      $('#wantMoreResults').thtml("wantMoreResultsTmpl", dataSource.data);
      $('#resultHeadNav').html("");
      $('#resultRecap').html("");
      $("#resultsList").thtml("noResultsTmpl", dataSource.data);
      $('#resultFooterNavLine').html("");
      if (currentContext == "results") {
        showResults();
      }
      scrollTo(0, 0);
      return;
  }


  setupTemplatePageData(dataSource.data);
  $('#wantMoreResults').thtml("wantMoreResultsTmpl", dataSource.data);
  $('#resultHeadNav').thtml("resultHeadNavTmpl", dataSource.data);
  $('#resultRecap').thtml("resultRecapTmpl", dataSource.data);
  $('#resultsList').thtml("resultListTmpl", dataSource.data.results.slice(dataSource.data.pageInfo.startAt, dataSource.data.pageInfo.endAt));
  setSelected($('#sortby_drp')[0], window.hashState.params.ord);
  $('#resultFooterNavLine').thtml("resultFooterNavLineTmpl", dataSource.data);

  showResults();
  scrollTo(0, 0);
}

function handleUnloadResultsContext(cmd) {
  if (cmd.newContext != "results") {
    hideSearch();
    hideResults();
  }
  if (cmd.newContext == "search") {
    hideResults();
  }

}

// ******* Search Module
function handleUnloadSearchContext(cmd) {
  if (cmd.newContext != "search" && cmd.newContext != "results") {
    hideSearch();
    hideResults();
  }
  $('#gotoSearchLink').show();
}

function handleSearchContext() {
  setSearchParamsFromUrl();
  showSearch(true);
  $('#gotoSearchLink').hide();
}

// ******* Abstract Module
function handleUnloadAbstractContext() {
  hideAbstract();
}

function getDownloadUrl(pubno, fmt) {
  return baseDataHostUrl+'&act=download&pubno='+pubno+'&format='+fmt; // application/x-pageimage,
}

var visit;
function handleAbstractContext(data, cmd) {
  dataSource = $('#resultsDataSource')[0];
  var pubno = hashState.params.dispub;

  if (!(dataSource.data && dataSource.data.hashByPub[pubno])) {
    query = null;
    $('#resultsDataSource').setDatasourceUrl(baseDataHostUrl+"&act=search&query=dispub("+pubno+')'+getGroups());
    $('#resultsDataSource').refresh();
    return -1;
  }

  var searchResult = dataSource.data.hashByPub[pubno];
  if (!searchResult.abstract) {
    $('#abstractDataSource').setDatasourceUrl(getDownloadUrl(pubno, 'application/x-abstract'), {dataType:'xml'});
    $('#abstractDataSource').refresh();
    return -1;
  }

  if (fetchNextOrPrevious(searchResult))
     return -1;

  var lang = getParam('lang');
  if (lang && (!searchResult.abstract.translated)) {
     translateAbstract(searchResult);
     return -1;
  }

  if (!searchResult.formatDetails) {
    $('#formatDetailsDataSource')[0].pubno = pubno;
    $('#formatDetailsDataSource').setDatasourceUrl(baseDataHostUrl+"act=details&dispub="+pubno, {dataType:'xml'});
    $('#formatDetailsDataSource').refresh();
    return -1;
  }

  if (!searchResult.supps) {
    if (data && (visit == 'supp') && (cmd == "success")) {
      searchResult.supps = [];
      $("file", data).each(function() {
        searchResult.supps.push(extractSupplementalInfo(this, pubno));
      });
    } else if (visit == "supp") {

    } else {
      $.ajax({
        url:'jsonMw?act=suppdetails&dispub='+pubno,
        success: processCommandQue
      });
      visit = "supp";
      return -1;
    }
  }

  setupTemplatePageData(searchResult.parent);
  $('#abstract').thtml("abstractTmpl", searchResult.abstract);
  $('.suppLink').click(scrollToSupp);

  if (!hashState.path.match('supp')) {
    scrollTo(0, 0);
  }
  showAbstract();
  if (hashState.path.match('supp')) {
    scrollToSupp();
  }
  visit = null;
}

function scrollToSupp() {
  $.scrollTo('#supp_files', 800);
}

function extractSupplementalInfo(node, pubno) {

  return {
    resource: $("resource", node).text(),
    size: $("size", node).text(),
    description: $("description", node).text(),
    category: $("category", node).text(),
    fname: $("name", node).text(),
    pubno: pubno,
    extension: $("extension", node).text()
  };

}

var
  supplementalDownloadUrl = null;


function downloadSupplemental() {

 window.open(supplementalDownloadUrl);
}

function setupSupplementalDownloadUrl(data) {
  supplementalDownloadUrl = $("url", data).text()
  thickbox("Terms of Use","tou.html",650,300,"ajax", "true");
}

function downloadSupp(pubno, resource) {
$.ajax({
  url:'jsonMw?act=suppurl&dispub='+pubno+'&resourceId='+resource,
  success: setupSupplementalDownloadUrl,
  dataType:'xml'
 });
}

// ******* PdfView Module
function handleUnloadViewPdfContext(cmd) {
  $('#pageBannerContainer').show();
  $('#copyrightFooter').show();
  $('#pdfView').hide();
  $('#pdfPage').remove();
  $("html")[0].style.overflow = "auto";
}

function handleViewPdfContext() {
  var pubno = hashState.params.dispub;
  dataSource = $('#resultsDataSource')[0];

  if (!(dataSource.data && dataSource.data.hashByPub[pubno])) {
     query = null;
     $('#resultsDataSource').setDatasourceUrl(baseDataHostUrl+"&act=search&query=dispub("+pubno+')'+getGroups());
     $('#resultsDataSource').refresh();
     return -1;
  }

  var searchResult = dataSource.data.hashByPub[pubno];
  if (fetchNextOrPrevious(searchResult))
     return -1;

  var r=$.cookie("seenPdfCopyright");
  if (!r) {
    pdfCopyrightWindow();
    return -1;
  }

  if (!searchResult.stageResult) {
    $.ajax({
      url: '/jsonMw?act=stage&pubno='+pubno+'&format=application/x-pageimage&callback=?',
      success: handleStageResult,
      dataType:'json'
    });
    return -1;
  }


  setupTemplatePageData(dataSource.data);

  $('#pageBannerContainer').hide();
  $('#copyrightFooter').hide();
  $('#pdfView').show();

  $('#pdfPageBanner').thtml("pdfPageBannerTmpl", searchResult);
  $('#pdfPage').remove();

  if (searchResult.stageResult.error) {
    $('body').tappend("failDownload", searchResult);
    return
  }

  if (jQuery.browser.msie) {
    $('body').tappend("frameCellTmplIE_embed", searchResult);
  } else {
    $('body').tappend("frameCellTmplFF", searchResult);
  }
  delayResize();
}

function handleStageResult(response) {
   var searchResult = $('#resultsDataSource')[0].data.hashByPub[hashState.params.dispub];

   searchResult.stageResult = response;
   processCommandQue();
}

function handleUnloadDefaultContext(cmd) {
  hideSearch();
  $('#gotoSearchLink').show();
}

// ******* Default Module
function handleDefaultContext() {
  showSearch(true);
  hideResults();
  clearSearch();
  $('#gotoSearchLink').hide();
}


function getLanguages() {
  $.ajax({
    url: '/ap/targetlanguages/en?ta=Ms',
    success: handleLanguages
  });
}

function handleLanguages(response) {
  alert(response);
}

function translateAbstract(searchResult) {
  $.ajax({
    url: '/ap/translator/?ta=Ms&sourceLang=en&targetLang='+getParam('lang'),
    success: handleTranslation,
    type: 'post',
    data: searchResult.abstract.abstract
  });
}

function handleTranslation(response) {
  var dispub = getParam("dispub")
  searchResult = $('#resultsDataSource')[0].data.hashByPub[dispub];
  searchResult.abstract.abstract = response;
  searchResult.abstract.translated = true;
  processCommandQue();
}

function extractSearchGroupInfo(node) {
return {
    id: $("Id", node).text(),
    groupName: $("GroupName", node).text(),
    groupDescription: $("GroupDescription", node).text(),
    title: $("QuickGlanceDescription", node).text(),
    url: $("MoreInfoURL", node).text(),
    coverage: $("CoverageDescription", node).text(),
    category: $("Category", node).text(),
    dropdownName: $("DropDownName", node).text(),
    showViewTitles: $("ShowViewTitlesLink", node).text()
  };
}

function processChildGroup(node) {
  var searchGroup = {
    id: $("NodeId>Id", node).text(),
    groupName: $("GroupName:first", node).text(),
    groupDescription: $("GroupDescription:first", node).text(),
    title: $("QuickGlanceDescription:last", node).text(),
    category: $("Category:last").text(),
    url: $("MoreInfoURL:last", node).text(),
    coverage: $("CoverageDescription:last", node).text(),
    category: $("Category:last", node).text(),
    dropdownName: $("DropDownName:last", node).text(),
    showViewTitles: $("ShowViewTitlesLink:last", node).text(),
    children: []
  };
  //console.log(node);
  $("ChildSearchGroupList>SearchGroupInfo", node).each(function () {
      searchGroup.children.push(extractSearchGroupInfo(this));
  });
  return searchGroup;
}

function processSearchGroup(node) {
  if ($("ChildSearchGroupList", node).length > 0) {
    return processChildGroup(node);
  } else {
    return extractSearchGroupInfo(node);
  }
}

function processAvailableSearchGroupsNode(doc) {
  var data = [];
  $("SearchGroupInfoList>SearchGroupInfo", doc).each(function() {
    if ($("CrossSearchingClass", this).length > 0) {
      csc = $($("CrossSearchingClass", this)[0]).text();
      if (csc == "") {
         return;
      }
      searchGroup = processSearchGroup(this);
      for(var x=0;x<data.length;x++) {
         if (data[x].csc == csc) {
             data[x].searchGroups.push(searchGroup);
             return;
         }
      }
      data.push({csc:csc,searchGroups:[searchGroup]});
    }
  });
  return data;
}

var availableGroups;
function processAvailableSearchGroups(doc) {
  availableGroups = processAvailableSearchGroupsNode(doc);
  processCommandQue();
}

function getAvailableSearchGroups() {
  $.ajax({
   url: baseDataHostUrl+'act=availgroups',
   success: processAvailableSearchGroups,
   dataType: 'xml'
 });
}

function handleLoginResponse() {
  $.historyLoad("search");
}

function handleLoginContext() {
  $('#login').thtml('loginTmpl', null);

  $('#login').show();
  $('#user')[0].focus();
}

function handleUnloadLoginContext() {
  $('#login').hide();
}

function serializeObject(o) {
  var r = "";
  $.each(o, function(k,v) {
    if (v && (v != ""))
       r+="&"+k+'='+escape(v);
  });
  return r;
}

function login(data) {
  $.ajax({
   url: baseDataHostUrl+'act=login'+serializeObject(data),
   success: handleLoginResponse
  });
}

function loginUsingForm() {
  if ($('#remember:checked').length > 0) {
    options = {expire: 3};
    $.cookie('user', $('#user').val(), options);
    $.cookie('password', $('#password').val(), options);
    $.cookie('client', $('#client').val(), options);
    $.cookie('clientVersion', $('#clientVersion').val(), options);
    $.cookie('hosts', $('#hosts').val(), options);
    $.cookie('transport', $('#transport').val(), options);
  }
  var data = {
    user: $('#user').val(),
    password: $('#password').val(),
    client: $('#client').val(),
    clientVersion: $('#clientVersion').val(),
    hosts: $('#hosts').val(),
    transport: $('#transport').val()
  }
  login(data);
}

function uncheckAllDbs() {
  $('#dbs input').each(function() {
    this.checked = false;
  });
}

function updateGroupsSelected() {
  $('#groupsSelected').html("");
  var groups = [];
  $('.dbs input:checked').each(function() {
    groups.push(this.value);
  });
  return groups;
}

function handleViewDbs() {
  if (!availableGroups) {
    getAvailableSearchGroups();
    return -1;
  }
  $('#viewDbs').thtml("viewDbsTmpl", {availableGroups:availableGroups});
  $('#viewDbs').show();
  $('.dbs input').click(function() {
    var isChecked = this.checked;
    $("input", this.parentNode).each(function() { this.checked = isChecked; });
    updateGroupsSelected();
  });
}

function dbsSearch() {
  $('#dblist li strong').each(function() {

  if ($(this).text().match(new RegExp($('#dbsSearch').val(), "i"))) {
     $(this.parentNode).show();
     $("input", this.parentNode).each(function() { this.checked = true; });
   } else {
     $(this.parentNode).hide();
     $("input", this.parentNode).each(function() { this.checked = false; });
   }
  });
  updateGroupsSelected()
}

function saveGroups() {
  var groups = updateGroupsSelected().toString();
  $.cookie('groups', groups);
  $.historyLoad('search');
}

function handleUnloadViewDbs() {
    $('#viewDbs').hide();
}

/************************************************************
                  onLoad...
************************************************************/

$(function() {
  $('#pageBannerContainer').thtml("pageBannerTmpl", null);

  $('#searchBox').thtml("searchBoxTmpl", null);
  $('#copyrightFooter').thtml("copyrightFooterTmpl", null);

  // set up data handlers
  $('#resultsDataSource').bind("onDataReceived", onResultsReceived);
  $('#abstractDataSource').bind("onDataReceived", onAbstractDataReceived);
  $('#formatDetailsDataSource').bind("onDataReceived", onFormatDetailsReceived);

  // set up the click event
  $('.searchButton').click(performSearch);
  $('.clearSearchButton').click(clearSearch);
  $("#SQ,#au,#ti,#dispub,#sch,#ad,#if").kbind("return", performSearch);

  addContextHandler({context:"abstract", f:handleAbstractContext}, {context:"abstract", f:handleUnloadAbstractContext});
  addContextHandler({context:"default", f:handleDefaultContext}, {context:"default", f:handleUnloadDefaultContext});
  addContextHandler({context:"results", f:handleResultsContext}, {context:"results", f:handleUnloadResultsContext});
  addContextHandler({context:"search", f:handleSearchContext}, {context:"search", f:handleUnloadSearchContext});
  addContextHandler({context:"viewpdf", f:handleViewPdfContext}, {context:"viewpdf", f:handleUnloadViewPdfContext});
  addContextHandler({context:"viewdbs", f:handleViewDbs}, {context:"viewdbs", f:handleUnloadViewDbs});
  addContextHandler({context:"login", f:handleLoginContext}, {context:"login", f:handleUnloadLoginContext});
  $(window).resize(delayResize);
  $.historyInit(handleContextOnLoad);
});