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'; VuFind.cart = (function() {
var _CART_COOKIE_SOURCES = 'vufind_cart_src'; var _COOKIE = 'vufind_cart';
var _CART_COOKIE_DELIM = "\t"; var _COOKIE_SOURCES = 'vufind_cart_src';
var _COOKIE_DELIM = "\t";
var _COOKIE_DOMAIN = false;
var currentId,currentSource; var setDomain = function(domain) {
var lastCartSubmit = false; _COOKIE_DOMAIN = domain;
}
function getCartItems() { var _uniqueArray = function(op) {
var items = Cookies.getItem(_CART_COOKIE); var ret = [];
if(items) { for(var i=0;i<op.length;i++) {
return items.split(_CART_COOKIE_DELIM); if(ret.indexOf(op[i]) < 0) {
ret.push(op[i]);
}
}
return ret;
} }
return [];
} var _getItems = function() {
function getCartSources() { var items = Cookies.getItem(_COOKIE);
var items = Cookies.getItem(_CART_COOKIE_SOURCES); if(items) {
if(items) { return items.split(_COOKIE_DELIM);
return items.split(_CART_COOKIE_DELIM); }
return [];
} }
return []; var _getSources = function() {
} var items = Cookies.getItem(_COOKIE_SOURCES);
function getFullCartItems() { if(items) {
var items = getCartItems(); return items.split(_COOKIE_DELIM);
var sources = getCartSources(); }
var full = [];
if(items.length == 0) {
return []; return [];
} }
for(var i=items.length;i--;) { var getFullItems = function() {
full[full.length] = sources[items[i].charCodeAt(0)-65]+'|'+items[i].substr(1); 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 updateCount = function() {
var items = getCartItems(); var items = _getItems();
$('#cartItems strong').html(items.length); $('#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;
} }
Cookies.setItem(_CART_COOKIE, $.unique(cartItems).join(_CART_COOKIE_DELIM), false, '/', cartCookieDomain);
updateCartCount(); var addItem = function(id,source) {
return true; if(!source) {
} source = VuFind.defaultSearchBackend;
function uniqueArray(op) {
var ret = [];
for(var i=0;i<op.length;i++) {
if(ret.indexOf(op[i]) < 0) {
ret.push(op[i]);
} }
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; var removeItem = function(id,source) {
} var cartItems = _getItems();
function removeItemFromCart(id,source) { var cartSources = _getSources();
var cartItems = getCartItems(); // Find
var cartSources = getCartSources(); var cartIndex = cartItems.indexOf(String.fromCharCode(65+cartSources.indexOf(source))+id);
// Find if(cartIndex > -1) {
var cartIndex = cartItems.indexOf(String.fromCharCode(65+cartSources.indexOf(source))+id); var sourceIndex = cartItems[cartIndex].charCodeAt(0)-65;
if(cartIndex > -1) { var cartItem = cartItems[cartIndex];
var sourceIndex = cartItems[cartIndex].charCodeAt(0)-65; var saveSource = false;
var cartItem = cartItems[cartIndex]; for(var i=cartItems.length;i--;) {
var saveSource = false; if(i==cartIndex) {
for(var i=cartItems.length;i--;) { continue;
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 cartItems.splice(cartIndex,1);
if(cartItems[i].charCodeAt(0)-65 == sourceIndex) { // Remove unused sources
saveSource = true; if(!saveSource) {
break; 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) {
cartItems.splice(cartIndex,1); Cookies.setItem(_COOKIE, _uniqueArray(cartItems).join(_COOKIE_DELIM), false, '/', _COOKIE_DOMAIN);
// Remove unused sources Cookies.setItem(_COOKIE_SOURCES, _uniqueArray(cartSources).join(_COOKIE_DELIM), false, '/', _COOKIE_DOMAIN);
if(!saveSource) { } else {
var oldSources = cartSources.slice(0); Cookies.removeItem(_COOKIE, '/', _COOKIE_DOMAIN);
cartSources.splice(sourceIndex,1); Cookies.removeItem(_COOKIE_SOURCES, '/', _COOKIE_DOMAIN);
// 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);
} }
updateCount();
return true;
} }
if(cartItems.length > 0) { return false;
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;
}
var cartNotificationTimeout = false; var _cartNotificationTimeout = false;
function registerUpdateCart($form) { var _registerUpdate = function($form) {
if($form) { if($form) {
$("#updateCart, #bottom_updateCart").unbind('click').click(function(){ $("#updateCart, #bottom_updateCart").unbind('click').click(function(){
var elId = this.id; var elId = this.id;
var selectedBoxes = $("input[name='ids[]']:checked", $form); var selectedBoxes = $("input[name='ids[]']:checked", $form);
var selected = []; var selected = [];
$(selectedBoxes).each(function(i) { $(selectedBoxes).each(function(i) {
selected[i] = this.value; selected[i] = this.value;
}); });
if (selected.length > 0) { if (selected.length > 0) {
var inCart = 0; var inCart = 0;
var msg = ""; var msg = "";
var orig = getFullCartItems(); var orig = getFullItems();
$(selected).each(function(i) { $(selected).each(function(i) {
for (var x in orig) { for (var x in orig) {
if (this == orig[x]) { if (this == orig[x]) {
inCart++; inCart++;
return; 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('|'); if (updated.length >= VuFind.translate('bookbagMax')) {
addItemToCart(data[1], data[0]); msg += "<br/>" + VuFind.translate('bookbagFull');
}); }
var updated = getFullCartItems(); $('#'+elId).data('bs.popover').options.content = msg;
var added = updated.length - orig.length; $('#cartItems strong').html(updated.length);
msg += added + " " + VuFind.translate('itemsAddBag'); } else {
if (inCart > 0 && orig.length > 0) { $('#'+elId).data('bs.popover').options.content = VuFind.translate('bulk_noitems_advice');
msg += "<br/>" + inCart + " " + VuFind.translate('itemsInBag');
} }
if (updated.length >= VuFind.translate('bookbagMax')) { $('#'+elId).popover('show');
msg += "<br/>" + VuFind.translate('bookbagFull'); if (_cartNotificationTimeout !== false) {
clearTimeout(_cartNotificationTimeout);
} }
$('#'+elId).data('bs.popover').options.content = msg; _cartNotificationTimeout = setTimeout(function() {
$('#cartItems strong').html(updated.length); $('#'+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 { } else {
$('#'+elId).data('bs.popover').options.content = VuFind.translate('bulk_noitems_advice'); // Search results
} var $form = $('form[name="bulkActionForm"]');
$('#'+elId).popover('show'); _registerUpdate($form);
if (cartNotificationTimeout !== false) {
clearTimeout(cartNotificationTimeout);
} }
cartNotificationTimeout = setTimeout(function() { $("#updateCart, #bottom_updateCart").popover({content:'', html:true, trigger:'manual'});
$('#'+elId).popover('hide'); }
}, 5000); };
return false; })();
});
}
}
// Building an array and checking indexes prevents a race situation // Building an array and checking indexes prevents a race situation
// We want to prioritize empty over printing // We want to prioritize empty over printing
function cartFormHandler(event, data) { var cartFormHandler = function(event, data) {
var keys = []; var keys = [];
for (var i in data) { for (var i in data) {
keys.push(data[i].name); keys.push(data[i].name);
...@@ -176,31 +219,6 @@ function cartFormHandler(event, data) { ...@@ -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() { $(document).ready(VuFind.cart.ready);
// 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'});
});
...@@ -66,9 +66,11 @@ ...@@ -66,9 +66,11 @@
$this->headScript()->appendFile("vendor/cookies.js"); $this->headScript()->appendFile("vendor/cookies.js");
$this->headScript()->appendFile("cart.js"); $this->headScript()->appendFile("cart.js");
$domain = $cart->getCookieDomain(); $domain = $cart->getCookieDomain();
$this->headScript()->appendScript( if (!empty($domain)) {
'var cartCookieDomain = ' . (!empty($domain) ? "'$domain'" : 'false') . ';' $this->headScript()->appendScript(
); 'VuFind.cart.setDomain("' . $domain . '");'
);
}
$this->jsTranslations()->addStrings( $this->jsTranslations()->addStrings(
array( array(
'addBookBag' => 'Add to Book Bag', '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