

function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != "function") {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}


function myOpenWindow(yURL, yName, yAttribs, yObj)
{
  var yWin;

  if (yObj != null) {

    if (!yObj.closed) {
      yObj.focus();
      return yObj;
    }

  }

  yWin = window.open(yURL, yName, yAttribs);
  return yWin;
}



// DOM reading functions:

function getDivsByClassName(classname) {
  var retval = [];
  var tags = document.getElementsByTagName("div");
  var regex = new RegExp("(^| )" + classname + "($| )");
  for(var i = 0; i < tags.length; ++i) {
    if(regex.test(tags[i].className)) {
      retval.push(tags[i]);
    }
  }
  return retval;
}


// Layout-calculating functions

function topOfElement(e) {
  var retval = 0;
  do {
    retval += e.offsetTop;
  } while(e = e.offsetParent)
  return retval;
}

function leftOfElement(e) {
  var retval = 0;
  do {
    retval += e.offsetLeft;
  } while(e = e.offsetParent)
  return retval;
}

function getScrollTop() { // Find window's scroll position:
  var pos = 0;
  if (window.innerHeight) {
    pos = window.pageYOffset;
  } else if (document.documentElement && document.documentElement.scrollTop) {
    pos = document.documentElement.scrollTop;
  } else if (document.body) {
    pos = document.body.scrollTop;
  }
  return pos;
}

function getClientWidth() {
  var s = 0;
  if (self.innerWidth) {
    s = self.innerWidth;
  } else if (document.documentElement && document.documentElement.clientWidth) {
    s = document.documentElement.clientWidth;
  } else if (document.body) {
    s = document.body.clientWidth;
  }
  return s;
}

function getClientHeight() {
  var s = 0;
  if (self.innerHeight) {
    s = self.innerHeight;
  } else if (document.documentElement && document.documentElement.clientHeight) {
    s = document.documentElement.clientHeight;
  } else if (document.body) {
    s = document.body.clientHeight;
  }
  return s;
}

function getScrollbarSize() // IE only!
{
  var shim = document.getElementById("sbwidthshim");

  if(!shim) return 18;

  shim.style.display = "block";
  shim.wrap = "off";
  var retval = shim.offsetHeight;
  shim.wrap = "soft";
  retval -= shim.offsetHeight;
  shim.style.display = "none";

  return (retval==0)?18:retval;
};




// General utilities for Liberty
function init() {
  if (window.initTitle != null) {
    initTitle();
  }
}

function checkspaces()
{
    if(document.gform != null)
        {
        if(document.gform.gw_citation != null)
        {
            var strCitation = document.gform.gw_citation.value;

            if(strCitation.indexOf(" ") != -1)
            {
                alert("This field cannot contain spaces");
                document.gform.gw_citation.focus();
            }
        }
    }
}


// Display the search dialog
function searchDialog(DBnm, displayForm) {
  searchDialogEx(DBnm, displayForm, "");
}

function searchDialogChangeDate(DBnm, displayForm) {
  searchDialogExChangeDate(DBnm, displayForm, "");
}

function searchDialogSrchWinSrch(DBnm, displayForm) {
  searchDialogExSrchWinSrch(DBnm, displayForm, "");
}

function searchAdvanceDialog(DBnm, displayForm) {
    searchAdvanceDialogEx(DBnm, displayForm, "");
}

function searchAdvanceDialogEx(DBnm, displayForm, slimit) {
    updateContextMenu("<contextConfig/>");
    window.location = gatewayLink+'&displayform=srch&database='+DBnm+'&nextform='+displayForm+'&slimit='+slimit;
}

function searchAdvanceDialogEx2(DBnm, displayForm, slimit, cancelform) {
    updateContextMenu("<contextConfig/>");
    window.location = gatewayLink+'&displayform=srchEx&database='+DBnm+'&nextform='+displayForm+'&slimit='+slimit+'&cancelform='+cancelform;
}


// Display the search dialog supporting an optional 'limit' parameter
// "SRCHAD="+limit   // is how it works
function searchDialogEx(DBnm, displayForm, slimit) {
  alldocfunc = 'allDocs("'+escape(DBnm)+'","'+escape(displayForm)+'","'+escape(slimit)+'","")';
  newdocfunc = 'allDocs("'+escape(DBnm)+'","'+escape(displayForm)+'","'+escape("DATEENTERED = "+gatewayDate)+'")';

  myHTML =  gatewayForm("searchDialog")+'<input type=hidden name=displayform value='+displayForm+'><input type=hidden name=searchform value=srchsumm><input type=hidden name=database value='+DBnm+'><input type=hidden name=SRCHAD value="'+slimit+'"><br><p align=center><b>' + trans["Search Database"] + ' [' + DBnm + '] :</b><br><br><input type=textbox name=srchad size=40><input type=submit name=go value="' + trans["Search"] + '"></form><br><br>';
  myHTML += '<a style="text-decoration:none" href='+gatewayLink+'&displayform=srch&database='+DBnm+'&nextform='+displayForm+'&slimit="'+ escape(slimit) +'">' + trans["Advanced"] + '</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a style="text-decoration:none" href=javascript:'+alldocfunc+'>' + trans["All"] + '</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a style="text-decoration:none" href=javascript:'+newdocfunc+'>' + trans["New Records"] + '</a></p>';
  dialogFoc(myHTML, "srchad");
}

// Display the search dialog supporting an optional 'limit' parameter
// "SRCHAD="+limit   // is how it works
function searchDialogEx2(DBnm, displayForm, slimit, cancelform) {
  alldocfunc = 'allDocs("'+escape(DBnm)+'","'+escape(displayForm)+'","'+escape(slimit)+'","")';
  newdocfunc = 'allDocs("'+escape(DBnm)+'","'+escape(displayForm)+'","'+escape("DATEENTERED = "+gatewayDate)+'")';

  myHTML =  gatewayForm("searchDialog")+'<input type=hidden name=displayform value='+displayForm+'><input type=hidden name=searchform value=srchsumm><input type=hidden name=database value='+DBnm+'><input type=hidden name=SRCHAD value="'+slimit+'"><br><p align=center><b>' + trans["Search Database"] + ' [' + DBnm + '] :</b><br><br><input type=textbox name=srchad size=40><input type=submit name=go value="' + trans["Search"] + '"></form><br><br>';
  myHTML += '<a style="text-decoration:none" href='+gatewayLink+'&displayform=srchex&database='+DBnm+'&nextform='+displayForm+'&slimit="'+ escape(slimit) +'"&cancelform='+cancelform+'>' + trans["Advanced"] + '</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a style="text-decoration:none" href=javascript:'+alldocfunc+'>' + trans["All"] + '</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a style="text-decoration:none" href=javascript:'+newdocfunc+'>' + trans["New Records"] + '</a></p>';
  dialogFoc(myHTML, "srchad");
}

// Display the search dialog supporting an optional 'limit' parameter
// "SRCHAD="+limit   // is how it works
function searchDialogExChangeDate(DBnm, displayForm, slimit) {
  alldocfunc = 'allDocs("'+escape(DBnm)+'","'+escape(displayForm)+'","'+escape(slimit)+'","")';
  newdocfunc = 'allDocs("'+escape(DBnm)+'","'+escape(displayForm)+'","'+escape("DATEENTERED = "+gatewayDate)+'")';

  myHTML =  gatewayForm("searchDialog")+'<input type=hidden name=displayform value='+displayForm+'><input type=hidden name=searchform value=srchsumm><input type=hidden name=database value='+DBnm+'><input type=hidden name=SRCHAD value="'+slimit+'"><br><p align=center><b>' + trans["Search Database"] + ' [' + DBnm + '] :</b><br><br><input type=textbox name=srchad size=40><input type=submit name=go value="' + trans["Search"] + '"></form><br><br>';
  myHTML += '<a style="text-decoration:none" href='+gatewayLink+'&displayform=srch&database='+DBnm+'&nextform='+displayForm+'&slimit='+slimit+'>' + trans["Advanced"] + '</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a style="text-decoration:none" href=javascript:'+alldocfunc+'>' + trans["All"] + '</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a style="text-decoration:none" href=javascript:'+newdocfunc+'>' + trans["Recent Changes"] + '</a></p>';
  dialogFoc(myHTML, "srchad");
}




// Display all docs in requested form
function allDocs(DBnm, displayForm, slimit) {
  window.location = gatewayLink+'&searchform=srchnull&database='+DBnm+'&displayform='+displayForm+'&srchad='+slimit;
}

// When adding a record prompt for the unique field value
function addRecordDialog(DBnm, displayForm, uniqueField, title) {
  addRecordDialogEx2(DBnm, displayForm, uniqueField, title, "", "");
}
function addRecordDialogEx(DBnm, displayForm, uniqueField, title, additionalCode) {
  addRecordDialogEx2(DBnm, displayForm, uniqueField, title, additionalCode, "");
}

function addRecordDialogExNoCase(DBnm, displayForm, uniqueField, title, additionalCode, defaultValue) {
  myHTML = '<center>'+gatewayFormOnSubmit("addDialog", 'javascript:return(addRecSubNoCase("srchma'+uniqueField+'"))')+'<input type=hidden name=displayform value='+displayForm+'><input type=hidden name=searchform value=srchnull><input type=hidden name=database value='+DBnm+'><br><p><b>'+title+'</b><br><br><input type=textbox name=srchma'+uniqueField+' value="'+defaultValue+'" size=40>&nbsp;<input type=submit name=go value="' + trans["Add"] + '"><br><br></p>'+additionalCode+'</form></center>';
  dialogFoc(myHTML, "srchma"+uniqueField);
}

function addRecordDialogEx2(DBnm, displayForm, uniqueField, title, additionalCode, defaultValue) {
  myHTML = '<center>'+gatewayFormOnSubmit("addDialog", 'javascript:return(addRecSubNoCase("srchma'+uniqueField+'"))')+'<input type=hidden name=displayform value='+displayForm+'><input type=hidden name=searchform value=srchnull><input type=hidden name=database value='+DBnm+'><br><p><b>'+title+'</b><br><br><input type=textbox name=srchma'+uniqueField+' value="'+defaultValue+'" size=40>&nbsp;<input type=submit name=go value="' + trans["Add"] + '"><br><br></p>'+additionalCode+'</form></center>';
  dialogFoc(myHTML, "srchma"+uniqueField);
}

function addRecordDialogExTransparent(DBnm, displayForm, uniqueField, title, additionalCode, defaultValue) {
  myHTML = '<center>'+gatewayFormOnSubmit("addDialog", 'javascript:return(addRecSubNoCase("srchma'+uniqueField+'"))')+'<input type=hidden name=displayform value='+displayForm+'><input type=hidden name=searchform value=srchnull><input type=hidden name=database value='+DBnm+'><br><p><b>'+title+'</b><br><br><input type=textbox name=srchma'+uniqueField+' value="'+defaultValue+'" size=40>&nbsp;<input type=submit name=go value="' + trans["Add"] + '"><br><br></p>'+additionalCode+'</form></center>';
  dialogFocTrans(myHTML, "srchma"+uniqueField);
}

function addRecordDialogExSm(DBnm, displayForm, uniqueField, title, additionalCode, defaultValue) {
  myHTML = '<center>'+gatewayFormOnSubmit("addDialog", 'javascript:return(addRecSub("srchma'+uniqueField+'"))')+'<input type=hidden name=displayform value='+displayForm+'><input type=hidden name=searchform value=srchnull><input type=hidden name=database value='+DBnm+'><br><p><b>'+title+'</b><br><br><input type=textbox name=srchma'+uniqueField+' value="'+defaultValue+'" size=5><BR><BR><input type=submit name=go value="' + trans["Add"] + '"><br><br></p>'+additionalCode+'</form></center>';
  dialogFoc(myHTML, "srchma"+uniqueField);
}

function addRecordDialogNoSpaces(DBnm, displayForm, uniqueField, title) {
  addRecordDialogExNoSpaces(DBnm, displayForm, uniqueField, title, "", "");
}
function addRecordDialogExNoSpaces(DBnm, displayForm, uniqueField, title, additionalCode, defaultValue) {
  myHTML = '<center>'+gatewayFormOnSubmit("addDialog", 'javascript:return(idSpacesCheck("srchma'+uniqueField+'"))')+'<input type=hidden name=displayform value='+displayForm+'><input type=hidden name=searchform value=srchnull><input type=hidden name=database value='+DBnm+'><br><p><b>'+title+'</b><br><br><input type=textbox name=srchma'+uniqueField+' value="'+defaultValue+'" size=40>&nbsp;<input type=submit name=go value="' + trans["Add"] + '"><br><br></p>'+additionalCode+'</form></center>';
  dialogFoc(myHTML, "srchma"+uniqueField);
}

function addRecordDialogNoSpacesOrFullstops(DBnm, displayForm, uniqueField, title) {
  addRecordDialogExNoSpacesOrFullstops(DBnm, displayForm, uniqueField, title, "", "");
}

function addRecordDialogExNoSpacesOrFullstops(DBnm, displayForm, uniqueField, title, additionalCode, defaultValue) {
  myHTML = '<center>'+gatewayFormOnSubmit("addDialog", 'javascript:return(idSpacesOrFullstopsCheck("srchma'+uniqueField+'"))')+'<input type=hidden name=displayform value='+displayForm+'><input type=hidden name=searchform value=srchnull><input type=hidden name=database value='+DBnm+'><br><p><b>'+title+'</b><br><br><input type=textbox name=srchma'+uniqueField+' value="'+defaultValue+'" size=40>&nbsp;<input type=submit name=go value="' + trans["Add"] + '"><br><br></p>'+additionalCode+'</form></center>';
  dialogFoc(myHTML, "srchma"+uniqueField);
}

function idSpacesCheck(field) {
  return idCharacterCheck(field, " ");
}

function idFullstopCheck(field) {
  return idCharacterCheck(field, ".");
}

function idSpacesOrFullstopsCheck(field) {
  return (idSpacesCheck(field) && idFullstopCheck(field)) ? true : false;
}

function idCharacterCheck(field, character) {
  var form = "";
  var element = "";
  /* This for loop is required to discover the latest instance of a field if a previous dialog of the same name
     has been "closed" via the closeDialog() function, which really only hides the dialog, causing name conflicts.
     Added to the idCharacterCheck() function in response to Socket #5702.*/
  for (i=0; i<document.forms.length; i++) {
    for (j=0; j<document.forms[i].elements.length; j++) {
      if (document.forms[i].elements[j].name == field) {
        form = i;
        element = j;
      }
    }
  }

  var strData = document.forms[form].elements[element].value;

  if(strData.indexOf(character) == -1)
  {
    return addRecSub(field);
  }
  else
  {
    alert("This field cannot contain the character: \"" + character + "\"");
    document.forms[form].elements[element].focus();
    return false;
  }
}

function addRecSub(fname) {
  var form = "";
  var element = "";
  /* This for loop is required to discover the latest instance of a field if a previous dialog of the same name
     has been "closed" via the closeDialog() function, which really only hides the dialog, causing name conflicts */
  for (i=0; i<document.forms.length; i++) {
    for (j=0; j<document.forms[i].elements.length; j++) {
      if (document.forms[i].elements[j].name == fname) {
        form = i;
        element = j;
      }
    }
  }
  if (window.uppercaseValue != null) {
    uppercaseValue();
  }

  if (eval("document.forms["+form+"].elements["+element+"].value") != "") {
    return true;
  }

  if (document.addDialog.generatebarcode) {
    if (eval("document.addDialog.generatebarcode.checked")) {
      return true;
    }
  }

  alert(trans["You must enter a value!"]);
  eval("document.forms["+form+"].elements["+element+"].focus()");
  return false;
}

function trimSpaces() {
  trimSpacesEx("srchmaname");
}

function trimSpacesEx(fname) {
  var name = eval('document.addDialog.' + fname + '.value');
  while (name.substring(0, 1) == " ") {
    name = name.substring(1);
  }
  while (name.substring(name.length-1) == " ") {
    name = name.substring(0, name.length-1);
  }
  eval('document.addDialog.' + fname + '.value = name');
}

function trimString(trimstring) {
  while (trimstring.substring(0, 1) == " ") {
    trimstring = trimstring.substring(1);
  }
  while (trimstring.substring(trimstring.length-1) == " ") {
    trimstring = trimstring.substring(0, trimstring.length-1);
  }
  return trimstring;
}

function addRecSubNoCase(fname) {
  var form = "";
  var element = "";
  /* This for loop is required to discover the latest instance of a field if a previous dialog of the same name
     has been "closed" via the closeDialog() function, which really only hides the dialog, causing name conflicts */
  for (i=0; i<document.forms.length; i++) {
    for (j=0; j<document.forms[i].elements.length; j++) {
      if (document.forms[i].elements[j].name == fname) {
        form = i;
        element = j;
      }
    }
  }
  if (window.trimSpaces != null) {
    trimSpacesEx(fname);
  }

  if (eval("document.forms["+form+"].elements["+element+"].value") != "") {
    return true;
  }

  if (document.addDialog.generatebarcode) {
    if (eval("document.addDialog.generatebarcode.checked")) {
      return true;
    }
  }

  alert(trans["You must enter a value!"]);
  eval("document.forms["+form+"].elements["+element+"].focus()");
  return false;
}


// Sort dialog
function sortDialog(DBnm, displayForm, title, additionalCode) {
  myHTML =  gatewayForm("sortDialog")+'<p><b>'+title+'</b><br><br>';
  myHTML += '<input type=hidden name=maxsort value=on>';
  myHTML += '<input type=hidden name=nowatchdog value=true>';
  myHTML += '<input type=hidden name=docno value=1>';
  myHTML += '<input type=hidden name=displayform value='+displayForm+'>';
  myHTML += trans["Sort field 1"] + ': <input type=textbox name=customsort1 onChange=javascript:syncSortDialog() onKeyUp=javascript:syncSortDialog()><br>';
  myHTML += trans["Sort field 2"] + ': <input type=textbox name=customsort2><br><br><center>';
  myHTML += '<input type=submit name=go value="' + trans["Sort"] + '"></center></p>';
  myHTML += additionalCode + '</form>';
  myHTML += '<br><br><center><a style="text-decoration:none" href='+gatewayLink+'&displayform=sort&DBnm='+DBnm+'&nextform='+displayForm+'&title='+title+'>' + trans["Advanced"] + '</a></center>';
  dialogFoc(myHTML, "customsort1");
  syncSortDialog();
}

// Javascript for sort dialog
function syncSortDialog() {
  var temp = document.sortDialog.customsort1.value;
  temp = temp.replace(/[ |\t]/g,'');
  var isBlank = (temp == '');

  document.sortDialog.customsort2.disabled = isBlank;
  document.sortDialog.go.disabled = isBlank;
}

// Word Export report selection
function wordExpMain(DBnm, sq, docs, returnForm) {
  updateContextMenu("<contextConfig/>");
  window.location = gatewayLink+'&displayform=weselect&searchform=srchnull&database=expword&sourcedocno='+sq+'&srchmadatabase='+DBnm+'&docs='+docs+'&returnForm='+returnForm;
}

// Word Export report selection
function wordExpMainPostPrint(DBnm, sq, docs, returnForm, supplier) {
  updateContextMenu("<contextConfig/>");
  window.location = gatewayLink+'&displayform=weselect&searchform=srchnull&database=expword&sourcedocno='+sq+'&srchmadatabase='+DBnm+'&docs='+docs+'&returnForm='+returnForm+'&targetfield="suppcode"&targettag="notprinted"&targetstring="'+supplier+'"&postprint="orders/srchremovetag"';
}




// Acquisitions
function acquisitions() {
  window.location = gatewayLink + '&displayform=orders/help';
}
function orders() {
  window.location = gatewayLink + '&displayform=orders/main&database=orders&searchform=srchnull&srchft=0';
}
function orderspre() {
  window.location = gatewayLink + '&displayform=orderspre/main&database=ordpre&searchform=srchnull&srchft=0';
}
function supplier() {
  window.location = gatewayLink + '&displayform=supplier/main';
}
function costCentres() {
  window.location = gatewayLink + '&displayform=costcent/main';
}
function budgets() {
  window.location = gatewayLink + '&displayform=budget/main';
}
function orderHistory() {
  window.location = gatewayLink + '&displayform=orders/mainTable&database=ordrec&searchform=srchnull&srchft=0';
}
function ordlate() {
  window.location = gatewayLink + '&displayform=orders/late';
}
function nbExp() {
  window.location = gatewayLink + '&displayform=orders/addNon';
}

// Cataloging
function Issues() {
  window.location = gatewayLink + '&displayform=catalog/main2';
}
function cataloguing() {
  cataloging();
}
function cataloging() {
  window.location = gatewayLink + '&displayform=catalog/help';
}
function resources() {
  biblios();
}
function biblios() {
  window.location = gatewayLink + '&displayform=catalog/main';
}
function articles() {
  window.location = gatewayLink + '&displayform=articles/main';
}
function thes() {
  window.location = gatewayLink + '&displayform=thes/main&thesname=thessub';
}
function pictureSearch() {
  window.location = gatewayLink + '&displayform=PictureSearch/main';
}
function marcdefn() {
  window.location = gatewayLink + '&displayform=marcdefn/main';
}
function weeding() {
  window.location = gatewayLink + '&displayform=weeding/main';
}
function stocktake() {
  stokMain();
}
function stokMain() {
  window.location = gatewayLink + '&displayform=stok/main';
}
function archive() {
  window.location = gatewayLink + '&displayform=catarchive/main';
}
function exchangeMain() {
  window.location = gatewayLink + '&displayform=catalog/exchange';
}
function modifyForms() {
  window.location = gatewayLink + '&displayform=catforms/main';
}


// Serials
function journals() {
  window.location = gatewayLink + '&displayform=journals/help';
}
function serials() {
  journals();
}
function schedule() {
  window.location = gatewayLink + '&displayform=journals/main';
}
function subscriptions() {
  window.location = gatewayLink + '&displayform=subs/main';
}
function claims() {
  window.location = gatewayLink + '&displayform=claims/start';
}
function claimhist() {
  window.location = gatewayLink + '&displayform=claims/histTable&database=clamstat&searchform=srchnull&srchft=0';
}
function journalindexing() {
  window.location = gatewayLink + '&displayform=index/main';
}


// OPAC
function opacNewWindow() {
  window.open(gatewayLink + '&displayform=opac/main','opac');
}


function oPAC() {
  opac();
}
function Search() {
  opac("search");
}

function opacNewItems(daysOld, showFull) {
  window.location = gatewayLink + '&displayform=opac/List&database=library&searchform=opac/srchfull0&srchlrdateentered=TODAY(-' + daysOld + ')&nomorehelp=on&showfull='+showFull;
}

function opacSerials(showFull) {
  window.location = gatewayLink + '&displayform=opac/quickJournals&showfull='+showFull;
}

function opacReading(showFull) {
  window.location = gatewayLink + '&displayform=opac/quickReading&showfull='+showFull;
}

function opacClosed(showFull) {
  window.location = gatewayLink + '&displayform=opac/quickClosed&database=issues&searchform=srchnull&srchftstatus=CLOSEDRESERVE&showfull='+showFull;
}

function opacSubject(showFull) {
  window.location = gatewayLink + '&displayform=opac/quickSubject&showfull='+showFull;
}

function opacType(showFull) {
  window.location = gatewayLink + '&displayform=opac/quickType&showfull='+showFull;
}

function opacMy() {
  window.location = '';
}

function opacMyMe() {
    window.location = gatewayLink + '&displayform=opac/myMe&database=borrower&searchform=srchnull&srchad=ALIAS%20=%20' + gatewayUsername;
}

function opacMyOnLoan() {
    window.location = gatewayLink + '&displayform=opac/myLoans&database=lend&searchform=srchnull&srchad=ALIAS%20=%20' + gatewayUsername;
}

function opacMyOverdues() {
    window.location = gatewayLink + '&displayform=opac/myOverdues&database=lend&searchform=srchnull&srchad=ALIAS%20=%20' + gatewayUsername;
}

function opacMyReserves() {
    window.location = gatewayLink + '&displayform=opac/myReserves&database=waitlist&searchform=srchnull&srchad='+gatewayUsername+'.WAITINGLIST.%20OR%20(DATECHANGED%20=%20TODAY(0)%20AND%20WAITINGLIST%20CO%20'+gatewayUsername+')';
}

function opacMyLoanHistory() {
    window.location = gatewayLink + '&displayform=opac/myLoanhistory&database=lendstat&searchform=srchnull&srchad=ALIAS%20=%20' + gatewayUsername;
}

function opacMySerials() {
    window.location = gatewayLink + '&displayform=opac/myJournals&database=sched&searchform=srchnull&srchad='+gatewayUsername+'.circlist,contentspage,notify.%20or%20(DATECHANGED%20=%20TODAY(0)%20AND%20(CIRCLIST%20CO%20'+gatewayUsername+'%20OR%20CONTENTSPAGE%20CO%20'+gatewayUsername+'%20OR%20NOTIFY%20CO%20'+gatewayUsername+'))';
}

function opacMyAlerts() {
    window.location = gatewayLink + '&displayform=opac/myAlerts&database=sdi&searchform=srchnull&srchad=ALIAS%20=%20' + gatewayUsername;
}

function opacMyRequests() {
      window.location = gatewayLink + '&displayform=opac/list&database=refman&searchform=srchnull&srchad=LOGIN%20=%20' + gatewayUsername;
}

function opacReceiveRequests() {
        window.location = gatewayLink + '&displayform=opac/receiveRequests';
}

function opacLogout() {
      window.location = gatewayLink + '&displayform=opac/main&application='+gatewayApplication+'&timestamp=&noauthentication=x';
}

function opacChangePassword() {
      window.location = gatewayLink + '&displayform=opac/MyChangepassword&application='+gatewayApplication;
}

function opacLogin() {
      window.location = gatewayLink + '&displayform=opac/login';
}

function opacPubApp() {
      window.location = gatewayLink + '&displayform=ItemSubmission/main&database=lendstat&searchform=srchnull&srchad=ALIAS%20=%20' + gatewayUsername;
}


// Circulation
function circulation() {
  window.location = gatewayLink + '&displayform=circ/main';
}

function advancedOPACsearch() {
  window.location = gatewayLink + '&displayform=opac/main2';
}
function selfissue() {
  window.location = gatewayLink + '&displayform=circ/selfissue';
}
function borrowers() {
  window.location = gatewayLink + '&displayform=clients/main';
}



function reserves() {
  window.location = gatewayLink + '&displayform=reserves/main';
}
function statistics() {
  window.location = gatewayLink + '&displayform=statistics/main';
}
function charges() {
  window.location = gatewayLink + '&displayform=charges/main';
}
function overdues() {
  window.location = gatewayLink + '&displayform=overdues/main';
}
function sdi() {
  window.location = gatewayLink + '&displayform=sdi/main';
}
function lendingRules() {
  window.location = gatewayLink + '&displayform=rules/main&nowatchdog=true';
}
function classLoans() {
  window.location = gatewayLink + '&displayform=classloans/main';
}
function purgeLoanHist() {
  window.location = gatewayLink + '&displayform=circ/purgelendstat/main';
}

//Reporting
function reporting() {
  window.location = gatewayLink + '&displayform=reporting/help';
}
function ourreports() {
  window.location = gatewayLink + '&displayform=reporting/main';
}
function reports() {
  window.location = gatewayLink + '&displayform=reporting/special/main';
}
function newreport() {
  addRecordDialogEx("REPORTPARMS","reporting/add", "title", "Enter a new report title:", "");
}



// Interloans
function interloans() {
  window.location = gatewayLink + '&displayform=inln/help';
}
function inlnsupp() {
  window.location = gatewayLink + '&displayform=inln/supp';
}
function inlnreq() {
  window.location = gatewayLink + '&displayform=inln/req';
}
function inlnhist() {
  window.location = gatewayLink + '&displayform=inln/mainTable&database=inlnstat&searchform=srchnull&srchft=0';
}
function inlnodue() {
  window.location = gatewayLink + '&displayform=inln/overdue';
}
function inlnstat() {
  window.location = gatewayLink + '&displayform=inln/stat';
}

// System
function system() {
  window.location = gatewayLink + '&displayform=system/help&prevSystemForm=' + gatewayDisplayForm;
}
function registry() {
  window.location = gatewayLink + '&displayform=system/main';
}
function home() {  // Management Home
  window.location = gatewayLink + '&displayform=home';
}
function libraryHome() {  // Library Home
  window.location = gatewayLink + '&displayform=Libraryhome/main';
}
function login() {
  window.location = gatewayLink + '&application='+gatewayApplication+'&timestamp=&displayform=main&noauthentication=x';
}
function loginOpenClose() {
  window.open(gatewayLink + '&application='+gatewayApplication+'&timestamp=&displayform=main&noauthentication=x');
  window.close();
}
function loginAuthenicate() {
  window.location = gatewayLink + '&application='+gatewayApplication+'&timestamp=&displayform=main';
}

function preferences() {
  window.location = gatewayLink + '&displayform=prefs';
}

function setupParms() {
  window.location = gatewayLink + '&displayform=customParms/setupMenu';
}
function customParms() {
  window.location = gatewayLink + '&displayform=customParms/main';
}
function customForms() {
  window.location = gatewayLink + '&displayform=customForms/main';
}
function customReports() {
  window.location = gatewayLink + '&displayform=customReports/main';
}
function listFileManagement() {
  listfiles();
}
function listfiles() {
  window.location = gatewayLink + '&displayform=listfiles/main';
}
function spellDictionary() {
  window.location = gatewayLink + '&displayform=listfiles/spelldict';
}
function emailDatabase() {
  emailsView();
}

function auditTrail() { // <!-- BMS Customisation -->
  window.location = gatewayLink + '&displayform=audit/main';
}

function emailsView() {
  window.location = gatewayLink + '&displayform=email/main';
}
function bulkDeletion() {
  window.location = gatewayLink + '&displayform=bulkDeletion/deletionMain';
}

function hkeep() {
  window.location = gatewayLink + '&displayform=system/hkeep';
}
function translations() {
  translation();
}
function translation() {
  window.location = gatewayLink + '&displayform=translation/main';
}
function importmain() {
  window.location = gatewayLink + '&displayform=import/main';
}
function slkWeb() {
  inFrameLink(gatewayLink + '&displayform=slkweb');
}

// Liberty Help
function help() {
  window.location = gatewayLink + '&displayform=help/main';
}
function about() {
  window.location = gatewayLink + '&displayform=about';
}
function about2() {
  about();
}
function clientSetup() {
  window.location = gatewayLink + '&displayform=customParms/client';
}
function colourCode() {
  win=window.open(gatewayLink + '&displayform=altmenu/colours','colours','location=0,menubar=0');
  win.creator=self;
  win.focus();
}
function helpReturnCodes() {
  win=window.open(gatewayLink + '&displayform=help/returncodes','returncodes','location=0,menubar=0,scrollBars=yes');
  win.creator=self;
  win.focus();
}
function sendForHelp() {
  win=window.open(gatewayLink + '&displayform=help/sendForHelp','sendforhelp','location=0,menubar=0,scrollBars=yes');
  win.creator=self;
  win.focus();
}
function capture() {
  inFrameLink(gatewayLink + '&displayform=capture/captureHelp');
}


function gotodocno() {
  myHTML =  gatewayForm("gotoDialog") + '<br><p align=center><b> ' + trans["Enter a number between 1 and"] + gatewayDocs + ':</b>&nbsp;<input type=textbox name=docno size=5>&nbsp;<input type=submit name=go value="' + trans["Goto"] + '"></form><br><br>';
  dialogExFoc(myHTML, 400, "docno");
}


function testEmail(from,recipient) {
  myHTML =  gatewayForm("testEmail") + '<p class=title><b>' + trans["Send an email"] + '</b></p><p class=std><table>';
  myHTML += '<tr valign=top><td>' + trans["To"] + ':</td><td><input type=textbox name=ge_address size=30 value=' + recipient + '></td></tr>';
  myHTML += '<tr valign=top><td>' + trans["From"] + ':</td><td><input type=textbox name=ge_sender size=30 value=' + from + '></td></tr>';
  myHTML += '<tr valign=top><td>' + trans["Subject"] + ':</td><td><input type=textbox name=ge_subject size=30></td></tr>';
  myHTML += '<tr valign=top><td>' + trans["Content"] + ':</td><td><textarea name=ge_content rows=5 cols=40></textarea></td></tr>';
  myHTML += '<tr valign=top><td colspan=2 align=center><input type=submit value="' + trans["Send"] + '"></td></tr>';
  myHTML += '<input type=hidden name=displayform value='+gatewayDisplayForm+'>';
  myHTML += '<input type=hidden name=updateform value=sendmail>';
  myHTML += '</form></table></p><br><br>';
  dialogExFoc(myHTML, 400, "ge_address");
}



function checkDate(dateField, isExpiryDate) {
  var date = dateField.value;

  // Build date string dependent on system date format.
  if (gatewayDateFormat == "DMY") {
    D = date.substring(0,2);
    M = date.substring(3,5);
  } else if (gatewayDateFormat == "MDY") {
    M = date.substring(0,2);
    D = date.substring(3,5);
  }
  Y = date.substr(6);

  if (date == "" || (D == "00" && M == "00" && Y == "0000")) {
    dateField.value = "00/00/0000";
    return true;
  } else {


    // Tranform month into a string value for use in Date object.
    switch (M) {
      case "01":
        month = "Jan";
        break;
      case "02":
        month = "Feb";
        break;
      case "03":
        month = "Mar";
        break;
      case "04":
        month = "Apr";
        break;
      case "05":
        month = "May";
        break;
      case "06":
        month = "Jun";
        break;
      case "07":
        month = "Jul";
        break;
      case "08":
        month = "Aug";
        break;
      case "09":
        month = "Sep";
        break;
      case "10":
        month = "Oct";
        break;
      case "11":
        month = "Nov";
        break;
      case "12":
        month = "Dec";
        break;
      default:
        month = "";
    }

    // Use JavaScript Date object to validate the input date, using the calculated month string as the comparison value.
    var dateStr = (month + " " + D + ", " + Y);
    var date = new Date(dateStr);
    var date_string = date.toString();
    var date_array = date_string.split(' ');

    // Check that the returned month value is the same as the original calculated value.
    if ((date_array[1] == month) && (Y.length == 4) && !(isNaN(Y) || isNaN(D))) {

      // An expiryDate parameter value of "true" will display a warning message if date is in the past
      if (isExpiryDate.toLowerCase() == "true") {
        var now = new Date();
        if (date.getTime() < now.getTime()) {
          if (confirm("The date entered is today or in the past.  Do you wish to continue?")) {
            return true;
          } else {
            dateField.focus();
            dateField.select();
            return false;
          }
        } else {
          return true;
        }
      } else {
        return true;
      }
    } else {  // Invalid date entry
      if (gatewayDateFormat == "DMY") {
        alert(trans["DATEERR_DMY"]);
      } else if (gatewayDateFormat == "MDY") {
        alert(trans["DATEERR_MDY"]);
      } else {
        // Default date error message
        alert(trans["DATEERR"]);
      }
      dateField.focus();
      dateField.select();
      return false;
    }
  }
}


// tests if the string is too long to be a valid URL in IE
// returns true if browser is IE and URL is longer than 2083 chars
function longURL (testString) {
  if (navigator.appName.indexOf("Microsoft") != -1 && testString.length > 2083) {
    return true;
  } else {
    return false;
  }
}

function formatCentsToDollars(cents) {
  var result = "";
  if (cents.length < 2) {
    cents = "0" + cents;
  }
  if (cents.length < 3) {
    result = "0." + cents;
  }
  if (result.indexOf(".") < 0) {
    var dollars = cents.substring(0, (cents.length - 2));
    cents = cents.substr(cents.length - 2);
    result = dollars + "." + cents;
  }
  return result;
}



function menuitemcount(){
  temp = contextMenu;
  temparray = temp.split("<li");
  return temparray.length;
}


function disableLinks() {
  var allLinks = document.all.tags("A");
  for (i=0; i < allLinks.length; i++) {
    allLinks[i].href = "javascript:";
    allLinks[i].target = "";
    allLinks[i].title = trans["Hyperlinks are disabled on this page"];
  }
}


function textAreaQuotes(textAreaName, destination) {
  //Since textarea contents can have spaces in them, we need to put each line in quotes.
  var myOutput = "";
  var myArray = textAreaName.value.split("\r\n");
  for (var i = 0; i < myArray.length; i++) {
    if (myArray[i] != ""){
      if ("*" == myArray[i].charAt(myArray[i].length - 1)) {
        myOutput += '"' + myArray[i].substring(0,myArray[i].length - 1) + '"*\r\n';
      } else {
        myOutput += '"' + myArray[i] + '"\r\n';
      }
    }
  }
  destination.value = myOutput
}

var contextMenu = ""
var menuHelps = new Array();

function updateContextMenu(menuList){
  //alert(menuList);
  var menuItems = menuList.split("><menuItem ");
  var keys = new Array();
  var urls = new Array();
  var texts = new Array();

  var menuContent = "";
  for (var i = 0; i < menuItems.length; i++) {
    //alert(menuItems[i]);

    keys[i] = getParm("key", menuItems[i]);
    urls[i] = getParm("url", menuItems[i]);
    menuHelps[i] = getParm("help", menuItems[i]);
    texts[i] = underlineKeys(getParm("text", menuItems[i]));

    if (("" != urls[i]) && ("" != keys[i])) {
      if (window.addKey) {
        addKey(keys[i], urls[i]);
      }
    }
  }

  var j = 0;

  menuContent += texts[j] + '\r\n';

  j = 1;
  if ((("" != urls[j]) && ("" != texts[j])) && ((undefined != urls[j]) && (undefined != texts[j]))) {
    menuContent += '<ul style="width:200px;">\r\n';
    for (j = 1; j < texts.length; j++) {
      if ((("" != urls[j]) && ("" != texts[j])) && ((undefined != urls[j]) && (undefined != texts[j]))) {
        if(navigator.appName.indexOf("Microsoft") != -1) {
          menuContent += '<li style="padding-bottom: 2px;padding-top: 1px;" onClick="javascript:' + urls[j] + '" onMouseOver="javascript:overContext(this)" onMouseMove="javascript:menuHelp (' + j + ')" onMouseOut="javascript:outContext(this);clearHelp()">'
        } else {
          menuContent += '<li style="padding-bottom: 2px;padding-top: 1px;" onClick="javascript:' + urls[j] + '">'
        }
        menuContent += '<a style="text-decoration:none">' + texts[j] + '</a></li>\r\n';
      }
    }
    menuContent += '</ul>\r\n';
  }
  menuContent += '<br style="clear: both;">\r\n';

  contextMenu = menuContent;
}

function menuHelp (menuOption) {
  //alert(menuHelps[menuOption]);
  window.status = menuHelps[menuOption];
}

function clearHelp () {
  window.status = "";
}

function getParm(parmName, parmString) {
  var parmIndex;
  var parmEndIndex;
  var parmValue = "";

  parmIndex = parmString.indexOf(parmName + "=");
  parmIndex += parmName.length + 1
  if (-1 != parmIndex){
    if ("'" == parmString.charAt(parmIndex)) {
      parmEndIndex = parmString.indexOf("'", 1 + parmIndex);
    } else {
      parmEndIndex = parmString.indexOf(" ", parmIndex);
    }
    if (-1 == parmEndIndex) {
      parmEndIndex = parmString.indexOf("/", parmIndex);
    }
    if (-1 == parmEndIndex) {
      parmEndIndex = parmString.indexOf(">", parmIndex);
    }

    parmValue = parmString.substring((parmIndex), parmEndIndex);
    parmValue = parmValue.replace(new RegExp('\"', "g"), "")
    parmValue = parmValue.replace(new RegExp('\'', "g"), "")
  }
  return parmValue;
}

function underlineKeys(menuString) {
  var result = ""
  for (var i=0; i < menuString.length; i++) {
    if ('[' == menuString.charAt(i)){
      result += "<u>";
    } else if (']' == menuString.charAt(i)){
      result += "</u>";
    } else {
      result += menuString.charAt(i);
    }
  }
  return result;
}

function openCapture(section, id){
  var mediaWin = myOpenWindow(gatewayLink + "&displayform=capture/playForm&section=" + section + "&id=" + id,"mediaWindow","status=1,statusbar=yes,scrollBars=no,resizable=yes,toolbar=no,menubar=no,location=no,directories=no,left=40,top=50,height=400, width=700",mediaWin);
}


function navbarHelp (help) {
  window.status = help;
}



// Gateway Helpers:

function quoteConcOperators(str)
{
  if ("\"" == str.charAt(0) && "\"" == str.charAt(str.length-1)) {
  	str = str.replace(new RegExp(" ", "g"), " adj0 ");
  }
  
  return str
            .replace(new RegExp("\"", "g"), "")         // remove quotes
            .replace(/\b(and|or|not|xor|same|notsame)\b/g, "\"$1\"")
            .replace(/^\s+/g,"").replace(/\s+$/g,"");   // trim
}

function printLowerCase(str){
	document.writeln(str.toLowerCase());
}

var submitsdisabled = false;
function disableSubmits(){
	submitsdisabled = true;
	var submits = document.getElementsByName("disableonsubmit");
	for (var i = 0; i < submits.length; i++){
		submits[i].disabled=true;
	}
}