try {
  document.execCommand("BackgroundImageCache", false, true);
} catch(err) {}

function validateSearchTerm() {
	// get textfield element		
	var queryElement = document.getElementById("searchTerm");
	
	// does element exist in form?
	if(queryElement == null) {
		return false;
	}
	
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(queryElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
	}
}

function validateEisbn() {
	// get textfield element		
	var eisbnElement = document.getElementById("eisbn");
	
	// does element exist in form?
	if(eisbnElement == null) {
		return false;
	}
	
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(eisbnElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
	}
}

function validateIsbn() {
	// get textfield element		
	var isbnElement = document.getElementById("isbn");
	
	// does element exist in form?
	if(isbnElement == null) {
		return false;
	}
	
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(isbnElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
	}
}

function validateTitle() {
	// get textfield element		
	var titleElement = document.getElementById("title");
	
	// does element exist in form?
	if(titleElement == null) {
		return false;
	}
	
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(titleElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
	}
}

function validateAuthors() {
	// get textfield element		
	var authorsElement = document.getElementById("authors");
	
	// does element exist in form?
	if(authorsElement == null) {
		return false;
	}
	
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(authorsElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
	}
}

function validateLibConClass() {
	// get textfield element		
	var libConClassElement = document.getElementById("libConClass");

	// does element exist in form?
	if(libConClassElement == null) {
		return false;
	}
			
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(libConClassElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
		
	}
}

function validateDewDecClass() {
	// get textfield element		
	var dewDecClassElement = document.getElementById("dewDecClass");
	
	// does element exist in form?
	if(dewDecClassElement == null) {
		return false;
	}
	
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(dewDecClassElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
	}
}

function validateNlmClass() {
	// get textfield element		
	var nlmClassElement = document.getElementById("nlmClass");
	
	// does element exist in form?
	if(nlmClassElement == null) {
		return false;
	}
	
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(nlmClassElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
	}
}

function validateBicClass() {
	// get textfield element		
	var bicClassElement = document.getElementById("bicClass");
	
	// does element exist in form?
	if(bicClassElement == null) {
		return false;
	}
	
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(bicClassElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
	}
}

function validateUrlInfo() {
	// get textfield element		
	var urlInfoElement = document.getElementById("urlInfo");
	
	// does element exist in form?
	if(urlInfoElement == null) {
		return false;
	}
	
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(urlInfoElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
	}
}

// functions for validating drop downs

function validateDateAdded() {
	// get both date select drop downs
	var monthAddedElement = document.getElementById("monthAdded");
	var yearAddedElement = document.getElementById("yearAdded");
			
	// does element exist in form?		
	if(monthAddedElement == null) {
		return false;
	}	
				
	// return true if either year or month has been specified
				
	if(monthAddedElement.value != 0) {
		return true;
	}
	
	if(yearAddedElement.value != 0) {
		return true;
	}
	
	// neither has been specified:
	
	return false;
}

function validateDatePublished() {
	// get both date select drop downs
	var monthPublishedElement = document.getElementById("monthPublished");
	var yearPublishedElement = document.getElementById("yearPublished");
	
	// does element exist in form?			
	if(monthPublishedElement == null) {
		return false;
	}
				
	// return true if either year or month has been specified
	if(monthPublishedElement.value != 0) {
		return true;
	}
	
	if(yearPublishedElement.value != 0) {
		return true;
	}
	
	// neither has been specified:
	return false;
}

function validatePublisher() {

	var publisherElement = document.getElementById("publisher");
	
	// does element exist in form?			
	if(publisherElement == null) {
		return false;
	}			
				
	if(publisherElement.value != 0) {
		return true;
	} else {
		return false;
	}
}

function validateAll() {
	return validateSearchTerm() || validateEisbn() || validateIsbn() || validateTitle() || validateAuthors() || validateLibConClass() || validateDewDecClass() || validateNlmClass() || validateBicClass() ||validateUrlInfo() || validateDateAdded() || validateDatePublished() || validatePublisher();
}
function noEmptySimple() {
		// get textfield element		
		var queryElement = document.getElementById("searchQuery");
		var empty = new RegExp("^\\s*$");
		if(empty.test(queryElement.value)) {
			// white space or empty string
			return false;
		} else {
			// query entered
			return true;
		}
}

function noEmptyString() {
	// get textfield element		
	var queryElement = document.getElementById("dawsonQuery");
	
	var empty = new RegExp("^\\s*$");
			
	if(queryElement.value == "") {
		return false;
	} else {
		// query entered
		return true;
	}
}

function noEmptyRevision() {
		// get textfield element		
		var queryElement = document.getElementById("query");
		var empty = new RegExp("^\\s*$");
		if(empty.test(queryElement.value)) {
			// white space or empty string
			return false;
		} else {
			// query entered
			return true;
		}
}

function toggleShowTools() {
	var toolsDiv = $("Tools");
	var outerDiv = $("OuterDiv");
	var pDFDocumentBox = document.getElementById("PDFDocBox");
	var showToolsDiv = $("ShowTools");
	var hideToolsDiv = $("HideTools");
	
	var showToolsBottomDiv = $("ShowToolsBottom");
	var hideToolsBottomDiv = $("HideToolsBottom");
	
	if (toolsDiv.style.display == "") {
		toolsDiv.style.display = "none";
		outerDiv.style.marginLeft = "-6px";
		showToolsDiv.style.display = "block";
		showToolsBottomDiv.style.display = "block";
		hideToolsDiv.style.display = "none";
		hideToolsBottomDiv.style.display = "none";
	} else {
		toolsDiv.style.display = "";
		showToolsDiv.style.display = "none";
		showToolsBottomDiv.style.display = "none";
		hideToolsDiv.style.display = "block";
		hideToolsBottomDiv.style.display = "block";
		outerDiv.style.marginLeft = "168px";
	}
	return false;
}


function calculateWidth(toolsShowing) {
	var widthStr;
	var agent = navigator.userAgent.toLowerCase();
	if(window.innerWidth) {
		if (toolsShowing) {
			widthStr = Math.ceil(window.innerWidth * 0.65) + "px";
		} else {
			widthStr = Math.ceil(window.innerWidth * 0.95) + "px";
		} 
	} else if (document.body.clientWidth) {
		if (toolsShowing) {
			widthStr = Math.ceil(document.documentElement.clientWidth * 0.65) + "px";
		} else {
			widthStr = Math.ceil(document.documentElement.clientWidth * 0.96) + "px";
		}
	}
	return widthStr;
}

function validateSearchTerm() {
	// get textfield element		
	var queryElement = document.getElementById("searchTerm");
	
	// does element exist in form?
	if(queryElement == null) {
		return false;
	}
	
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(queryElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
	}
}

function validateEisbn() {
	// get textfield element		
	var eisbnElement = document.getElementById("eisbn");
	
	// does element exist in form?
	if(eisbnElement == null) {
		return false;
	}
	
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(eisbnElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
	}
}

function validateIsbn() {
	// get textfield element		
	var isbnElement = document.getElementById("isbn");
	
	// does element exist in form?
	if(isbnElement == null) {
		return false;
	}
	
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(isbnElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
	}
}

function validateTitle() {
	// get textfield element		
	var titleElement = document.getElementById("title");
	
	// does element exist in form?
	if(titleElement == null) {
		return false;
	}
	
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(titleElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
	}
}

function validateAuthors() {
	// get textfield element		
	var authorsElement = document.getElementById("authors");
	
	// does element exist in form?
	if(authorsElement == null) {
		return false;
	}
	
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(authorsElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
	}
}

function validateLibConClass() {
	// get textfield element		
	var libConClassElement = document.getElementById("libConClass");

	// does element exist in form?
	if(libConClassElement == null) {
		return false;
	}
			
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(libConClassElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
		
	}
}

function validateDewDecClass() {
	// get textfield element		
	var dewDecClassElement = document.getElementById("dewDecClass");
	
	// does element exist in form?
	if(dewDecClassElement == null) {
		return false;
	}
	
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(dewDecClassElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
	}
}

function validateUrlInfo() {
	// get textfield element		
	var urlInfoElement = document.getElementById("urlInfo");
	
	// does element exist in form?
	if(urlInfoElement == null) {
		return false;
	}
	
	var empty = new RegExp("^\\s*$");
			
	if(empty.test(urlInfoElement.value)) {
		// white space or empty string
		return false;
	} else {
		// query entered
		return true;
	}
}

// functions for validating drop downs

function validateDateAdded() {
	// get both date select drop downs
	var monthAddedElement = document.getElementById("monthAdded");
	var yearAddedElement = document.getElementById("yearAdded");
			
	// does element exist in form?		
	if(monthAddedElement == null) {
		return false;
	}	
				
	// return true if either year or month has been specified
				
	if(monthAddedElement.value != 0) {
		return true;
	}
	
	if(yearAddedElement.value != 0) {
		return true;
	}
	
	// neither has been specified:
	
	return false;
}

function validateDatePublished() {
	// get both date select drop downs
	var monthPublishedElement = document.getElementById("monthPublished");
	var yearPublishedElement = document.getElementById("yearPublished");
	
	// does element exist in form?			
	if(monthPublishedElement == null) {
		return false;
	}
				
	// return true if either year or month has been specified
	if(monthPublishedElement.value != 0) {
		return true;
	}
	
	if(yearPublishedElement.value != 0) {
		return true;
	}
	
	// neither has been specified:
	return false;
}

function validatePublisher() {

	var publisherElement = document.getElementById("publisher");
	
	// does element exist in form?			
	if(publisherElement == null) {
		return false;
	}			
				
	if(publisherElement.value != 0) {
		return true;
	} else {
		return false;
	}
}
				
function validateAll() {
	return validateSearchTerm() || validateEisbn() || validateIsbn() || validateTitle() || validateAuthors() || validateLibConClass() || validateDewDecClass() || validateUrlInfo() || validateDateAdded() || validateDatePublished() || validatePublisher();
}

function pdfPageSearch(adminOrReader) {
	var searchTable = $("searchTable");
	searchTable.style.display = "block";
	var eisbn = document.getElementById("pdfPageEisbn");
	var eisbnVal;
	if (eisbn.value) {
		eisbnVal = getTapestryParameter(eisbn.value);
	}
	var request = new Object();
	var query = document.getElementById("searchPDFQuery");
	var pattern = /^\s*$/;
	if (!query || pattern.test(query.value)) {
		return false;
	}
	
	request.eisbn = eisbnVal;
	request.query = query.value;
	
	var callBack = function(data) {

		DWRUtil.removeAllRows("searchBody");
		
		var searchQuery = data.query;
		var escapedQuery;
		var offset = $('pdfPageOffset').value;
		
		if (searchQuery) {
			escapedQuery = searchQuery.replace(/['"]/g, "");
		}
		
		var cellFuncs = [
		  function(result) {
		  pageDisplayNo = parseInt(result.pageNumber) - parseInt(offset);
		  if (pageDisplayNo < 1) {
		  	pageDisplayNo = "Prelim.";
		  }
		  return "<a href=\"#\" onclick=\"return updateSearchLink(" + result.pageNumber + ",'" + escapedQuery + "','" + adminOrReader + "')\"" + ">" + pageDisplayNo + "</a>"; 
		  },
		  function(result) { return "<a href=\"#\" onclick=\"return updateSearchLink(" + result.pageNumber + ",'" + escapedQuery + "','" + adminOrReader + "')\"" + ">" + result.percentageScore + "</a>"; }
		  ];
		var count = 0;
		DWRUtil.addRows("searchBody", data.results, cellFuncs);
	}
	
	PdfPageAjaxSearch.doSearch(request, callBack);
	return false;
}

function pdfEmbed(index, adminOrReader, eisbn, pageNumber) {
	var zoomVal = DWRUtil.getValue("zoomOptions");
	var url;
	if (adminOrReader == 'reader') {
		url = "/depp/reader/protected/pdfpage/";
	} else {
		url = "/depp/admin/protected/pdfpage/";	
	}
	
	updateIFrameSrc(url + index + "/" + Math.floor(Math.random() * 1000001) + "?" + zoomVal +  "#toolbar=0&statusbar=0&scrollbar=0&messages=0&navpanes=0&" + zoomVal);
	updatePrintCopyEnabled(eisbn, pageNumber, adminOrReader);
}

function updatePrintCopyEnabled(isbn, pageNumber, adminOrReader) {
	var copyCallBack = function(data) {
		if (data == true) {
			/* page already copy enabled so disable button */
			setCopyButtonDisabled();
		} else {
			setCopyButtonEnabled();
		}
	};
	
	var printCallBack = function(data) {
		if (data == true) {
			/* page already print enabled so disable button */
			setPrintButtonDisabled();
		} else {
			setPrintButtonEnabled();
		}
	};
	
	AjaxUpdatePdfPageNumber.isPageCopyEnabled(isbn, pageNumber, adminOrReader, copyCallBack);
	AjaxUpdatePdfPageNumber.isPagePrintEnabled(isbn, pageNumber, adminOrReader, printCallBack);
}

function pdfSearchEmbed(index, pageNumber, eisbn, query, adminOrReader) {

	var hostname = location.hostname;
	var port = location.port;
	
	if(port && port != "") {
		hostname = hostname + ":" + port;
	}
	var zoomVal = DWRUtil.getValue("zoomOptions");
	
	var url;
	if (adminOrReader == 'reader') {
		url = "/depp/reader/protected/pdfpage/";
	} else {
		url = "/depp/admin/protected/pdfpage/";
	}
	updateIFrameSrc(url + index + "/pdfpage.pdf?toolbar=0&statusbar=0&scrollbar=0&messages=0&navpanes=0&" + zoomVal + "#xml=http://" + hostname + "/depp/highlighter?e="+eisbn+"&pg="+pageNumber+"&q="+query);
	updatePrintCopyEnabled(eisbn, pageNumber, adminOrReader);

	
}


function setUpNotesLinks(adminOrReader) {
	var eisbn = getTapestryParameter(DWRUtil.getValue("pdfPageEisbn"));
	var userId = getTapestryParameter(DWRUtil.getValue("userId"));
	var offset = $('pdfPageOffset').value;
	var noFunc = [function(data) { return data; }];
	var linkFunc = [function(data) {
		var displayNo = (data - offset);
		if (displayNo < 1) {
			displayNo = "prelim."
		} 
		return '<a href=\"#\" onclick=\"return updatePdfPageNumber(' + data + ', true, \'' + adminOrReader + '\')\">note on page ' + displayNo + '</a>'; 
		}];  
	var callBack = function(data) {
		var theDiv = $('notesLinks');
		DWRUtil.removeAllRows('notesLinks');
		if (data.length < 1) {
			DWRUtil.addRows('notesLinks', ['You have no notes for this title'], noFunc);
		} else {
			DWRUtil.addRows('notesLinks', data, linkFunc);
		}
	};
	NotesUpdater.getAllNotes(userId, eisbn,callBack);
}

function setStateOfNavigationControls(pageNumber, pageCount) {
	var first = $("FirstLink");
	var previous = $("PreviousLink");
	var next = $("NextLink");
	var last = $("LastLink");
	
	var firstBottom = $("FirstLinkBottom");
	var previousBottom = $("PreviousLinkBottom");
	var nextBottom = $("NextLinkBottom");
	var lastBottom = $("LastLinkBottom");
	
	if (pageNumber == 1) {
		first.className = "off";
		firstBottom.className = "off";
		previous.className = "off";
		previousBottom.className = "off";
		last.className = "on";
		lastBottom.className = "on";
		next.className = "on";
		nextBottom.className = "on";
	} else if (pageNumber == pageCount) {
		last.className = "off";
		lastBottom.className = "off";
		next.className = "off";
		nextBottom.className = "off";
		first.className = "on";
		firstBottom.className = "on";
		previous.className = "on";
		previousBottom.className = "on";
	} else {
		last.className = "on";
		lastBottom.className = "on";
		next.className = "on";
		nextBottom.className = "on";
		first.className = "on";
		firstBottom.className = "on";
		previous.className = "on";
		previousBottom.className = "on";
	}
	return false;
}

var firstTitle = null;
var previousTitle = null;
var nextTitle = null;
var lastTitle = null;
var firstBottomTitle = null;
var previousBottomTitle = null;
var nextBottomTitle = null;
var lastBottomTitle = null;



function disableNavigation(){
	var first = $("FirstLink");
	var previous = $("PreviousLink");
	var next = $("NextLink");
	var last = $("LastLink");
	
	var firstBottom = $("FirstLinkBottom");
	var previousBottom = $("PreviousLinkBottom");
	var nextBottom = $("NextLinkBottom");
	var lastBottom = $("LastLinkBottom");
	
	if (nextTitle === null){
		firstTitle = first.title;
		previousTitle = previous.title ;
		nextTitle = next.title;
		lastTitle = last.title;
		firstBottomTitle = firstBottom.title;
		previousBottomTitle = previousBottom.title;
		nextBottomTitle = nextBottom.title;
		lastBottomTitle = lastBottom.title;
	}
	
	first.className = "off";
	firstBottom.className = "off";
	previous.className = "off";
	previousBottom.className = "off";
	last.className = "off";
	lastBottom.className = "off";
	next.className = "off";
	nextBottom.className = "off";
	
	first.title = firstBottom.title = previous.title = previousBottom.title = last.title = lastBottom.title = next.title = nextBottom.title = "Please wait loading..."; 
}

function enableNavigation(){
	var first = $("FirstLink");
	var previous = $("PreviousLink");
	var next = $("NextLink");
	var last = $("LastLink");
	
	var firstBottom = $("FirstLinkBottom");
	var previousBottom = $("PreviousLinkBottom");
	var nextBottom = $("NextLinkBottom");
	var lastBottom = $("LastLinkBottom");
	
	first.className = "on";
	firstBottom.className = "on";
	previous.className = "on";
	previousBottom.className = "on";
	last.className = "on";
	lastBottom.className = "on";
	next.className = "on";
	nextBottom.className = "on";

	if (nextTitle !== null){
		previous.title = previousTitle;
		first.title = firstTitle;
		firstBottom.title = firstBottomTitle;
		previousBottom.title = previousBottomTitle;
		last.title = lastTitle;
		lastBottom.title = lastBottomTitle;
		next.title = nextTitle;
		nextBottom.title = nextBottomTitle;
	}
	
}

function handleExpiry() {
	var canOfferAP = DWRUtil.getValue("offerAP");
	if (canOfferAP == "true") {
		ebookAutoPurchaseOrExpireModalWindow();
	} else {
		var abstractViewAddress = $('abstractViewString').value;
		window.location = abstractViewAddress.substr(1) + "/expired";
	}
}

function updatePdfPageNumber(pageNumber, redisplayPdf, adminOrReader) {
	if (!isPdfSupported()) {
		setUnavailable();
		return false;
	}
	var pageCount = $('pdfPageCount');
	if (pageCount != null) {
		pageCount = parseInt(pageCount.value);
	}
	var offset = $('pdfPageOffset');
	
	if (offset != null) {
		offset = $('pdfPageOffset').value;
	}
	
	var callBack = function(data) {
		var displayPageNo = (pageNumber - parseInt(offset));
		if (displayPageNo < 1) {
			displayPageNo = '-';
		}
		if (data == -1) {
			handleExpiry();
		} else if (data == -2) {
			readOnlineModalWindow();
			$('currentPdfPage').value = $('previousPdfPage').value;
			var tmpPageNo = $('currentPdfPage');
			setStateOfNavigationControls(getTapestryParameter(tmpPageNo.value), pageCount);
		} else if (data == -3) {
			/* abuse detected, show modal window containing reCAPTCHA */
			captchaModalWindow();
		} else {
			if(redisplayPdf) {
				pdfEmbed(data, adminOrReader, eisbn, pageNumber);
			}
			// Set text in jump to box
			$('pageLabel').innerHTML = displayPageNo + ' of ' + (pageCount - parseInt(offset));
			$('pageLabelBottom').innerHTML = displayPageNo + ' of ' + (pageCount - offset);
		}
	};
	var eisbn = getTapestryParameter(DWRUtil.getValue("pdfPageEisbn"));
	var userId = getTapestryParameter(DWRUtil.getValue("userId"));
	// work out if active loan, preview, or rental
	
	var rental;
	var preview;

	if (adminOrReader == 'reader') {	
		rental = $('rental').value;
		preview = $('preview').value;
	} else {
		rental = "false";
		preview = "true";
	}
	
	AjaxUpdatePdfPageNumber.getAjaxUpdatePageIndex(eisbn, pageNumber, rental, preview, adminOrReader, callBack);
	$('previousPdfPage').value = $('currentPdfPage').value;
	$('currentPdfPage').value = pageNumber;
	
	var notes = dojo.widget.byId("noteArea");
	if (notes != null) {
		var updateNotes = function(data) {
			var noteArea = dojo.widget.byId("noteArea");
			noteArea.setText(data);
		};
		NotesUpdater.getNote(userId, eisbn, pageNumber, updateNotes);
	}
	
	setStateOfNavigationControls(pageNumber, pageCount);
	return false;
}

var navigating = false;
var showCaptcha = false;
var blankingOut = false;
function navigatePdf(forwardOrBack, adminOrReader) {
	if (navigating == true) {
		disableNavigation();
		return false;
	} else {
		navigating = true;
		var tmpPageNo = $('currentPdfPage');
		var tmpPageCount = $('pdfPageCount');
		
		var pageNumber = null;
		var pageCount = null;
		
		if (tmpPageNo != null) {
			pageNumber = parseInt(getTapestryParameter(tmpPageNo.value));
			
		}
		
		if (tmpPageCount != null) {
			pageCount = parseInt(getTapestryParameter(tmpPageCount.value));
		}
		
		if (pageNumber == null || pageCount == null) {
			throw new Exception("Error: Cannot load page");
		}
		
		
		if (forwardOrBack == "forward") {
			if (pageNumber < pageCount) {
				pageNumber++;
			}
		} else if (forwardOrBack == "back") {
			if (pageNumber > 1) {
				pageNumber--;
			}
		} else if (forwardOrBack == "last") {
			if (pageNumber < pageCount) {
				pageNumber = pageCount;
			}
		} else if (forwardOrBack == "first") {
			if (pageNumber > 1) {
				pageNumber = 1;
			}
		}
		updatePdfPageNumber(pageNumber, true, adminOrReader);
		return false;
	}
}

function jumpToPdfPage(adminOrReader) {
	var offset = $('pdfPageOffset').value;
	var original = $('originalJumpToPage').value;
	var input = $('jumpToPage').value;
	var result = input.match(/-?\d+/);
	if(result == null){
		alert("There is no page " + input + " in this document.");
		$('jumpToPage').select();
	}
	else{
		var pageNo = parseInt(result[0], 10);
		var pageCount =  parseInt(getTapestryParameter(DWRUtil.getValue("pdfPageCount")));
		if(pageNo > (pageCount - parseInt(offset)) || pageNo < 1){
			alert("There is no page " + pageNo + " in this document.");
			$('jumpToPage').select();
		} else {
			var jumpToPageNo = parseInt(pageNo) +  parseInt(offset);
			updatePdfPageNumber(jumpToPageNo , true, adminOrReader);
			$('jumpToPage').blur();
		}
	}
}

function jumpToPdfPageTop(adminOrReader) {
	var jumpToPageBottom = $('jumpToPageBottom');
	var jumpToPageTop = $('jumpToPage');
	jumpToPageBottom.value = jumpToPageTop.value;
	jumpToPdfPage(adminOrReader);
}

function jumpToPdfPageBottom(adminOrReader) {
	var jumpToPageBottom = $('jumpToPageBottom');
	var jumpToPageTop = $('jumpToPage');
	jumpToPageTop.value = jumpToPageBottom.value;
	jumpToPdfPage(adminOrReader);
}

function jumpToFocus(){
	$('jumpToPage').select();
}

function ajaxUpdateUnprotectedPdf(protection) {
	var pageNumber = parseInt(getTapestryParameter(DWRUtil.getValue("currentPdfPage")));
	var pageCount =  parseInt(getTapestryParameter(DWRUtil.getValue("pdfPageCount")));
	
	var printButtonLink = $("printButtonLink");
	var copyButtonLink = $("copyButtonLink");
	
	var callBack = function(data) {
	
		var copiesLeft = parseInt(DWRUtil.getValue("copiesLeft"));
		var printsLeft = parseInt(DWRUtil.getValue("printsLeft"));
	
		if (data == -1) {
			handleExpiry();
		} else {
			// must be reader portal for print / copy enabled pages
			pdfEmbed(data, "reader", eisbn, pageNumber);
			if (protection == "print") {
				if (printsLeft > 0) {
					DWRUtil.setValue("printsLeft", --printsLeft);
					window.alert("The print dialogue should appear automatically once you have clicked on OK below.\r\nIf the print dialogue box does not appear, please right-click on the PDF area on the screen and select \"Print\"\r\n");
				}
			} else if (protection == "copy") {
				if (copiesLeft > 0) {
					DWRUtil.setValue("copiesLeft", --copiesLeft);
				}
			}
		}
	}
	var eisbn = getTapestryParameter($("pdfPageEisbn").value);
	
	// work out if active loan, preview, or rental
	var rental = DWRUtil.getValue("rental");
		var preview = DWRUtil.getValue("preview");
	AjaxUpdatePdfPageNumber.getAjaxUpdateProtectedPageIndex(eisbn, pageNumber, protection, rental, preview, callBack);
	

	return false;
}

function setCopyButtonEnabled() {
	var copyButtonLink = $("copyButtonLink");
	if (!copyButtonLink) {
		return;
	}
	var copiesLeft = parseInt(DWRUtil.getValue("copiesLeft"));
	if (copiesLeft > 0) {
		copyButtonLink.style.display = "";
		DWRUtil.setValue("copyButtonText", "To enable this page to be copied, click the OK button and copy the text you require.");
	} else {
		copyButtonLink.style.display = "none";
		DWRUtil.setValue("copyButtonText", "You have no copy credits left for this title.");
	}
}

function setPrintButtonEnabled() {
	var printButtonLink = $("printButtonLink");
	if (!printButtonLink) {
		return;
	}
	var printsLeft = parseInt(DWRUtil.getValue("printsLeft"));
	if (printsLeft > 0) {
		var printButtonLink = $("printButtonLink");
		printButtonLink.style.display = "";
		DWRUtil.setValue("printButtonText", "To enable this page to be printed, click the OK button and wait for the print dialog to be displayed.");
	} else {
		DWRUtil.setValue("printButtonText", "You have no print credits left for this title");
	}
}

function setCopyButtonDisabled() {
	var copyButtonLink = $("copyButtonLink");
	if (!copyButtonLink) {
		return;
	}
	copyButtonLink.style.display = "none";
	DWRUtil.setValue("copyButtonText", "You may now copy this page");
}

function setPrintButtonDisabled() {
	var printButtonLink = $("printButtonLink");
	if (!printButtonLink) {
		return;
	}
	printButtonLink.style.display = "none";
	DWRUtil.setValue("printButtonText", "You may now print this page");
}

function updateSearchLink(pageNumber, query, adminOrReader) {
	var pageCount =  parseInt(getTapestryParameter(DWRUtil.getValue("pdfPageCount")));
	var eisbn = getTapestryParameter($("pdfPageEisbn").value);

	var callBack = function(data) {
		if (data == -1) {
			handleExpiry();
		} else if (data != -2) { // avoid case where preview is blocked
			pdfSearchEmbed(data, pageNumber, eisbn, query, adminOrReader);
		}
	}

	if (adminOrReader == 'reader') {
		// work out if active loan, preview, or rental
		var rental = DWRUtil.getValue("rental");
		var preview = DWRUtil.getValue("preview");
		AjaxUpdatePdfPageNumber.getAjaxUpdatePageIndex(eisbn, pageNumber, rental, preview, adminOrReader, callBack);
	} else {
		AjaxUpdatePdfPageNumber.getAjaxUpdatePageIndex(eisbn, pageNumber, "false", "true", adminOrReader, callBack);
	}
	updatePdfPageNumber(pageNumber, false, adminOrReader);
	return false;
}

function getTapestryParameter(param) {
	if (param.indexOf("S") > -1) {
		param = param.substring(1);
	}
	return param;
}

function resizePdfIFrame(){
	var heightStr;
	var widthStr;
	var agent = navigator.userAgent.toLowerCase();
	if(window.innerHeight) {
		heightStr = Math.ceil(window.innerHeight * 1.75) + "px";
	} else if (document.body.clientHeight) {
		if (agent.indexOf('msie 7.0') != -1) {
			heightStr = Math.ceil(document.documentElement.clientHeight * 1.75) + "px";
		} else {
			heightStr = Math.ceil(document.documentElement.clientHeight * 1.55) + "px";
		}
	}
	var pdfDoc = document.getElementById("PdfDoc");
	
	if (heightStr) {
		pdfDoc.style.height = heightStr;
	}
	
	if (pdfDoc.style.width != "99%" && pdfDoc.style.width != "") {
		// width needs updating
		var toolsDiv = $("accordionDiv");
		pdfDoc.style.width = calculateWidth(toolsDiv.style.display == "");
	}
}

function resizeTools() {
	var heightStr = 250;
	var agent = navigator.userAgent.toLowerCase();
	if(window.innerHeight) {
		heightStr = Math.ceil(window.innerHeight * 0.8);
	} else if (document.documentElement.clientHeight) {
		if (agent.indexOf('msie 7.0') != -1) {
			heightStr = Math.ceil(document.documentElement.clientHeight * 0.8);
		} else {
			heightStr = Math.ceil(document.documentElement.clientHeight * 0.65);
		}
	}
	return (heightStr - 138);
}

function updateNoPerPage() {
	var saveToFile = document.getElementById("saveToFile");
	var noPerPage = document.getElementById("noPerPage");
	if (saveToFile.checked) {
		noPerPage.style.display = "none";
	} else {
		noPerPage.style.display = "block";
	}
	
	return true;
}

function zoomPdf(adminOrReader) {
	var eisbn = getTapestryParameter(DWRUtil.getValue("pdfPageEisbn"));
	var userId = getTapestryParameter(DWRUtil.getValue("userId"));
	var pageNumber = DWRUtil.getValue("currentPdfPage");
	
	var rental;
	var preview;
	
	if (adminOrReader == 'reader') {
		rental = DWRUtil.getValue("rental");
		preview = DWRUtil.getValue("preview");
	} else {
		rental = "false";
		preview = "true";
	}
	
	var callBack = function(data) {
		pdfEmbed(data, adminOrReader, eisbn, pageNumber);
	};
	AjaxUpdatePdfPageNumber.getAjaxUpdatePageIndex(eisbn, pageNumber, rental, preview, adminOrReader, callBack);
	
	return false;
}

function zoomPdfBottom(adminOrReader) {
	var zoomOptionsBottom = $('zoomOptionsBottom');
	var zoomOptions = $('zoomOptions');
	zoomOptions.value = zoomOptionsBottom.value;
	zoomPdf(adminOrReader);
}

function zoomPdfTop(adminOrReader) {
	var zoomOptionsBottom = $('zoomOptionsBottom');
	var zoomOptions = $('zoomOptions');
	zoomOptionsBottom.value = zoomOptions.value;
	zoomPdf(adminOrReader);
}

function setPdfZoom(zoomLevel) {
	var zoomOptions = $('zoomOptions');
	zoomOptions.value = zoomLevel;
}

var returnSrc;
function updateReturnSrc() {
	if (showCaptcha == false) {
		if (navigator.userAgent.indexOf("MSIE") > -1 && !window.opera) {
			try{
				returnSrc = document.getElementById("PdfDoc").src;
			}
			catch(e)
			{
				returnSrc = document.frames('PdfDoc').location.href;
			}
		} else {
			returnSrc = $('PdfDoc').src;
		}
	}
}

function readOnlineModalWindow() {
	updateReturnSrc();
	blankingOut = true;
	updateIFrameSrc("/depp/ModalWindowBackground.html");

	var html = "<div class=\"modal_window_content\"><div>Preview is limited to the first 50 physical pages</div>";
	html += "<div class=\"modal_window_buttons\"><input valign=\"bottom\" type=\"image\" src=\"../../images/ok.gif\" onClick=\"updateIFrameSrc('" + returnSrc + "'); closeModalWindow(); return false;\" /></div></form></div>";
	modalWindow(html, 300, 100);
}

function ebookAutoPurchaseModalWindow() {
	updateReturnSrc();
	blankingOut = true;
	updateIFrameSrc("/depp/ModalWindowBackground.html");

	var html = "<div class=\"modal_window_content\"><div class='infringement_message'><h1>Title purchased!</h1><p></p><p>This title has been automatically purchased for your institution. You now have full access to this book.</p></div>";
	html += "<div class=\"modal_window_buttons\"><input valign=\"bottom\" type=\"image\" src=\"../../images/ok.gif\" onClick=\"updateIFrameSrc('" + returnSrc + "'); closeModalWindow(); return false;\" /></div></form></div>";
	modalWindow(html, 450, 200);
}

function ebookAutoPurchaseOrExpireModalWindow() {
	updateReturnSrc();
	blankingOut = true;
	updateIFrameSrc("/depp/ModalWindowBackground.html");
	var html = $("offer_purchase_dialog_content").innerHTML;
	html = html.replace("pagePlaceholder", $("previousPdfPage").value);
	modalWindow(html, 450, 200);
}

function captchaModalWindow() {
	updateReturnSrc();
	showCaptcha = true;
	blankingOut = true;
	updateIFrameSrc("/depp/ModalWindowBackground.html");

	var html = "<div class=\"modal_window_content\"><form method=\"POST\" action=\"\" onsubmit=\"validateReCaptcha(); return false;\"><div class=\"infringement_message\"><h1>WARNING</h1><p>Dawsonera has detected that you may be in breach of the terms and conditions due to a high rate of page requests. If you are intending to try and copy or distribute this content it is illegal and you must desist immediately.</p><p>Your institutional administrator has been notified.</p><p>In order to continue, please enter the code shown below.</p></div>";
	html += "<div id=\"recaptcha_div\"></div>";
	html += "<div class=\"modal_window_buttons\"><form><input type=\"hidden\" value=\"" + returnSrc + "\" id=\"returnPage\" /><input valign=\"bottom\" type=\"image\" src=\"../../images/ok.gif\" onClick=\"validateReCaptcha(); return false;\"/></div>";
	modalWindow(html, 600, 400);
	addCaptchaToModalWindow();
}

function showIPAccessModalWindow(dest) {
	var html = "<div class='modal_window_content'><div class='infringement_message'><h1>Log in to use personalised features</h1><p></p><p>To continue with this action please sign in below or create an account <a href='/depp/reader/protected/CreateUser.html?dest=" + dest + "'>here</a>.</p></div>";
	html += "<p>Athens users <a href='/depp/athens/?url=" + dest + "'>log in here</a>.</p><p>Shibboleth users <a href='/depp/shibboleth/ShibbolethLogin.html?dest=" + escape(dest) + "'>log in here</a>.</p><p>OR</p>";
	html += "<form method='post' action='/depp/reader/ReaderUserPassLogin/?dest=" + dest + "' name='smallform' class='loginform' title='Direct Form'>"; 
	html += "<div id='modal-login-div'><table id='login-table'><tr><td align='right'><label for='username'>Username </label></td><td align='left'><input id='username' type='text' name='username' value=''/></td></tr><tr><td align='right'><label for='password'>Password </label></td><td align='left'><input id='password' type='password' name='password' value=''/></td></tr></table></div>";
	html +="<div class='modal_window_buttons'><input id='modal-login' type='image' title='Login' src='../../images/small_login.gif'/><input id='modal-cancel' title='Cancel' type='image' src='../../images/cancel-login.gif' onclick='closeModalWindow(); return false;'/></div>";
	modalWindow(html, 600, 370);
}

function showIPAccessModalWindowOnEbookView(dest) {
	updateReturnSrc();
	updateIFrameSrc("/depp/ModalWindowBackground.html");
	var html = "<div class='modal_window_content'><div class='infringement_message'><h1>Log in to use personalised features</h1><p></p><p>To continue with this action please sign in below or create an account <a href='/depp/reader/protected/CreateUser.html?dest=" + dest + "'>here</a>.</p></div>";
	html += "<p>Athens users <a href='/depp/athens/?url=" + dest + "'>log in here</a>.</p><p>Shibboleth users <a href='/depp/shibboleth/ShibbolethLogin.html?dest=" + escape(dest) + "'>log in here</a>.</p><p>OR</p>";
	html += "<form method='post' action='/depp/reader/ReaderUserPassLogin/?dest=" + dest + "' name='smallform' class='loginform' title='Direct Form'>"; 
	html += "<div id='modal-login-div'><table id='login-table'><tr><td align='right'><label for='username'>Username </label></td><td align='left'><input id='username' type='text' name='username' value=''/></td></tr><tr><td align='right'><label for='password'>Password </label></td><td align='left'><input id='password' type='password' name='password' value=''/></td></tr></table></div>";
	html +="<div class='modal_window_buttons'><input id='modal-login' type='image' title='Login' src='../../images/small_login.gif'/><input id='modal-cancel' title='Cancel' type='image' src='../../images/cancel-login.gif' onclick='resetIframeSrcAndCloseModalWindow(); return false;'/></div>";
	modalWindow(html, 600, 370);
}

function showIPAccessModalWindowForEbookFunctions(ebookViewDest) {
	var tmpPageNo = $('currentPdfPage');
	var pageNumber = parseInt(getTapestryParameter(tmpPageNo.value));
	ebookViewDest += "/S" + pageNumber;
	showIPAccessModalWindowOnEbookView(ebookViewDest);
}

function addCaptchaToModalWindow() {
	var publicKey = $('reCaptchaPublicKey').value;
	Recaptcha.create(publicKey, "recaptcha_div", { theme: "clean", callback: Recaptcha.focus_response_field });
}

function resetIframeSrcAndCloseModalWindow() {
	updateIFrameSrc(returnSrc);
	closeModalWindow();
}

function modalWindow(html, dialogWidth, dialogHeight) {
	Dialog.info(html, {width:dialogWidth, height:dialogHeight, destroyOnClose:true});
}

function closeModalWindow() {
	Dialog.closeInfo();
}

function iframeOnload() {
	if (blankingOut == true) {
		blankingOut = false;
		return true;
	}
	
	if (showCaptcha == true) {
		/* user trying to navigate to different page after recaptcha displayed */
        Recaptcha.destroy();
        closeModalWindow();
        captchaModalWindow();
    } else {
    	navigating = false;
    	enableNavigation();
    }
    return true;
}

function updateIFrameSrc(newSrc) {
	if (isPdfSupported()) {
		if (navigator.userAgent.indexOf("MSIE") > -1 && !window.opera) {
			//If this first option fails(this is new for IE9) then reverts back to the old method.
			try{
				document.getElementById("PdfDoc").src = newSrc;
			}
			catch(e)
			{
				document.frames('PdfDoc').location.href = newSrc;
			}
		} else {
			$('PdfDoc').src = newSrc;
		}
	} else {
		setUnavailable();
	}
}

function isPdfSupported() {
	// Change this back to re-enable PDF plugin detection 
	var found = true;
	try {
		(new ActiveXObject("AcroPDF.PDF") || new ActiveXObject("PDF.PdfCtrl"));
		found = true;
	} catch(e) {
		if (navigator.platform.indexOf("Mac") >= 0 && navigator.userAgent.indexOf("Safari") >= 0) {
			found = true;
		} else {
			for(i=0; i<navigator.mimeTypes.length; i++) {
				var it = navigator.mimeTypes[i];
				if (it.suffixes.match(/pdf/gim)) {
	                found = true;
	            }
			}
		}
	}
    return found;
}

function setUnavailable() {
	$('PDFNavigation').remove();
	$('PDFNavigationBottom').remove();
	$('RoWrapper').update("<p>Your browser does not support showing PDF content. Please visit the <a href=\"http://get.adobe.com/uk/reader/\">Abobe Reader</a> website to install it.</p>");
}

function suggestionCallback(data) {
    if (data.length > 0) {
        var inner = '<table><thead><tr><th>Date requested</th><th>Requester email</th><th>Comments</th></tr></thead><tbody>';
        
        if (data.length > 0) {
        	for (i=0;i<data.length;i++) {
        		if (data[i].hidden==true) {
        			inner += '<tr class="prevDeleted">';
        		}
        		else {
        			inner += '<tr>';
        		}
                inner += '<td>' + data[i].dateSuggested + '</td><td><a href="mailto:' + data[i].email + '">' + data[i].email + '</a></td><td>' + data[i].comment + '</td></tr>';
            }
        } else {
        	inner += '<tr>td colspan="3">Error retriving data.</td></tr>';
        }
        inner += '</tbody></table>';
        
        // Use jQuery via jQuery(...) to avoid conflict with DWR
        jQuery('#suggestion-details').html(inner);
    }
}

