diff --git a/themes/bootstrap/js/cart.js b/themes/bootstrap/js/cart.js index dd21ac7d1154efa3866cd8d3fbdccb35e56a1ee9..65d7ddd754ac94f37a77c336e35b5a6968716d8c 100644 --- a/themes/bootstrap/js/cart.js +++ b/themes/bootstrap/js/cart.js @@ -1,270 +1,270 @@ -/*global Cookies, newAccountHandler, path, vufindString, Lightbox, updatePageForLogin */ - -var _CART_COOKIE = 'vufind_cart'; -var _CART_COOKIE_SOURCES = 'vufind_cart_src'; -var _CART_COOKIE_DELIM = "\t"; - -var currentId,currentSource; - -function getCartItems() { - var items = Cookies.getItem(_CART_COOKIE); - if(items) { - return items.split(_CART_COOKIE_DELIM); - } - return []; -} -function getCartSources() { - var items = Cookies.getItem(_CART_COOKIE_SOURCES); - if(items) { - return items.split(_CART_COOKIE_DELIM); - } - return []; -} -function getFullCartItems() { - var items = getCartItems(); - var sources = getCartSources(); - var full = []; - if(items.length == 0) { - return []; - } - for(var i=items.length;i--;) { - full[full.length] = sources[items[i].charCodeAt(0)-65]+'|'+items[i].substr(1); - } - return full; -} - -function addItemToCart(id,source) { - if(!source) { - source = 'VuFind'; - } - var cartItems = getCartItems(); - var cartSources = getCartSources(); - var sIndex = cartSources.indexOf(source); - if(sIndex < 0) { - // Add source to source cookie - cartItems[cartItems.length] = String.fromCharCode(65+cartSources.length) + id; - cartSources[cartSources.length] = source; - Cookies.setItem(_CART_COOKIE_SOURCES, cartSources.join(_CART_COOKIE_DELIM), false, '/'); - } else { - cartItems[cartItems.length] = String.fromCharCode(65+sIndex) + id; - } - Cookies.setItem(_CART_COOKIE, $.unique(cartItems).join(_CART_COOKIE_DELIM), false, '/'); - $('#cartItems strong').html(parseInt($('#cartItems strong').html(), 10)+1); - return true; -} -function uniqueArray(op) { - var ret = []; - for(var i=0;i<op.length;i++) { - if(ret.indexOf(op[i]) < 0) { - ret.push(op[i]); - } - } - return ret; -} -function removeItemFromCart(id,source) { - var cartItems = getCartItems(); - var cartSources = getCartSources(); - // Find - var cartIndex = cartItems.indexOf(String.fromCharCode(65+cartSources.indexOf(source))+id); - if(cartIndex > -1) { - var sourceIndex = cartItems[cartIndex].charCodeAt(0)-65; - var cartItem = cartItems[cartIndex]; - var saveSource = false; - for(var i=cartItems.length;i--;) { - if(i==cartIndex) { - continue; - } - // If this source is shared by another, keep it - if(cartItems[i].charCodeAt(0)-65 == sourceIndex) { - saveSource = true; - break; - } - } - cartItems.splice(cartIndex,1); - // Remove unused sources - if(!saveSource) { - var oldSources = cartSources.slice(0); - cartSources.splice(sourceIndex,1); - // Adjust source index characters - for(var j=cartItems.length;j--;) { - var si = cartItems[j].charCodeAt(0)-65; - var ni = cartSources.indexOf(oldSources[si]); - cartItems[j] = String.fromCharCode(65+ni)+cartItems[j].substring(1); - } - } - if(cartItems.length > 0) { - Cookies.setItem(_CART_COOKIE, uniqueArray(cartItems).join(_CART_COOKIE_DELIM), false, '/'); - Cookies.setItem(_CART_COOKIE_SOURCES, uniqueArray(cartSources).join(_CART_COOKIE_DELIM), false, '/'); - } else { - Cookies.removeItem(_CART_COOKIE, '/'); - Cookies.removeItem(_CART_COOKIE_SOURCES, '/'); - } - $('#cartItems strong').html(parseInt($('#cartItems strong').html(), 10)-1); - return true; - } - return false; -} -var cartNotificationTimeout = false; -function registerUpdateCart($form) { - if($form) { - $("#updateCart, #bottom_updateCart").unbind('click').click(function(){ - var elId = this.id; - var selectedBoxes = $("input[name='ids[]']:checked", $form); - var selected = []; - $(selectedBoxes).each(function(i) { - selected[i] = this.value; - }); - if (selected.length > 0) { - var inCart = 0; - var msg = ""; - var orig = getFullCartItems(); - $(selected).each(function(i) { - for (var x in orig) { - if (this == orig[x]) { - inCart++; - return; - } - } - var data = this.split('|'); - addItemToCart(data[1], data[0]); - }); - var updated = getFullCartItems(); - var added = updated.length - orig.length; - msg += added + " " + vufindString.itemsAddBag; - if (inCart > 0 && orig.length > 0) { - msg += "<br/>" + inCart + " " + vufindString.itemsInBag; - } - if (updated.length >= vufindString.bookbagMax) { - msg += "<br/>" + vufindString.bookbagFull; - } - $('#'+elId).data('popover').options.content = msg; - $('#cartItems strong').html(updated.length); - } else { - $('#'+elId).data('popover').options.content = vufindString.bulk_noitems_advice; - } - $('#'+elId).popover('toggle'); - if (cartNotificationTimeout !== false) { - clearTimeout(cartNotificationTimeout); - } - cartNotificationTimeout = setTimeout(function() { - $('#'+elId).popover('hide'); - }, 5000); - return false; - }); - } -} - -// Ajax cart submission for the lightbox -var lastCartSubmit = false; -function cartSubmit($form) { - lastCartSubmit = $form; - var submit = $form.find('input[type="submit"][clicked=true]').attr('name'); - var checks = $form.find('input.checkbox-select-item:checked'); - if(checks.length == 0 && submit != 'empty') { - return Lightbox.displayError(vufindString['bulk_noitems_advice']); - } - if (submit == 'print') { - //redirect page - var url = path+'/Records/Home?print=true'; - for(var i=0;i<checks.length;i++) { - url += '&id[]='+checks[i].value; - } - document.location.href = url; - } else if ((submit != 'empty' || confirm(vufindString['confirmEmpty'])) - && (submit != 'delete' || confirm(vufindString['confirmDelete']))) { - Lightbox.submit($form, Lightbox.changeContent); - } else { - $('#modal').find('.icon-spinner').remove(); - } -} - -$(document).ready(function() { - // Record buttons - var cartId = $('#cartId'); - if(cartId.length > 0) { - cartId = cartId.val().split('|'); - currentId = cartId[1]; - currentSource = cartId[0]; - $('#cart-add.correct,#cart-remove.correct').removeClass('correct hidden'); - $('#cart-add').click(function() { - addItemToCart(currentId,currentSource); - $('#cart-add,#cart-remove').toggleClass('hidden'); - }); - $('#cart-remove').click(function() { - removeItemFromCart(currentId,currentSource); - $('#cart-add,#cart-remove').toggleClass('hidden'); - }); - } else { - // Search results - var $form = $('form[name="bulkActionForm"]'); - registerUpdateCart($form); - } - $("#updateCart, #bottom_updateCart").popover({content:'', html:true, trigger:'manual'}); - - // Setup lightbox behavior - // Cart lightbox - $('#cartItems').click(function() { - return Lightbox.get('Cart','Cart'); - }); - // Overwrite - Lightbox.addFormCallback('accountForm', function(html) { - updatePageForLogin(); - if (lastCartSubmit !== false) { - cartSubmit(lastCartSubmit); - lastCartSubmit = false; - } else { - newAccountHandler(html); - } - }); - Lightbox.addFormHandler('cartForm', function(evt) { - cartSubmit($(evt.target)); - return false; - }); - Lightbox.addFormCallback('bulkEmail', function(html) { - Lightbox.confirm(vufindString['bulk_email_success']); - }); - Lightbox.addFormCallback('bulkSave', function(html) { - // After we close the lightbox, redirect to list view - Lightbox.addCloseAction(function() { - document.location.href = path+'/MyResearch/MyList/'+Lightbox.lastPOST['list']; - }); - Lightbox.confirm(vufindString['bulk_save_success']); - }); - Lightbox.addFormHandler('exportForm', function(evt) { - $.ajax({ - url: path + '/AJAX/JSON?' + $.param({method:'exportFavorites'}), - type:'POST', - dataType:'json', - data:Lightbox.getFormData($(evt.target)), - success:function(data) { - if(data.data.needs_redirect) { - document.location.href = data.data.result_url; - } else { - Lightbox.changeContent(data.data.result_additional); - } - }, - error:function(d,e) { - //console.log(d,e); // Error reporting - } - }); - return false; - }); - $('#modal').on('hidden', function(e) { - // Update cart items (add to cart, remove from cart, cart lightbox interface) - var cartCount = $('#cartItems strong'); - if(cartCount.length > 0) { - var cart = getFullCartItems(); - var id = $('#cartId'); - if(id.length > 0) { - id = id.val(); - $('#cart-add,#cart-remove').addClass('hidden'); - if(cart.indexOf(id) > -1) { - $('#cart-remove').removeClass('hidden'); - } else { - $('#cart-add').removeClass('hidden'); - } - } - cartCount.html(cart.length); - } - }); -}); +/*global confirm, Cookies, newAccountHandler, path, vufindString, Lightbox, updatePageForLogin */ + +var _CART_COOKIE = 'vufind_cart'; +var _CART_COOKIE_SOURCES = 'vufind_cart_src'; +var _CART_COOKIE_DELIM = "\t"; + +var currentId,currentSource; + +function getCartItems() { + var items = Cookies.getItem(_CART_COOKIE); + if(items) { + return items.split(_CART_COOKIE_DELIM); + } + return []; +} +function getCartSources() { + var items = Cookies.getItem(_CART_COOKIE_SOURCES); + if(items) { + return items.split(_CART_COOKIE_DELIM); + } + return []; +} +function getFullCartItems() { + var items = getCartItems(); + var sources = getCartSources(); + var full = []; + if(items.length == 0) { + return []; + } + for(var i=items.length;i--;) { + full[full.length] = sources[items[i].charCodeAt(0)-65]+'|'+items[i].substr(1); + } + return full; +} + +function addItemToCart(id,source) { + if(!source) { + source = 'VuFind'; + } + var cartItems = getCartItems(); + var cartSources = getCartSources(); + var sIndex = cartSources.indexOf(source); + if(sIndex < 0) { + // Add source to source cookie + cartItems[cartItems.length] = String.fromCharCode(65+cartSources.length) + id; + cartSources[cartSources.length] = source; + Cookies.setItem(_CART_COOKIE_SOURCES, cartSources.join(_CART_COOKIE_DELIM), false, '/'); + } else { + cartItems[cartItems.length] = String.fromCharCode(65+sIndex) + id; + } + Cookies.setItem(_CART_COOKIE, $.unique(cartItems).join(_CART_COOKIE_DELIM), false, '/'); + $('#cartItems strong').html(parseInt($('#cartItems strong').html(), 10)+1); + return true; +} +function uniqueArray(op) { + var ret = []; + for(var i=0;i<op.length;i++) { + if(ret.indexOf(op[i]) < 0) { + ret.push(op[i]); + } + } + return ret; +} +function removeItemFromCart(id,source) { + var cartItems = getCartItems(); + var cartSources = getCartSources(); + // Find + var cartIndex = cartItems.indexOf(String.fromCharCode(65+cartSources.indexOf(source))+id); + if(cartIndex > -1) { + var sourceIndex = cartItems[cartIndex].charCodeAt(0)-65; + var cartItem = cartItems[cartIndex]; + var saveSource = false; + for(var i=cartItems.length;i--;) { + if(i==cartIndex) { + continue; + } + // If this source is shared by another, keep it + if(cartItems[i].charCodeAt(0)-65 == sourceIndex) { + saveSource = true; + break; + } + } + cartItems.splice(cartIndex,1); + // Remove unused sources + if(!saveSource) { + var oldSources = cartSources.slice(0); + cartSources.splice(sourceIndex,1); + // Adjust source index characters + for(var j=cartItems.length;j--;) { + var si = cartItems[j].charCodeAt(0)-65; + var ni = cartSources.indexOf(oldSources[si]); + cartItems[j] = String.fromCharCode(65+ni)+cartItems[j].substring(1); + } + } + if(cartItems.length > 0) { + Cookies.setItem(_CART_COOKIE, uniqueArray(cartItems).join(_CART_COOKIE_DELIM), false, '/'); + Cookies.setItem(_CART_COOKIE_SOURCES, uniqueArray(cartSources).join(_CART_COOKIE_DELIM), false, '/'); + } else { + Cookies.removeItem(_CART_COOKIE, '/'); + Cookies.removeItem(_CART_COOKIE_SOURCES, '/'); + } + $('#cartItems strong').html(parseInt($('#cartItems strong').html(), 10)-1); + return true; + } + return false; +} +var cartNotificationTimeout = false; +function registerUpdateCart($form) { + if($form) { + $("#updateCart, #bottom_updateCart").unbind('click').click(function(){ + var elId = this.id; + var selectedBoxes = $("input[name='ids[]']:checked", $form); + var selected = []; + $(selectedBoxes).each(function(i) { + selected[i] = this.value; + }); + if (selected.length > 0) { + var inCart = 0; + var msg = ""; + var orig = getFullCartItems(); + $(selected).each(function(i) { + for (var x in orig) { + if (this == orig[x]) { + inCart++; + return; + } + } + var data = this.split('|'); + addItemToCart(data[1], data[0]); + }); + var updated = getFullCartItems(); + var added = updated.length - orig.length; + msg += added + " " + vufindString.itemsAddBag; + if (inCart > 0 && orig.length > 0) { + msg += "<br/>" + inCart + " " + vufindString.itemsInBag; + } + if (updated.length >= vufindString.bookbagMax) { + msg += "<br/>" + vufindString.bookbagFull; + } + $('#'+elId).data('popover').options.content = msg; + $('#cartItems strong').html(updated.length); + } else { + $('#'+elId).data('popover').options.content = vufindString.bulk_noitems_advice; + } + $('#'+elId).popover('toggle'); + if (cartNotificationTimeout !== false) { + clearTimeout(cartNotificationTimeout); + } + cartNotificationTimeout = setTimeout(function() { + $('#'+elId).popover('hide'); + }, 5000); + return false; + }); + } +} + +// Ajax cart submission for the lightbox +var lastCartSubmit = false; +function cartSubmit($form) { + lastCartSubmit = $form; + var submit = $form.find('input[type="submit"][clicked=true]').attr('name'); + var checks = $form.find('input.checkbox-select-item:checked'); + if(checks.length == 0 && submit != 'empty') { + return Lightbox.displayError(vufindString['bulk_noitems_advice']); + } + if (submit == 'print') { + //redirect page + var url = path+'/Records/Home?print=true'; + for(var i=0;i<checks.length;i++) { + url += '&id[]='+checks[i].value; + } + document.location.href = url; + } else if ((submit != 'empty' || confirm(vufindString['confirmEmpty'])) + && (submit != 'delete' || confirm(vufindString['confirmDelete']))) { + Lightbox.submit($form, Lightbox.changeContent); + } else { + $('#modal').find('.icon-spinner').remove(); + } +} + +$(document).ready(function() { + // Record buttons + var cartId = $('#cartId'); + if(cartId.length > 0) { + cartId = cartId.val().split('|'); + currentId = cartId[1]; + currentSource = cartId[0]; + $('#cart-add.correct,#cart-remove.correct').removeClass('correct hidden'); + $('#cart-add').click(function() { + addItemToCart(currentId,currentSource); + $('#cart-add,#cart-remove').toggleClass('hidden'); + }); + $('#cart-remove').click(function() { + removeItemFromCart(currentId,currentSource); + $('#cart-add,#cart-remove').toggleClass('hidden'); + }); + } else { + // Search results + var $form = $('form[name="bulkActionForm"]'); + registerUpdateCart($form); + } + $("#updateCart, #bottom_updateCart").popover({content:'', html:true, trigger:'manual'}); + + // Setup lightbox behavior + // Cart lightbox + $('#cartItems').click(function() { + return Lightbox.get('Cart','Cart'); + }); + // Overwrite + Lightbox.addFormCallback('accountForm', function(html) { + updatePageForLogin(); + if (lastCartSubmit !== false) { + cartSubmit(lastCartSubmit); + lastCartSubmit = false; + } else { + newAccountHandler(html); + } + }); + Lightbox.addFormHandler('cartForm', function(evt) { + cartSubmit($(evt.target)); + return false; + }); + Lightbox.addFormCallback('bulkEmail', function(html) { + Lightbox.confirm(vufindString['bulk_email_success']); + }); + Lightbox.addFormCallback('bulkSave', function(html) { + // After we close the lightbox, redirect to list view + Lightbox.addCloseAction(function() { + document.location.href = path+'/MyResearch/MyList/'+Lightbox.lastPOST['list']; + }); + Lightbox.confirm(vufindString['bulk_save_success']); + }); + Lightbox.addFormHandler('exportForm', function(evt) { + $.ajax({ + url: path + '/AJAX/JSON?' + $.param({method:'exportFavorites'}), + type:'POST', + dataType:'json', + data:Lightbox.getFormData($(evt.target)), + success:function(data) { + if(data.data.needs_redirect) { + document.location.href = data.data.result_url; + } else { + Lightbox.changeContent(data.data.result_additional); + } + }, + error:function(d,e) { + //console.log(d,e); // Error reporting + } + }); + return false; + }); + $('#modal').on('hidden', function(e) { + // Update cart items (add to cart, remove from cart, cart lightbox interface) + var cartCount = $('#cartItems strong'); + if(cartCount.length > 0) { + var cart = getFullCartItems(); + var id = $('#cartId'); + if(id.length > 0) { + id = id.val(); + $('#cart-add,#cart-remove').addClass('hidden'); + if(cart.indexOf(id) > -1) { + $('#cart-remove').removeClass('hidden'); + } else { + $('#cart-add').removeClass('hidden'); + } + } + cartCount.html(cart.length); + } + }); +}); diff --git a/themes/bootstrap3/js/cart.js b/themes/bootstrap3/js/cart.js index 3843c8c3213823261d8c80db925058f59b300f6a..31410581dc1de85d02d5360388f4a684b044adf1 100644 --- a/themes/bootstrap3/js/cart.js +++ b/themes/bootstrap3/js/cart.js @@ -1,270 +1,270 @@ -/*global Cookies, newAccountHandler, path, vufindString, Lightbox, updatePageForLogin */ - -var _CART_COOKIE = 'vufind_cart'; -var _CART_COOKIE_SOURCES = 'vufind_cart_src'; -var _CART_COOKIE_DELIM = "\t"; - -var currentId,currentSource; - -function getCartItems() { - var items = Cookies.getItem(_CART_COOKIE); - if(items) { - return items.split(_CART_COOKIE_DELIM); - } - return []; -} -function getCartSources() { - var items = Cookies.getItem(_CART_COOKIE_SOURCES); - if(items) { - return items.split(_CART_COOKIE_DELIM); - } - return []; -} -function getFullCartItems() { - var items = getCartItems(); - var sources = getCartSources(); - var full = []; - if(items.length == 0) { - return []; - } - for(var i=items.length;i--;) { - full[full.length] = sources[items[i].charCodeAt(0)-65]+'|'+items[i].substr(1); - } - return full; -} - -function addItemToCart(id,source) { - if(!source) { - source = 'VuFind'; - } - var cartItems = getCartItems(); - var cartSources = getCartSources(); - var sIndex = cartSources.indexOf(source); - if(sIndex < 0) { - // Add source to source cookie - cartItems[cartItems.length] = String.fromCharCode(65+cartSources.length) + id; - cartSources[cartSources.length] = source; - Cookies.setItem(_CART_COOKIE_SOURCES, cartSources.join(_CART_COOKIE_DELIM), false, '/'); - } else { - cartItems[cartItems.length] = String.fromCharCode(65+sIndex) + id; - } - Cookies.setItem(_CART_COOKIE, $.unique(cartItems).join(_CART_COOKIE_DELIM), false, '/'); - $('#cartItems strong').html(parseInt($('#cartItems strong').html(), 10)+1); - return true; -} -function uniqueArray(op) { - var ret = []; - for(var i=0;i<op.length;i++) { - if(ret.indexOf(op[i]) < 0) { - ret.push(op[i]); - } - } - return ret; -} -function removeItemFromCart(id,source) { - var cartItems = getCartItems(); - var cartSources = getCartSources(); - // Find - var cartIndex = cartItems.indexOf(String.fromCharCode(65+cartSources.indexOf(source))+id); - if(cartIndex > -1) { - var sourceIndex = cartItems[cartIndex].charCodeAt(0)-65; - var cartItem = cartItems[cartIndex]; - var saveSource = false; - for(var i=cartItems.length;i--;) { - if(i==cartIndex) { - continue; - } - // If this source is shared by another, keep it - if(cartItems[i].charCodeAt(0)-65 == sourceIndex) { - saveSource = true; - break; - } - } - cartItems.splice(cartIndex,1); - // Remove unused sources - if(!saveSource) { - var oldSources = cartSources.slice(0); - cartSources.splice(sourceIndex,1); - // Adjust source index characters - for(var j=cartItems.length;j--;) { - var si = cartItems[j].charCodeAt(0)-65; - var ni = cartSources.indexOf(oldSources[si]); - cartItems[j] = String.fromCharCode(65+ni)+cartItems[j].substring(1); - } - } - if(cartItems.length > 0) { - Cookies.setItem(_CART_COOKIE, uniqueArray(cartItems).join(_CART_COOKIE_DELIM), false, '/'); - Cookies.setItem(_CART_COOKIE_SOURCES, uniqueArray(cartSources).join(_CART_COOKIE_DELIM), false, '/'); - } else { - Cookies.removeItem(_CART_COOKIE, '/'); - Cookies.removeItem(_CART_COOKIE_SOURCES, '/'); - } - $('#cartItems strong').html(parseInt($('#cartItems strong').html(), 10)-1); - return true; - } - return false; -} -var cartNotificationTimeout = false; -function registerUpdateCart($form) { - if($form) { - $("#updateCart, #bottom_updateCart").unbind('click').click(function(){ - var elId = this.id; - var selectedBoxes = $("input[name='ids[]']:checked", $form); - var selected = []; - $(selectedBoxes).each(function(i) { - selected[i] = this.value; - }); - if (selected.length > 0) { - var inCart = 0; - var msg = ""; - var orig = getFullCartItems(); - $(selected).each(function(i) { - for (var x in orig) { - if (this == orig[x]) { - inCart++; - return; - } - } - var data = this.split('|'); - addItemToCart(data[1], data[0]); - }); - var updated = getFullCartItems(); - var added = updated.length - orig.length; - msg += added + " " + vufindString.itemsAddBag; - if (inCart > 0 && orig.length > 0) { - msg += "<br/>" + inCart + " " + vufindString.itemsInBag; - } - if (updated.length >= vufindString.bookbagMax) { - msg += "<br/>" + vufindString.bookbagFull; - } - $('#'+elId).data('bs.popover').options.content = msg; - $('#cartItems strong').html(updated.length); - } else { - $('#'+elId).data('bs.popover').options.content = vufindString.bulk_noitems_advice; - } - $('#'+elId).popover('show'); - if (cartNotificationTimeout !== false) { - clearTimeout(cartNotificationTimeout); - } - cartNotificationTimeout = setTimeout(function() { - $('#'+elId).popover('hide'); - }, 5000); - return false; - }); - } -} - -// Ajax cart submission for the lightbox -var lastCartSubmit = false; -function cartSubmit($form) { - lastCartSubmit = $form; - var submit = $form.find('input[type="submit"][clicked=true]').attr('name'); - var checks = $form.find('input.checkbox-select-item:checked'); - if(checks.length == 0 && submit != 'empty') { - return Lightbox.displayError(vufindString['bulk_noitems_advice']); - } - if (submit == 'print') { - //redirect page - var url = path+'/Records/Home?print=true'; - for(var i=0;i<checks.length;i++) { - url += '&id[]='+checks[i].value; - } - document.location.href = url; - } else if ((submit != 'empty' || confirm(vufindString['confirmEmpty'])) - && (submit != 'delete' || confirm(vufindString['confirmDelete']))) { - Lightbox.submit($form, Lightbox.changeContent); - } else { - $('#modal').find('.fa.fa-spinner').remove(); - } -} - -$(document).ready(function() { - // Record buttons - var cartId = $('#cartId'); - if(cartId.length > 0) { - cartId = cartId.val().split('|'); - currentId = cartId[1]; - currentSource = cartId[0]; - $('#cart-add.correct,#cart-remove.correct').removeClass('correct hidden'); - $('#cart-add').click(function() { - addItemToCart(currentId,currentSource); - $('#cart-add,#cart-remove').toggleClass('hidden'); - }); - $('#cart-remove').click(function() { - removeItemFromCart(currentId,currentSource); - $('#cart-add,#cart-remove').toggleClass('hidden'); - }); - } else { - // Search results - var $form = $('form[name="bulkActionForm"]'); - registerUpdateCart($form); - } - $("#updateCart, #bottom_updateCart").popover({content:'', html:true, trigger:'manual'}); - - // Setup lightbox behavior - // Cart lightbox - $('#cartItems').click(function() { - return Lightbox.get('Cart','Cart'); - }); - // Overwrite - Lightbox.addFormCallback('accountForm', function(html) { - updatePageForLogin(); - if (lastCartSubmit !== false) { - cartSubmit(lastCartSubmit); - lastCartSubmit = false; - } else { - newAccountHandler(html); - } - }); - Lightbox.addFormHandler('cartForm', function(evt) { - cartSubmit($(evt.target)); - return false; - }); - Lightbox.addFormCallback('bulkEmail', function(html) { - Lightbox.confirm(vufindString['bulk_email_success']); - }); - Lightbox.addFormCallback('bulkSave', function(html) { - // After we close the lightbox, redirect to list view - Lightbox.addCloseAction(function() { - document.location.href = path+'/MyResearch/MyList/'+Lightbox.lastPOST['list']; - }); - Lightbox.confirm(vufindString['bulk_save_success']); - }); - Lightbox.addFormHandler('exportForm', function(evt) { - $.ajax({ - url: path + '/AJAX/JSON?' + $.param({method:'exportFavorites'}), - type:'POST', - dataType:'json', - data:Lightbox.getFormData($(evt.target)), - success:function(data) { - if(data.data.needs_redirect) { - document.location.href = data.data.result_url; - } else { - Lightbox.changeContent(data.data.result_additional); - } - }, - error:function(d,e) { - //console.log(d,e); // Error reporting - } - }); - return false; - }); - $('#modal').on('hidden.bs.modal', function() { - // Update cart items (add to cart, remove from cart, cart lightbox interface) - var cartCount = $('#cartItems strong'); - if(cartCount.length > 0) { - var cart = getFullCartItems(); - var id = $('#cartId'); - if(id.length > 0) { - id = id.val(); - $('#cart-add,#cart-remove').addClass('hidden'); - if(cart.indexOf(id) > -1) { - $('#cart-remove').removeClass('hidden'); - } else { - $('#cart-add').removeClass('hidden'); - } - } - cartCount.html(cart.length); - } - }); -}); +/*global confirm, Cookies, newAccountHandler, path, vufindString, Lightbox, updatePageForLogin */ + +var _CART_COOKIE = 'vufind_cart'; +var _CART_COOKIE_SOURCES = 'vufind_cart_src'; +var _CART_COOKIE_DELIM = "\t"; + +var currentId,currentSource; + +function getCartItems() { + var items = Cookies.getItem(_CART_COOKIE); + if(items) { + return items.split(_CART_COOKIE_DELIM); + } + return []; +} +function getCartSources() { + var items = Cookies.getItem(_CART_COOKIE_SOURCES); + if(items) { + return items.split(_CART_COOKIE_DELIM); + } + return []; +} +function getFullCartItems() { + var items = getCartItems(); + var sources = getCartSources(); + var full = []; + if(items.length == 0) { + return []; + } + for(var i=items.length;i--;) { + full[full.length] = sources[items[i].charCodeAt(0)-65]+'|'+items[i].substr(1); + } + return full; +} + +function addItemToCart(id,source) { + if(!source) { + source = 'VuFind'; + } + var cartItems = getCartItems(); + var cartSources = getCartSources(); + var sIndex = cartSources.indexOf(source); + if(sIndex < 0) { + // Add source to source cookie + cartItems[cartItems.length] = String.fromCharCode(65+cartSources.length) + id; + cartSources[cartSources.length] = source; + Cookies.setItem(_CART_COOKIE_SOURCES, cartSources.join(_CART_COOKIE_DELIM), false, '/'); + } else { + cartItems[cartItems.length] = String.fromCharCode(65+sIndex) + id; + } + Cookies.setItem(_CART_COOKIE, $.unique(cartItems).join(_CART_COOKIE_DELIM), false, '/'); + $('#cartItems strong').html(parseInt($('#cartItems strong').html(), 10)+1); + return true; +} +function uniqueArray(op) { + var ret = []; + for(var i=0;i<op.length;i++) { + if(ret.indexOf(op[i]) < 0) { + ret.push(op[i]); + } + } + return ret; +} +function removeItemFromCart(id,source) { + var cartItems = getCartItems(); + var cartSources = getCartSources(); + // Find + var cartIndex = cartItems.indexOf(String.fromCharCode(65+cartSources.indexOf(source))+id); + if(cartIndex > -1) { + var sourceIndex = cartItems[cartIndex].charCodeAt(0)-65; + var cartItem = cartItems[cartIndex]; + var saveSource = false; + for(var i=cartItems.length;i--;) { + if(i==cartIndex) { + continue; + } + // If this source is shared by another, keep it + if(cartItems[i].charCodeAt(0)-65 == sourceIndex) { + saveSource = true; + break; + } + } + cartItems.splice(cartIndex,1); + // Remove unused sources + if(!saveSource) { + var oldSources = cartSources.slice(0); + cartSources.splice(sourceIndex,1); + // Adjust source index characters + for(var j=cartItems.length;j--;) { + var si = cartItems[j].charCodeAt(0)-65; + var ni = cartSources.indexOf(oldSources[si]); + cartItems[j] = String.fromCharCode(65+ni)+cartItems[j].substring(1); + } + } + if(cartItems.length > 0) { + Cookies.setItem(_CART_COOKIE, uniqueArray(cartItems).join(_CART_COOKIE_DELIM), false, '/'); + Cookies.setItem(_CART_COOKIE_SOURCES, uniqueArray(cartSources).join(_CART_COOKIE_DELIM), false, '/'); + } else { + Cookies.removeItem(_CART_COOKIE, '/'); + Cookies.removeItem(_CART_COOKIE_SOURCES, '/'); + } + $('#cartItems strong').html(parseInt($('#cartItems strong').html(), 10)-1); + return true; + } + return false; +} +var cartNotificationTimeout = false; +function registerUpdateCart($form) { + if($form) { + $("#updateCart, #bottom_updateCart").unbind('click').click(function(){ + var elId = this.id; + var selectedBoxes = $("input[name='ids[]']:checked", $form); + var selected = []; + $(selectedBoxes).each(function(i) { + selected[i] = this.value; + }); + if (selected.length > 0) { + var inCart = 0; + var msg = ""; + var orig = getFullCartItems(); + $(selected).each(function(i) { + for (var x in orig) { + if (this == orig[x]) { + inCart++; + return; + } + } + var data = this.split('|'); + addItemToCart(data[1], data[0]); + }); + var updated = getFullCartItems(); + var added = updated.length - orig.length; + msg += added + " " + vufindString.itemsAddBag; + if (inCart > 0 && orig.length > 0) { + msg += "<br/>" + inCart + " " + vufindString.itemsInBag; + } + if (updated.length >= vufindString.bookbagMax) { + msg += "<br/>" + vufindString.bookbagFull; + } + $('#'+elId).data('bs.popover').options.content = msg; + $('#cartItems strong').html(updated.length); + } else { + $('#'+elId).data('bs.popover').options.content = vufindString.bulk_noitems_advice; + } + $('#'+elId).popover('show'); + if (cartNotificationTimeout !== false) { + clearTimeout(cartNotificationTimeout); + } + cartNotificationTimeout = setTimeout(function() { + $('#'+elId).popover('hide'); + }, 5000); + return false; + }); + } +} + +// Ajax cart submission for the lightbox +var lastCartSubmit = false; +function cartSubmit($form) { + lastCartSubmit = $form; + var submit = $form.find('input[type="submit"][clicked=true]').attr('name'); + var checks = $form.find('input.checkbox-select-item:checked'); + if(checks.length == 0 && submit != 'empty') { + return Lightbox.displayError(vufindString['bulk_noitems_advice']); + } + if (submit == 'print') { + //redirect page + var url = path+'/Records/Home?print=true'; + for(var i=0;i<checks.length;i++) { + url += '&id[]='+checks[i].value; + } + document.location.href = url; + } else if ((submit != 'empty' || confirm(vufindString['confirmEmpty'])) + && (submit != 'delete' || confirm(vufindString['confirmDelete']))) { + Lightbox.submit($form, Lightbox.changeContent); + } else { + $('#modal').find('.fa.fa-spinner').remove(); + } +} + +$(document).ready(function() { + // Record buttons + var cartId = $('#cartId'); + if(cartId.length > 0) { + cartId = cartId.val().split('|'); + currentId = cartId[1]; + currentSource = cartId[0]; + $('#cart-add.correct,#cart-remove.correct').removeClass('correct hidden'); + $('#cart-add').click(function() { + addItemToCart(currentId,currentSource); + $('#cart-add,#cart-remove').toggleClass('hidden'); + }); + $('#cart-remove').click(function() { + removeItemFromCart(currentId,currentSource); + $('#cart-add,#cart-remove').toggleClass('hidden'); + }); + } else { + // Search results + var $form = $('form[name="bulkActionForm"]'); + registerUpdateCart($form); + } + $("#updateCart, #bottom_updateCart").popover({content:'', html:true, trigger:'manual'}); + + // Setup lightbox behavior + // Cart lightbox + $('#cartItems').click(function() { + return Lightbox.get('Cart','Cart'); + }); + // Overwrite + Lightbox.addFormCallback('accountForm', function(html) { + updatePageForLogin(); + if (lastCartSubmit !== false) { + cartSubmit(lastCartSubmit); + lastCartSubmit = false; + } else { + newAccountHandler(html); + } + }); + Lightbox.addFormHandler('cartForm', function(evt) { + cartSubmit($(evt.target)); + return false; + }); + Lightbox.addFormCallback('bulkEmail', function(html) { + Lightbox.confirm(vufindString['bulk_email_success']); + }); + Lightbox.addFormCallback('bulkSave', function(html) { + // After we close the lightbox, redirect to list view + Lightbox.addCloseAction(function() { + document.location.href = path+'/MyResearch/MyList/'+Lightbox.lastPOST['list']; + }); + Lightbox.confirm(vufindString['bulk_save_success']); + }); + Lightbox.addFormHandler('exportForm', function(evt) { + $.ajax({ + url: path + '/AJAX/JSON?' + $.param({method:'exportFavorites'}), + type:'POST', + dataType:'json', + data:Lightbox.getFormData($(evt.target)), + success:function(data) { + if(data.data.needs_redirect) { + document.location.href = data.data.result_url; + } else { + Lightbox.changeContent(data.data.result_additional); + } + }, + error:function(d,e) { + //console.log(d,e); // Error reporting + } + }); + return false; + }); + $('#modal').on('hidden.bs.modal', function() { + // Update cart items (add to cart, remove from cart, cart lightbox interface) + var cartCount = $('#cartItems strong'); + if(cartCount.length > 0) { + var cart = getFullCartItems(); + var id = $('#cartId'); + if(id.length > 0) { + id = id.val(); + $('#cart-add,#cart-remove').addClass('hidden'); + if(cart.indexOf(id) > -1) { + $('#cart-remove').removeClass('hidden'); + } else { + $('#cart-add').removeClass('hidden'); + } + } + cartCount.html(cart.length); + } + }); +});