var widest_submenu_width_for_category = [];
var positionUserOptions = function()
{
$("#userOptions").hide();
if ($(window).width() >= 992) // Large desktop
{
$("#userOptions").appendTo("#subnav").show();
}
else if ($(window).width() >= 768) // Small desktop
{
$("#userOptions").appendTo("#heading").show();
}
else if ($(window).width() < 768) // Mobile
{
$("#userOptions").appendTo("#subnavbar").show();
}
};
var stickyNavTop = 0;
var stickyNavHeight = 0;
var stickyNav = function()
{
if ($(window).width() >= 768 && ($(window).scrollTop() > stickyNavTop))
{
$('#nav-container').addClass('sticky');
$("#heading").css("padding-bottom", stickyNavHeight + "px");
}
else
{
$('#nav-container').removeClass('sticky');
$("#heading").css("padding-bottom", "0");
}
};
$(window).load(function()
{
stickyNavTop = $('#nav-container').offset().top;
stickyNavHeight = $('#nav-container').height();
stickyNav();
$(window).resize(function()
{
widest_submenu_width_for_category.length = 0;
positionUserOptions();
$('#nav-container').removeClass('sticky');
$("#heading").css("padding-bottom", "0");
stickyNavTop = $('#nav-container').offset().top;
stickyNavHeight = $('#nav-container').height();
stickyNav();
});
$(window).scroll(function()
{
stickyNav();
});
});
$(document).ready(function()
{
positionUserOptions();
$('[rel=tooltip]').tooltip({trigger: 'hover', placement: 'top'});
// Back to top button
$(window).scroll(function()
{
if ($(this).scrollTop()) {
$('#top').fadeIn();
} else {
$('#top').fadeOut();
}
});
$("#top").click(function ()
{
$('#nav-container').removeClass('sticky');
$("#heading").css("padding-bottom", "0");
stickyNavTop = $('#nav-container').offset().top;
stickyNavHeight = $('#nav-container').height();
$("html, body").animate({scrollTop: 0}, 250);
});
// Tab hash tags and default
var hash = window.location.hash;
hash = hash.split('?')[0];
if ( ! hash)
{
if ( $('.nav-tabs li:first').hasClass('active'))
{
}
else
{
try
{
$('.nav-tabs a:first').tab('show');
}
catch(ohdear)
{
}
}
}
else
{
if (hash.indexOf('.') == 1)
{
$('.nav-tabs a:first').tab('show');
}
else
{
$('.nav-tabs a[href="'+ hash +'"]').tab('show');
}
}
$(".product-popover").popover({
template: '
',
html: true,
trigger: 'hover',
container: '#content',
placement: 'auto top'
});
$(".product-purchase").popover({
template: '',
html: true,
trigger: 'manual',
container: '#content',
placement: 'bottom'
});
// Controls the purchase popovers, hiding all popovers first, detecting the element and showing the appropiate element
$(".product-purchase").click(function(event)
{
event.stopPropagation();
$(".popover").hide();
var popover = $(".popover");
if ( $(this).attr("data-popoveractive") == 1)
{
$(this).popover("hide");
$(this).attr("data-popoveractive", 0);
}
else
{
if (popover.not(":visible") )
{
$(this).popover("show");
$("[data-popoveractive='1']").attr("data-popoveractive", 0); // Set all states to 0
$(this).attr("data-popoveractive", 1);
}
}
});
$("body").click(function(target)
{
var elem = target.target;
if ( $(elem).attr("data-popover") == "1") // If within the purchase popover
{
if ( $(elem).attr("data-link") != "1" ) // If not the View Information button, ignore default
{
target.preventDefault();
var ID = $(elem).attr("data-id");
if ( $(elem).hasClass("popoverbutton") ) // Add to object
{
$(elem).removeClass("btn-default popoverbutton").addClass("btn-success popoverbuttonActive");
var ID = $(elem).attr("data-id");
}
if ( ($(elem).hasClass("fa")) || ($(elem).is("img")) )
{
$(elem).closest("a").removeClass("btn-primary").addClass("btn-success popoverbuttonActive");
}
string = 'Proceed to Checkout';
$(elem).closest("div").find(".cartbutton").html(string);
}
}
else
{
if (!$(elem).hasClass("fa"))
{
$(".product-purchase").popover("hide");
$(".dropdown_nav").fadeOut();
$(".navActive").removeClass("navActive");
$("[data-popoveractive='1']").attr("data-popoveractive", 0); // Set all states to 0
}
}
});
$(".product-popover").hover(function()
{
var id = $(this).attr("data-id");
$("#cart_"+id).removeClass("btn-default").addClass("btn-primary").css("color", "white");
},
function()
{
var id = $(this).attr("data-id");
$("#cart_"+id).removeClass("btn-primary").addClass("btn-default").css("color", "#428BCA");
});
var ua = navigator.userAgent.toLowerCase();
if(navigator.appName != "Microsoft Internet Explorer" || (ua.indexOf('msie 7.0') == 0 && ua.indexOf('msie 8.0') == 0))
{
$(".dotdotdot").dotdotdot();
}
});
$(".swipe-scroll a").click(function(e)
{
if ($(this).attr('href') == '#') {
e.preventDefault();
$(".swipe-scroll a").removeClass("selected");
var divId = $(this).data('div');
if ($('#' + divId).is(':visible'))
{
$('#' + divId).hide();
return;
}
$(this).addClass("selected");
$(".swipe-divs-blue i.fa").removeClass("fa-caret-down");
$(".swipe-divs-blue i.fa").addClass("fa-caret-right");
$("[id^='scroll-']").hide();
$('#' + divId).show();
}
});
$(".swipe-divs-blue a").click(function(e)
{
if ($(this).attr('href') == '#') {
e.preventDefault();
var divId = $(this).data('div');
if ($('#' + divId).is(':visible'))
{
$(this).find("i.fa").removeClass("fa-caret-down");
$(this).find("i.fa").addClass("fa-caret-right");
$('#' + divId).hide();
return;
}
$(this).find("i.fa").removeClass("fa-caret-right");
$(this).find("i.fa").addClass("fa-caret-down");
$('#' + divId).show();
}
});
$('#search-option').change(function()
{
var selected = $(this).val();
var inputPlaceholder = function (text) { $('#search-products').attr({ placeholder: text }) };
if (selected == 'author') {
inputPlaceholder('Search by author');
} else if (selected == 'series') {
inputPlaceholder('Search by series');
} else if (selected == 'categories') {
inputPlaceholder('Search by category');
} else {
inputPlaceholder('Search by title or ISBN');
}
});
$("#subnav").on('show.bs.collapse', function()
{
$("#userOptions .dropdown.open").removeClass("open");
$("#subnav").css('opacity', 1);
});
$("#subnav").on('hide.bs.collapse', function()
{
$("#subnav").css('opacity', 0);
});
$("#subnav").on('hidden.bs.collapse', function()
{
$("#subnav").css('opacity', 1);
});
$("#userOptions .dropdown").click(function()
{
// Close #subnav if it is open
if ($("#subnavbar button.collapsed").length === 0) {
$("#subnav").collapse('hide');
}
});
$("li.category_desktop").on('show.bs.dropdown', function()
{
var dropdown = $(this).find('> ul.dropdown-menu');
var left = Math.round($(this).offset().left);
var width = Math.round(dropdown.outerWidth());
if (left < ($(window).width() / 2)) {
// main dropdown starts in left half of screen, so set it back to default left aligned; it should be already,
// but could have been switched to right aligned previously if browser window size has changed since page load
// (no need to bother checking if it fits OK, as if it doesn't then switching to right aligned would only make
// it look even worse)
dropdown.removeClass('dropdown-menu-right');
dropdown.find('> li > a > i.fa').removeClass('fa-caret-left');
dropdown.find('> li > a > i.fa').addClass('fa-caret-right');
} else {
// main dropdown starts in right half of screen, so check whether it will fit OK as default left aligned or
// whether it needs switching to right aligned
if ((left + width) > $(window).width()) {
// main dropdown is too wide to fit on screen, so switch it to right aligned
dropdown.addClass('dropdown-menu-right');
dropdown.find('> li > a > i.fa').removeClass('fa-caret-right');
dropdown.find('> li > a > i.fa').addClass('fa-caret-left');
} else {
// main dropdown itself is OK, but will still need switching to right aligned if it has any direct submenus
// that are too wide to fit on screen as default left aligned
var id = $(this).attr('data-category_id');
var submenu_left = left + width;
widest_submenu_width_for_category[id] = get_widest_submenu_width(dropdown);
if (widest_submenu_width_for_category[id] > 0 && (submenu_left + widest_submenu_width_for_category[id]) > $(window).width()) {
// main dropdown has direct submenus (widest_submenu_width_for_category[id] > 0) and at least one of
// them is too wide to fit on screen as default left aligned, so switch main dropdown to right aligned
dropdown.addClass('dropdown-menu-right');
dropdown.find('> li > a > i.fa').removeClass('fa-caret-right');
dropdown.find('> li > a > i.fa').addClass('fa-caret-left');
} else {
// either main dropdown has no direct submenus (widest_submenu_width_for_category[id] == 0) or main
// dropdown has direct submenus (widest_submenu_width_for_category[id] > 0) but none are too wide to fit
// on screen as default left aligned, so set main dropdown back to default left aligned; it should be
// already, but could have been switched to right aligned previously if browser window size has changed
// since page load
dropdown.removeClass('dropdown-menu-right');
dropdown.find('> li > a > i.fa').removeClass('fa-caret-left');
dropdown.find('> li > a > i.fa').addClass('fa-caret-right');
}
}
}
});
$("li.category_desktop").on('hide.bs.dropdown', function()
{
$('li.category_desktop ul.dropdown-menu.has-submenus ul.dropdown-menu').hide();
$('ul.dropdown-menu[data-open_for]').attr('data-open_for', '');
});
$("a.has-submenu").click(function(e)
{
e.preventDefault();
e.stopPropagation();
var submenu_category_id = $(this).attr('data-submenu_category_id');
var submenu = $('#submenu-' + submenu_category_id);
if (!submenu.is(':visible')) {
// only bother checking menu aligments when opening a submenu, not when closing one
widest_submenu_width_for_category[submenu_category_id] = get_widest_submenu_width(submenu);
if (widest_submenu_width_for_category[submenu_category_id] > 0) {
// only need to check menu aligments if submenu being opened has further submenus
if (!$(this).parent().parent().hasClass('dropdown-menu-right')) {
// submenu's parent menu is default left aligned, so stick with that unless a change of direction is
// necessary
var submenu_left_edge = Math.round($(this).offset().left) + Math.round($(this).outerWidth());
var submenu_right_edge = submenu_left_edge + Math.round(submenu.outerWidth());
if ((submenu_right_edge + widest_submenu_width_for_category[submenu_category_id]) <= $(window).width()) {
// submenu has no submenus too wide to fit on screen, so set it back to default left aligned; it
// should be already, but could have been switched to right aligned previously if browser window
// size has changed since page load
submenu.removeClass('dropdown-menu-right');
submenu.find('> li > a > i.fa').removeClass('fa-caret-left');
submenu.find('> li > a > i.fa').addClass('fa-caret-right');
} else {
// submenu has at least one submenu that's too wide to fit on screen, so see if it's better to
// switch it to right aligned
if (widest_submenu_width_for_category[submenu_category_id] <= submenu_left_edge) {
// switching to right aligned will provide enough space to fully display all submenus of the
// submenu, so go ahead and switch
submenu.addClass('dropdown-menu-right');
submenu.find('> li > a > i.fa').removeClass('fa-caret-right');
submenu.find('> li > a > i.fa').addClass('fa-caret-left');
} else {
// switching to right aligned won't provide enough space to fully display all submenus of the
// submenu either, so set it back to default left aligned; it should be already, but could have
// been switched to right aligned previously if browser window size has changed since page load
submenu.removeClass('dropdown-menu-right');
submenu.find('> li > a > i.fa').removeClass('fa-caret-left');
submenu.find('> li > a > i.fa').addClass('fa-caret-right');
}
}
} else {
// submenu's parent menu is right aligned, so switch to that unless a change of direction is necessary
var submenu_left_edge = Math.round($(this).offset().left) - Math.round(submenu.outerWidth());
if (submenu_left_edge >= widest_submenu_width_for_category[submenu_category_id]) {
// submenu has no submenus too wide to fit on screen, so switch it to right aligned to match its
// parent menu
submenu.addClass('dropdown-menu-right');
submenu.find('> li > a > i.fa').removeClass('fa-caret-right');
submenu.find('> li > a > i.fa').addClass('fa-caret-left');
} else {
// submenu has at least one submenu that's too wide to fit on screen, so set it back to default left
// aligned; it should be already, but could have been switched to right aligned previously if
// browser window size has changed since page load
submenu.removeClass('dropdown-menu-right');
submenu.find('> li > a > i.fa').removeClass('fa-caret-left');
submenu.find('> li > a > i.fa').addClass('fa-caret-right');
}
}
}
}
$('ul.dropdown-menu[data-open_for]').attr('data-open_for', '');
submenu.attr('data-open_for', submenu_category_id);
$(this).parents('ul.dropdown-menu').attr('data-open_for', submenu_category_id);
$('li.category_desktop ul.dropdown-menu.has-submenus ul.dropdown-menu[data-open_for!=' + submenu_category_id + ']').hide();
submenu.toggle();
});
function get_widest_submenu_width(element)
{
var category_id = element.attr('data-category_id');
if (typeof(widest_submenu_width_for_category[category_id]) !== 'undefined') {
return widest_submenu_width_for_category[category_id];
}
var width = 0;
$(element.find('> li > ul.dropdown-menu')).each(function()
{
var clone = $(this).clone().addClass('submenu-clone').appendTo('body');
if (clone.outerWidth() > width) {
width = clone.outerWidth();
}
clone.remove();
});
return width;
}