The Gitlab instance will be restarted on Monday April 28th at 2AM. There will be a short interruption of service.

Skip to content
Snippets Groups Projects
Commit de767dbd authored by Chris Hallberg's avatar Chris Hallberg Committed by Demian Katz
Browse files

Convert Cart to a namespaced object.

parent 9fe393af
No related merge requests found
/*global bulkActionSubmit, cartCookieDomain, Cookies, Lightbox, refreshPageForLogin, VuFind */
/*global Cookies, VuFind */
var _CART_COOKIE = 'vufind_cart';
var _CART_COOKIE_SOURCES = 'vufind_cart_src';
var _CART_COOKIE_DELIM = "\t";
VuFind.cart = (function() {
var _COOKIE = 'vufind_cart';
var _COOKIE_SOURCES = 'vufind_cart_src';
var _COOKIE_DELIM = "\t";
var _COOKIE_DOMAIN = false;
var currentId,currentSource;
var lastCartSubmit = false;
var setDomain = function(domain) {
_COOKIE_DOMAIN = domain;
}
function getCartItems() {
var items = Cookies.getItem(_CART_COOKIE);
if(items) {
return items.split(_CART_COOKIE_DELIM);
var _uniqueArray = function(op) {
var ret = [];
for(var i=0;i<op.length;i++) {
if(ret.indexOf(op[i]) < 0) {
ret.push(op[i]);
}
}
return ret;
}
return [];
}
function getCartSources() {
var items = Cookies.getItem(_CART_COOKIE_SOURCES);
if(items) {
return items.split(_CART_COOKIE_DELIM);
var _getItems = function() {
var items = Cookies.getItem(_COOKIE);
if(items) {
return items.split(_COOKIE_DELIM);
}
return [];
}
return [];
}
function getFullCartItems() {
var items = getCartItems();
var sources = getCartSources();
var full = [];
if(items.length == 0) {
var _getSources = function() {
var items = Cookies.getItem(_COOKIE_SOURCES);
if(items) {
return items.split(_COOKIE_DELIM);
}
return [];
}
for(var i=items.length;i--;) {
full[full.length] = sources[items[i].charCodeAt(0)-65]+'|'+items[i].substr(1);
var getFullItems = function() {
var items = _getItems();
var sources = _getSources();
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;
}
return full;
}
function updateCartCount() {
var items = getCartItems();
$('#cartItems strong').html(items.length);
}
function addItemToCart(id,source) {
if(!source) {
source = VuFind.defaultSearchBackend;
}
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, '/', cartCookieDomain);
} else {
cartItems[cartItems.length] = String.fromCharCode(65+sIndex) + id;
var updateCount = function() {
var items = _getItems();
$('#cartItems strong').html(items.length);
}
Cookies.setItem(_CART_COOKIE, $.unique(cartItems).join(_CART_COOKIE_DELIM), false, '/', cartCookieDomain);
updateCartCount();
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]);
var addItem = function(id,source) {
if(!source) {
source = VuFind.defaultSearchBackend;
}
var cartItems = _getItems();
var cartSources = _getSources();
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(_COOKIE_SOURCES, cartSources.join(_COOKIE_DELIM), false, '/', _COOKIE_DOMAIN);
} else {
cartItems[cartItems.length] = String.fromCharCode(65+sIndex) + id;
}
Cookies.setItem(_COOKIE, $.unique(cartItems).join(_COOKIE_DELIM), false, '/', _COOKIE_DOMAIN);
updateCount();
return true;
}
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;
var removeItem = function(id,source) {
var cartItems = _getItems();
var cartSources = _getSources();
// 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;
}
}
// 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);
}
}
}
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(_COOKIE, _uniqueArray(cartItems).join(_COOKIE_DELIM), false, '/', _COOKIE_DOMAIN);
Cookies.setItem(_COOKIE_SOURCES, _uniqueArray(cartSources).join(_COOKIE_DELIM), false, '/', _COOKIE_DOMAIN);
} else {
Cookies.removeItem(_COOKIE, '/', _COOKIE_DOMAIN);
Cookies.removeItem(_COOKIE_SOURCES, '/', _COOKIE_DOMAIN);
}
updateCount();
return true;
}
if(cartItems.length > 0) {
Cookies.setItem(_CART_COOKIE, uniqueArray(cartItems).join(_CART_COOKIE_DELIM), false, '/', cartCookieDomain);
Cookies.setItem(_CART_COOKIE_SOURCES, uniqueArray(cartSources).join(_CART_COOKIE_DELIM), false, '/', cartCookieDomain);
} else {
Cookies.removeItem(_CART_COOKIE, '/', cartCookieDomain);
Cookies.removeItem(_CART_COOKIE_SOURCES, '/', cartCookieDomain);
}
updateCartCount();
return true;
return false;
}
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 _cartNotificationTimeout = false;
var _registerUpdate = function($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 = getFullItems();
$(selected).each(function(i) {
for (var x in orig) {
if (this == orig[x]) {
inCart++;
return;
}
}
var data = this.split('|');
addItem(data[1], data[0]);
});
var updated = getFullItems();
var added = updated.length - orig.length;
msg += added + " " + VuFind.translate('itemsAddBag');
if (inCart > 0 && orig.length > 0) {
msg += "<br/>" + inCart + " " + VuFind.translate('itemsInBag');
}
var data = this.split('|');
addItemToCart(data[1], data[0]);
});
var updated = getFullCartItems();
var added = updated.length - orig.length;
msg += added + " " + VuFind.translate('itemsAddBag');
if (inCart > 0 && orig.length > 0) {
msg += "<br/>" + inCart + " " + VuFind.translate('itemsInBag');
if (updated.length >= VuFind.translate('bookbagMax')) {
msg += "<br/>" + VuFind.translate('bookbagFull');
}
$('#'+elId).data('bs.popover').options.content = msg;
$('#cartItems strong').html(updated.length);
} else {
$('#'+elId).data('bs.popover').options.content = VuFind.translate('bulk_noitems_advice');
}
if (updated.length >= VuFind.translate('bookbagMax')) {
msg += "<br/>" + VuFind.translate('bookbagFull');
$('#'+elId).popover('show');
if (_cartNotificationTimeout !== false) {
clearTimeout(_cartNotificationTimeout);
}
$('#'+elId).data('bs.popover').options.content = msg;
$('#cartItems strong').html(updated.length);
_cartNotificationTimeout = setTimeout(function() {
$('#'+elId).popover('hide');
}, 5000);
return false;
});
}
}
// Reveal
return {
// Methods
addItem: addItem,
removeItem: removeItem,
getFullItems: getFullItems,
updateCount: updateCount,
setDomain: setDomain,
// Lightbox handler
// Setup
ready: function() {
// Record buttons
var $cartId = $('.cartId');
if($cartId.length > 0) {
$cartId.each(function() {
var cartId = this.value.split('|');
var currentId = cartId[1];
var currentSource = cartId[0];
var $parent = $(this).parent();
$parent.find('.cart-add.correct,.cart-remove.correct').removeClass('correct hidden');
$parent.find('.cart-add').click(function() {
addItem(currentId,currentSource);
$parent.find('.cart-add,.cart-remove').toggleClass('hidden');
});
$parent.find('.cart-remove').click(function() {
removeItem(currentId,currentSource);
$parent.find('.cart-add,.cart-remove').toggleClass('hidden');
});
});
} else {
$('#'+elId).data('bs.popover').options.content = VuFind.translate('bulk_noitems_advice');
}
$('#'+elId).popover('show');
if (cartNotificationTimeout !== false) {
clearTimeout(cartNotificationTimeout);
// Search results
var $form = $('form[name="bulkActionForm"]');
_registerUpdate($form);
}
cartNotificationTimeout = setTimeout(function() {
$('#'+elId).popover('hide');
}, 5000);
return false;
});
}
}
$("#updateCart, #bottom_updateCart").popover({content:'', html:true, trigger:'manual'});
}
};
})();
// Building an array and checking indexes prevents a race situation
// We want to prioritize empty over printing
function cartFormHandler(event, data) {
var cartFormHandler = function(event, data) {
var keys = [];
for (var i in data) {
keys.push(data[i].name);
......@@ -176,31 +219,6 @@ function cartFormHandler(event, data) {
}
}
document.addEventListener('VuFind.lightbox.closed', updateCartCount, false);
document.addEventListener('VuFind.lightbox.closed', VuFind.cart.updateCount, false);
$(document).ready(function() {
// Record buttons
var $cartId = $('.cartId');
if($cartId.length > 0) {
$cartId.each(function() {
var cartId = this.value.split('|');
currentId = cartId[1];
currentSource = cartId[0];
var $parent = $(this).parent();
$parent.find('.cart-add.correct,.cart-remove.correct').removeClass('correct hidden');
$parent.find('.cart-add').click(function() {
addItemToCart(currentId,currentSource);
$parent.find('.cart-add,.cart-remove').toggleClass('hidden');
});
$parent.find('.cart-remove').click(function() {
removeItemFromCart(currentId,currentSource);
$parent.find('.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'});
});
$(document).ready(VuFind.cart.ready);
......@@ -66,9 +66,11 @@
$this->headScript()->appendFile("vendor/cookies.js");
$this->headScript()->appendFile("cart.js");
$domain = $cart->getCookieDomain();
$this->headScript()->appendScript(
'var cartCookieDomain = ' . (!empty($domain) ? "'$domain'" : 'false') . ';'
);
if (!empty($domain)) {
$this->headScript()->appendScript(
'VuFind.cart.setDomain("' . $domain . '");'
);
}
$this->jsTranslations()->addStrings(
array(
'addBookBag' => 'Add to Book Bag',
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment