CINXE.COM
My Bookshelf
<!DOCTYPE html> <html lang="en"> <head> <!-- cookie consent code --> <link rel="stylesheet" type="text/css" href="https://www.ams.org/css/cookieconsent.min.css" /> <script src="https://www.ams.org/js/cookieconsent.min.js"></script> <script> window.addEventListener("load", function () { window.cookieconsent.initialise({ "palette": { "popup": { "background": "#edeff5", "text": "#000000" }, "button": { "background": "#4b81e8" } }, "theme": "classic", "position": "bottom-right", "content": { "message": "This website uses cookies to ensure you get the best experience on our website.", "href": "https://www.ams.org/privacy", "dismiss": "Okay", "link": "Learn more about our privacy policy" } }) }); </script> <!-- end cookie consent code --> <!-- Google tag (gtag.js) --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-26G4XFTR63"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-26G4XFTR63'); </script> <!-- Google Tag Manager --> <script> (function (w, d, s, l, i) { w[l] = w[l] || []; w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' }); var f = d.getElementsByTagName(s)[0], j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f); })(window, document, 'script', 'dataLayer', 'GTM-P3772VN');</script> <!-- End Google Tag Manager --> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1" /> <title>My Bookshelf</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=la2wBcwNrtsWnRcKs9-t6qPZCC77Hs6CAduqGL_rRNM" /> <link rel="stylesheet" href="/AMS.Bookstore.Web.styles.css?v=mEUDLZZE54KYSwZwWfP3PP5vkomreysVvvDaU6mwQPY" /> <link rel="stylesheet" href="/css/modal.css?v=jRvw7By4TNDoJZ_KpsQbElRYsNpbzhWunAP5-eocRzk" /> <link rel="stylesheet" href="/css/loadingPanel.css?v=lBJGOYH_EIEBMMe17FTOETO6n2E9cwL1WhqodiMLsoM" /> <link rel="stylesheet" href="/css/cart.css?v=OO3e6LoNzay9iX1eQBG8Hnya8fMmx9ZQBbFa7WLeDZ8" /> <script src="/lib/jquery/dist/jquery.min.js"></script> <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="/js/site.js?v=hqP4uPRLXDoB3DGdt798csCdljKq0RvUSE-n1y2q8Dk"></script> <script src="https://kit.fontawesome.com/2ad6d7fbd6.js" crossorigin="anonymous"></script> <script src="/lib/sharethis/js/sharethis.js?v=MwmBK2LdmpagMX_OQV5w4rl5KC5hV5U2i72SiTbLwSs#property=63d912115a2f67001342bdf7&product=inline-share-buttons&source=platform"></script> <script type="text/javascript"> $(document).ready(function() { $("#BookshelfModelLink").addClass("active"); $(".loginLogout").click(setRedirect); $(".cartCounter").html($("#cartCountPlaceholder").html()); handleCustomShareConfig(); handleInfoHeader('2024/11/26|18:53'); }); function setRedirect() { event.preventDefault(); if ("https://bookstore.ams.org/Bookshelf" == "") { // we are on the browse page, need to set propery with javascript() var returnUrl = getShareUrl(); returnUrl = encodeURIComponent(returnUrl); var baseUrl = $(this).prop("href"); var questionOrAnd = baseUrl.includes("?") ? "&" : "?"; location.href = baseUrl + questionOrAnd + "returnUrl=" + returnUrl; } else { location.href = $(this).prop("href"); } } </script> </head> <body> <!-- Google Tag Manager (noscript) --> <noscript b-nlceesq935> <iframe b-nlceesq935 src="https://www.googletagmanager.com/ns.html?id=GTM-P3772VN" height="0" width="0" style="display:none;visibility:hidden"></iframe> </noscript> <!-- End Google Tag Manager (noscript) --> <div b-nlceesq935 id="cartCountPlaceholder" style="display:none"><div class="cart"> <a class="cart" href="https://ebus.ams.org/ebus/ShoppingCart.aspx"> <span class="showItems"> <span class="cartCountLabel"> 0 </span> </span> </a> </div></div> <div b-nlceesq935 class="headerLogoSearchContainer"> <div b-nlceesq935 role="banner" class="headerLogoSearchContainerTopRow"> <div b-nlceesq935 class="headerLogoContainer mobile"> <button b-nlceesq935 id="headerLogoMenuButton" class="headerLogoMenuContainer" onclick="openSideNav(event);" onkeypress="handleKeypressForClick(event)" tabindex="0" aria-label="Open side navigation menu"></button> <div b-nlceesq935><a b-nlceesq935 href="/" aria-label="Link to browse"><img b-nlceesq935 src="/images/ams-bookstore-logo.png" alt="AMS Logo"></a></div> <div b-nlceesq935 class="headerLogoCartContainer"> <div b-nlceesq935 id="cartCounter" class="cartCounter"> </div> </div> </div> <div b-nlceesq935 class="headerLogoContainer wide"> <a b-nlceesq935 href="/" aria-label="Link to browse"><img b-nlceesq935 src="/images/ams-bookstore-logo.png" alt="AMS Logo"></a> </div> <div b-nlceesq935 class="headerLogoRightResponsive"> <div b-nlceesq935 class="headerRightSideActionItems"> <div b-nlceesq935 class="headerNavLinks"> <ul b-nlceesq935 class="navbar-nav flex-grow-1"> <li b-nlceesq935 class="nav-item"> <a b-nlceesq935 href="https://www.ams.org" target="_blank" class="nav-link text-dark">AMS Home<span b-nlceesq935 class="sr-only">(opens in a new tab)</span><span b-nlceesq935 class="extLink"></span></a> </li> <li b-nlceesq935 class="nav-item"> <a class="nav-link text-dark" href="/Bookshelf">My Bookshelf</a> </li> <li b-nlceesq935 class="nav-item"> <a class="nav-link text-dark loginLogout" href="/Account/Login?returnUrl=https%3A%2F%2Fbookstore.ams.org%2FBookshelf">Login</a> </li> </ul> </div> <div b-nlceesq935 class="headerSearchContainer"> <link rel="stylesheet" href="/css/simpleSearch.css?v=Zp72v9BNKGS-eDr-MLHDvaAIQNNugvRUQM_CWL_F0l8" /> <link rel="stylesheet" href="//code.jquery.com/ui/1.13.1/themes/base/jquery-ui.css"> <script src="https://code.jquery.com/ui/1.13.1/jquery-ui.js"></script> <script src="/js/simpleSearch.js?v=176KrpHOwVdaFKNW5L7MgS2hJg1vembFvfNgHaMs8Vc"></script> <div role="search" id="simpleSearchContainer" class="simpleSearchContainer"> <div id="simpleSearchInputWrapper" class="simpleSearchInputWrapper" > <div class="simpleSearchMenuBtnContainer" onclick="openSideNav(event);" onkeypress="handleKeypressForClick(event)" tabindex="0"></div> <input id="simpleSearchInput" class="form-control simpleSearchInput" type="search" placeholder="Search the AMS Bookstore" autocomplete="off" aria-describedby="initInstr" aria-owns="searchSuggestionsResults" aria-expanded="false" aria-autocomplete="both" aria-activedescendant="" /><label class="hiddenLabel" for="simpleSearchInput">Search the AMS Bookstore</label> <div class="simpleSearchIconContainer"><button class="simpleSearchBtn" onclick="performSimpleSearch($('#simpleSearchInput').val())"><svg width="18" height="18" viewBox="0 0 13 13"><title>search</title><path d="m4.8495 7.8226c0.82666 0 1.5262-0.29146 2.0985-0.87438 0.57232-0.58292 0.86378-1.2877 0.87438-2.1144 0.010599-0.82666-0.28086-1.5262-0.87438-2.0985-0.59352-0.57232-1.293-0.86378-2.0985-0.87438-0.8055-0.010599-1.5103 0.28086-2.1144 0.87438-0.60414 0.59352-0.8956 1.293-0.87438 2.0985 0.021197 0.8055 0.31266 1.5103 0.87438 2.1144 0.56172 0.60414 1.2665 0.8956 2.1144 0.87438zm4.4695 0.2115 3.681 3.6819-1.259 1.284-3.6817-3.7 0.0019784-0.69479-0.090043-0.098846c-0.87973 0.76087-1.92 1.1413-3.1207 1.1413-1.3553 0-2.5025-0.46363-3.4417-1.3909s-1.4088-2.0686-1.4088-3.4239c0-1.3553 0.4696-2.4966 1.4088-3.4239 0.9392-0.92727 2.0864-1.3969 3.4417-1.4088 1.3553-0.011889 2.4906 0.45771 3.406 1.4088 0.9154 0.95107 1.379 2.0924 1.3909 3.4239 0 1.2126-0.38043 2.2588-1.1413 3.1385l0.098834 0.090049z"></path></svg></button></div> <span id="initInstr" style="display: none;">When autocomplete results are available use up and down arrows to review and enter to select. Touch device users, explore by touch or with swipe gestures.</span> <div id="simpleSearchStatus" role="status" aria-live="polite" aria-relevant="additions" class="sr-only"></div> </div> </div> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8IxuUvaeZRREi9I41erTZ0sQVZoNFebefdNURPpp7FzJKpv6dsAh7c_uncAJd3Y0GufFCjNiDS4TZkuwOc-sa83ZMgttyq59jBXJAB9vHnewGJtTuPlsZLiD0aOrW7Y8NTrjPuceJIIYLkugSW6LuXM" /> <script type="text/javascript"> $(document).ready(function () { initSearchSuggestions(); }); </script> <div b-nlceesq935 class="headerNavLinks advancedSearchBtnLinkContainer"> <a id="AdvancedSearchLink" class="advancedSearchLink nav-link text-dark" href="/AdvancedSearch">Advanced Search</a> </div> <div b-nlceesq935 id="cartCounterWide" class="cartCounter wide"> </div> </div> </div> </div> </div> <div b-nlceesq935 role="navigation" class="headerNavLinks fullWidthMenu"> <ul b-nlceesq935 class="navbar-nav flex-grow-1"> <li b-nlceesq935 class="nav-item"> <a id="BrowseModelLink" class="nav-link text-dark" href="/Browse">Browse</a> </li> <li b-nlceesq935 class="nav-item"> <a b-nlceesq935 id="belowHeaderBooksOnSaleLink" class="nav-link text-dark" href="/books-on-sale">On Sale</a> </li> <li b-nlceesq935 class="nav-item"> <a b-nlceesq935 id="belowHeaderMAAPressLink" class="nav-link text-dark" href="/maa-press-browse">MAA Press Books</a> </li> <li b-nlceesq935 class="nav-item"> <a b-nlceesq935 id="belowHeaderTextbookLink" class="nav-link text-dark" href="/bookstore-textbooks">Textbooks</a> </li> <li b-nlceesq935 class="nav-item"> <a b-nlceesq935 id="belowHeaderBookSeriesLink" class="nav-link text-dark" href="/bookstore-series">Book Series</a> </li> <li b-nlceesq935 class="nav-item"> <a b-nlceesq935 id="belowHeaderEBookCollectionsLink" class="nav-link text-dark" href="https://www.ams.org/ebooks" target="_blank">eBook Collections<span b-nlceesq935 class="sr-only">(opens in a new tab)</span><span b-nlceesq935 class="extLink"></span></a> </li> </ul> </div> </div> <div b-nlceesq935 role="navigation" class="sideNav"> <ul b-nlceesq935 class="sideNavUl"> <li b-nlceesq935> <button b-nlceesq935 class="headerLogoMenuContainer close" onclick="closeSideNav();" onkeypress="handleCloseSideNaveKeypress(event)" tabindex="0" aria-label="Close side navigation menu"></button> </li> <li b-nlceesq935 class="nav-item"> <a id="advancedSearchLinkSideNav" class="advancedSearchLink" class="nav-link" href="/AdvancedSearch">Advanced Search</a> </li> <li b-nlceesq935 class="nav-item"> <a id="browseModelLink" class="nav-link" href="/Browse">Browse</a> </li> <li b-nlceesq935 class="nav-item"> <a b-nlceesq935 id="sideMenuBooksOnSaleLink" class="nav-link" href="/books-on-sale">On Sale</a> </li> <li b-nlceesq935 class="nav-item"> <a b-nlceesq935 id="sideMenuMAAPressLink" class="nav-link" href="/maa-press-browse">MAA Press Books</a> </li> <li b-nlceesq935 class="nav-item"> <a b-nlceesq935 id="sideMenuTextbookLink" class="nav-link" href="/bookstore-textbooks">Textbooks</a> </li> <li b-nlceesq935 class="nav-item"> <a b-nlceesq935 id="sideMenuBookSeriesLink" class="nav-link" href="/bookstore-series">Book Series</a> </li> <li b-nlceesq935 class="nav-item"> <a b-nlceesq935 id="sideMenuEBookCollectionsLink" class="nav-link" href="https://www.ams.org/ebooks" target="_blank">eBook Collections<span b-nlceesq935 class="sr-only">(opens in a new tab)</span><span b-nlceesq935 class="extLink"></span></a> </li> <li b-nlceesq935 class="nav-item userAccountSection"> <a class="nav-link" href="/Bookshelf">My Bookshelf</a> </li> <li b-nlceesq935 class="nav-item"> <a class="nav-link loginLogout" href="/Account/Login?returnUrl=https%3A%2F%2Fbookstore.ams.org%2FBookshelf">Login</a> </li> </ul> </div> <div b-nlceesq935 class="sideNavOverlay"></div> <div b-nlceesq935 class="container"> <main b-nlceesq935 role="main" class="pb-3"> <link rel="stylesheet" href="/css/productBrowse.css?v=KK39n8HjVkeUQf0w0FF8boom38t9FgDqr9z1xu8KwHE" /> <script type="text/x-mathjax-config"> MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ['\\(','\\)']], processEscapes: true }, loader: {load: ['[tex]/textmacros']}, tex: {packages: {'[+]': ['textmacros']}} }); </script> <script type="text/javascript"> function loadInitialResults() { $('#productBrowseMainContentPane').hide(); $("#noResultsFoundDiv").hide(); var rowsPerPage = localStorage.getItem("amsBookshelfRowsPerPage"); if (rowsPerPage == null) { rowsPerPage = $("#productBrowsePagingRowsPerPage").val(); localStorage.setItem("amsBookshelfRowsPerPage", rowsPerPage); } document.getElementById('hdnRowsPerPage').value = rowsPerPage; var listView = localStorage.getItem("amsBookshelfListView"); if (listView == null) { listView = "list"; localStorage.setItem("amsBookshelfListView", listView); } showLoadingPanel(); document.getElementById('hdnCurrentPage').value = "1"; document.getElementById('hdnListView').value = listView; var postData = { pageNumber: '1', numPerPage: rowsPerPage, filter: '', filterType: 0 }; var onSuccess = function (response) { if (response != null) { console.log(response); if (response.Products != null && response.Products.length > 0) addMoreItemsToList(response.Products); else { $("#noResultsFoundDiv").show(); $(".productBrowseListViewContainer").hide(); $("#productBrowsePagingDiv").hide(); } document.getElementById('hdnTotalRows').value = response.TotalRows; } processPaging(); $('#productBrowseMainContentPane').show(); hideLoadingPanel(); }; var onError = function (jqXHR, textStatus, errorThrown) { console.log('error getting browse product results'); console.log(jqXHR); console.log(textStatus); console.log(errorThrown); $('#productBrowseMainContentPane').show(); hideLoadingPanel(); }; getBookshelfResults(postData, onSuccess, onError); $("#productBrowsePagingRowsPerPage").val(rowsPerPage); $(".productBrowseViewSelector").removeClass("active"); $(".productBrowseViewSelector[data-view-type='" + document.getElementById('hdnListView').value + "']").addClass("active"); } function getBookshelfResults(postData, onSuccess, onError) { var successFunc = onSuccess || function (response) { console.log(response); } var errorFunc = onError || function (jqXHR, textStatus, errorThrown) { console.log(jqXHR); console.log(textStatus); console.log(errorThrown); }; console.log('calling getBookshelfResults', postData); $.ajax({ type: "POST", url: "/bookshelf?handler=getbookshelfproducts", data: postData, headers: { RequestVerificationToken: $('input[name="__RequestVerificationToken"]').val() }, success: successFunc, error: errorFunc }); } function getEBook(type, productId) { $("#bookshelfLoadingModal").jmodal({}); var _type = ""; switch (type) { case "pdf": _type = "application/pdf" break; case "epub": _type = "application/epub+zip" break; case "url": break; case "file": _type = "application/octet-stream" break; } if (type == "url") { // make a ajax call open result in new window const formData = new FormData(); formData.append("productId", productId); var filename = "tempFilename"; var url = '/bookshelf?handler=GetBook' var xhr = new XMLHttpRequest(); xhr.open('POST', url, true); xhr.setRequestHeader('RequestVerificationToken', $('input[name="__RequestVerificationToken"]').val()); xhr.onload = function (e) { if (this.status == 200) { var rUrl = new URL(this.responseURL); var newWindow = window.open(rUrl); if (! newWindow) { $.jmodal.close(); $("#bookshelfWarningModal").jmodal({}); } else { $.jmodal.close(); } } else { // bad request, probably not logged in $("#bookshelfLoginModal").jmodal({}); //alert('Please log in to access your bookshelf.') } }; xhr.send(formData); } else { const formData = new FormData(); formData.append("productId", productId); var filename = "tempFilename"; var url = '/bookshelf?handler=GetBook' var xhr = new XMLHttpRequest(); xhr.open('POST', url, true); xhr.responseType = 'blob'; xhr.setRequestHeader('RequestVerificationToken', $('input[name="__RequestVerificationToken"]').val()); xhr.onload = function(e) { if (this.status == 200) { var rUrl = new URL(this.responseURL); var rUrlrel = rUrl.pathname + rUrl.search; // need to make sure we didnt get a redirect if (rUrlrel === url) { var disposition = xhr.getResponseHeader('Content-Disposition'); if (disposition && disposition.indexOf('attachment') !== -1) { var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/; var matches = filenameRegex.exec(disposition); if (matches != null && matches[1]) { filename = matches[1].replace(/['"]/g, ''); } } var blob = new Blob([this.response], { type: _type }); var downloadUrl = URL.createObjectURL(blob); console.log(downloadUrl); var a = document.createElement("a"); a.href = downloadUrl; a.download = filename; document.body.appendChild(a); a.click(); console.log("downloadComplete"); $.jmodal.close(); } else { // redirect is sent if user does not have access to book // this should only happen if someone is trying to hack window.location = this.responseURL; } } else if (this.status == 400) { // bad request, probably not logged in $.jmodal.close(); $("#bookshelfLoginModal").jmodal({}); //alert('Please log in to access your bookshelf.') } else { $.jmodal.close(); $("#bookshelfMissingFileModal").jmodal({}); //alert('File is missing, unable to download file.') } //$.jmodal.close(); }; xhr.send(formData); } } function processPaging() { //console.log('processPaging'); $("#productBrowsePagingBtnContainer").html(""); $('#btnFirst').attr('disabled', true); $('#btnPrevious').attr('disabled', true); $('#btnNext').attr('disabled', true); $('#btnLast').attr('disabled', true); var pageNumber = parseInt(document.getElementById('hdnCurrentPage').value); var rowsPerPage = parseInt(document.getElementById('hdnRowsPerPage').value); var totalRows = parseInt(document.getElementById('hdnTotalRows').value); var totalPages = parseInt(totalRows / rowsPerPage); var remainingRows = totalRows % rowsPerPage; if (remainingRows > 0) totalPages++; if (totalPages > 1) { if (pageNumber > 1) { $('#btnFirst').attr('disabled', false); $('#btnPrevious').attr('disabled', false); } if (pageNumber < totalPages) { $('#btnNext').attr('disabled', false); $('#btnLast').attr('disabled', false); } } var pages = new Array(); var pagesToShow = 5; // should be odd var buffer = parseInt(pagesToShow / 2); if (totalPages > pagesToShow) { pages.push('1'); for (var i = 2; i < totalPages; i++) { if (!((i < (pageNumber - buffer) && pageNumber != (buffer + 3)) || (i > (pageNumber + buffer) && pageNumber != (totalPages - buffer - 2)))) pages.push(i.toString()); } if (totalPages >= (buffer + 4)) { if (pageNumber >= (buffer + 4)) { pages.splice(1, 0, "..."); } if (pageNumber <= (totalPages - (buffer + 3))) { pages.push("..."); } } pages.push(totalPages.toString()); } else { for (var i = 1; i <= totalPages; i++) { pages.push(i.toString()); } } $.each(pages, function (index, page) { var isBtnDisabled = ""; var btnClass = ""; if (isNaN(page)) isBtnDisabled = ' disabled="disabled" '; else { if (pageNumber == parseInt(page)) { isBtnDisabled = ' disabled="disabled" '; btnClass = " currentPage "; } } var imgHtml = '<input type="button" value="' + page + '" onclick="clickPageBtn(' + page + ')" id="pageButton_' + page +'" class="btn productBrowsePagingBtn productBrowsePagingBtnSinglePage' + btnClass + '" ' + isBtnDisabled + '>'; $("#productBrowsePagingBtnContainer").append(imgHtml); }); } function clickPageBtn(page) { showLoadingPanel(); var currPage = parseInt(document.getElementById('hdnCurrentPage').value); var rowsPerPage = parseInt(document.getElementById('hdnRowsPerPage').value); if (isNaN(page)) { var totalRows = parseInt(document.getElementById('hdnTotalRows').value); var totalPages = parseInt(totalRows / rowsPerPage); var remainingRows = totalRows % rowsPerPage; if (remainingRows > 0) totalPages++; switch(page) { case "first": page = 1; break; case "previous": page = currPage - 1; break; case "next": page = currPage + 1; break; case "last": page = totalPages; break; } } document.getElementById('hdnCurrentPage').value = page; var filterText = $('#productBookshelfFilterText').val(); var filterType = (filterText != "") ? 1 : 0; var postData = { pageNumber: page, numPerPage: rowsPerPage, filter: filterText, filterType: filterType }; var onSuccess = function (response) { if (response != null) { console.log(response); $('html,body').animate({ scrollTop: $('#productBrowseListContainer').offset().top - 20 }, 100); $("#productBrowseListContainer").html(""); addMoreItemsToList(response.Products); document.getElementById('hdnTotalRows').value = response.TotalRows; } processPaging(); hideLoadingPanel(); }; var onError = function (jqXHR, textStatus, errorThrown) { console.log('error getting browse product results'); console.log(jqXHR); console.log(textStatus); console.log(errorThrown); hideLoadingPanel(); }; getBookshelfResults(postData, onSuccess, onError); } function changeView(view) { localStorage.removeItem("amsBookshelfListView"); localStorage.setItem("amsBookshelfListView", view); document.getElementById('hdnListView').value = view; var oldClass = (view == "grid") ? "list" : "grid"; $(".productBrowseListItem").removeClass(oldClass).addClass(view); $(".productBrowseViewSelector").removeClass("active"); $(".productBrowseViewSelector[data-view-type='" + view + "']").addClass("active"); //setListViewToCookie(); } function changeRowsPerPage() { showLoadingPanel(); var rowsPerPage = $("#productBrowsePagingRowsPerPage").val(); localStorage.removeItem("amsBookshelfRowsPerPage"); localStorage.setItem("amsBookshelfRowsPerPage", rowsPerPage); document.getElementById('hdnRowsPerPage').value = rowsPerPage; document.getElementById('hdnCurrentPage').value = "1"; var filterText = $('#productBookshelfFilterText').val(); var filterType = (filterText != "") ? 1 : 0; var postData = { pageNumber: 1, numPerPage: rowsPerPage, filter: filterText, filterType: filterType }; var onSuccess = function (response) { if (response != null) { $('html,body').animate({ scrollTop: $('#productBrowseListContainer').offset().top - 20 }, 100); $("#productBrowseListContainer").html(""); addMoreItemsToList(response.Products); document.getElementById('hdnTotalRows').value = response.TotalRows; } processPaging(); hideLoadingPanel(); }; var onError = function (jqXHR, textStatus, errorThrown) { console.log('error getting browse product results'); console.log(jqXHR); console.log(textStatus); console.log(errorThrown); hideLoadingPanel(); }; getBookshelfResults(postData, onSuccess, onError); } function showLoadingPanel() { $('#loadingPanel').show(); } function hideLoadingPanel() { $('#loadingPanel').hide(); } function processMathJax() { MathJax.Hub.Queue(["Typeset", MathJax.Hub]); } function addMoreItemsToList(newProducts) { $.each(newProducts, function(key, product) { //currValues[key] = value; //console.log(product); //var newProductListItem = $("#productBrowseBlankItem").clone(); var newProductListItem = $("#productBrowseListItem").clone(); $(newProductListItem).find(".productBrowseImage").attr("src", product.SmallImage); $(newProductListItem).addClass(document.getElementById('hdnListView').value); var title = product.Title; if (product.Subtitle != null && product.Subtitle != "") { title += ": " + product.Subtitle; } $(newProductListItem).find(".productBrowseTitle").html(title); if (product.RelatedCustomers != null) { var authors = new Array(); var editors = new Array(); var authorEditor = { FullName: "", Affiliation: "", RelationshipType: "" }; var foundEditor = false; $.each(product.RelatedCustomers, function (index, customer) { if (authorEditor.FullName != customer.FullName) { if (authorEditor.FullName != null && authorEditor.FullName != "" && authorEditor.RelationshipType == "AUTHOR") { authors.push(authorEditor); } else if (authorEditor.FullName != null && authorEditor.FullName != "" && authorEditor.RelationshipType == "EDITOR") { editors.push(authorEditor); } authorEditor = { FullName: customer.FullName, Affiliation: customer.Affiliation, RelationshipType: customer.RelationshipType }; if (!foundEditor && customer.RelationshipType.toUpperCase() == "EDITOR") { foundEditor = true; authorEditor.FirstEditor = true; } } else { authorEditor.Affiliation += " and " + customer.Affiliation; } }); if (authorEditor.FullName != "" && authorEditor.RelationshipType == "AUTHOR") { authors.push(authorEditor); } else if (authorEditor.FullName != "" && authorEditor.RelationshipType == "EDITOR") { editors.push(authorEditor); } if (product.DisplayAuthorEditorFlag == 'A' || product.DisplayAuthorEditorFlag == 'B') { $.each(authors, function (index, authEd) { var authEdHtml = '<div class="productBrowseAuthorRow">'; authEdHtml += '<span id="lblAuthorEditorFullname_' + product.ProductId + "_" + index + '" class="productBrowseAuthorEditorName">' + authEd.FullName + '</span>'; if (authEd.Affiliation != null && authEd.Affiliation != "") authEdHtml += '<span id="lblAuthorEditSpacer_' + product.ProductId + "_" + index + '">: </span>'; authEdHtml += '<span id="lblAuthorEditorAffiliation_' + product.ProductId + "_" + index + '" class="productBrowseAffiliation">' + authEd.Affiliation + '</span>'; authEdHtml += '</div>'; $(newProductListItem).find("#productBrowseRelatedCustomersLabel").append(authEdHtml); //$('.productDetailAuthorContainer').append(authEdHtml); }); } if (product.DisplayAuthorEditorFlag == 'E' || product.DisplayAuthorEditorFlag == 'B') { $.each(editors, function (index, authEd) { var authEdHtml = '<div class="productBrowseAuthorRow">'; if (authEd.FirstEditor) authEdHtml += '<span class="productBrowseEditedByLabel">Edited by:</span>'; authEdHtml += '<span id="lblAuthorEditorFullname_' + product.ProductId + "_" + index + '" class="productBrowseAuthorEditorName">' + authEd.FullName + '</span>'; if (authEd.Affiliation != null && authEd.Affiliation != "") authEdHtml += '<span id="lblAuthorEditSpacer_' + product.ProductId + "_" + index + '">: </span>'; authEdHtml += '<span id="lblAuthorEditorAffiliation_' + product.ProductId + "_" + index + '" class="productBrowseAffiliation">' + authEd.Affiliation + '</span>'; authEdHtml += '</div>'; $(newProductListItem).find("#productBrowseRelatedCustomersLabel").append(authEdHtml); //$('.productDetailAuthorContainer').append(authEdHtml); }); } } $(newProductListItem).find(".productBrowseProductCode").html(product.ProductCode); $(newProductListItem).find(".productBrowseCopyrightYearLabel").html(product.CopyrightYear); $(newProductListItem).find(".productBrowseProductDescriptionLabel").html(product.ProductDescription); $(newProductListItem).find(".productBrowseReadershipLabel").html(product.Readership); $(newProductListItem).find("#productBrowseListItem").attr("data-product-id", product.ProductId); $(newProductListItem).find("#productBrowseListMoreButton").attr("data-product-id", product.ProductId); $(newProductListItem).find("#productBrowseListLessButton").attr("data-product-id", product.ProductId); $(newProductListItem).find(".productBrowseListMoreInfo").attr("data-product-id", product.ProductId); $(newProductListItem).find(".productBrowseTitleLink").attr("href", "/view?ProductCode=" + product.ProductCode); $(newProductListItem).find(".quick-view").attr("data-product-id", product.ProductId); $(newProductListItem).find("#productBrowseListItem").attr("class", $(newProductListItem).find("#productBrowseListItem").attr("class") + " " + document.getElementById('hdnListView').value); // only one entry needed, for nyp message var showMessage = false; $.each(product.BookshelfEntries, function (index, bookshelfEntry) { if (bookshelfEntry.OutOfStockReason != "NYP") { switch(bookshelfEntry.BookshelfEntryType) { case 1: $(newProductListItem).find("#buttonsTd").append("<button id=\"ebookPdf\" class=\"productBrowseViewEbook\" onclick=\"getEBook('pdf'," + bookshelfEntry.ProductId + "); return false;\">PDF</button>"); break; case 2: $(newProductListItem).find("#buttonsTd").append("<button id=\"ebookEpub\" class=\"productBrowseViewEbook\" onclick=\"getEBook('epub'," + bookshelfEntry.ProductId + "); return false;\">ePUB</button>"); break; case 3: $(newProductListItem).find("#buttonsTd").append("<button id=\"ebookUrl\" class=\"productBrowseViewEbook\" onclick=\"getEBook('url'," + bookshelfEntry.ProductId + "); return false;\">View</button>"); break; case 4: $(newProductListItem).find("#buttonsTd").append("<button id=\"ebookFile\" class=\"productBrowseViewEbook\" onclick=\"getEBook('file'," + bookshelfEntry.ProductId + "); return false;\">File</button>"); break; default: // no buttons } } else{ if (showMessage == false) { const options = { year: 'numeric', month: 'short', day: 'numeric' }; var date = new Date(bookshelfEntry.NextReceiptDate); var datestring = date.toLocaleDateString('en-us', options); $(newProductListItem).find("#buttonsTd").append("<div class='bookshelfNotYetAvailable' ><div><b>Publishing soon!</b></div><div>Check back here on " + datestring + " to download your eBook.</div></div>"); showMessage = true; } } }); $(newProductListItem).find("*") .each(function() { var id = this.id || ""; if (id != "") { this.id = id + "_" + product.ProductId; } }); $("#productBrowseListContainer").append($(newProductListItem)); $(".productBrowseListMoreButton[data-product-id='" + product.ProductId + "']").on("click", function () { showMoreInfo(product.ProductId) }); $(".productBrowseListLessButton[data-product-id='" + product.ProductId + "']").on("click", function () { hideMoreInfo(product.ProductId) }); }); processMathJax(); } function replaceImageError(imgElement) { $(imgElement).attr("src", "/images/not_found.png"); } function toggleMenuItem(menuItem) { var parentItem = $(menuItem).parent(); if($(menuItem).find(".productBrowseFilterHeaderExpand").hasClass("active")) { $(parentItem).find(".productBrowseFilterHeaderExpand").removeClass("active"); $(parentItem).find(".productBrowseFilterHeaderCollapse").addClass("active"); $(parentItem).find(".productBrowseFilterContent").addClass("active"); } else { $(parentItem).find(".productBrowseFilterHeaderCollapse").removeClass("active"); $(parentItem).find(".productBrowseFilterContent").removeClass("active"); $(parentItem).find(".productBrowseFilterHeaderExpand").addClass("active"); } } function submitFilterText() { var filterText = $('#productBookshelfFilterText').val(); if (filterText != "") { $('#productBrowseMainContentPane').hide(); var rowsPerPage = document.getElementById('hdnRowsPerPage').value; showLoadingPanel(); document.getElementById('hdnCurrentPage').value = "1"; var postData = { pageNumber: '1', numPerPage: rowsPerPage, filter: filterText, filterType: 1 }; var onSuccess = function (response) { if (response != null) { console.log(response); $("#productBrowseListContainer").html(""); addMoreItemsToList(response.Products); document.getElementById('hdnTotalRows').value = response.TotalRows; } processPaging(); $('#productBrowseMainContentPane').show(); hideLoadingPanel(); $("#btnProductBookshelfFilterTextClear").show(); }; var onError = function (jqXHR, textStatus, errorThrown) { console.log('error getting browse product results'); console.log(jqXHR); console.log(textStatus); console.log(errorThrown); $('#productBrowseMainContentPane').show(); hideLoadingPanel(); }; getBookshelfResults(postData, onSuccess, onError); } } function clearFilterText() { $('#productBookshelfFilterText').val(""); $('#productBrowseMainContentPane').hide(); var rowsPerPage = document.getElementById('hdnRowsPerPage').value; showLoadingPanel(); document.getElementById('hdnCurrentPage').value = "1"; var postData = { pageNumber: '1', numPerPage: rowsPerPage, filter: '', filterType: 1 }; var onSuccess = function (response) { if (response != null) { console.log(response); $("#productBrowseListContainer").html(""); addMoreItemsToList(response.Products); document.getElementById('hdnTotalRows').value = response.TotalRows; } processPaging(); $('#productBrowseMainContentPane').show(); hideLoadingPanel(); $("#btnProductBookshelfFilterTextClear").hide(); }; var onError = function (jqXHR, textStatus, errorThrown) { console.log('error getting browse product results'); console.log(jqXHR); console.log(textStatus); console.log(errorThrown); $('#productBrowseMainContentPane').show(); hideLoadingPanel(); }; getBookshelfResults(postData, onSuccess, onError); } </script> <script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-AMS_CHTML-full.js"></script> <div id="loadingPanel" class="productBrowseLoadingPanel"> <div> <div class="sp sp-3balls"></div> </div> </div> <div id="bookshelfLoadingModal" class="jmodal bookshelfLoadingModal"> <div> <div class="bookshelfLoadingInfo"> Authorizing download of eBook... </div> <div id="loadingPanelEbook" class="productBrowseLoadingPanel relative loadingPanelEbook"> <div> <div class="sp sp-3balls"></div> </div> </div> </div> </div> <div id="bookshelfWarningModal" class="jmodal bookshelfLoadingModal"> <div> <div class="bookshelfLoadingInfo"> You must enable pop ups for this site to view this book. </div> <div id="loadingPanelEbook" class="productBrowseLoadingPanel relative loadingPanelEbook"> </div> </div> </div> <div id="bookshelfLoginModal" class="jmodal bookshelfLoadingModal"> <div> <div class="bookshelfLoadingInfo"> Please log in to access your bookshelf. </div> <div id="loadingPanelEbook" class="productBrowseLoadingPanel relative loadingPanelEbook"> </div> </div> </div> <div id="bookshelfMissingFileModal" class="jmodal bookshelfLoadingModal"> <div> <div class="bookshelfLoadingInfo"> File is missing, unable to download file. </div> <div id="loadingPanelEbook" class="productBrowseLoadingPanel relative loadingPanelEbook"> </div> </div> </div> <input type="hidden" id="hdnRowsPerPage" name="RowsPerPage" value="" /> <input type="hidden" id="hdnListView" name="ListView" value="" /> <div id="productBrowseBlankItem" style="display: none;"> <ul> <li id="productBrowseListItem" class="productBrowseListItem"> <div class="productBrowseProductContainer"> <div class="productBrowseImageContainer"> <img class="productBrowseImage productBrowseSmallImage" onerror="replaceImageError(this);" src="/images/not_found.png" title="" style=""> </div> <div class="productBrowseProductInfoContainer"> <table style="height: 100%; width: 100%;"> <tr> <td style="padding-top: 10px; padding-bottom: 10px;"> <table width="100%" cellpadding="0" cellspacing="0"> <tbody> <tr> <td> <a id="lnkTitle" class="productBrowseTitleLink" ><span class="productBrowseTitle"></span></a> </td> </tr> <tr> <td colspan="2"> <span id="productBrowseRelatedCustomersLabel"></span> </td> </tr> <tr> <td colspan="2"> <span style="font-weight: bold;">Product Code: </span><span class="productBrowseProductCode"></span> </td> </tr> <tr> <td colspan="2"> <span style="font-weight: bold;">Copyright Year: </span><span class="productBrowseCopyrightYearLabel"></span> </td> </tr> <tr> <td id="buttonsTd" colspan="2"> </td> </tr> </tbody> </table> </td> </tr> </table> </div> </div> </li> </ul> </div> <div class="productBrowseListViewContainer"> <div class="productBrowseListViewSelector"> <button id="productBrowseViewList" runat="server" data-view-type="list" onclick="changeView('list'); return false;" class="productBrowseViewSelector listView left active"> </button> <button id="productBrowseViewGrid" runat="server" data-view-type="grid" onclick="changeView('grid'); return false;" class="productBrowseViewSelector gridView right"> </button> </div> <div class="productBrowseRowsPerPageSelectorContainer"> <select id="productBrowsePagingRowsPerPage" class="productBrowseRowsPerPageSelector" onchange="changeRowsPerPage();" > <option value="12">Show: 12</option> <option value="24">Show: 24</option> <option value="48">Show: 48</option> </select> </div> <!-- <div id="productBookshelfFilterContainer" class="productBookshelfFilterContainer"> <input type="text" id="productBookshelfFilterText" class="productBookshelfFilterText" placeholder="Filter by title..."/> <input type="button" id="btnProductBookshelfFilterText" class="btnProductBookshelfFilterText btn productBrowsePagingBtn" value="Apply" onclick="submitFilterText(); return false;"/> <input type="button" id="btnProductBookshelfFilterTextClear" class="btnProductBookshelfFilterTextClear btn productBrowsePagingBtn" value="Clear" onclick="clearFilterText(); return false;" /> </div> --> </div> <div id="productBrowseContent" class="productBrowseContent"> <div id="productBrowseMainContentPane" class="productBrowseMainContentPane"> <div id="notLoggedIn" class="notLoggedIn">Please log in to view the books on your bookshelf.</div> <div id="productBrowseAppliedFilterContainer" class="productBrowseAppliedFilterContainer"></div> <div id="resultsDiv" runat="server"> <ul id="productBrowseListContainer" class="productBrowseListContainer"> </ul> <div id="productBrowseContinuousScrollLoading" class="productBrowseContinuousScrollLoading"> <div class="sp sp-3balls"></div> </div> </div> <div id="noResultsFoundDiv" class="noResultsFoundDiv"> Our records show that there are no books on your bookshelf.<br />We welcome you to <a href="/Browse">browse</a> our bookstore to find something you may be interested in! </div> <div id="productBrowsePagingDiv" class="productBrowsePagingContainer" runat="server"> <input type="hidden" id="hdnTotalRows" name="TotalRows" value="" /> <input type="hidden" id="hdnCurrentPage" name="CurrentPage" value="" /> <input id="btnFirst" type="button" value="<<" onclick="clickPageBtn('first')" class="btn productBrowsePagingBtn"> <input id="btnPrevious" type="button" value="<" onclick="clickPageBtn('previous')" class="btn productBrowsePagingBtn"> <span id="productBrowsePagingBtnContainer"></span> <input id="btnNext" type="button" value=">" onclick="clickPageBtn('next')" class="btn productBrowsePagingBtn"> <input id="btnLast" type="button" value=">>" onclick="clickPageBtn('last')" class="btn productBrowsePagingBtn"> </div> </div> </div> <div style="clear:both"><hr /></div> <div class="productBrowseFooterPane"> <a target="_blank"href="https://www.mathjax.org"> <img title="Powered by MathJax" src="https://www.mathjax.org/badge/badge.gif" border="0" alt="Powered by MathJax" /> </a> </div> <input name="__RequestVerificationToken" type="hidden" value="CfDJ8IxuUvaeZRREi9I41erTZ0sQVZoNFebefdNURPpp7FzJKpv6dsAh7c_uncAJd3Y0GufFCjNiDS4TZkuwOc-sa83ZMgttyq59jBXJAB9vHnewGJtTuPlsZLiD0aOrW7Y8NTrjPuceJIIYLkugSW6LuXM" /> <script type="text/javascript"> $(document).ready(function () { if ("" != "") { $(".notLoggedIn").hide(); loadInitialResults(); } else { $(".notLoggedIn").show(); if($("a[href*='/Account/Login']:visible").length > 0) { $("a[href*='/Account/Login']:visible")[0].click(); } } }); </script> </main> </div> <footer b-nlceesq935 class="footer text-muted"> <div b-nlceesq935> <a b-nlceesq935 href="https://www.ams.org"><img b-nlceesq935 src="/images/footer-line.png" alt="American Mathematical Society" class="img-responsive" title="" style=""></a> </div> <div b-nlceesq935 class="shareContainer"> <ul b-nlceesq935 class="list-inline shareList"> <li b-nlceesq935><a b-nlceesq935 href="https://www.facebook.com/amermathsoc" title="Follow us on Facebook"><i b-nlceesq935 class="fa-brands fa-facebook-f fa-lg"></i></a></li> <li b-nlceesq935><a b-nlceesq935 href="https://twitter.com/amermathsoc" title="Follow us on X"><i b-nlceesq935 class="fa-brands fa-x-twitter fa-lg"></i></a></li> <li b-nlceesq935><a b-nlceesq935 href="https://www.linkedin.com/company/51001" title="Follow us on LinkedIn"><i b-nlceesq935 class="fa-brands fa-linkedin-in fa-lg"></i></a></li> <li b-nlceesq935><a b-nlceesq935 href="https://www.instagram.com/amermathsoc" title="Follow us on Instagram"><i b-nlceesq935 class="fa-brands fa-instagram fa-lg"></i></a></li> <li b-nlceesq935><a b-nlceesq935 href="https://www.youtube.com/amermathsoc" title="Follow us on YouTube"><i b-nlceesq935 class="fa-brands fa-youtube fa-lg"></i></a></li> </ul> </div> <div b-nlceesq935 class="container"> <p b-nlceesq935><a b-nlceesq935 href="https://www.ams.org/bookstore-email-list" target="_blank" class="btn btn-primary footerBtn">Join Our Email List <span b-nlceesq935 class="sr-only">(opens in a new tab)</span><span b-nlceesq935 class="extLink" ></span></a></p> <p b-nlceesq935><a b-nlceesq935 href="https://www.ams.org" target="_blank">American Mathematical Society <span b-nlceesq935 class="sr-only">(opens in a new tab)</span><span b-nlceesq935 class="extLink"></span></a> 路 <a b-nlceesq935 href="https://goo.gl/maps/ZvJdkQEC79p" title="Google map 201 Charles Street Providence, Rhode Island" target="_blank">201 Charles Street Providence, Rhode Island 02904-2213 <span b-nlceesq935 class="sr-only">(opens in a new tab)</span><span b-nlceesq935 class="extLink"></span></a> 路 <a b-nlceesq935 href="https://www.ams.org/reach" target="_blank">Contact Us <span b-nlceesq935 class="sr-only">(opens in a new tab)</span><span b-nlceesq935 class="extLink"></span></a> </p> <p b-nlceesq935><small b-nlceesq935>AMS, American Mathematical Society, the tri-colored AMS logo, and Advancing research, Creating connections, are trademarks and services marks of the American Mathematical Society and registered in the U.S. Patent and Trademark Office.</small></p> <p b-nlceesq935> © <a b-nlceesq935 href="https://www.ams.org/about-us/copyright" target="_blank">Copyright <span b-nlceesq935 class="sr-only">(opens in a new tab)</span><span b-nlceesq935 class="extLink"></span></a> <script> var now = new Date(); document.write(now.getFullYear()); </script>, American Mathematical Society 路 <a b-nlceesq935 href="https://www.ams.org/about-us/privacy" target="_blank">Privacy Statement <span b-nlceesq935 class="sr-only">(opens in a new tab)</span><span b-nlceesq935 class="extLink"></span></a> 路 <a b-nlceesq935 href="https://www.ams.org/tou">Terms of Use</a> 路 <a b-nlceesq935 href="https://www.ams.org/accessibility">Accessibility and AMS Online Content</a> 路 <a b-nlceesq935 href="https://www.ams.org/publications/pubpermissions">Rights and Permissions</a></p> <p b-nlceesq935><a b-nlceesq935 target="_blank" href="/shipping-info">Shipping Information <span b-nlceesq935 class="sr-only">(opens in a new tab)</span><span b-nlceesq935 class="extLink"></span></a> 路 <a b-nlceesq935 target="_blank" href="/international-dist">International Orders <span b-nlceesq935 class="sr-only">(opens in a new tab)</span><span b-nlceesq935 class="extLink"></span></a></p> </div> </footer> <script src="/js/jquery.modal.min.js"></script> </body> </html>