/* Minification failed. Returning unminified contents.
(2452,25-26): run-time error JS1014: Invalid character: `
(2452,73-74): run-time error JS1004: Expected ';': {
(2452,92-93): run-time error JS1014: Invalid character: `
(2664,21-22): run-time error JS1014: Invalid character: `
(2664,35-36): run-time error JS5008: Illegal assignment: =
(2664,47-48): run-time error JS1014: Invalid character: `
(2710,56-57): run-time error JS1014: Invalid character: `
(2710,78-79): run-time error JS1014: Invalid character: `
 */
//To check if touchscreen laptop chose to use mouse
jQuery('body').one('mousemove', function () {
    $('body').attr('id', 'NoTouch');
});
//To check if touchscreen laptop chose to use touch
// ReSharper disable once StringLiteralTypo
jQuery('body').one('touchstart', function () {
    if ($('#NoTouch').length) {
        $('body').removeAttr('id', 'NoTouch');
    }
});

window.debounce = function (func, wait, immediate) {
    var timeout;
    return function () {
        var context = this, args = arguments;
        var later = function () {
            timeout = null;

            if (!immediate)
                func.apply(context, args);
        };

        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);

        if (callNow)
            func.apply(context, args);
    };
};

/*Header Area*/

var body = $('body');
var imageOverlay = $('#ImageOverlay');
var imageOverlayContent = $('#ImageOverlayContent');
var overlayContentContainer = $('#ImageOverlayContentContainer');
var overlayContentContainerContent = $('.content', overlayContentContainer);
var popUpOverlay = $('#PopUpOverlay');
var popUpOverlayContent = $('#PopUpOverlayContent');
var popUpOverlayContentContainer = $('#PopUpOverlayContentContainer');
var popUpOverlayContentContainerContent = $('.content', popUpOverlayContentContainer);
var closeButton = $('.close-button');
var mobileHeader = $('#MainMenuMobile');
var mobileHeaderUserNav = $('#MainMenuMobile a.user-dropdown-menu-link');

$(window).resize(function () {
    var infoBoxWrapper = $('.info-box-wrapper, .supporting-foundation-modal', overlayContentContainerContent);
    if (infoBoxWrapper.length > 0) {
        UndoCenterInfoBox(overlayContentContainer, imageOverlayContent);
        CenterInfoBox(overlayContentContainerContent, imageOverlayContent, overlayContentContainer);
    }
});

body.on('click', '.header-menu-bar-icon', function () {
    body.addClass('with-side-menu');
    $('#DropdownMenu').addClass('active');
    $('.header-menu-bar-icon').css('left', '-100%');
    $('.menuContent').css('height', $(window).outerHeight() + 'px');
    ShowModal(imageOverlay, imageOverlayContent, false, true, true);
    return false;
});

body.on('click', '.closeButton', function () {
    $('#DropdownMenu').removeClass('active');
    $('.header-menu-bar-icon').css('left', '0');
    HideModal(imageOverlay, imageOverlayContent);
    imageOverlayContent.removeClass('top-100');
    return false;
});

body.on('click', '.menuContent .collapse-icon, .menuContent .expand-icon', function () {
    $(this).toggleClass('collapse-icon').toggleClass('expand-icon');
});

body.on('click', '.give-now', function () {
    imageOverlayContent.addClass('top-100');
    LoadModal($('.give-now-section').html(), true, false, false, true);
    return false;
});

body.on('click', '.close-button', function () {
    HideModal(imageOverlay, imageOverlayContent);
    HidePopUpModal();
    return false;
});

popUpOverlayContentContainer.on('click', '.blue-close-button, .admin-cancel-button', function () {
    HideModal(imageOverlay, imageOverlayContent);
    HidePopUpModal();
    return false;
});

body.on('click', '.spirit-box-inner, .spirit-of-the-day-inner', function () {
    var spiritBox = $(this).closest('.spirit-box');
    var contents = spiritBox.find('.spirit-box-modal-elements').html(); //contents will also copy event handlers for popup links

    if (contents && contents.length) {
        LoadModal(contents, true, false, false, true);

        trackSpiritModal(spiritBox);
    }
});

body.on('click', '.popup-link', function () {
    var t = $(this);
    var url = t.data('link-url') || t.attr('href');

    var popupWidth = 700;
    var popupHeight = 500;

    //calculate position to center pop-up
    var dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left;
    var dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top;

    var width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width;
    var height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height;

    var left = ((width / 2) - (popupWidth / 2)) + dualScreenLeft;
    var top = ((height / 2) - (popupHeight / 2)) + dualScreenTop;

    // ReSharper disable once StringLiteralTypo
    var windowParameters = 'width=' + popupWidth + ',height=' + popupHeight + ',toolbar=0,menubar=0,location=0,status=1,scrollbars=1,resizable=1,left=' + left + ',top=' + top;

    window.open(url, '_blank', windowParameters);

    return false;
});

body.on('click', '.user-dropdown-menu-name', function () {
    if ($('.tabs.user-dropdown-menu').hasClass('expanded'))
        $('.tabs.user-dropdown-menu').removeClass('expanded');
    else
        $('.tabs.user-dropdown-menu').addClass('expanded');
});

body.on('click', 'input[type="checkbox"] ~ div', function () {
    var fakeCheckbox = $(this);
    var realCheckbox = fakeCheckbox.prevAll('input[type="checkbox"]');

    realCheckbox.prop('checked', !realCheckbox.prop("checked"));
    realCheckbox.trigger('change');
});

body.on('click', 'input[type="radio"] ~ span', function () {
    var fakeRadio = $(this);
    var realRadio = fakeRadio.prevAll('input[type="radio"]');
    var isChecked = realRadio.prop("checked");

    if (!isChecked) {
        realRadio.prop('checked', true);
        realRadio.trigger('change');
    }
});

body.on('click', '[data-for]', function () {
    var el = $(this);
    var id = '#' + el.data('for');
    var targetEl = $(id);

    // Only trigger the click if we have a target
    // and the target is NOT a child of the clicked element (to prevent recursion)
    // and the target is not the clicked element
    var targetExists = targetEl.length;
    var targetIsChildOfClickedElement = el.has(targetEl).length;
    var targetIsClickedElement = el.is(targetEl);

    if (targetExists && !targetIsChildOfClickedElement && !targetIsClickedElement)
        targetEl.trigger('click');
});

body.on('mouseenter mouseleave', '.bg-invert', function () {
    var el = $(this);
    var color = el.data('color');
    var altColor = el.data('alt-color');

    el.css('color', altColor);
    el.css('background-color', color);

    el.data('color', altColor);
    el.data('alt-color', color);
});

jQuery.fn.extend({
    disable: function (state) {
        return this.each(function () {
            var $this = $(this);
            $this.toggleClass('disabled', state);
        });
    }
});

body.ready(function () {
    mobileHeaderUserNav.disable(true);

    var isLoggedIn = $('.header-cart-icon').data('is-logged-in');
    var isGuestUser = $('.header-cart-icon').data('is-guest-user');

    if (isLoggedIn && !isGuestUser) {
        $('.user-dropdown-menu').removeClass('hide');
        $('.mobile-menu-tabs').removeClass('hide-mobile-header-user-icon');
    }
});

body.on('click', '.mobile-header-user-icon', function () {
    if (mobileHeader.hasClass('expanded')) {
        mobileHeader.removeClass('expanded');
        mobileHeaderUserNav.disable(true);
    }
    else {
        mobileHeader.addClass('expanded');
        mobileHeaderUserNav.disable(false);
    }
});


$('body').on('click', 'a.disabled', function (event) {
    event.preventDefault();
});

body.on('click', '.user-dropdown-menu-link.log-out, .tabs.log-out', function () {
    $.ajax({
        type: 'POST',
        url: '/umbraco/surface/loginsurface/logout',
        success: function () {
            if (location.pathname.indexOf('/checkout/') === 0)
                location.href = '/';
            else
                location.reload();
        }
    });
});

(function () {
    var header = $('header');
    var givingEventName = header.data('giving-event-name');
    var givingEventUrl = header.data('giving-event-url');

    if (!givingEventName || !givingEventUrl)
        return;

    var givingStoreItem = header.find('#DropdownMenu .menuContent [data-is-giving-store="true"]');
    var givingEventItem = givingStoreItem.find('.hidden');

    givingEventItem.attr('href', givingEventUrl);
    givingEventItem.children('.sideMenus').text(givingEventName);

    givingStoreItem.children().not('hr').toggleClass('hidden');
})();

(function () {
    var header = $('header');
    var userFirstName = header.data('user-first-name');

    if (!userFirstName)
        return;

    $('.user-dropdown-menu-name').text(userFirstName);
})();

/*Search Slider Area*/

/*NOTE: With change that made Search Results it's own page, a click handler for this slider was added to search.js*/
var searchSlider = $('.searchSlider');

if (searchSlider.length) {
    var inputBox = searchSlider.find('.search-input');
    var queryTextbox = inputBox.find('.search-query');
    var searchSliderForm = searchSlider.find('form');
    var searchSliderPlaceholders = searchSliderForm.data('contents');
    var searchSliderColors = searchSliderForm.data('colors');

    var contentIndex = 0;
    var searchSliderContents = searchSliderPlaceholders.split(',');
    var colorIndex = 0;
    var colors = searchSliderColors.split(',');
    var searchSlideRepeatId;
    var searchSlideInterval = 4000; /*milliseconds*/

    var restartCycling = debounce(function () {
        if (!searchSlideRepeatId) {
            searchSlideRepeatId = setInterval(function () {
                searchSlider.find('.rightArrow').trigger('click');
            }, searchSlideInterval);
        }
    }, 2 * searchSlideInterval);

    var pauseCyclingIfRealClick = function (e) {
        if (e.hasOwnProperty('originalEvent')) {
            //real click from a user occurred (not .click())
            if (searchSlideRepeatId) {
                clearInterval(searchSlideRepeatId);
                searchSlideRepeatId = null;
            }

            restartCycling();
        }
    };

    if (searchSlider.length > 0) {
        searchSlider.on('click', '.leftArrow', function (e) {
            pauseCyclingIfRealClick(e);
            inputBox.removeClass('color-' + colors[colorIndex]);
            colorIndex--;
            contentIndex--;

            if (contentIndex < 0 && colorIndex < 0) {
                contentIndex = searchSliderContents.length - 1;
                colorIndex = colors.length - 1;
            }

            queryTextbox.attr('placeholder', searchSliderContents[contentIndex]);
            inputBox.addClass('color-' + colors[colorIndex]);
        });

        searchSlider.on('click', '.rightArrow', function (e) {
            pauseCyclingIfRealClick(e);
            inputBox.removeClass('color-' + colors[colorIndex]);
            colorIndex++;
            contentIndex++;

            if (contentIndex >= searchSliderContents.length && colorIndex >= colors.length) {
                contentIndex = 0;
                colorIndex = 0;
            }

            queryTextbox.attr('placeholder', searchSliderContents[contentIndex]);
            inputBox.addClass('color-' + colors[colorIndex]);
        });

        searchSlider.on('focus', '.search-query', function () {
            if (searchSlideRepeatId) {
                clearInterval(searchSlideRepeatId);
                searchSlideRepeatId = null;
            }
        });

        searchSlider.on('blur', '.search-query', function () {
            restartCycling();
        });

        searchSlideRepeatId = setInterval(function () {
            searchSlider.find('.rightArrow').trigger('click');
        }, searchSlideInterval);
    }
}

body.on('hover', '.arrowLeft', function () {
    $('.arrowBackground').show();
});

function isNullOrWhitespace(input) {
    if (typeof input === 'undefined' || input === null) return true;

    return input.replace(/\s/g, '').length < 1;
}

/*Modal Content*/
var scrollTopOnModalLoad;
function LoadModal(content, showCloseButton, callback, withGradient, lockScreenScroll) {
    var overlayContent = $('#ImageOverlayContent');
    var contentContainer = overlayContent.find('.content');

    contentContainer.html(content);

    ShowModal(null, overlayContent, showCloseButton, withGradient, lockScreenScroll);

    if (callback)
        callback();
}

function HideModal(overlay, overlayContent) {

    if (!overlayContent)
        overlayContent = $('#ImageOverlayContent');

    imageOverlay.fadeOut(300);
    imageOverlayContent.hide();
    // ReSharper disable once UnknownCssClass
    imageOverlay.removeClass('site-search with-gradient');
    imageOverlayContent.css('top', '50%');
    imageOverlayContent.css('height', '');
    imageOverlayContent.find('.content').empty();
    overlayContent.removeClass('top-100');
    $('#DropdownMenu').removeClass('active');
    $('.header-menu-bar-icon').css('left', '0');

    $('body,html').removeClass('lock-screen');

    $(window).scrollTop(scrollTopOnModalLoad);

    body.removeClass('with-side-menu');
    UndoCenterInfoBox(overlayContentContainer, overlayContent);
    $(window).off('resize.infoBox');
}

function ShowModal(overlay, overlayContent, showCloseButton, withGradient, lockScreenScroll) {
    if ($(window).width() < 1025 || lockScreenScroll) {
        scrollTopOnModalLoad = $(window).scrollTop();

        $('body,html').addClass('lock-screen');
    }

    var infoBoxWrapper = $('.info-box-wrapper, .supporting-foundation-modal', overlayContentContainerContent);
    if (infoBoxWrapper.length > 0) {
        $(window).on('resize.infoBox', function () {
            UndoCenterInfoBox(overlayContentContainer, imageOverlayContent);
            CenterInfoBox(overlayContentContainerContent, imageOverlayContent, overlayContentContainer);
        });
    }

    (overlay || $('#ImageOverlay'))
        .addClass(withGradient ? 'with-gradient' : '')
        .fadeIn(300);

    if (!overlayContent)
        overlayContent = $('#ImageOverlayContent');

    overlayContent.show();
    overlayContent.css('visibility', 'visible');

    overlayContent.css('top', '100px');

    $('.close-button').toggle(showCloseButton);

    CenterInfoBox(overlayContentContainerContent, overlayContent, overlayContentContainer);
}

/*If the overlay is an info-box, determine the location of the content then remove the container and add the appropriate left
location. This is done to remove the margin from the ImageOverlayContent so that the left and right of the content is the ImageOverlay
and it is click-able.*/
function CenterInfoBox(ocContainerContent, oc, ocContainer) {
    var infoBoxWrapper = $('.info-box-wrapper, .supporting-foundation-modal', ocContainerContent);

    if (infoBoxWrapper.length > 0) {
        var windowWidth = $(window).width();
        var overlayContentContainerContentWidth = ocContainerContent.innerWidth();

        oc.css('left', (windowWidth - overlayContentContainerContentWidth) / 2);
        oc.width(overlayContentContainerContentWidth);
        ocContainer.removeClass('container');
    }
}

function UndoCenterInfoBox(ocContainer, oc) {
    ocContainer.addClass('container');
    oc.css('left', 'initial').width('');
}

function CenterModal() {
    imageOverlayContent.css('top', '60px');
    closeButton.css('top', $(window).width() < 975 ? 24 : 36);
}

$('.faq-button, .faq-question').click(function () {
    $(this)
        .closest('.faq-item')
        .toggleClass('expanded')
        .find('.faq-answer')
        .slideToggle();
});

$('.what-to-give-button, .to-give-question').click(function () {
    $(this)
        .closest('.what-to-give-item')
        .toggleClass('expanded')
        .find('.to-give-answer')
        .slideToggle();
});

$('.supporting-foundations-item-button, .supporting-foundations-item-title').click(function () {
    $(this)
        .closest('.supporting-foundations-item')
        .toggleClass('expanded')
        .find('.supporting-foundations-item-body')
        .slideToggle();
});

$(document).keyup(function (e) {
    if (e.keyCode === 27) {
        HideModal();
    }
});

$('#ImageOverlay').on('click', function (e) {
    e.preventDefault();
    HideModal();
    $('#ImageOverlayContent .content').empty();
    $('.modal-wrapper').hide();
    return false;
});

//Begin Popup Overlay

/*Modal Content*/
function LoadPopUpModal(content, callback, withGradient, lockScreenScroll) {
    var popUpContentContainer = popUpOverlayContent.find('.content');

    popUpContentContainer.html(content);

    ShowPopUpModal(withGradient, lockScreenScroll);

    if (callback)
        callback();
}

function HidePopUpModal() {

    if (!popUpOverlayContent)
        popUpOverlayContent = $('#PopUpOverlayContent');

    popUpOverlay.fadeOut(300);
    popUpOverlayContent.hide();
    popUpOverlayContent.find('.content').empty();
    popUpOverlayContent.removeClass('top-100');

    $('body,html').removeClass('lock-screen');
    body.removeClass('with-side-menu');
}

function ShowPopUpModal(withGradient, lockScreenScroll) {
    if ($(window).width() < 1025 || lockScreenScroll)
        $('body,html').addClass('lock-screen');

    popUpOverlay.addClass(withGradient ? 'with-gradient' : '').fadeIn(300);

    popUpOverlayContent.show();
    popUpOverlayContent.css('visibility', 'visible');
}

$(document).keyup(function (e) {
    if (e.keyCode === 27) {
        HidePopUpModal();
    }
});

popUpOverlay.on('click', function (e) {
    e.preventDefault();
    HidePopUpModal();
    $('#PopUpOverlayContent .content').empty();
    $('.modal-wrapper').hide();
    var forms = $('form:not(#CheckoutCartForm)');
    enableSubmit(forms);
    return false;
});

//End Popup Overlay

$(document).ready(function ($) {

    $('.attach-register-tooltip').tooltip();
    $('.attach-tooltip').tooltip();
    $('.attach-tooltip').on('click', function () {
        var mediaQuery = window.matchMedia('screen and (max-width: 991px)');
        if (mediaQuery.matches) {
            var tooltipText = $(this).data('originalTitle');
            var content = '<div class="mobile-tooltip-content">' + tooltipText + '</div>';
            ShowModal(imageOverlay, imageOverlayContent, true, false, true);
            overlayContentContainerContent.html(content);
        }
    });

    $('.footer-navigation-expand').on('click', function () {

        $('.footer-navigation-link-wrapper').slideToggle();
        $('.footer-navigation-expand-image').toggleClass('shrink');
    });

    $('#ScrollToTopButton').on('click', function () {
        $('html,body').animate({ scrollTop: 0 }, 'slow');
        return false;
    });


    var scrollButton = $('#ScrollToTopButton');
    $(window).on('scroll', function () {
        if ($('body').scrollTop() > 40)
            scrollButton.show();
        else
            scrollButton.hide();
    });

    $('.mobile-top-menu-link-expand').on('click', function () {
        $('.mobile-top-menu-links').slideToggle();
        $(this).toggleClass('expand shrink');
    });

    $(document).on('click', '.requirements-expand', function () {
        $(this)
            .closest('.requirements-item')
            .toggleClass('expanded')
            .find('.requirements-description')
            .slideToggle();

        $(this)
            .closest('.requirements-item')
            .find('.expand-icon')
            .toggleClass('collapse-icon');
    });

    $(document).on('click', '.scholarship-search-link', function () {
        $('.scholarship-search-advanced, .scholarship-search-keyword').slideToggle();
    });

    $(document).on('click', '.scholarship-match.row', function () {
        $(this)
            .closest('.scholarship-match-section')
            .toggleClass('expanded')
            .find('.scholarship-match-subcategories-all')
            .slideToggle();

        $(this)
            .closest('.scholarship-match-section')
            .find('.expand-icon')
            .toggleClass('collapse-icon');

        if ($('.scholarship-match-section').hasClass('expanded')) {
            $('.scholarship-match-footer')
                .toggleClass('expanded')
                .slideDown();
        }
        else {
            $('.scholarship-match-footer')
                .toggleClass('expanded')
                .slideUp();
        }
    });

    $('.scholarship-match-button').on('click', function () {
        $('.scholarship-match-footer').delay(5000).fadeToggle(); //so that button doesn't toggle before results are loaded
    });

    var initialSpiritBox = $('.initial-spirit-box');
    if (initialSpiritBox.length) {
        LoadModal(initialSpiritBox.find('.spirit-box-modal-elements').html(), true, false, false, true);

        trackSpiritModal(initialSpiritBox);
    }

    $('.mobile-internal-nav-button').on('click', function () {
        var link = $(this);
        $('html, body').animate({
            scrollTop: $(link.attr('href')).offset().top - 50
        }, 1000);

        return false;
    });
});

// force all embedded videos to keep their aspect ratio
body.fitVids();


$('.left-internal-menu-dropdown').on('click', function () {
    var link = $(this);
    var itemWrapper = link.next('.left-internal-menu-dropdown-items');

    link.toggleClass('open');
    itemWrapper.toggleClass('open');
});

var doEqualHeightColumns = function () {
    resetEqualHeightColumns();

    $('[data-equal-height="row"]').each(function (i, rowEl) {
        var row = $(rowEl);
        var cols = row.children('[data-equal-height="col"]');
        var maxHeight = 0;

        cols.each(function (j, colEl) {
            var col = $(colEl);
            var colHeight = col.height();

            if (colHeight > maxHeight)
                maxHeight = colHeight;
        });

        cols.height(maxHeight);
    });
};

var resetEqualHeightColumns = function () {
    $('[data-equal-height="row"] [data-equal-height="col"]').height('auto');
};

var fixCallButtonLinks = function () {
    $('.call-button').each(function (i, el) {
        var link = $(el);
        var href = link.attr('href');
        link.data('href', href);
        link.removeAttr('href');
    });
};
var resetCallButtonLinks = function () {
    $('.call-button').each(function (i, el) {
        var link = $(el);
        var href = link.data('href');
        link.data('href', '');
        link.attr('href', href);
    });
};

var jRes = jRespond([
    {
        label: 'xs',
        enter: 0,
        exit: 767
    }, {
        label: 'sm',
        enter: 768,
        exit: 991
    }, {
        label: 'md',
        enter: 992,
        exit: 1199
    }, {
        label: 'lg',
        enter: 1200,
        exit: 100000
    }
]);

jRes.addFunc([{
    breakpoint: 'xs',
    enter: resetEqualHeightColumns
}, {
    breakpoint: 'md',
    enter: doEqualHeightColumns
}, {
    breakpoint: 'sm',
    enter: doEqualHeightColumns
}, {
    breakpoint: 'lg',
    enter: doEqualHeightColumns
}]);

jRes.addFunc([{
    breakpoint: 'xs',
    enter: resetCallButtonLinks
}, {
    breakpoint: ['sm', 'md', 'lg'],
    enter: fixCallButtonLinks
}]);

$(document).ready(function () {
    ResizeRecentPressReleases();
    ResizeFaqButtons();
});

$(window).resize(function () {
    ResizeRecentPressReleases();
    ResizeFaqButtons();
});

function ResizeRecentPressReleases() {
    var recentPressReleases = $('.recent-press-releases-title');
    recentPressReleases.css('height', 'auto');
    var maxHeight = 0;

    recentPressReleases.each(function () {
        var thisHeight = $(this).outerHeight();
        if (thisHeight > maxHeight)
            maxHeight = thisHeight;
    });

    recentPressReleases.each(function () {
        $(this).outerHeight(maxHeight);
    });
}

function ResizeFaqButtons() {
    var faqItems = $('.faq-item');
    $('.faq-button').css('height', 'auto');
    var isSafari = navigator.userAgent.indexOf('Safari') > -1 && navigator.userAgent.indexOf('Chrome') === -1;

    faqItems.each(function () {
        if (isSafari)
            $(this).outerHeight($('.faq-question', this).outerHeight());
        $('.faq-button', this).outerHeight($('.faq-question', this).outerHeight());
    });
}

// show search results loading spinner for 1500ms (or one complete animation) if in html
$(document).ready(function () {
    $('.loading-spinner-container').toggleClass('show-spinner').delay(1500).queue(function () {
        $(this).toggleClass('show-spinner').dequeue();
    });
});

//make You May Like elements same height
$(document).ready(function () {
    YouMayLikeItemResize();

    $(window).resize(function () {
        YouMayLikeItemResize();
    });
});

var YouMayLikeItemResize = function () {
    var skip = 3;
    var youMayLikeContainerPartial = $('.you-may-like-container .you-may-like-container-content');
    var youMayLikeItem = $('.you-may-like-item', youMayLikeContainerPartial);
    for (var i = 0; i < youMayLikeItem.length; i += skip) {
        var greatestHeight = 0;
        var thisItem;
        var itemContentList;
        for (var a = 0; a < skip; a++) {
            thisItem = youMayLikeItem.eq(a + i);
            thisItem.css('height', 'auto');
            itemContentList = $('.you-may-like-item-content', thisItem);
            itemContentList.css('height', 'auto');

            $.each(itemContentList, function (index, content) {
                // ReSharper disable once ClosureOnModifiedVariable
                if (content.clientHeight > greatestHeight)
                    greatestHeight = content.clientHeight;
            });
        }
        for (var b = 0; b < skip; b++) {
            thisItem = youMayLikeItem.eq(b + i);
            var itemPortrait = $('.suggestion-portrait', thisItem);
            var itemContent = $('.you-may-like-item-content', itemPortrait);
            itemContent.height(greatestHeight);
            thisItem.height(Math.round(thisItem.height()));
        }
    }
};

var changePasswordSuccess = function (jsonObject) {
    if (jsonObject.success) {
        $('#Content').append(jsonObject.message);
        popUpOverlayContent.addClass('top-100');
        LoadPopUpModal($('#UserResetPasswordSuccess').html(), false, false, true);
    }
    else {
        if (!jsonObject.success || jsonObject.error) {
            $('.error-message').show();
            $('.field-validation-valid.umbraco-error-message').show();
        }
    }
    enableSubmit('#ChangePasswordForm');
};

// read more expander
$(document).ready(function () {
    $('.read-more-expander').on('click', function () {
        var expander = $(this);
        var expanderTarget = $('#' + expander.data('for'));
        expander.toggleClass('open');

        if (expander.hasClass('open'))
            expanderTarget.css('max-height', expander.data('max-height-opened'));
        else
            expanderTarget.css('max-height', expander.data('max-height-closed'));
    });
});

/*begin global append unobtrusive with custom validation attribute*/
// ReSharper disable StringLiteralTypo
jQuery.validator.unobtrusive.adapters.add(
    'onevalueingrouponlyrequirement', ['properties'], function (options) {
        options.rules['onevalueingrouponlyrequirement'] = options.params;
        options.messages['onevalueingrouponlyrequirement'] = options.message;
    }
);
// ReSharper restore StringLiteralTypo

// ReSharper disable once StringLiteralTypo
jQuery.validator.addMethod('onevalueingrouponlyrequirement', function (value, element, params) {
    var properties = params.properties.split(',');
    var values = $.map(properties, function (property) {
        var val = $('#' + property).val();
        return val !== '' ? val : null;
    });
    return values.length > 0;
}, '');
/*end global append unobtrusive with custom validation attribute*/
//global form validator extension
//jquery extension method that resets validation, clears old errors and input values
$.fn.clearForm = function () {
    $(this).each(function () {
        $(this).trigger('reset.unobtrusiveValidation');
    });

    $(this).find('input[type=text]')
        .val('');

    $(this).find('.input-validation-error')
        .val('')
        .removeClass('input-validation-error');

    $(this).find('.error-message.field-validation-error')
        .empty()
        .addClass('field-validation-valid')
        .removeClass('field-validation-error');
};

$(document).ready(
    initializeClientValidation
);

var initializeClientValidation = function () {
    //reinitialize unobtrusive validation on Ajax Forms (targeting with onsubmit attribute)
    jQuery.each($('form[data-ajax]'), function (i, form) {
        $(form).removeData('validator');
        $.validator.unobtrusive.parse(form);
    });
    ResponsiveErrorStyling();
};

var reattachUnobtrusiveValidation = function ($f) {
    /// <summary>reattach unobtrusive validation on form selector</summary>
    /// <param name="$f" type="form selector">form selector</param>
    /// <returns type="" />
    $f.removeData('validator');
    $.validator.unobtrusive.parse($f);
};

var ajaxFormShowMessage = function ($f) {
    $f.find('.success-message').show();
    $f.on('focusin', function () {
        $f.find('.success-message').hide();
        $f.off('focusin');
    });
};

var ajaxFormSuccess = function (data, status, xhr) {
    var $f = $(xhr.responseText).find('form');

    //ajaxFormShowMessage2($f);
    //reattachUnobtrusiveValidation(form);

    var updateTargetId = $f.data('ajax-update');
    var $t = $(updateTargetId);
    reattachUnobtrusiveValidation($t);
    ajaxFormShowMessage($t);

    window.rebindAddressTypeChanges();
};

var ajaxFormFailure = function (xhr) {
    // replace updateTargetId element with ajax response

    var $f = $(xhr.responseText).find('form');
    var updateTargetId = $f.data('ajax-update');
    var $t = $(updateTargetId);

    //var updateTargetId = $(form).attr('data-ajax-update');
    $t.replaceWith(xhr.responseText);

    reattachUnobtrusiveValidation($t);

    window.rebindAddressTypeChanges();
};

var ajaxFormComplete = function () {
    //reattachUnobtrusiveValidation(form);
    //ajaxFormShowMessage(form);
};

var wrapperValidation = function (inputId) {
    var input = document.getElementById(inputId);
    if (($(input).parent().hasClass('wrapper-error-grouping')) && (!($(input).hasClass('input-validation-error')))) {
        $(input).parent().removeClass('wrapper-error-grouping');

    }
    else if (($(input).parent().hasClass('wrapper-error-single')) && (!($(input).hasClass('input-validation-error')))) {
        $(input).parent().removeClass('wrapper-error-single');
    }
    else if (($(input).parent().hasClass('wrapper-error-end-grouping')) && (!($(input).hasClass('input-validation-error')))) {
        $(input).parent().removeClass('wrapper-error-end-grouping');
    }
    //update wrapper classes
    inputWrapperErrorStyle();
};
//end global form validator extension
//called on initial validation and subsequent updates - so removes classes that are no longer valid
var inputWrapperErrorStyle = function () {
    jQuery.each($(':input'), function (i, input) {
        var isInputInvalid = $(input).hasClass('input-validation-error');
        var isNextInputInvalid = $(input).parent().next().hasClass('hidden') ?
            $(input).parent().next().next().children(':input').hasClass('input-validation-error') :
            $(input).parent().next().children(':input').hasClass('input-validation-error');

        //check if 2 stacked inputs have hidden class 
        var isNextHidden = $(input).parent().next().hasClass('hidden') &&
            $(input).parent().next().next().hasClass('hidden');

        if (isNextHidden && !isNextInputInvalid)
            isNextInputInvalid = $(input).parent()
                .next().next().next().children(':input')
                .hasClass('input-validation-error');

        var isPrevInputInvalid = $(input).parent().prev().hasClass('hidden') ?
            $(input).parent().prev().prev().children(':input').hasClass('input-validation-error') :
            $(input).parent().prev().children(':input').hasClass('input-validation-error');

        //check if 2 stacked inputs have hidden class 
        var isPrevHidden = $(input).parent().prev().hasClass('hidden') &&
            $(input).parent().prev().prev().hasClass('hidden');

        if (isPrevHidden && !isPrevInputInvalid)
            isPrevInputInvalid = $(input).parent()
                .prev().prev().prev().children(':input')
                .hasClass('input-validation-error');


        if (isInputInvalid && isNextInputInvalid) {
            $(input).parent().addClass('wrapper-error-grouping');
            $(input).parent().removeClass('wrapper-error-single');
            $(input).parent().removeClass('wrapper-error-end-grouping');
        }
        else if (isInputInvalid && isPrevInputInvalid && !isNextInputInvalid) {
            $(input).parent().addClass('wrapper-error-end-grouping');
            $(input).parent().removeClass('wrapper-error-single');
            $(input).parent().removeClass('wrapper-error-grouping');
        }
        else if (isInputInvalid) {
            $(input).parent().addClass('wrapper-error-single');
            $(input).parent().removeClass('wrapper-error-grouping');
            $(input).parent().removeClass('wrapper-error-end-grouping');
        }
    });
};

var ResponsiveErrorStyling = function () {

    $('.settings-form-section .blue-border-submit-button').on('click', function () {
        setTimeout(inputWrapperErrorStyle, 1000);
    });
    $('.settings-form-section  input[type="text"], .settings-form-section input[type="password"], .settings-form-section select').on('change paste keyup', function () {
        var inputId = this.id;
        //allow unobtrusive validation function to remove class before calling function to update wrapper's class
        setTimeout(function () { wrapperValidation(inputId); }, 250);
    });
};


//Global Submit Form Functions

// this is here to allow Firefox back button to be used and allow any disabled forms to become enabled again
$(window).on('load', function () {
    enableSubmit($('form:not(#CheckoutCartForm):not(#RequestDirectoryListingForm):not(.newsletter-form)'));
});

var enableSubmit = function (form) {
    $(':submit, :reset', form).attr('disabled', false);
};

var disableSubmit = function (form, forceDisable) {
    if (forceDisable || $(form).valid()) {
        $(':submit, :reset', form).attr('disabled', true);
    }
};

var disableSubmitWithLoadBar = function (form, forceDisable, $loadingBarElement) {
    if (forceDisable || $(form).valid()) {
        $(':submit, :reset', form).attr('disabled', true);
    }

    ToggleLoadingBar($loadingBarElement);
};

var disableAjaxFormSubmit = function () {
    disableSubmit(this);
};

var enableAjaxFormSubmit = function () {
    enableSubmit(this);
};
//End Global Submit Form Functions

$(document).ready(function () {
    $('.input-checkbox').each(function () {
        $(this).hide().after('<div class="checkbox-icon" />');
    });

    $('.checkbox-icon').on('click', function () {
        $(this).toggleClass('checked');
    });

    $('.input-radio').each(function () {
        $(this).hide().after('<div class="radio-icon" />');
    });

    $('.radio-icon').on('click', function () {
        $('.radio-icon.checked').not(this).removeClass('checked');
        $(this).toggleClass('checked');
    });
});

// Styles placeholder text for selects
var stylePlaceholderDropdowns = function () {
    var detectPlaceholder = function (selectElement) {
        var dropdown = $(selectElement);
        var value = dropdown.val();

        dropdown.toggleClass('is-placeholder', !value);
    }

    // set the initial state
    $('select').each(function () {
        detectPlaceholder(this);
    });

    // This allows us to rebind everything if we need to (AJAX modals, etc)
    $('body').off('change.dropdown-placeholders');

    $('body').on('change.dropdown-placeholders', 'select', function () {
        detectPlaceholder(this);
    });
};

$(document).ready(function () {
    stylePlaceholderDropdowns();
});

(function () {
    FastClick.attach(document.body);
})();

var trackSpiritModal = function (spiritBox) {
    window.dataLayer = window.dataLayer || [];

    window.dataLayer.push({
        'event': 'spirit modal',
        'spirit_id': spiritBox.data('spirit-id'),
        'spirit_name': spiritBox.data('spirit-name'),
        'spirit_url': spiritBox.data('spirit-url')
    });
};

window.parseQueryString = function () {
    var queryString = window.location.search;

    if (!queryString.trim())
        return {};

    var pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&');
    var query = {};

    for (var i = 0; i < pairs.length; i++) {
        var pair = pairs[i].split('=');

        query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');
    }

    return query;
};

window.updateQueryString = function (key, value) {
    // This little function will update any query string value (new or not)
    // and update the URL without reloading the page or adding new history items.
    // It only works in browsers that support the history API. --AEM

    if (window.history && window.history.replaceState) {
        var qs = window.parseQueryString() || {};

        qs[key] = value;

        var newUrl = window.location.protocol + '//' + window.location.host + window.location.pathname + '?' + $.param(qs);

        window.history.replaceState({ path: newUrl }, '', newUrl);
    }
};

// Nonprofit Directory Page
(function () {
    var nonprofitDirectoryPage = $('#NonprofitDirectory');

    if (nonprofitDirectoryPage.length) {
        nonprofitDirectoryPage.on('click', '.confirm-action-buttons-print', function () {
            window.print();
        });

        if (typeof window.print !== 'function')
            nonprofitDirectoryPage.find('.confirm-action-buttons-print').remove();
    }
})();

$(document).ready(function () {
    var scrollOnLoad = $('[data-scroll-on-load="true"]');

    if (!scrollOnLoad.length)
        return;

    var scrollOnLoadOffset = scrollOnLoad.data('scroll-on-load-offset');

    $('html, body').animate({
        scrollTop: scrollOnLoad.offset().top - scrollOnLoadOffset
    }, 1000);
});
;
var ToggleLoadingBar = function ($loadingBarElement) {
    $loadingBarElement.toggleClass('active');
};;
(function () {
    var heroCarousel = $('#HeroCarousel');

    heroCarousel.appendTo($('#CarouselPlaceHolder'));

    if (heroCarousel.length)
        $('#Content').css('margin-top', '-555px');

    var heroCarouselFirstImageContainer;

    // set the height of the home carousel based on the first slide maintaining its default aspect ratio and being full screen width
    $(window).resize(function () {
        if (heroCarouselFirstImageContainer && heroCarouselFirstImageContainer.length)
            sizeHeroCarousel();
    });

    var image = new Image();
    image.onload = function () {
        sizeHeroCarousel();
    };

    $(document).ready(function () {
        heroCarouselFirstImageContainer = $($('#HeroCarousel .item.active .imageWrapper div')[0]);

        if (heroCarouselFirstImageContainer.length)
            image.src = heroCarouselFirstImageContainer.css('background-image').replace(/url\((['"])?(.*?)\1\)/gi, '$2');

        //This adds swipe events to the Home Page bootstrap carousel and uses jquery.mobile.custom.js
        heroCarousel.on('swiperight', function () { $('#HeroCarousel').carousel('prev'); });
        heroCarousel.on('swipeleft', function () { $('#HeroCarousel').carousel('next'); });
    });

    var sizeHeroCarousel = function () {
        var newImageHeight = image.height * $(window).width() / image.width;

        $('#HeroCarousel .imageWrapper').height(newImageHeight);
        $('#HeroCarousel .img-responsive.center-block').height(newImageHeight);
    };
})();
;

// Address Verification
(function () {
    var verificationCount = 0;

    window.addressVerificationEventHandler = function () {
        if (verificationCount > 25) {
            alert('Too many verifications have occurred. This is probably due to an unexpected loop. No more verifications will be allowed until the page has been refreshed.');
            return false;
        }

        var form = $(this);

        if ((form.data('address-verify') || '').toLowerCase() === 'skip')
            return;

        var isVerifiedInput = form.find('input[data-address-verify="isVerified"]');
        var model = {
            businessName: form.find('[data-address-verify="businessName"]').val(),
            address1: form.find('[data-address-verify="address1"]').val(),
            address2: form.find('[data-address-verify="address2"]').val(),
            city: form.find('[data-address-verify="city"]').val(),
            stateId: form.find('[data-address-verify="stateId"]').val(),
            zip: form.find('[data-address-verify="zip"]').val(),
            countryCode: form.find('[data-address-verify="countryCode"]').val()
        };

        var hasAddressVerifyFormChanged = function (targetForm, targetModel) {
            var savedModel = targetForm.data('address-verify-state') || {};

            return targetModel.businessName !== savedModel.businessName
                || targetModel.address1 !== savedModel.address1
                || targetModel.address2 !== savedModel.address2
                || targetModel.city !== savedModel.city
                || targetModel.stateId !== savedModel.stateId
                || targetModel.zip !== savedModel.zip
                || targetModel.countryCode !== savedModel.countryCode;
        };

        // Exit early and allow the form to submit as normal if we are verified and nothing has changed
        if ((isVerifiedInput.val() || '').toLowerCase() === 'true' && !hasAddressVerifyFormChanged(form, model))
            return;

        // Exit early if the address line 1 input is empty. Let validation take over from there.
        if (!(model.address1 || '').trim().length)
            return;

        var modalCallback = function () {
            enableSubmit(form);
            ToggleLoadingBar(form.find('.loading-bar'));

            form.find('[data-address-verify="county"]').val('');

            popUpOverlayContent.off('.address-verify');

            popUpOverlayContent.on('click.address-verify', '.address-verification-button-edit', function () {
                popUpOverlayContent.find('button').prop('disabled', true);
                HidePopUpModal();

                return false;
            });

            popUpOverlayContent.on('click.address-verify', '.address-verification-button-submitted', function () {
                popUpOverlayContent.find('button').prop('disabled', true);
                HidePopUpModal();

                isVerifiedInput.val('True');
                window.saveAddressVerifyState();

                form.trigger('submit');

                return false;
            });

            popUpOverlayContent.on('click.address-verify', '.address-verification-button-match', function () {
                var button = $(this);
                var match = button.data('address-match');

                popUpOverlayContent.find('button').prop('disabled', true);

                //form.find('[data-address-verify="businessName"]').val(match.BusinessName);
                form.find('[data-address-verify="address1"]').val(match.Address1);
                form.find('[data-address-verify="address2"]').val(match.Address2);
                form.find('[data-address-verify="city"]').val(match.City);
                form.find('[data-address-verify="stateId"]').val(match.StateId);
                form.find('[data-address-verify="zip"]').val(match.Zip);
                form.find('[data-address-verify="countryCode"]').val(match.CountryCode);
                form.find('[data-address-verify="county"]').val(match.County);

                isVerifiedInput.val('true');
                window.saveAddressVerifyState();

                HidePopUpModal();

                form.trigger('submit');

                return false;
            });
        };

        $.ajax({
            url: '/umbraco/surface/addressverificationsurface/verify',
            type: 'POST',
            data: model,
            success: function (response) {
                if (response && response.length)
                    LoadPopUpModal(response, modalCallback, false, false);
                else {
                    // No match found (probably due to non-US address), so consider the address verified
                    isVerifiedInput.val('True');
                    window.saveAddressVerifyState();

                    form.trigger('submit');
                }
            }
        });

        verificationCount++;

        return false;
    };

    body.on('submit', 'form[data-address-verify]', window.addressVerificationEventHandler);

    window.saveAddressVerifyState = function () {
        var forms = $('form[data-address-verify]');

        forms.each(function (i, el) {
            var form = $(this);

            var model = {
                businessName: form.find('[data-address-verify="businessName"]').val(),
                address1: form.find('[data-address-verify="address1"]').val(),
                address2: form.find('[data-address-verify="address2"]').val(),
                city: form.find('[data-address-verify="city"]').val(),
                stateId: form.find('[data-address-verify="stateId"]').val(),
                zip: form.find('[data-address-verify="zip"]').val(),
                countryCode: form.find('[data-address-verify="countryCode"]').val()
            };

            form.data('address-verify-state', model);
        });
    };

    window.saveAddressVerifyState();
})();

// Address Type - Business Name
(function () {
    window.rebindAddressTypeChanges = function () {
        var addressTypeDropdowns = $('[data-address-type=""]');

        addressTypeDropdowns.each(function (i, el) {
            var dropdown = $(el);

            if (!dropdown.closest('[data-address-type-wrapper], form').find('[data-address-type]:not([data-address-type=""])').length)
                return;

            dropdown.off('change.address-type');

            dropdown.on('change.address-type', function () {
                var value = dropdown.val();
                var form = dropdown.closest('[data-address-type-wrapper], form');

                form.find('[data-address-type]:not([data-address-type=""])').hide();

                if (value) {
                    var dependentElements = form.find('[data-address-type="' + value + '"]');
                    var inputs = dependentElements.find('input[type="text"],input[type="email"],select,textarea');

                    dependentElements.show();
                    inputs.filter(':visible').prop('disabled', false);
                    inputs.filter(':hidden').prop('disabled', true);
                }
            });

            dropdown.trigger('change.address-type');
        });
    };

    // Expose this function so it can be called again if needed --AEM
    window.rebindAddressTypeChanges();
})();
;

(function () {
    var body = $('body');
    
    body.on('keyup change', 'input[data-phone]', function () {
        var input = $(this);
        var value = input.val() || '';

        // This removes all non-digit characters from the value then sets the value back to the textbox
        input.val(value.split('').filter(function (c) { return /\d/.test(c); }).join(''));
    });

    // trigger a cleanup on page load
    body.find('input[data-phone]').trigger('change');

})();
;

/*Global Elements*/
var emailInput = $('.reset-password-form input[name="email"]');
var headerContainer = $('header.container-fluid');
var loginErrorMessage = $('.login-form .error-message');
var loginForm = $('.login-form');
var loginFormDisplay = $('.login-form input[name="DisplayForm"]');
var loginInputFields = $('.login-form input[name="Password"], .login-form input[name="UserName"]');
var mobileMenu = $('#MainMenuMobile');
var pageHeaderElements = $('.giving-event-header, .alert-banners, #PageWrapper').first();
var resetPassword = $('.reset-password-form');
var mediaSmallQuery = window.matchMedia('screen and (max-width: 991px)');

var resetResetPasswordForm = function () {
    $('#HeaderResetPasswordForm').clearForm();
}

var resetLoginForm = function () {
    $('#LoginForm').clearForm();
}

var viewLogin = function () {
    $('#HeaderLogin').attr('aria-hidden', false);
    loginFormDisplay.val('true');
    loginForm.removeClass('hidden');
    loginForm
        .removeClass('hide-animate-element')
        .delay(100)
        .queue(function () {
            pageHeaderElements.addClass('margin-top-321');
            $(this).addClass('desktop-display-login').dequeue();
            $('.desktop-display-login').show();
        })
        .delay(100)
        .queue(function () {
            $(this).addClass('overflow-visible').dequeue();
        });
};

var mobileViewLogin = function () {
    loginFormDisplay.val('true');
    loginForm.removeClass('hidden');
    loginForm.removeClass('hide-animate-element')
        .delay(100)
        .queue(function () {
            $(this).addClass('mobile-display-login').dequeue();
            $('.mobile-display-login').show();
        })
        .delay(100)
        .queue(function () {
            $(this).addClass('overflow-visible').dequeue();

            headerContainer.removeClass('height-555').addClass('height-1060');
            mobileMenu.removeClass('height-155').addClass('height-657');
        });
};

var hideLogin = function () {
    $('#HeaderLogin').attr('aria-hidden', true);
    loginFormDisplay.val('false');
    $('.desktop-display-login').hide();
    loginForm.removeClass('desktop-display-login');
    loginForm.addClass('hide-animate-element');
    loginInputFields.val('');
    loginForm.removeClass('padding-top-50');
    loginForm.addClass('hidden');
};

var mobileHideLogin = function () {
    loginFormDisplay.val('false');
    $('.mobile-display-login').hide();
    loginForm.removeClass('mobile-display-login');
    loginForm.addClass('hide-animate-element');
    headerContainer.removeClass('height-1060').addClass('height-555');
    mobileMenu.removeClass('height-657').addClass('height-155');
    loginForm.addClass('hidden');
};

var showHeaderLogin = function () {
    if (mediaSmallQuery.matches)
        mobileViewLogin();
    else
        viewLogin();
};

function hideResetPassword() {
    $('#HeaderResetPassword').attr('aria-hidden', true);
    $('.desktop-display-reset-password').hide();
    resetPassword.removeClass('desktop-display-reset-password')
        .delay(100)
        .queue(function () {
            $(this).addClass('hide-animate-element').dequeue();
        });
}

function mobileHideResetPassword() {
    $('.mobile-display-reset-password').hide();
    resetPassword.removeClass('mobile-display-reset-password')
        .delay((100))
        .queue(function () {
            $(this).addClass('hide-animate-element').dequeue();

            headerContainer.removeClass('height-1060').addClass('height-555');
            mobileMenu.removeClass('height-657').addClass('height-155');
        });
}

var viewResetSuccess = function (resetSuccess) {
    resetSuccess
        .queue(function () {
            $(this).addClass('desktop-display-reset-success').dequeue().show();
        })
        .delay(100)
        .queue(function () {
            $(this).addClass('overflow-visible').dequeue();
        });
};

var hideResetSuccess = function (resetSuccess) {
    resetSuccess
        .hide()
        .removeClass('desktop-display-reset-success')
        .delay(100)
        .queue(function () {
            $(this).addClass('hide-animate-element').dequeue();
            resetSuccess.removeClass('padding-top-50');
        });
};

var mobileViewResetSuccess = function (resetSuccess) {
    resetSuccess
        .queue(function () {
            $(this).addClass('mobile-display-reset-success').dequeue().show();
        })
        .delay((100))
        .queue(function () {
            $(this).addClass('overflow-visible').dequeue();
            headerContainer.removeClass('height-555').addClass('height-1060');
            mobileMenu.removeClass('height-155').addClass('height-657');
        });
};

var mobileHideResetSuccess = function (resetSuccess) {
    resetSuccess
        .hide()
        .removeClass('mobile-display-reset-success')
        .delay((100))
        .queue(function () {
            $(this).addClass('hide-animate-element').dequeue();
            headerContainer.removeClass('height-1060').addClass('height-555');
            mobileMenu.removeClass('height-657').addClass('height-155');
        });
};

//Reset Password Token Ajax Functions
var resetPasswordHeaderSuccess = function (partialObject) {
    enableSubmit($('#HeaderResetPasswordForm'));
    $(partialObject).insertAfter('#HeaderResetPasswordForm');
    $('#HeaderResetPasswordForm input').val('');

    var resetSuccess = $('.reset-password .reset-password-success');

    if (mediaSmallQuery.matches) {
        mobileHideResetPassword();
        mobileViewResetSuccess(resetSuccess);
    }
    else {
        hideResetPassword();
        viewResetSuccess(resetSuccess);

        //Implement success click events
        resetSuccess.on('click', '.blue-close-button', function (event) {
            if (mediaSmallQuery.matches) {
                mobileHideResetSuccess(resetSuccess);
                mobileHideResetPassword();
            }
            else {
                hideResetSuccess(resetSuccess);
                pageHeaderElements.removeClass('margin-top-321');
            }
            $('div').remove('.reset-password-success.hide-animate-element');
        });

        resetSuccess.on('click', '.display-login', function () {
            resetPassword.addClass('hide-animate-element');

            if (mediaSmallQuery.matches) {
                mobileHideResetSuccess(resetSuccess);
                mobileViewLogin();
            }
            else {
                hideResetSuccess(resetSuccess);
                viewLogin();
            }
            $('div').remove('.reset-password-success.hide-animate-element');
        });

    }
};

var resetPasswordHeaderFailure = function (responseObject) {
    $('.reset-password.mobile-format').html(responseObject.responseText);
    var form = $('.reset-password.mobile-format').find('form');
    //enable link and button
    enableSubmit(form);
    form.on('click', '.display-login', function () {
        form.addClass('hide-animate-element');

        if (mediaSmallQuery.matches) {
            mobileHideResetPassword();
            mobileViewLogin();
        }
        else {
            hideResetPassword();
            viewLogin();
        }
        resetResetPasswordForm();
    });

    if (mediaSmallQuery.matches) {
        $('.reset-password.mobile-format .reset-password-form').addClass('mobile-display-reset-password');
        $('.mobile-display-reset-password').show();
    }
    else {
        $('.reset-password.mobile-format .reset-password-form').addClass('desktop-display-reset-password');
        $('.desktop-display-reset-password').show();
    }
};
//Reset Password Ajax Functions
var resetPasswordSuccess = function (responseUrl) {
    window.location.replace(responseUrl);
};

var resetPasswordFailure = function (responseObject) {
    $('#SecureResetPasswordWrapper').html(responseObject.responseText);
    $('#SecureResetPasswordForm').removeData('validator');
    $.validator.unobtrusive.parse($('#SecureResetPasswordForm'));
};

var positionMobileForms = function () {
    //check to see if a form is visible before resizing to mobile
    if ($('.header-menu-bar-icon').hasClass('margin-top-321')) {
        if (loginForm)
            hideLogin();

        if ($('.reset-password'))
            hideResetPassword();

        if ($('.reset-password .reset-password-success'))
            hideResetSuccess($('.reset-password .reset-password-success'));

        pageHeaderElements.removeClass('margin-top-321');
    }

    if (loginForm) {
        var detachLogin = loginForm.detach();
        $(detachLogin).insertAfter('.menu-tabs.mobile-menu-tabs.hide-mobile-header-user-icon.col-xs-12');
    }
    if ($('.reset-password')) {
        var detachResetPasswordWrapper = $('.reset-password').detach();
        $(detachResetPasswordWrapper).insertAfter('.login-form');
    }
};

var positionDesktop = function () {
    //check to see if login form is open prior to making the view large    
    if (loginForm) {
        if (loginForm.hasClass('mobile-display-login')) 
            mobileHideLogin();

        var detachLogin = loginForm.detach();
        $(detachLogin).appendTo('#HeaderLogin');
    }

    if ('.reset-password') {
        if (resetPassword.hasClass('mobile-display-reset-password'))
            mobileHideResetPassword();

        var detachResetPasswordWrapper = $('.reset-password').detach();
        $(detachResetPasswordWrapper).appendTo('#HeaderResetPassword');
    }

    if ($('.reset-password .reset-password-success'))
        mobileHideResetSuccess($('.reset-password .reset-password-success'));

};

jRes.addFunc([{
    breakpoint: 'xs',
    enter: positionMobileForms
}]);

jRes.addFunc([{
    breakpoint: 'sm',
    enter: positionMobileForms
}]);

jRes.addFunc([{
    breakpoint: 'md',
    enter: positionDesktop
}]);

jRes.addFunc([{
    breakpoint: 'lg',
    enter: positionDesktop
}]);

(function () {
    var registerContentContainer = $('#Register');
    var registerFirstName = $('.register-input.first-name');
    var registerBothNameInputs = $(".register-input.first-name, .register-input.last-name");
    var registerInputFirstName = $('.register-input.first-name');
    var registerInputLastName = $('.register-input.last-name');
    var registerInputWrapperLastName = $('.register-input-name-wrapper.last-name');

    $(window).load(function () {

        if (loginFormDisplay.val() == 'true') {
            if (mediaSmallQuery.matches)
                mobileViewLogin();
            else
                viewLogin();
        }

        $('.menu-tabs').on('click', '.tabs.login', function (event) {
            showHeaderLogin();
            return false;
        });

        loginForm.on('click', '.blue-close-button', function (event) {
            if (mediaSmallQuery.matches)
                mobileHideLogin();
            else {
                hideLogin();
                pageHeaderElements.removeClass('margin-top-321');
            }

            resetLoginForm();
        });
        //Reset Password
        $('.reset-password').on('click', '.blue-close-button', function (event) {
            if (mediaSmallQuery.matches)
                mobileHideResetPassword();
            else {
                hideResetPassword();
                pageHeaderElements.removeClass('margin-top-321');
            }
            resetResetPasswordForm();
        });
    });

    //Reset Password
    loginForm.on('click', '.forgot-password', function () {
        if (mediaSmallQuery.matches) {
            mobileHideLogin();
            mobileViewResetPassword();
        }
        else {
            hideLogin();
            viewResetPassword();
        }

        resetLoginForm();
    });

    resetPassword.on('click', '.display-login', function () {
        resetPassword.addClass('hide-animate-element');

        if (mediaSmallQuery.matches) {
            mobileHideResetPassword();
            mobileViewLogin();
        }
        else {
            hideResetPassword();
            viewLogin();
        }
        resetResetPasswordForm();
    });

    /*Helper Functions*/

    var viewResetPassword = function () {
        $('#HeaderResetPassword').attr('aria-hidden', false);
        resetPassword.removeClass('hide-animate-element')
            .delay(100)
            .queue(function () {
                $(this).addClass('desktop-display-reset-password').dequeue();
                $('.desktop-display-reset-password').show();
            })
            .delay(100)
            .queue(function () {
                $(this).addClass('overflow-visible').dequeue();
            });
    }

    var mobileViewResetPassword = function () {
        resetPassword.removeClass('hide-animate-element')
            .delay(100)
            .queue(function () {
                $(this).addClass('mobile-display-reset-password').dequeue();
                $('.mobile-display-reset-password').show();
            })
            .delay((100))
            .queue(function () {
                $(this).addClass('overflow-visible').dequeue();
                headerContainer.removeClass('height-555').addClass('height-1060');
                mobileMenu.removeClass('height-155').addClass('height-657');
            });
    }

    //END RESET PASSWORD

    //Register
    var inlineInputsWrapperValidation = function () {
        if (registerInputWrapperLastName.hasClass('margin-left-0') &&
        ((registerInputFirstName.hasClass('input-validation-error') && registerInputLastName.hasClass('input-validation-error')) ||
            (!registerInputFirstName.hasClass('input-validation-error') && !registerInputLastName.hasClass('input-validation-error')))) {
            registerInputWrapperLastName.removeClass('margin-left-0');
        }
        else if ((registerInputFirstName.hasClass('input-validation-error') && !registerInputLastName.hasClass('input-validation-error')) ||
            (!registerInputFirstName.hasClass('input-validation-error') && registerInputLastName.hasClass('input-validation-error'))) {
            registerInputWrapperLastName.addClass('margin-left-0');
        }
    };

    var registerNameValidationError = function () {
        //allow unobtrusive validation function to remove class before calling function to update wrapper's class
        setTimeout(function () { inlineInputsWrapperValidation() }, 200);
    };

    registerContentContainer.on('click', ':submit', function () {
        registerNameValidationError();
    });

    registerFirstName.on("change paste keyup", registerBothNameInputs, (function () {
        registerNameValidationError();
    }));
})();
;

$('.call-button').tooltip();

$('.supporting-image-wrapper').on('click', '.supporting-image-overlay', function () {
    var image = $(this).closest('.supporting-image-item').find('img').prop('src');
    var caption = $(this).closest('.supporting-image-item').data('caption');
    var hasCaption = caption.length > 0;

    var modal = '<div class="supporting-foundation-modal"><div class="supporting-foundation-modal-wrapper">';
    modal += '<div class="supporting-image" style="background-image: url(' + image + ')"></div>';
    modal += '</div>';
    if (hasCaption) {
        modal = modal + '<div class="supporting-image-caption">' + caption + '</div>';
        modal = modal + '<hr/>';
    }
    modal += '</div>';

    LoadModal(modal, true);
});

if (window.location.hash && $('.supporting-foundations-item-title').length > 0)
{
    var element = $(window.location.hash);
    $('body').animate({
        scrollTop: element.offset().top
    }, 1000, function () {
        element.find('.supporting-foundations-item-title')[0].click();
        $('body').animate({
            scrollTop: element.offset().top
        }, 1000);
    });
}
;
$(document).ready(function () {
    relatedPagesResize();

    $(window).resize(function () {
        relatedPagesResize();
    });
});

function relatedPagesResize() {
    $('.related-page-link').each(function () {
        var top = ($('.related-page-container', this).outerHeight() - $('.related-page-name', this).outerHeight()) / 2;
        $('.related-page-name', this).css('top', top + 'px');
    });
}
;

//Global Variables
var paginationContainers = $('.search-pagination-container');

var centerPagination = function () {
    for (var x = 0; x < paginationContainers.length; x++) {
        var paginationContainer = $(paginationContainers[x]);
        var paginationContainerWidth = 0;
        var paginationContainerChildren = paginationContainer.children();

        for (var i = 0; i < paginationContainerChildren.length; i++)
            paginationContainerWidth += $(paginationContainerChildren[i]).outerWidth(true);

        paginationContainer.outerWidth(paginationContainerWidth + 2);
    }
};

// call this to reset when ajax-ing new pagination partial
var resetPagination = function () {
    paginationContainers = $('.search-pagination-container');
    centerPagination();
};

//Search Login Popovers
var searchResultLoginPopup = function () {
    getLoginPopUp(function (data) {
        $('#SearchLoginPartial').html(data);
        $.validator.unobtrusive.parse("#SearchLogin > div > div > form");
        $('#SearchLogin').css("display", "block");
        popUpOverlayContent.addClass('top-100');
        LoadPopUpModal($('#SearchLogin'), false, false, true);
        $('#CurrentUrl').val(window.location.href);
    });
    return false;
};

var getLoginPopUp = function (callback) {
    $.ajax({
        type: 'GET',
        dataType: 'html',
        url: '/umbraco/surface/searchresultsloginajax/loginformpopover',
        success: function (response) {
            return callback(response);
        }
    });
};

var searchLoginSuccess = function (response) {
    if (response.length && response !== window.location.href)
        window.location.href = response;
    else
        window.location.reload();
};

var searchLoginFailure = function (responseObject) {
    $('#PopUpOverlayContentContainer .content').html(responseObject.responseText);
    $('#SearchLogin').css('display', 'block');
    var form = $('#SearchLogin').find('form');
    $.validator.unobtrusive.parse(form);
    enableSubmit(form);
};

(function () {
    var searchInputs = $('.header-search-input, .giving-top-menu-search-input, .scholarship-search-input');
    var givingTopMenuSearchInput = $($('.giving-top-menu-search-input')[0]);
    var searchResultsContainer;
    var searchResults;
    var searchResultsClassPrefix;
    var activeHeaderSearchInput;
    var isResultSelected = false;
    var indexOfSelectedResult = -1;
    var preventChangeOnHover = false;
    var searchTerm;
    var searchType;
    var take = 10;
    var lazyLoadSkip = 10;
    var applicationOnline;
    var isPotentialMatch = false;
    var scholarshipSearches;
    var scholarshipSearchResults;
    var scholarshipSearchMatches;
    var scholarshipSearchResultsPrefix = '/search-results/scholarship-search-results?';

    var resetIsSelected = function () {
        isResultSelected = false;
        indexOfSelectedResult = -1;
    };

    var hideSearchDropdown = function () {
        if (searchResultsContainer) {
            searchResultsContainer.slideUp(150, function () {
                $('#ImageOverlay').removeClass('mobile-search');
                searchResultsContainer.html('');
            });
        }
    };

    var getScholarshipSearchResults = function () {
        scholarshipSearches = {
            searchType: 'scholarship',
            searchTerm: searchTerm,
            applicationOnline: applicationOnline,
            take: 10,
            skip: 0
        };

        if (typeof potentialMatchesUrl !== 'undefined') {
            var scholarshipMatchesUrl = $.param(scholarshipSearches) + potentialMatchesUrl + '&isPotentialMatch=' + isPotentialMatch;
            scholarshipSearchMatches = scholarshipSearchResultsPrefix + scholarshipMatchesUrl;
        }

        var scholarshipSearchResultsUrl = $.param(scholarshipSearches);
        scholarshipSearchResults = scholarshipSearchResultsPrefix + scholarshipSearchResultsUrl;
    };

    var submitSearch = function () {
        if (searchType === 'scholarship') {
            if (typeof searchTerm === 'undefined')
                return;

            getScholarshipSearchResults();

            if (isPotentialMatch === true)
                window.location = scholarshipSearchMatches;
            else
                window.location = scholarshipSearchResults;
        }
        else {
            // Try to get the search value again (due to browser autocomplete or pasting)
            if (!searchTerm && activeHeaderSearchInput && activeHeaderSearchInput.length)
                searchTerm = activeHeaderSearchInput.val();

            window.location = '/Search-Results?searchType=' + searchType + '&searchTerm=' + searchTerm + '&faceted=true&grouped=false&take=' + take + '&skip=0';
        }
    };

    var getDropdownResults = function (callback) {
        var resultsToShowPerGroup = 4;

        $.ajax({
            type: 'GET',
            dataType: 'html',
            url: '/umbraco/surface/searchResultsAjax/dropdown',
            data: {
                SearchResultsClassPrefix: searchResultsClassPrefix,
                SearchTerm: searchTerm,
                SearchType: searchType,
                Faceted: false,
                Grouped: true,
                Take: resultsToShowPerGroup
            },
            success: callback
        });
    };

    var getLazyLoadResults = function (baseUrl, callback) {
        $.ajax({
            type: 'GET',
            dataType: 'html',
            url: baseUrl,
            data: {
                Skip: lazyLoadSkip,
                Take: take
            },
            success: callback
        });
    };

    var showSearchResults = debounce(function (resultContainer, callback) {
        getDropdownResults(function (data) {
            // callback to parse search results into html
            resultContainer.html(data);
            searchResults = $('.' + searchResultsClassPrefix + '-description');

            // callback renders results after html is ready
            callback();
        });
    }, 500);

    var checkValLength = function (element) {
        if (element.val().length > 2) {
            searchTerm = element.val();
            showSearchResults(searchResultsContainer, function () {
                // callback to render results after html is ready
                if (searchResults.length) {
                    searchResultsContainer.addClass('visible');
                    searchResultsContainer.slideUp(150, function () {
                        searchResultsContainer.slideDown(150);
                    });
                }
                else
                    hideSearchDropdown();
            });
        }
        else {
            searchTerm = '';
            hideSearchDropdown();
        }
    };

    var selectSearchResult = function () {
        // used to navigate the dropdown with arrow up and arrow down keys
        var totalResults = searchResults.length;
        if (!totalResults)
            return;

        var downOnLastResult = indexOfSelectedResult >= totalResults;

        if (indexOfSelectedResult < 0) {
            resetIsSelected();
            $(window).scrollTop(0);
            return;
        }
        else if (!isResultSelected) {
            indexOfSelectedResult = 0;
            isResultSelected = true;
        }
        else if (downOnLastResult)
            indexOfSelectedResult = totalResults - 1;

        var windowHeight = $(window).height();
        var windowScrollTop = $(window).scrollTop();
        var element = $(searchResults[indexOfSelectedResult]);
        var elementOffsetTop = element.offset().top;
        var elementOffsetBottom = elementOffsetTop + element.outerHeight();
        if (windowHeight + windowScrollTop < elementOffsetBottom)
            $(window).scrollTop(elementOffsetBottom - windowHeight);

        if (downOnLastResult)
            $(window).scrollTop(searchResultsContainer.offset().top + searchResultsContainer.outerHeight() - windowHeight);

        if (windowScrollTop > elementOffsetTop)
            $(window).scrollTop(elementOffsetTop);

        $(searchResults[indexOfSelectedResult]).addClass('active');
    };

    var bindMouseMove = function (element) {
        // preventChangeOnHover is set to true while using arrow up or arrow down to move through dropdown
        if (preventChangeOnHover)
            return;

        searchResults.removeClass('active');
        element.addClass('active');
        isResultSelected = true;
        indexOfSelectedResult = searchResults.index(element);
    };

    var bindResultClick = function (element) {
        var linkUrl = element.data('link-url');

        // if this dropdown item is in the Funds section (and not a DL), do not navigate from here
        // Checkout.js will handle the navigation to the cart and trigger the login popover if necessary
        if ($(element).is('.search-results-dropdown-Funds:not(.has-dl)'))
            return false;

        $(location).attr('href', linkUrl);

        // ReSharper disable once NotAllPathsReturnValue
    };

    var bindKeyDown = function (e, element) {
        // enter key
        if (e.which === 13)
            return;

        searchResults.removeClass('active');

        // stop the input scrolling into view if not in view and disable using hover to change selection
        if (e.which === 40 || e.which === 38) {
            preventChangeOnHover = true;
            e.preventDefault();
        }

        // down arrow
        if (e.which === 40 && element.val().length > 2) {
            indexOfSelectedResult++;
            selectSearchResult();
            return;
        }

        // up arrow
        if (e.which === 38 && element.val().length > 2) {
            indexOfSelectedResult--;
            selectSearchResult();
        }
    };

    var bindKeyUp = function (e, element) {
        // enter key
        if (e.which === 13) {
            if (isResultSelected) {
                var activeResult = $('.' + searchResultsClassPrefix + '-description' + '.active');
                var linkUrl = $(activeResult[0]).data('link-url');
                $(location).attr('href', linkUrl);
            }
            else {
                if (typeof searchTerm === 'undefined')
                    searchTerm = '';

                submitSearch();
            }

            return;
        }

        // down arrow and up arrow handled on key down
        if (e.which === 40 || e.which === 38) {
            // wait for current scrolling action to complete before allowing hover to change selection
            setTimeout(function () {
                preventChangeOnHover = false;
            }, 300);
            return;
        }

        searchResults.removeClass('active');

        resetIsSelected();

        checkValLength(element);
    };

    var bindSearchInputs = function (element) {
        searchInputs.off('keydown');
        searchInputs.off('keyup');
        hideSearchDropdown();

        // set active input and handlers
        activeHeaderSearchInput = element;
        searchType = activeHeaderSearchInput.data('search-type');
        activeHeaderSearchInput.on('keydown', function (e) {
            if (e.which !== 13)
                bindKeyDown(e, activeHeaderSearchInput);
            else if (indexOfSelectedResult >= 0)
                $(searchResults[indexOfSelectedResult]).click();
            else {
                if (typeof searchTerm !== 'undefined')
                    submitSearch();
                else
                    $(this).focus();
            }
        });
        activeHeaderSearchInput.on('keyup', function (e) {
            if (e.which !== 13)
                bindKeyUp(e, activeHeaderSearchInput);
        });

        // set container to receive results
        searchResultsContainer = $('.' + activeHeaderSearchInput.data('results-container'));
        searchResultsContainer.html('');

        //set individual result containers
        searchResultsClassPrefix = activeHeaderSearchInput.data('results-prefix');
        searchResults = $('.' + searchResultsClassPrefix + '-description');

        // event handler for hovering over results
        body.off('mousemove', '.' + searchResultsClassPrefix + '-description').on('mousemove', '.' + searchResultsClassPrefix + '-description', function () {
            bindMouseMove($(this));
        });

        // event handler for clicking results
        body.off('click', '.' + searchResultsClassPrefix + '-description').on('click', '.' + searchResultsClassPrefix + '-description', function () {
            bindResultClick($(this));
        });

        checkValLength(activeHeaderSearchInput);
    };

    //click handler for search slider submit
    body.on('click', '.searchSliderContent .sliderSearchLink , .mobile-slider-search-button', function (e) {
        e.preventDefault();

        var textbox = $(this).closest('form').find('.search-query');
        var value = textbox.val();

        if (!value)
            value = textbox.attr('placeholder');

        searchTerm = value;
        searchType = 'global';
        submitSearch();
    });

    body.on('submit', '.searchSliderContent form', function () {
        $(this).find('.sliderSearchLink').trigger('click');

        return false;
    });

    // click handler for state select change on giving store search results page
    body.on('change', '.state-filter-select, .county-filter-select', function () {
        var selectedOption = this[this.selectedIndex];
        var newSearchUrl = selectedOption.value;
        window.location = newSearchUrl;
    });


    // event handler to close dropdowns when clicking off of the input
    body.on('click', function (e) {
        // "rightArrow pointer pull-right hidden-xs hidden-sm" className refers to the slider search input right arrow.
        // this arrow is clicked, programmatically, and the click action will trigger the search results dropdown to hide
        // if not handled here
        if (e.toElement !== givingTopMenuSearchInput && e.target.className !== 'rightArrow pointer pull-right hidden-xs hidden-sm')
            hideSearchDropdown();
    });

    // set active header search input (could be desktop or mobile), bind to handlers, set result container
    searchInputs.on('click', function (e) { bindSearchInputs($(e.target)); });

    body.on('click', '.header-search-icon', function () {
        $('.header-search-input-wrapper, .mobile-header-search-input-wrapper').addClass('visible');
        $('.mobile-header-search-icon').addClass('show-search-input');

        searchInputs.removeClass('active');

        var isMobile = $(this).hasClass('mobile-header-search-icon');

        if (isMobile)
            $('.mobile-header-search-input-wrapper .header-search-input').addClass('active');
        else
            $('.header-search-input-wrapper .header-search-input').addClass('active');

        activeHeaderSearchInput = $($('.header-search-input.active')[0]);

        // have to delay setting focus on the input until the css transitions are done, or else the html rendering is slightly off
        searchInputs.delay(300).queue(function () {
            bindSearchInputs(activeHeaderSearchInput);

            activeHeaderSearchInput.focus().dequeue();
        });
    });

    body.on('click', '.close-header-search-input, .show-search-input', function () {
        $('.header-search-input-wrapper, .mobile-header-search-input-wrapper').removeClass('visible');
        hideSearchDropdown();
        $('.header-search-input').val('');
        $('.mobile-header-search-icon').removeClass('show-search-input');
    });

    body.on('click', '.execute-header-search-icon, .header-search-dropdown-more-results, .execute-giving-top-menu-search-icon, .giving-top-menu-search-dropdown-more-results', function () {
        var button = $(this);

        if (!searchTerm && button.siblings('input').length)
            searchTerm = button.siblings('input').val();

        submitSearch();
    });

    body.on('click', '.scholarship-search-icon, .scholarship-search-dropdown-more-results', function () {
        if (typeof searchTerm === 'undefined') {
            searchTerm = '';
            searchType = 'scholarship';
        }

        submitSearch();
    });

    //filter scholarship search results by online application
    body.on('click', '.search-result-app', function () {
        searchTerm = $('div.search-results-term').text().replace(/\u2018/g, "").replace(/\u2019/g, ""); //remove left and right single quotes
        searchType = 'scholarship';
        applicationOnline = $('.search-result-app').data('value');
        applicationOnline = applicationOnline === 'True' ? 'False' : 'True';
        isPotentialMatch = window.isPotentialScholarshipMatch;
        window.potentialMatchesUrl = window.lazyLoadUrl.replace(/^(.+?)applicationOnline=False|^(.+?)applicationOnline=True/, ""); //remove url prefix specific to lazy loading

        submitSearch();
    });

    // lazy load more results on giving store or scholarship search results
    body.on('click', '.search-result-load-more-button', function () {
        var baseUrl = $(this).data('lazy-load-url');
        var totalResults = $(this).data('total-result');

        getLazyLoadResults(baseUrl, function (data) {
            $('.search-list-results').append(data);
            lazyLoadSkip += take;

            // hide load more button if all results are loaded
            if (totalResults <= lazyLoadSkip)
                $('.search-load-more').addClass('hidden');
        });
    });

    // filter-expander click handler
    body.on('click', '.filter-expander', function () {
        $(this).toggleClass('expanded');

        // Save the state of the filter UI to localstorage
        var expanded = $(this).hasClass('expanded');
        var filterExpanderState = JSON.parse(localStorage['filter-expander-state'] || '{}');

        filterExpanderState[this.id] = expanded;

        localStorage['filter-expander-state'] = JSON.stringify(filterExpanderState);
    });

    // On page load, restore the filter expander states
    (function () {
        var filterExpanderState = JSON.parse(localStorage['filter-expander-state'] || '{}');

        $.each(filterExpanderState, function (key, value) {
            $('#' + key).toggleClass('expanded', !!value);
        });
    })();

    // centers the search results page number links after the search results page loads
    $(document).ready(function () {
        centerPagination();

        $(window).resize(function () {
            centerPagination();
        });
    });

    // login pop up
    body.on('click', '.login-search', function () {
        searchResultLoginPopup();
    });
})();
;

(function () {

    //#region Give Links, Forms, and Buttons
    var goToCart = function (queryString) {
        location.href = `/umbraco/surface/checkoutLoginSurface/goToCart${queryString || ''}`;
    };

    body.on('click', '.go-to-cart-link', function () {
        var queryString = $(this).data('cart-query-string');

        goToCart(queryString);

        return false;
    });

    body.on('click', '.search-results-dropdown-Funds:not(.has-dl)', function () {
        var queryString = $(this).data('link-url');

        goToCart(queryString);
    });

    body.on('click', '.header-cart-icon, .mobile-header-cart-icon, .login-return', function () {
        goToCart();
    });

    body.on('click', '.search-suggestion-form-link', function () {
        var queryString = '?giftType=suggestion';

        goToCart(queryString);

        return false;
    });
    //#endregion

    //#region Wrapper Objects
    var checkoutAddOrgOrFund = $('.checkout-add-org-or-fund');
    var checkoutDetails = $('.checkout-details');
    var checkoutCart = $('.checkout-cart');
    var checkoutDecision = $('.checkout-decision');
    var checkoutContactInfo = $('.checkout-contact-info');
    var checkoutBillingInfo = $('.checkout-billing-info');
    var checkoutConfirmation = $('.checkout-confirmation');
    //#endregion

    //#region Shared
    var resetValidation = function (hiddenDropdown, value) {
        hiddenDropdown.addClass('hidden').removeClass('has-error');
        hiddenDropdown.children('select').removeClass('input-validation-error');

        //reset validation message
        if (value !== 'US') {
            // ReSharper disable StringLiteralTypo
            $('.checkout-validation-errors-wrapper')
                .find('[data-valmsg-for="State"]')
                .removeClass('field-validation-error')
                .add('field-validation-valid')
                .html('');
        }

        if (value !== 'CA') {
            // ReSharper disable StringLiteralTypo
            $('.checkout-validation-errors-wrapper')
                .find('[data-valmsg-for="Province"]')
                .removeClass('field-validation-error')
                .add('field-validation-valid')
                .html('');
            // ReSharper restore StringLiteralTypo
        }
    };

    var fixInputs = function (wrapper) {
        var inputs = wrapper.find('input[type="text"],input[type="email"],select,textarea').not('.g-recaptcha-response');

        inputs.filter(':visible').prop('disabled', false);
        inputs.filter(':hidden').prop('disabled', true);
    };

    var updateAddressEditable = function (wrapper, enable) {
        enable = !!enable || parseInt(wrapper.find('#AddressKey').val()) < 0;

        wrapper
            .find('#BusinessName, #Address, #Address1, #Address2, #City, #StateUS, #StateCA, #Zip, #CountryCode')
            .prop('disabled', !enable)
            .closest('.checkout-form-group')
            .toggleClass('checkout-form-group-disabled', !enable);

        // The button should be the opposite of the fields
        wrapper.find('.edit-address-button').prop('disabled', enable);
    };

    var updatePhoneEditable = function (wrapper, enable) {
        enable = !!enable || parseInt(wrapper.find('#PhoneKey').val()) < 0;

        wrapper
            .find('#Phone')
            .prop('disabled', !enable)
            .closest('.checkout-form-group')
            .toggleClass('checkout-form-group-disabled', !enable);

        // The button should be the opposite of the fields
        wrapper.find('.edit-phone-button').prop('disabled', enable);
    };
    //#endregion

    //#region Checkout Add Org or Fund
    checkoutAddOrgOrFund.on('change', '#Address1', function () {
        var input = $(this);
        var form = input.closest('form');
        var value = input.val() || '';

        form.data('address-verify', value.length ? '' : 'skip');
    });

    checkoutAddOrgOrFund.find('#Address1').trigger('change');
    //#endregion

    //#region Checkout Details
    var toggleAddressVerification = function () {
        // We use .attr() here instead of .data() since the JS for verifying the address
        // fields uses selectors to find the inputs and such. .data() does not actually change
        // the DOM but .attr() does. --AEM

        checkoutDetails.find('[data-address-verify]:not([name="DedicationNotifyAddressVerified"])').attr('data-address-verify', '');

        var shouldVerify = checkoutDetails.find('[name="DedicationNotifyAddress"]:visible').length;
        checkoutDetails.find('#CheckoutDetailForm').attr('data-address-verify', shouldVerify ? '' : 'skip');

        checkoutDetails.find('[name="DedicationNotifyAddress"]:visible').attr('data-address-verify', 'address1');
        checkoutDetails.find('[name="DedicationNotifyAddress2"]:visible').attr('data-address-verify', 'address2');
        checkoutDetails.find('[name="DedicationNotifyCity"]:visible').attr('data-address-verify', 'city');
        checkoutDetails.find('[name="DedicationNotifyStateId"]:visible').attr('data-address-verify', 'stateId');
        checkoutDetails.find('[name="DedicationNotifyZip"]:visible').attr('data-address-verify', 'zip');
        checkoutDetails.find('[name="DedicationNotifyCountryCode"]:visible').attr('data-address-verify', 'countryCode');

        window.saveAddressVerifyState();
    };

    checkoutDetails.on('change', '[name="GiftType"]', function (e, data) {
        var value = $(this).val().toLowerCase();
        var isGrant = value === 'grant';
        var isRecurring = value === 'recurringgift';

        checkoutDetails.find('[data-is-grant="' + isGrant + '"]').removeClass('hidden');
        checkoutDetails.find('[data-is-grant="' + !isGrant + '"]').addClass('hidden');
        checkoutDetails.find('[data-is-recurring="' + isRecurring + '"]').removeClass('hidden');
        checkoutDetails.find('[data-is-recurring="' + !isRecurring + '"]').addClass('hidden');

        checkoutDetails.find('[data-' + (isGrant ? 'grant' : 'gift') + '-text]').each(function (i, el) {
            var textElement = $(el);
            var text = textElement.data((isGrant ? 'grant' : 'gift') + '-text');

            // This is meant to preserve any child elements when we swap the text
            // (since this is used primarily on a label where we need to keep the empty div) --AEM
            var children = textElement.children();
            var childHtml = '';

            for (var j = 0; j < children.length; j++)
                childHtml += children[j].outerHTML;

            textElement.html(childHtml + text);
        });

        checkoutDetails.find('[data-' + (isGrant ? 'grant' : 'gift') + '-placeholder]').each(function (i, el) {
            var element = $(el);
            var placeholder = element.data((isGrant ? 'grant' : 'gift') + '-placeholder');

            element.attr('placeholder', placeholder);
        });

        checkoutDetails.find('[data-length-' + (isGrant ? 'grant' : 'gift') + ']').each(function (i, el) {
            var element = $(el);
            var length = element.data('length-' + (isGrant ? 'grant' : 'gift'));
            var dataValue = element.val();

            if (dataValue.length > length)
                element.val(dataValue.substr(0, length));

            element.prop('maxLength', length);
        });

        checkoutDetails.find('[id^="DedicationNotifyDeliveryMethodGrant"]').prop('disabled', !isGrant);

        if (!(data || {}).fromGiveTo && checkoutDetails.find('#OrgCanReceiveCreditCardGifts').val() === 'False') {
            checkoutDetails.find('#GiveToOrg').prop('checked', isGrant);
            checkoutDetails.find('#GiveToFund').prop('checked', !isGrant);
        }

        var canSuggestGrants = checkoutDetails.find('#CanSuggestGrant').val() === 'True';
        var seqNum = parseInt(checkoutDetails.find('#SequenceNumber').val()) || 0;
        if (!isGrant && canSuggestGrants && !seqNum)
            checkoutDetails.find('select[id^="DedicationNotifyDeliveryMethod"]').val('');

        checkoutDetails.find('[data-is-grant] input[type="hidden"]').each(function (i, el) {
            var input = $(el);
            var parent = input.closest('[data-is-grant]');

            input.prop('disabled', parent.is('[data-is-grant="' + !isGrant + '"]'));
        });

        checkoutDetails.find('select[name="GrantFundId"]').trigger('change');

        if (!(data || {}).fromGiveTo)
            checkoutDetails.find('[name="GiveTo"]:checked').trigger('change');

        checkoutDetails.find('#IsCorporateGift').trigger('change');
        checkoutDetails.find('[id^="ShouldNotifyOfDedication"]:checked').trigger('change');

        fixInputs(checkoutDetails);
    });

    checkoutDetails.on('change', '[name="GiveTo"]', function () {
        var value = $(this).val();

        checkoutDetails
            .find('[data-give-to]')
            .addClass('hidden')
            .filter(`[data-give-to="${value}"]`)
            .removeClass('hidden');

        checkoutDetails.find('[data-give-to] select[name="FundId"], [data-give-to] select[name="OrgId"]').val('');
        checkoutDetails.find('[data-give-to] [name="FundId"], [data-give-to] [name="OrgId"]').trigger('change');
        checkoutDetails.find('[name="GiftType"]:checked, [name="GiftType"][type="hidden"]').trigger('change', [{ fromGiveTo: true }]);

        fixInputs(checkoutDetails);
    });

    checkoutDetails.on('blur', '#GiftAmount', function () {
        var textbox = $(this);

        // get the entered value and remove all non-digit (or .) characters
        var value = (textbox.val() || '').replace(/[^\d\.]/g, '');

        if (!value)
            return;

        // split the value and insert commas as necessary (from https://stackoverflow.com/a/2901298)
        var parts = value.split('.');
        parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');

        // if the value does not have anything to the right of the decimal point, add it
        if (parts.length === 1)
            parts.push('00');

        // trim any extra decimal places
        parts[1] = (parts[1] + '00').substr(0, 2);

        // put the parts back together and prepend the dollar sign
        value = '$' + parts.join('.');

        // save the formatted value back to the textbox and the summary box
        textbox.val(value);
        checkoutDetails.find('.checkout-details-summary-item .gift-amount').text(value);
    });

    checkoutDetails.on('change', '[data-give-to] [name="FundId"], [data-give-to] [name="OrgId"]', function () {
        var input = $(this);
        var wrapper = input.closest('[data-give-to]');
        var id = wrapper.is(':visible') ? input.val() : 0;
        var portraitNameElement = checkoutDetails.find('.checkout-details-summary-item .portrait-name');
        var portraitLogoElement = checkoutDetails.find('.checkout-details-summary-item img');

        if (id) {
            var name = input.is('select') ? input.find(`option[value="${id}"]`).text() : input.data('name');

            portraitNameElement.text(name);
        } else
            portraitNameElement.text(portraitNameElement.data('original-name'));

        if (id) {
            var logoForm = checkoutDetails.find('#CheckoutDetailsLogoForm');
            var orgIdInput = logoForm.find('[name="OrgId"]');
            var fundIdInput = logoForm.find('[name="FundId"]');

            orgIdInput.val('');
            fundIdInput.val('');

            if (input.is('[name="OrgId"]'))
                orgIdInput.val(id);
            else
                fundIdInput.val(id);

            $.ajax({
                url: logoForm.attr('action').replace(/\?.*$/, ''),
                type: logoForm.attr('method'),
                data: logoForm.serialize(),
                success: function (data) {
                    portraitLogoElement.attr('src', data);
                },
                error: function () {
                    portraitLogoElement.attr('src', portraitLogoElement.data('original-url'));
                }
            });
        } else
            portraitLogoElement.attr('src', portraitLogoElement.data('original-url'));
    });

    checkoutDetails.on('change', 'select[name="GrantFundId"]', function () {
        var dropdown = $(this);
        var fundId = dropdown.val();
        var fundName = dropdown.find('option[value="' + fundId + '"]').text();

        if (dropdown.is(':visible')) {
            checkoutDetails.find('.donor-fund-name').toggleClass('hidden', !fundId);
            checkoutDetails.find('.donor-fund-name span').text(fundName);
        }
        else
            checkoutDetails.find('.donor-fund-name').addClass('hidden');
    });

    checkoutDetails.on('change', '[name="Dedication"]', function (e, data) {
        var value = $(this).val();

        // Clear dedication form values, but not if this is the first load
        if (!(data || {}).isInitial) {
            checkoutDetails
                .find('.dedication-form')
                .find('input, select')
                .not('[type="hidden"], [type="checkbox"], [type="radio"]')
                .val('');
            checkoutDetails
                .find('.dedication-form')
                .find('input[type="checkbox"], input[type="radio"]')
                .prop('checked', false);

            checkoutDetails.find('[name="DedicationNotifyAddressVerified"]').val('false');

            // default country dropdowns back to US
            checkoutDetails.find('[name="DedicationNotifyCountryCode"]').val('US').trigger('change');
        }

        checkoutDetails
            .find('[data-dedication]')
            .addClass('hidden')
            .filter('[data-dedication="' + value + '"]')
            .removeClass('hidden');

        fixInputs(checkoutDetails);

        checkoutDetails
            .find('[data-dedication]:hidden [name="ShouldNotifyOfDedication"]')
            .prop('disabled', true);

        checkoutDetails
            .find('[data-dedication]:visible [name="ShouldNotifyOfDedication"]')
            .prop('disabled', false);

        checkoutDetails
            .find('[id^="ShouldNotifyOfDedication"]')
            .trigger('change');

        if (!(data || {}).isInitial)
            toggleAddressVerification();
    });

    checkoutDetails.on('change', '[id^="ShouldNotifyOfDedication"]', function () {
        var checkbox = $(this);
        var dedicationForm = checkbox.closest('.dedication-form');

        if (!dedicationForm.is(':visible'))
            return;

        var value = $(this).prop('checked');

        checkoutDetails
            .find('[data-dedication]:visible .notify-info')
            .toggleClass('hidden', !value);

        fixInputs(checkoutDetails);

        if (value) {
            var hiddenInput = dedicationForm.find('input[id^="DedicationNotifyDeliveryMethod"]:not(:disabled)');
            var dropdown = dedicationForm.find('select[id^="DedicationNotifyDeliveryMethod"]:visible');
            var seqNum = parseInt(checkoutDetails.find('#SequenceNumber').val()) || 0;

            if (checkoutDetails.find('[name="GiftType"]').val().toLowerCase() === 'grant' && !seqNum)
                dropdown.val(hiddenInput.val());

            if (dropdown.length)
                dropdown.trigger('change');
            else if (hiddenInput.length)
                hiddenInput.trigger('change');
        }
    });

    checkoutDetails.on('change', '[id^="DedicationNotifyDeliveryMethod"]', function () {
        var value = $(this).val();

        checkoutDetails
            .find('[data-dedication-notify]')
            .addClass('hidden')
            .filter('[data-dedication-notify="' + value + '"]')
            .removeClass('hidden');

        fixInputs(checkoutDetails);
        checkoutDetails.find('[id^="DedicationNotifyCountryCode"]').trigger('change');
        toggleAddressVerification();
    });

    checkoutDetails.on('change', '[id^="DedicationNotifyCountryCode"]', function () {
        var dropdown = $(this);

        if (dropdown.is(':hidden'))
            return;

        var value = dropdown.val();

        if (value !== 'US' && value !== 'CA')
            value = 'address';

        var hiddenDropdown = checkoutDetails.find('[data-dedication-country][data-dedication-country!="' + value + '"]');

        resetValidation(hiddenDropdown, value);

        checkoutDetails
            .find('[data-dedication-country="' + value + '"]')
            .removeClass('hidden');

        fixInputs(checkoutDetails);
    });

    checkoutDetails.find('[name="GiftType"]:checked, [name="GiftType"][type="hidden"]').trigger('change');
    checkoutDetails.find('[name="GiveTo"]:checked').trigger('change');
    checkoutDetails.find('[data-give-to] [name="FundId"], [data-give-to] [name="OrgId"]').trigger('change');
    checkoutDetails.find('select[name="GrantFundId"]').trigger('change');
    checkoutDetails.find('[name="Dedication"]:checked').trigger('change', [{ isInitial: true }]);
    checkoutDetails.find('[id^="ShouldNotifyOfDedication"]:checked').trigger('change');
    checkoutDetails.find('[id^="DedicationNotifyCountryCode"]').trigger('change');
    checkoutDetails.find('#IsCorporateGift:checked').trigger('change');
    checkoutDetails.find('#AgreedToTerms').trigger('change');

    (function () {
        var betterTogetherModal = checkoutDetails.find('#BetterTogetherModal');

        var callback = function () {
            popUpOverlayContent.off('click.checkout-pop-up');

            popUpOverlayContent.on('click.checkout-pop-up', '.close-modal', function () {
                HidePopUpModal();
            });
        };

        if (betterTogetherModal.length)
            LoadPopUpModal(betterTogetherModal.find('.pop-up-content'), callback);
    })();
    //#endregion

    //#region Checkout Cart
    var saveCart = function (form, callback) {
        var formData = form.serialize();

        form.find('input, button').prop('disabled', true);

        $.ajax({
            url: '/umbraco/surface/checkoutcartsurface/save',
            type: 'POST',
            data: formData,
            success: function (response) {
                form.find('input, button').prop('disabled', false);

                if (response === 'False')
                    alert('Unable to save cart.');
                else if (typeof callback === 'function')
                    callback(response);
            },
            error: function () {
                alert('Unable to save cart');
            }
        });
    };

    checkoutCart.on('change', '#WillCoverProcessingCost', function (e, data) {
        var checkbox = $(this);
        var value = checkbox.prop('checked');
        var form = checkbox.closest('form');

        checkoutCart.find('[data-with-cost="true"]').toggleClass('hidden', !value);
        checkoutCart.find('[data-with-cost="false"]').toggleClass('hidden', value);

        if (!(data || {}).isInitial)
            saveCart(form);
    });

    checkoutCart.on('click', '[data-remove-cart-item]', function () {
        var seqNum = $(this).data('remove-cart-item');
        var content = $('#RemoveItemModalContent .pop-up-content').clone();

        var callback = function () {
            popUpOverlayContent.off('click.checkout-pop-up');

            popUpOverlayContent.on('click.checkout-pop-up', '.checkout-button.button-yes', function () {
                $.ajax({
                    url: '/umbraco/surface/checkoutcartsurface/removeitem',
                    type: 'DELETE',
                    data: { seqNum: seqNum },
                    complete: function () {
                        window.location.reload();
                    }
                });
            });

            popUpOverlayContent.on('click.checkout-pop-up', '.checkout-button.button-no', function () {
                HidePopUpModal();
            });
        };

        LoadPopUpModal(content, callback);

        return false;
    });

    if (checkoutCart.find('#GivingEventPrePostAcknowledged').length) {
        checkoutCart.on('change', '#GivingEventPrePostAcknowledged', function () {
            var checkbox = $(this);
            var checked = checkbox.prop('checked');
            var formGroup = checkbox.closest('.form-group');

            formGroup.toggleClass('has-error', !checked);
            formGroup.prev('h4').toggleClass('has-error', !checked);
        });

        checkoutCart.on('submit', '#CheckoutCartForm', function () {
            var form = $(this);
            var givingEventCheckbox = form.find('#GivingEventPrePostAcknowledged');

            if (!givingEventCheckbox.prop('checked')) {
                givingEventCheckbox.closest('.form-group').addClass('has-error');
                givingEventCheckbox.closest('.form-group').prev('h4').addClass('has-error');
                enableSubmit(form);
                ToggleLoadingBar(form.find('.loading-bar'));
                return false;
            }

            return true;
        });
    }

    checkoutCart.find('#WillCoverProcessingCost').trigger('change', [{ isInitial: true }]);

    (function () {
        var givingEventModal = checkoutCart.find('#GivingEventPreRunModal, #GivingEventPostRunModal');

        var callback = function () {
            popUpOverlayContent.off('click.checkout-pop-up');

            popUpOverlayContent.on('click.checkout-pop-up', '.close-modal', function () {
                HidePopUpModal();
            });
        };

        if (givingEventModal.length)
            LoadPopUpModal(givingEventModal.find('.pop-up-content'), callback);
    })();
    //#endregion

    //#region Checkout Decision
    var disableDecisionButtons = function () {
        checkoutDecision.find('.checkout-decision-button').prop('disabled', true);
        ToggleLoadingBar(checkoutDecision.find('.loading-bar'));
    };

    var enableDecisionButtons = function () {
        checkoutDecision.find('.checkout-decision-button').prop('disabled', false);
        ToggleLoadingBar(checkoutDecision.find('.loading-bar'));
    };

    var decisionLogin = function () {
        var loginModalForm = checkoutDecision.find('#DecisionLoginModalForm');
        var loginModalCallback = function () {
            popUpOverlayContent.off('.decision-login');

            $.validator.unobtrusive.parse('#CheckoutDecisionLoginForm');

            popUpOverlayContent.on('submit.decision-login', '#CheckoutDecisionLoginForm', function () {
                var loginForm = $(this);

                disableSubmit(loginForm);

                $.ajax({
                    url: loginForm.attr('action'),
                    type: loginForm.attr('method'),
                    data: loginForm.serialize(),
                    success: function (data) {
                        // If success, we have a URL to redirect to.
                        window.location = data;
                    },
                    error: function (xhr) {
                        // Errors return the model contents again, but with errors visible. Using
                        // LoadPopUpModal will run the callback again, which will re-attach validation
                        // and event handlers automatically. --AEM
                        LoadPopUpModal(xhr.responseText, loginModalCallback, false, false);
                    }
                });

                return false;
            });
        };

        $.ajax({
            url: loginModalForm.attr('action'),
            type: loginModalForm.attr('method'),
            data: loginModalForm.serialize(),
            success: function (data) {
                LoadPopUpModal(data, loginModalCallback, false, false);
            },
            error: function () {
                alert('Unable to load login form.');
            },
            complete: function () {
                enableDecisionButtons();
            }
        });
    };

    var decisionRegister = function () {
        var registerModalForm = checkoutDecision.find('#DecisionRegisterModalForm');
        var registerModalCallback = function () {
            popUpOverlayContent.off('.decision-register');

            popUpOverlayContent.on('submit.decision-register', '#CheckoutDecisionRegisterForm', function () {
                var registerForm = $(this);

                disableSubmit(registerForm);

                $.ajax({
                    url: registerForm.attr('action'),
                    type: registerForm.attr('method'),
                    data: registerForm.serialize(),
                    success: function (data) {
                        // If success, we have a URL to redirect to.
                        window.location = data;
                    },
                    error: function (xhr) {
                        // Errors return the model contents again, but with errors visible. Using
                        // LoadPopUpModal will run the callback again, which will re-attach validation
                        // and event handlers automatically. --AEM
                        LoadPopUpModal(xhr.responseText, registerModalCallback, false, false);
                    }
                });

                return false;
            });

            var recaptcha = popUpOverlayContent.find('.g-recaptcha');

            if (recaptcha.length && typeof (window.grecaptcha) !== 'undefined') {
                // ReSharper disable once IdentifierTypo
                window.grecaptcha.render(recaptcha.attr('id'), { 'sitekey': recaptcha.data('site-key') });
            }
        };

        $.ajax({
            url: registerModalForm.attr('action'),
            type: registerModalForm.attr('method'),
            data: registerModalForm.serialize(),
            success: function (data) {
                LoadPopUpModal(data, registerModalCallback, false, false);
            },
            error: function () {
                alert('Unable to load register form.');
            },
            complete: function () {
                enableDecisionButtons();
            }
        });
    };

    checkoutDecision.on('click', '.checkout-decision-button', function () {
        var button = $(this);
        var decision = button.data('decision');

        disableDecisionButtons();

        switch (decision) {
            case 'login':
                decisionLogin();
                break;

            case 'register':
                decisionRegister();
                break;

            case 'guest':
                window.location = button.data('decison-url');
                break;
        }

        return false;
    });
    //#endregion

    //#region Checkout Contact Info
    checkoutContactInfo.on('change', '#CountryCode', function () {
        var dropdown = $(this);

        if (dropdown.is(':hidden'))
            return;

        var value = dropdown.val();

        if (value !== 'US' && value !== 'CA')
            value = 'address';

        var hiddenDropdown = checkoutContactInfo.find('[data-country][data-country!="' + value + '"]');

        resetValidation(hiddenDropdown, value);

        checkoutContactInfo
            .find('[data-country="' + value + '"]')
            .removeClass('hidden');

        fixInputs(checkoutContactInfo);
    });

    checkoutContactInfo.on('change', '#CreateAccount', function () {
        var value = $(this).prop('checked');

        checkoutContactInfo
            .find('.checkout-fieldset.create-account')
            .toggleClass('hidden', !value);

        fixInputs(checkoutContactInfo);
    });

    checkoutContactInfo.on('change', '#AddressKey', function () {
        var dropdown = $(this);
        var value = parseInt(dropdown.val());
        var addresses = dropdown.data('addresses');
        var address = addresses.filter(function (a) { return a.AddressKey === value; })[0];

        if (!address)
            address = { CountryCode: 'US' };

        checkoutContactInfo.find('#AddressTypeKey').val(address.AddressTypeKey);
        checkoutContactInfo.find('#BusinessName').val(address.BusinessName);
        checkoutContactInfo.find('#Address').val(address.Address1);
        checkoutContactInfo.find('#Address2').val(address.Address2);
        checkoutContactInfo.find('#City').val(address.City);
        checkoutContactInfo.find('#StateUS').val(address.StateId);
        checkoutContactInfo.find('#StateCA').val(address.StateId);
        checkoutContactInfo.find('#Zip').val(address.Zip);
        checkoutContactInfo.find('#CountryCode').val(address.CountryCode);
        checkoutContactInfo.find('#County').val(address.County);
        checkoutContactInfo.find('#IsVerified').val(address.IsVerified);

        checkoutContactInfo.find('#CountryCode').trigger('change');

        checkoutContactInfo.find('.edit-address-button').toggle(value > 0);

        window.rebindAddressTypeChanges();
        window.saveAddressVerifyState();

        updateAddressEditable(checkoutContactInfo);
    });

    checkoutContactInfo.on('change', '#PhoneKey', function () {
        var dropdown = $(this);
        var value = parseInt(dropdown.val());
        var phones = dropdown.data('phones');
        var phone = phones.filter(function (p) { return p.PhoneId === value; })[0];

        if (!phone)
            phone = {};

        checkoutContactInfo.find('#PhoneTypeKey').val(phone.PhoneTypeId);
        checkoutContactInfo.find('#Phone').val(phone.PhoneNumber).trigger('change');
        checkoutContactInfo.find('.edit-phone-button').toggle(value > 0);

        updatePhoneEditable(checkoutContactInfo);
    });

    checkoutContactInfo.on('click', '.edit-address-button', function () {
        updateAddressEditable(checkoutContactInfo, true);
    });

    checkoutContactInfo.on('click', '.edit-phone-button', function () {
        updatePhoneEditable(checkoutContactInfo, true);
    });

    checkoutContactInfo.on('submit', '#CheckoutContactForm', function () {
        var form = $(this);

        fixInputs(form);
    });

    checkoutContactInfo.find('#CountryCode').trigger('change');
    checkoutContactInfo.find('#AddressKey').trigger('change');
    checkoutContactInfo.find('#PhoneKey').trigger('change');
    checkoutContactInfo.find('#CreateAccount').trigger('change');
    //#endregion

    //#region Checkout Billing Info
    var getErrorMessageFromAnetCode = function (code, anetErrorMessage) {
        switch (code) {
            case 'E_WC_05':
            case 'E_WC_20':
                return 'The Credit Card Number is not valid.';

            case 'E_WC_06':
            case 'E_WC_07':
            case 'E_WC_08':
                return 'The Expiration Date is not valid.';

            case 'E_WC_15':
                return 'The Security Code is not valid.';

            // If we don't have a custom message, display the one from Authorize.net
            default:
                return anetErrorMessage;
        }
    };

    var sendPaymentToAnet = function (form) {
        var errorWrapper = form.find('.checkout-validation-errors-wrapper');
        var errors = errorWrapper.find('.checkout-validation-errors');

        errors.find('.anet-error').remove();
        errorWrapper.addClass('hidden');
        form.find('[data-anet-error]').removeClass('has-error');

        var expDate = form.find("#CreditCardExpiration").val().split('/');

        var anetData = {
            authData: {
                clientKey: form.data('anet-client-key'),
                apiLoginID: form.data('anet-login-id')
            },
            cardData: {
                cardNumber: form.find("#CreditCardNumber").val(),
                month: expDate.length ? expDate[0] : '',
                year: expDate.length > 1 ? expDate[1] : '',
                cardCode: form.find("#CreditCardSecurityCode").val()
            }
        };

        window.Accept.dispatchData(anetData, function (response) {
            // Apparently the security code isn't required by Authorize.net.
            // We want to make sure it's provided, so we'll fake the error
            // here and let the code below display it. --AEM
            if (!anetData.cardData.cardCode.length) {
                response.messages.resultCode = 'Error';
                response.messages.message.push({ code: 'E_WC_15' });
            }

            if (response.messages.resultCode === "Error") {
                for (var i = 0; i < response.messages.message.length; i++) {
                    var code = response.messages.message[i].code;
                    var errorMessage = getErrorMessageFromAnetCode(code, response.messages.message[i].text);

                    if (errors.text().indexOf(errorMessage) !== -1)
                        continue;

                    var errorElement = $('<span class="anet-error"></span>').text(errorMessage);

                    errors.append(errorElement);
                    form.find('[data-anet-error~="' + code + '"]').addClass('has-error');
                }

                enableSubmit(form);
                ToggleLoadingBar(form.find('.loading-bar'));
                errorWrapper.removeClass('hidden');
            }
            else {
                form.find('#OpaqueDataDescriptor').val(response.opaqueData.dataDescriptor);
                form.find('#OpaqueDataValue').val(response.opaqueData.dataValue);

                // We don't want to risk these being submitted anywhere now that we have the opaque data.
                form.find('#CreditCardNumber').val('');
                form.find('#CreditCardExpiration').val('');
                form.find('#CreditCardSecurityCode').val('');

                checkoutBillingInfo.find('#CheckoutBillingForm').trigger('submit');
            }
        });
    };

    var showHideAltPaymentError = function (form, message) {
        var errorWrapper = form.find('.checkout-validation-errors-wrapper');
        var errors = errorWrapper.find('.checkout-validation-errors');

        errors.find('.alt-pay-error').remove();
        errorWrapper.addClass('hidden');

        if (message && message.length) {
            var errorElement = $('<span class="alt-pay-error"></span>').text(message);

            errors.append(errorElement);
            errorWrapper.removeClass('hidden');
        }
    };

    var setUpApplePay = function (wrapper) {
        var applePayOption = wrapper.find('#PaymentMethodAP');

        if (!applePayOption.length)
            return; // Apple Pay is disabled

        // Latest version at time of implementation. Requires iOS 12.2+ and macOS 10.14.4+
        var applePayVersion = 6;

        // Apple Pay is exposed by the browser via the ApplePaySession object on the window.
        // If it's not there, it's not supported. We also check if the user can make payments
        // and if the version the browser supports is the version we need.
        if (!window.ApplePaySession || !window.ApplePaySession.canMakePayments() || !window.ApplePaySession.supportsVersion(applePayVersion))
            return; // Apple Pay is not supported

        // Show the option
        applePayOption.closest('.form-group').removeClass('hidden');

        wrapper.on('click', '.checkout-apple-pay-button', function () {
            var button = $(this);
            var form = button.closest('#CheckoutBillingForm');
            var request = {
                countryCode: 'US',
                currencyCode: 'USD',
                supportedNetworks: ['visa', 'masterCard', 'amex', 'discover'],
                merchantCapabilities: ['supports3DS', 'supportsCredit', 'supportsDebit'], // Make sure NOT to include supportsEMV here
                total: {
                    label: 'Total',
                    amount: form.data('total')
                }
            };

            // Create the session with our request data
            var session = new window.ApplePaySession(applePayVersion, request);

            // This fires immediately. Our own site should be called with the URL provided by the Payment API.
            session.onvalidatemerchant = function (event) {
                var validationForm = wrapper.find('#ApplePayMerchantValidationForm');

                validationForm.find('[name="ValidationUrl"]').val(event.validationURL);

                $.ajax({
                    url: validationForm.attr('action'),
                    type: validationForm.attr('method'),
                    data: validationForm.serialize(),
                    success: function (data) {
                        if (data)
                            session.completeMerchantValidation(data);
                        else {
                            showHideAltPaymentError(form, 'Unable to validate Apple Pay merchant.');
                            button.show();
                            ToggleLoadingBar(form.find('.loading-bar'));
                            session.abort();
                        }
                    },
                    error: function () {
                        showHideAltPaymentError(form, 'Unable to validate Apple Pay merchant.');
                        button.show();
                        ToggleLoadingBar(form.find('.loading-bar'));
                        session.abort();
                    }
                });
            };

            // This fires when the payment is complete. We need to create our transaction now using the data provided.
            session.onpaymentauthorized = function (event) {
                // Generate our token by converting the payment object to json then to base64.
                // This token is what Authorize.net needs to process the transaction.
                var paymentDataJson = JSON.stringify(event.payment.token.paymentData);
                var token = window.btoa(paymentDataJson);

                form.find('[name="OpaqueDataValue"]').val(token);

                $.ajax({
                    url: form.attr('action'),
                    type: form.attr('method'),
                    data: form.serialize(),
                    success: function (data) {
                        if (data.error) {
                            showHideAltPaymentError(form, 'Apple Pay Error: ' + data.error);
                            button.show();
                            ToggleLoadingBar(form.find('.loading-bar'));
                            session.completePayment({ status: window.ApplePaySession.STATUS_FAILURE });
                        }
                        else {
                            // Close the payment sheet and redirect to the receipt page.
                            // Note that we don't re-show the button here. Leave it hidden so they don't try to pay again.
                            session.completePayment({ status: window.ApplePaySession.STATUS_SUCCESS });
                            window.location = data.url;
                        }
                    }
                });
            };

            session.oncancel = function () {
                button.show();
                ToggleLoadingBar(form.find('.loading-bar'));
            };

            // Hide the button and open the payment sheet to begin the merchant validation process
            button.hide();
            ToggleLoadingBar(form.find('.loading-bar'));
            session.begin();

            return false;
        });
    };

    var setUpGooglePay = function (wrapper) {
        var googlePayOption = wrapper.find('#PaymentMethodGP');

        if (!googlePayOption.length)
            return; // Google Pay is disabled

        // This is called from the JS library when it is loaded.
        window.ongooglepayloaded = function () {
            var environment = googlePayOption.data('environment');
            var paymentsClient = new google.payments.api.PaymentsClient({ environment: environment });

            // This is the base request. We will extend it later with more details, but this is all
            // we need to verify that the user can make a payment.
            var payRequest = {
                apiVersion: 2,
                apiVersionMinor: 0,
                allowedPaymentMethods: [{
                    type: 'CARD',
                    parameters: {
                        allowedAuthMethods: ["PAN_ONLY", "CRYPTOGRAM_3DS"],
                        allowedCardNetworks: ["AMEX", "DISCOVER", "MASTERCARD", "VISA"]
                    }
                }]
            };

            var canMakePaymentCallback = function (response) {
                if (!response.result)
                    return;

                var onGooglePayButtonClick = function () {
                    var button = $(this);
                    var form = button.closest('form');

                    button.hide();
                    ToggleLoadingBar(form.find('.loading-bar'));

                    // Extend the base pay request with more details for the actual payment
                    payRequest.transactionInfo = {
                        totalPriceStatus: 'FINAL',
                        totalPrice: wrapper.find('#CheckoutBillingForm').data('total').toString(),
                        currencyCode: 'USD',
                        countryCode: 'US'
                    };

                    // Then add in our merchant info and gateway info
                    payRequest.merchantInfo = {
                        merchantName: googlePayOption.data('merchant-name'),
                        merchantId: googlePayOption.data('merchant-id')
                    };

                    payRequest.allowedPaymentMethods[0].tokenizationSpecification = {
                        type: 'PAYMENT_GATEWAY',
                        parameters: {
                            gateway: googlePayOption.data('gateway-name'),
                            gatewayMerchantId: googlePayOption.data('gateway-id').toString()
                        }
                    };

                    // This triggers the payment sheet/window
                    paymentsClient.loadPaymentData(payRequest)
                        .then(function (paymentData) {
                            // Generate our token by converting the payment token to base64.
                            // This token is what Authorize.net needs to process the transaction.
                            var token = window.btoa(paymentData.paymentMethodData.tokenizationData.token);

                            form.find('[name="OpaqueDataValue"]').val(token);

                            $.ajax({
                                url: form.attr('action'),
                                type: form.attr('method'),
                                data: form.serialize(),
                                success: function (data) {
                                    if (data.error) {
                                        showHideAltPaymentError(form, 'Google Pay Error: ' + data.error);
                                        button.show();
                                        ToggleLoadingBar(form.find('.loading-bar'));
                                    }
                                    else
                                        window.location = data.url;
                                }
                            });
                        }).catch(function (err) {
                            if (err.statusCode !== 'CANCELED')
                                showHideAltPaymentError(form, 'Google Pay Error: ' + err.statusMessage);

                            button.show();
                            ToggleLoadingBar(form.find('.loading-bar'));
                        });
                };

                // Create and add the pay button to the page
                wrapper.find('.checkout-google-pay-button-wrapper').append(paymentsClient.createButton({
                    onClick: onGooglePayButtonClick,
                    buttonColor: 'black',
                    buttonType: 'short'
                }));

                // Show the Google Pay option
                googlePayOption.closest('.form-group').removeClass('hidden');
            };

            // Check if we can pay. If so, create the pay button and its callback.
            paymentsClient.isReadyToPay(payRequest)
                .then(canMakePaymentCallback)
                .catch(function () {
                    // User cannot make payments through Google Pay, do nothing
                });
        };
    };

    checkoutBillingInfo.on('change', '[name="PaymentMethod"]', function () {
        var method = ($(this).val() || 'creditcard').toLowerCase();

        checkoutBillingInfo.find('[data-payment-method]').hide();
        checkoutBillingInfo.find('[data-payment-method="' + method + '"]').show();

        fixInputs(checkoutBillingInfo);
    });

    checkoutBillingInfo.on('keyup', '#CreditCardNumber', function () {
        // This does not validate the credit card number! It only updates the logos. --AEM

        var value = $(this).val();
        var logos = $('.checkout-us-dollar-message');

        // Taken from http://stackoverflow.com/a/72801/491538 and https://stackoverflow.com/a/21617574
        var visa = /^4[0-9]{6,}$/;
        var amex = /^3[47][0-9]{5,}$/;
        var discover = /^6(?:011|5[0-9]{2})[0-9]{3,}$/;
        var masterCard = /^(5[1-5]|222[1-9]|22[3-9]|2[3-6]|27[01]|2720)[0-9]{0,}$/;

        logos.removeClass('is-visa is-mastercard is-amex is-discover');

        if (visa.test(value))
            logos.addClass('is-visa');
        else if (amex.test(value))
            logos.addClass('is-amex');
        else if (discover.test(value))
            logos.addClass('is-discover');
        else if (masterCard.test(value))
            logos.addClass('is-mastercard');
    });

    checkoutBillingInfo.on('change', '#IsCorporateGift', function () {
        var value = $(this).prop('checked');

        checkoutBillingInfo
            .find('.company-info')
            .toggleClass('hidden', !value);

        fixInputs(checkoutBillingInfo);
    });

    checkoutBillingInfo.on('change', '#UseSeparateBillingAddress', function () {
        var value = $(this).prop('checked');

        checkoutBillingInfo
            .find('.different-billing-info')
            .toggleClass('hidden', !value);

        checkoutBillingInfo.find('#AddressKey').trigger('change');
        checkoutBillingInfo.find('#CountryCode').trigger('change');

        checkoutBillingInfo.find('#CheckoutBillingForm').data('address-verify', value ? '' : 'skip');

        window.rebindAddressTypeChanges();
    });

    checkoutBillingInfo.on('change', '#CountryCode', function () {
        var dropdown = $(this);

        if (dropdown.is(':hidden'))
            return;

        var value = dropdown.val();

        if (value !== 'US' && value !== 'CA')
            value = 'address';

        var hiddenDropdown = checkoutBillingInfo.find('[data-country][data-country!="' + value + '"]');

        hiddenDropdown.addClass('hidden');
        resetValidation(hiddenDropdown, value);

        checkoutBillingInfo
            .find('[data-country="' + value + '"]')
            .removeClass('hidden');

        fixInputs(checkoutBillingInfo);
    });

    checkoutBillingInfo.on('change', '#AddressKey', function () {
        var dropdown = $(this);
        var value = parseInt(dropdown.val());
        var addresses = dropdown.data('addresses');
        var address = addresses.filter(function (a) { return a.AddressKey === value; })[0];

        if (!address)
            address = { CountryCode: 'US' };

        checkoutBillingInfo.find('#AddressTypeKey').val(address.AddressTypeKey);
        checkoutBillingInfo.find('#BusinessName').val(address.BusinessName);
        checkoutBillingInfo.find('#Address1').val(address.Address1);
        checkoutBillingInfo.find('#Address2').val(address.Address2);
        checkoutBillingInfo.find('#City').val(address.City);
        checkoutBillingInfo.find('#StateUS').val(address.StateId);
        checkoutBillingInfo.find('#StateCA').val(address.StateId);
        checkoutBillingInfo.find('#Zip').val(address.Zip);
        checkoutBillingInfo.find('#CountryCode').val(address.CountryCode);
        checkoutBillingInfo.find('#County').val(address.County);
        checkoutBillingInfo.find('#IsVerified').val(address.IsVerified);

        checkoutBillingInfo.find('#CountryCode').trigger('change');

        checkoutBillingInfo.find('.edit-address-button').toggle(value > 0);

        window.saveAddressVerifyState();
        window.rebindAddressTypeChanges();

        updateAddressEditable(checkoutBillingInfo);
    });

    checkoutBillingInfo.on('click', '.edit-address-button', function () {
        updateAddressEditable(checkoutBillingInfo, true);
    });

    checkoutBillingInfo.on('change', '#CreditCardExpiration', function () {
        var expDate = $(this);
        var value = expDate.val() || '';
        var cleanValue = value.replace(/[^\d]/ig, '');

        if (cleanValue.length > 2) {
            // 3 digits is probably MYY
            if (cleanValue.length === 3)
                cleanValue = '0' + cleanValue;

            // ReSharper disable once CommentTypo
            // 6 digits is probably MMYYYY
            if (cleanValue.length === 6)
                cleanValue = cleanValue.substr(0, 2) + cleanValue.substr(4, 2);

            expDate.val(cleanValue.substr(0, 2) + '/' + cleanValue.substr(2, 2));
        }
    });

    checkoutBillingInfo.on('submit', '#CheckoutBillingForm', function () {
        var form = $(this);

        fixInputs(form);

        disableSubmitWithLoadBar(form, true, form.find('.loading-bar'));

        var paymentMethod = form.find('[name="PaymentMethod"]:checked, [name="PaymentMethod"][type="hidden"]').val() || 'creditcard';

        if (paymentMethod.toLowerCase() === 'creditcard' && !form.find('#OpaqueDataDescriptor').val().length) {
            sendPaymentToAnet(form);

            return false;
        }

        // Let the form submit as normal since we have the data needed
        // ReSharper disable once NotAllPathsReturnValue
    });

    checkoutBillingInfo.find('[name="PaymentMethod"]:checked, [name="PaymentMethod"][type="hidden"]').trigger('change');
    checkoutBillingInfo.find('#IsCorporateGift').trigger('change');
    checkoutBillingInfo.find('#UseSeparateBillingAddress').trigger('change');
    checkoutBillingInfo.find('#CountryCode').trigger('change');
    setUpApplePay(checkoutBillingInfo);
    setUpGooglePay(checkoutBillingInfo);
    //#endregion

    //#region Checkout Confirmation
    checkoutConfirmation.on('click', '.confirm-action-buttons-print', function () {
        window.print();
    });

    if (typeof window.print !== 'function')
        checkoutConfirmation.find('.confirm-action-buttons-print').remove();

    var tryTrackTransaction = function () {
        var transactionData = checkoutConfirmation.data('gtm-ecommerce-tracking');

        if (!transactionData)
            return;

        // We store previously tracked transaction IDs in local storage. If we see an ID we
        // know we have already tracked, then we don't track it again. --AEM
        var prevTrackedIds = JSON.parse(localStorage.getItem('tcf-gtm-transaction-ids') || '[]');

        if (prevTrackedIds.indexOf(transactionData.transactionId) !== -1)
            return;

        // Before tracking, push the ID into the list of previously tracked IDs and save it
        // back to local storage so we don't track it again.
        prevTrackedIds.push(transactionData.transactionId);
        localStorage.setItem('tcf-gtm-transaction-ids', JSON.stringify(prevTrackedIds));

        window.dataLayer = window.dataLayer || [];
        window.dataLayer.push(transactionData);
    };

    tryTrackTransaction();
    //#endregion

    //#region Cart Count
    $.ajax({
        url: '/umbraco/surface/checkoutcartsurface/count',
        type: 'GET',
        cache: false, // This appends "_={timestamp}" to the URL to sidestep browser caching. --AEM
        success: function (data) {
            data = parseInt(data);

            if (!data)
                return;

            $('.header-cart-icon').attr('data-count', data);
            $('.mobile-header-cart-icon').attr('data-count', data);
        }
    });
    //#endregion
})();
;
//Uses EZSlider.js

//Define how many slides to move on a button click
var internalSlidesToMoveOnButtonClick = 1;

//Define all sliders with the name of their container list, the width of one slide, the index of the active slide in the list
var internalImageList = $('.carousel-image-list');
var internalImageListWidthOfSlideAsPercent = 78;
var indexOfInternalImageListActiveSlide = 2;

var internalTextList = $('.carousel-text-list');
var internalTextListWidthOfSlideAsPercent = 100;
var indexOfInternalTextListActiveSlide = 1;

var internalMobileList = $('.carousel-mobile-image-list');
var internalMobileListWidthOfSlideAsPercent = 100;
var indexOfInternalMobileListActiveSlide = 1;

if ($('#StoriesOfImpact').length)
    indexOfInternalMobileListActiveSlide = 1;


//Define the list display offset (offset being a portion of the previous and next slide are visible) as a percentage
var internalImageListOffset = 11;
var internalTextListOffset = 0;
var internalMobileListOffset = 0;

//Define the list containing the carousel indicators
var internalIndicatorList = $('.carousel-indicator-list');
var topSliderIndicatorList = null;
SetIndicatorListListener(internalIndicatorList, internalMobileList, indexOfInternalMobileListActiveSlide, false);

//Attach slider actions for all sliders when the carousel indicators trigger a leftward slide in EZSlider, OnMoveIndicatorLeft()

//Attach slider actions for all sliders when the carousel indicators trigger a rightward slide in EZSlider, OnMoveIndicatorRight()

//Attach event handlers to all slider buttons
$(document).ready(function ($) {
    $('.carousel-nav-button.left, .mobile-carousel-button.left').on('click', function () {
        MoveCarouselRight(internalSlidesToMoveOnButtonClick, internalImageList, internalImageListWidthOfSlideAsPercent, indexOfInternalImageListActiveSlide, false, internalIndicatorList, internalImageListOffset);
        MoveCarouselRight(internalSlidesToMoveOnButtonClick, internalTextList, internalTextListWidthOfSlideAsPercent, indexOfInternalTextListActiveSlide, false, internalIndicatorList, internalTextListOffset);
        MoveCarouselRight(internalSlidesToMoveOnButtonClick, internalMobileList, internalMobileListWidthOfSlideAsPercent, indexOfInternalMobileListActiveSlide, true, internalIndicatorList, internalMobileListOffset);
    });

    $('.carousel-nav-button.right, .mobile-carousel-button.right').on('click', function () {
        MoveCarouselLeft(internalSlidesToMoveOnButtonClick, internalImageList, internalImageListWidthOfSlideAsPercent, indexOfInternalImageListActiveSlide, false, internalIndicatorList, internalImageListOffset);
        MoveCarouselLeft(internalSlidesToMoveOnButtonClick, internalTextList, internalTextListWidthOfSlideAsPercent, indexOfInternalTextListActiveSlide, false, internalIndicatorList, internalTextListOffset);
        MoveCarouselLeft(internalSlidesToMoveOnButtonClick, internalMobileList, internalMobileListWidthOfSlideAsPercent, indexOfInternalMobileListActiveSlide, true, internalIndicatorList, internalMobileListOffset);
    });

    // ReSharper disable once StringLiteralTypo
    $('.carousel-image-list, .carousel-text-list, .carousel-mobile-image-list').on('swipeleft', function () {
        MoveCarouselLeft(internalSlidesToMoveOnButtonClick, internalImageList, internalImageListWidthOfSlideAsPercent, indexOfInternalImageListActiveSlide, false, internalIndicatorList, internalImageListOffset);
        MoveCarouselLeft(internalSlidesToMoveOnButtonClick, internalTextList, internalTextListWidthOfSlideAsPercent, indexOfInternalTextListActiveSlide, false, internalIndicatorList, internalTextListOffset);
        MoveCarouselLeft(internalSlidesToMoveOnButtonClick, internalMobileList, internalMobileListWidthOfSlideAsPercent, indexOfInternalMobileListActiveSlide, true, internalIndicatorList, internalMobileListOffset);
    });

    // ReSharper disable once StringLiteralTypo
    $('.carousel-image-list, .carousel-text-list, .carousel-mobile-image-list').on('swiperight', function () {
        MoveCarouselRight(internalSlidesToMoveOnButtonClick, internalImageList, internalImageListWidthOfSlideAsPercent, indexOfInternalImageListActiveSlide, false, internalIndicatorList, internalImageListOffset);
        MoveCarouselRight(internalSlidesToMoveOnButtonClick, internalTextList, internalTextListWidthOfSlideAsPercent, indexOfInternalTextListActiveSlide, false, internalIndicatorList, internalTextListOffset);
        MoveCarouselRight(internalSlidesToMoveOnButtonClick, internalMobileList, internalMobileListWidthOfSlideAsPercent, indexOfInternalMobileListActiveSlide, true, internalIndicatorList, internalMobileListOffset);
    });

    //Stories of Impact Header Slider
    $('.slider-nav-button.right').on('click', function () {
        MoveCarouselLeft(internalSlidesToMoveOnButtonClick, internalMobileList, internalMobileListWidthOfSlideAsPercent, indexOfInternalMobileListActiveSlide, false, topSliderIndicatorList, internalMobileListOffset);
    });

    $('.slider-nav-button.left').on('click', function () {
        MoveCarouselRight(internalSlidesToMoveOnButtonClick, internalMobileList, internalMobileListWidthOfSlideAsPercent, indexOfInternalMobileListActiveSlide, false, topSliderIndicatorList, internalMobileListOffset);
    });

    // ReSharper disable StringLiteralTypo
    $('.top-header-slider-wrapper.swipeable').on('swipeleft', function () {
        MoveCarouselLeft(internalSlidesToMoveOnButtonClick, internalMobileList, internalMobileListWidthOfSlideAsPercent, indexOfInternalMobileListActiveSlide, false, topSliderIndicatorList, internalMobileListOffset);
    });

    $('.top-header-slider-wrapper.swipeable').on('swiperight', function () {
        MoveCarouselRight(internalSlidesToMoveOnButtonClick, internalMobileList, internalMobileListWidthOfSlideAsPercent, indexOfInternalMobileListActiveSlide, false, topSliderIndicatorList, internalMobileListOffset);
    });
    // ReSharper restore StringLiteralTypo
});
;

(function (window, $) {

    $('.publication-view-button').on('click', function () {
        $('#PublicationGroups').toggleClass('icon-view list-view');
        $('.list-view .publication-buttons-wrapper').show();
        $('.icon-view .publication-buttons-wrapper').hide();
        $('.list-view .publication-group-scroll-left-button').hide();
        $('.list-view .publication-group-scroll-right-button').hide();
        $('.icon-view .publication-group-scroll-left-button').show();
        $('.icon-view .publication-group-scroll-right-button').show();
    });

    $('.publication-image').on('mouseenter', function () {
        if (!$('.icon-view').length)
            return;

        var thisParent = $(this).parent();
        $('.publication-image-modal', this).fadeIn(150);
        $('.publication-buttons-wrapper', thisParent).fadeIn(150);
    });

    $('.publication-inner-wrapper').on('mouseleave', function () {
        var breakpoint = jRes.getBreakpoint();

        if (!$('.icon-view').length || breakpoint === 'xs' || breakpoint === 'sm')
            return;

        $('.publication-image-modal', this).fadeOut(150);
        $('.publication-buttons-wrapper', this).fadeOut(150);
    });

    $('.publication-group-scroll-left-button').on('click', function () {
        var button = $(this);
        var thisPublicationGroup = button.parent();
        var thisGroupWrapper = thisPublicationGroup.find('.publication-group-wrapper');
        var leftPosition = parseInt((thisGroupWrapper.get(0).style.left || '0').replace('px', '').replace('%', ''));
        var destinationPosition = Math.min((leftPosition + 100), 0);

        thisGroupWrapper.css('left', destinationPosition + '%');

        $('.publication-group-scroll-right-button', thisPublicationGroup).removeClass('hidden').show();

        if (destinationPosition === 0)
            button.addClass('hidden');
    });

    $('.publication-group-scroll-right-button').on('click', function () {
        var button = $(this);
        var thisPublicationGroup = button.parent();
        var thisGroupWrapper = thisPublicationGroup.find('.publication-group-wrapper');
        var leftPosition = parseInt((thisGroupWrapper.get(0).style.left || '0').replace('px', '').replace('%', ''));
        var numberOfPublicationsToScroll = button.data('scroll-count') || 4;
        var publicationsInGroup = button.data('count');
        var maxPosition = -(100 / numberOfPublicationsToScroll) * (publicationsInGroup - numberOfPublicationsToScroll);
        var destinationPosition = Math.max((leftPosition - 100), maxPosition);

        thisGroupWrapper.css('left', destinationPosition + '%');

        $('.publication-group-scroll-left-button', thisPublicationGroup).removeClass('hidden').show();

        if (destinationPosition === maxPosition)
            button.addClass('hidden');
    });

    if ($(window).width() > 1024)
        $('.publication-button').tooltip();

    $('.publication-button.share-button').on('click', function () {
        //Get the data attribute from the element $(this) by using .data(..) 
        LoadModal($('.resource-sharing-partial').html(), true);

        //Update The Email Link to Share the Data attribute value
        $('.email-button-link').prop('href', 'mailto:?body=' + $(this).closest('a').data('email-link'));
        return false;
    });

    $('body').on('click', '.email-button-link', function () {
        HideModal();
    });

    var resetPublicationGroupSliders = function () {
        $('.publication-group-wrapper').css('left', 0);

        $('.publication-group-scroll-left-button').addClass('hidden');
        $('.publication-group-scroll-right-button').removeClass('hidden');
    };

    jRes.addFunc({
        breakpoint: 'sm',
        enter: resetPublicationGroupSliders
    });

})(window, jQuery);
;

(function () {
    var wrapper = $('.press-release-partial-wrapper');

    wrapper.on('click', '.press-release-category', function () {
        var category = $(this);

        if (category.hasClass('active'))
            return;

        category
            .siblings()
            .removeClass('active')
            .end()
            .addClass('active');

        window.updateQueryString('category', category.data('category'));

        $.ajax({
            url: "/umbraco/surface/pressreleasessurface/applynewfilter",
            data: {
                pressReleaseCategory: category.data('category')
            },
            success: function (data) {
                wrapper.empty().append(data);
            }
        });
    });

    wrapper.on('click', '.press-releases-load-more-button', function () {
        $.ajax({
            url: "/umbraco/surface/pressreleasessurface/loadmoreresults",
            success: function (data) {
                wrapper.empty().append(data);
            }
        });
    });
})();
;
/* Staff Page */

$('.detailed-employee-employee-container .details-button').on('click', function (e) {
    e.preventDefault();

    //determine number of employeesPerRow
    var button = $(this);
    var row = button.closest('.row');
    var thisEmployee = button.closest('.detailed-employee-employee-container');
    var employees = row.children('.detailed-employee-employee-container');
    var breakpoint = jRes.getBreakpoint();
    var employeesPerRow = breakpoint === 'lg' || breakpoint === 'md'
        ? 4
        : breakpoint === 'sm'
            ? 2
            : 1;

    //determine where to append employee details
    var index = employees.index(thisEmployee);
    var rowNumber = Math.floor(index / employeesPerRow);
    var rowFirstEmployeeIndex = rowNumber * employeesPerRow;
    var rowLastEmployeeIndex = (rowNumber + 1) * employeesPerRow;

    if (rowLastEmployeeIndex > employees.length)
        rowLastEmployeeIndex = employees.length;

    rowLastEmployeeIndex--;

    var employeesInRow = employees.slice(rowFirstEmployeeIndex, rowLastEmployeeIndex + 1);
    var rowLastEmployee = employees.eq(rowLastEmployeeIndex);

    //remove container after the last employee in the row, if it's a details block
    rowLastEmployee
        .next()
        .has('.detailed-employee-details')
        .stop()
        .slideUp(function () { $(this).remove(); });

    if (button.hasClass('details-button-active')) {
        button.removeClass('details-button-active');
        thisEmployee.find('.arrow-down').stop().slideUp();
    }
    else {
        employeesInRow.find('.details-button').removeClass('details-button-active');
        button.addClass('details-button-active');
        employeesInRow.find('.arrow-down').stop().slideUp();
        thisEmployee.find('.arrow-down').stop().slideDown();

        var education = thisEmployee.data('employee-education');
        var biography = thisEmployee.data('employee-bio');
        var bioUrl = thisEmployee.data('employee-bio-url');

        var col = $('<div></div>').addClass('col-xs-12').hide();
        var details = $('<div></div>').addClass('detailed-employee-details');

        if (!isNullOrWhitespace(education)) {
            var educationTitleDiv = $('<div></div>').addClass('detailed-employee-details-title');
            var educationTextDiv = $('<div></div>').addClass('detailed-employee-details-text');

            educationTitleDiv.append('Education');
            educationTextDiv.append(education);
            details.append(educationTitleDiv);
            details.append(educationTextDiv);
        }

        if (!isNullOrWhitespace(biography)) {
            var biographyTitleDiv = $('<div></div>').addClass('detailed-employee-details-title');
            var biographyTextDiv = $('<div></div>').addClass('detailed-employee-details-text');

            biographyTitleDiv.append('Biography');
            biographyTextDiv.append(biography);
            details.append(biographyTitleDiv);
            details.append(biographyTextDiv);
        }

        if (!isNullOrWhitespace(bioUrl)) {
            var bioIconDiv = $('<div></div>').addClass('detailed-employee-bio-icon');
            var bioLinkDiv = $('<div></div>').addClass('detailed-employee-bio-link bordered-underline no-color-change');
            var bioLink = $('<a></a>').attr('href', bioUrl);

            bioLinkDiv.append('Download Full Bio');
            bioLink.append(bioIconDiv, bioLinkDiv);
            details.append(bioLink);
        }

        var exitLink = $('<a></a>').attr('href', '#').addClass('detailed-employee-exit-link');
        var exitButtonDiv = $('<div></div>').addClass('detailed-employee-exit-icon');

        exitButtonDiv.on('click', function (evt) {
            evt.preventDefault();

            employeesInRow.find('.details-button-active').removeClass('details-button-active');
            employeesInRow.find('.arrow-down').stop().slideUp();

            $(this).closest('.detailed-employee-details').parent().stop().slideUp(function () { $(this).remove(); });
        });

        exitLink.append(exitButtonDiv);
        details.append(exitLink);
        col.append(details);

        //add the details block after the last employee in the row
        //details button won't be there if all details are empty, so we don't need to worry about an empty details block
        rowLastEmployee.after(col);
        col.stop().slideDown();
    }
});

$('.employeeInfo .details-button').on('click', function () {
    var button = $(this);
    var employee = button.closest('.employeeInfo');
    var row = employee.parent();

    // Find and remove any open details in the row.
    row.find('.employee-details-wrapper').stop().slideUp(function () {
        $(this).remove();
    });

    if (button.hasClass('details-button-active')) {
        button.removeClass('details-button-active');
        employee.removeClass('with-open-details');
    }
    else {
        row.find('.details-button').removeClass('details-button-active');
        button.addClass('details-button-active');
        row.find('.with-open-details').removeClass('with-open-details');
        employee.addClass('with-open-details');

        var education = employee.data('employee-education');
        var biography = employee.data('employee-bio');
        var bioUrl = employee.data('employee-bio-url');

        // This will hold all of the details contents, immediately hidden (so it can be animated when full)
        var detailsContainer = $('<div></div>').addClass('col-sm-12 employee-details-wrapper').hide();
        var details = $('<div></div>').addClass('detailed-employee-details');

        if (!isNullOrWhitespace(education)) {
            var educationTitleDiv = $('<div></div>').addClass('detailed-employee-details-title');
            var educationTextDiv = $('<div></div>').addClass('detailed-employee-details-text');

            educationTitleDiv.append('Education');
            educationTextDiv.append(education);
            details.append(educationTitleDiv);
            details.append(educationTextDiv);
        }

        if (!isNullOrWhitespace(biography)) {
            var biographyTitleDiv = $('<div></div>').addClass('detailed-employee-details-title');
            var biographyTextDiv = $('<div></div>').addClass('detailed-employee-details-text');

            biographyTitleDiv.append('Biography');
            biographyTextDiv.append(biography);
            details.append(biographyTitleDiv);
            details.append(biographyTextDiv);
        }

        if (!isNullOrWhitespace(bioUrl)) {
            var bioIconDiv = $('<div></div>').addClass('detailed-employee-bio-icon');
            var bioLinkDiv = $('<div></div>').addClass('detailed-employee-bio-link bordered-underline no-color-change');
            var bioLink = $('<a></a>').attr('href', bioUrl);

            bioLinkDiv.append('Download Full Bio');
            bioLink.append(bioIconDiv, bioLinkDiv);
            details.append(bioLink);
        }

        var exitLink = $('<a></a>').attr('href', '#').addClass('detailed-employee-exit-link');
        var exitButtonDiv = $('<div></div>').addClass('detailed-employee-exit-icon');

        exitButtonDiv.on('click', function (e) {
            e.preventDefault();

            $(this)
                .closest('.employee-details-wrapper')
                .stop()
                .slideUp(function () {
                    row.find('.details-button-active').removeClass('details-button-active');
                    row.find('.with-open-details').removeClass('with-open-details');

                    $(this).remove();
                });
        });

        exitLink.append(exitButtonDiv);
        details.append(exitLink);
        detailsContainer.append(details);

        if (jRes.getBreakpoint() === 'xs')
            employee.after(detailsContainer);
        else
            row.append(detailsContainer);

        detailsContainer.stop().slideDown();
    }

    return false;
});

(function () {
    var careerPage = $('#CareerOpportunities');

    if (!careerPage.length)
        return;

    careerPage.on('click', '.career-postings .sort-tabs-titles', function () {
        var button = $(this);
        var targetId = button.data('target');
        var targetElement = $(targetId);

        if (targetElement.length) {
            $('html, body').animate({
                scrollTop: targetElement.offset().top - 50
            }, 500);
        }
    });
})();
;

$(document).ready(function ($) {
    var containers = $('.left-rail-cta-container');

    containers.each(function (i) {
        var container = $(containers[i]);
        var text = $(container.find('.left-rail-cta-modal-text'));
        var modalContainer = $(container.find('.left-rail-cta-image-modal'));

        text.css('padding-top', (modalContainer.height() - text.height()) / 2);
    });

    $('.left-rail-cta-image-modal').on('mouseenter', function () {
        var thisParent = $(this).parent().parent().parent();
        var backgroundColor = thisParent.css('border-bottom-color');
        $('.left-rail-cta-image-modal', thisParent).css('background-color', backgroundColor);
        $(this).find('.left-rail-cta-modal-text').css('color', '#fff');
    });

    $('.left-rail-cta-image-modal').on('mouseleave', function () {
        var thisParent = $(this).parent().parent().parent();
        $('.left-rail-cta-image-modal', thisParent).css('background-color', 'transparent');
        $(this).find('.left-rail-cta-modal-text').css('color', 'transparent');
    });
});
;

$(document).ready(function ($) {
    $('.two-button-cta-container').on({
        mouseenter: function () {
            var button = $(this);
            var color = button.data('background-color');
            button.css('background-color', color);
            button.css('color', '#fff');
        },
        mouseleave: function () {
            var button = $(this);
            var color = button.data('background-color');
            button.css('background-color', '#fff');
            button.css('color', color);
        }
    }, '.two-button-cta-button');
});
;

(function () {
    var dashboardToutResize = function () {
        var toutNumber = 2;
        var givingToutsContentPartial = $('.dashboard-content-touts .giving-store-tout');
        var givingToutsContent = $('.giving-store-tout-content', givingToutsContentPartial);

        if (jRes.getBreakpoint() === 'xs')
            givingToutsContent.css('height', 'auto');
        else {
            for (var i = 0; i < givingToutsContent.length; i += toutNumber) {
                var greatestHeight = 0;
                var thisTout;
                var toutBody;
                for (var a = 0; a < toutNumber; a++) {
                    thisTout = givingToutsContent.eq(a + i);
                    thisTout.css('height', 'auto');
                    toutBody = $('.giving-store-tout-body', thisTout);
                    toutBody.css('height', 'auto');
                    var toutHeight = Math.ceil(thisTout.outerHeight());
                    if (toutHeight > greatestHeight)
                        greatestHeight = toutHeight;
                }
                for (var b = 0; b < toutNumber; b++) {
                    thisTout = givingToutsContent.eq(b + i);
                    greatestHeight = Math.ceil(greatestHeight);
                    var bottom = $('.giving-store-tout-bottom-section', thisTout);
                    toutBody = $('.giving-store-tout-body', bottom);
                    var differenceHeight = greatestHeight - thisTout.outerHeight();
                    //lower the body height to show wrapper container border
                    toutBody.outerHeight(Math.floor(toutBody.outerHeight()) + differenceHeight - 2);
                    thisTout.outerHeight(greatestHeight);
                }
            }
        }
    };

    $(window).load(function () {
        dashboardToutResize();

        $(window).resize(function () {
            dashboardToutResize();
        });

        var leftDashboardInternalMenu = $('.left-dashboard-internal-menu');

        body.on('click', '.mobile-dashboard-internal-nav-buttons', function () {
            $(this).toggleClass('expanded');
        });

        $('.dashboard-content-touts').on('click', '.spirit-box-inner', function () {
            return false;
        });

        leftDashboardInternalMenu.on('click', '.left-dashboard-internal-menu-dropdown', function () {
            $(this).toggleClass('open');
        });

        //function to set first fund to be open if none are open
        $(document).ready(function () {
            var fundInternalItems = $('.left-dashboard-funds-internal-menu-dropdown');
            var openFundInternalItems = $('.left-dashboard-funds-internal-menu-dropdown.open');
            if (fundInternalItems.length && !openFundInternalItems.length)
                fundInternalItems.eq(0).addClass('open');

            var directoryListingsInternalItems = $('.left-dashboard-directory-internal-menu-dropdown');
            var openDirectoryListingsInternalItems = $('.left-dashboard-directory-internal-menu-dropdown.open');
            if (directoryListingsInternalItems.length && !openDirectoryListingsInternalItems.length)
                directoryListingsInternalItems.eq(0).addClass('open');
        });

        leftDashboardInternalMenu.on('click', '.left-dashboard-funds-menu-dropdown', function () {
            $(this).toggleClass('open');
        });

        leftDashboardInternalMenu.on('click', '.left-dashboard-funds-internal-menu-dropdown', function () {
            $(this).toggleClass('open');
        });

        leftDashboardInternalMenu.on('click', '.left-dashboard-portraits-menu-dropdown', function () {
            $(this).toggleClass('open');
        });

        leftDashboardInternalMenu.on('click', '.left-dashboard-portraits-internal-menu-dropdown', function () {
            $(this).toggleClass('open');
        });

        leftDashboardInternalMenu.on('click', '.left-dashboard-directory-menu-dropdown', function () {
            $(this).toggleClass('open');
        });

        leftDashboardInternalMenu.on('click', '.left-dashboard-directory-internal-menu-dropdown', function () {
            $(this).toggleClass('open');
        });
    });
})();

(function () {
    var emailConfirmationModal = $('.email-confirm-modal');

    if (!emailConfirmationModal.length)
        return;

    LoadPopUpModal(emailConfirmationModal, function () {
        var modal = popUpOverlayContent.find('.email-confirm-modal');

        // Specify the width so the thank you message doesn't change it.
        modal.css('width', modal.outerWidth());
        modal.off('.email-confirm');

        modal.on('submit.email-confirm', '#ConfirmEmailForm', function () {
            var form = $(this);

            $.ajax({
                url: form.attr('action'),
                type: form.attr('method'),
                data: form.serialize(),
                success: function () {
                    modal.find('.email-confirm-modal-section').slideToggle();
                },
                error: function () {
                    alert('Could not update email confirmation');
                }
            });

            return false;
        });
    });
})();
;
//Uses EZSlider.js

//Define how many slides to move on a button click
var spiritSlidesToMoveOnButtonClick = 1;

//Define all sliders with the name of their container list, the width of one slide, the index of the active slide in the list
var spiritImageList = $('.spirit-image-list');
var hasPromotionZoneSlider = document.getElementsByClassName('promotion-zone-slider');
var spiritImageListWidthOfSlideAsPercent = hasPromotionZoneSlider.length ? 100 : 50;
var indexOfSpiritImageListActiveSlide = 1;

//Define the list display offset (offset being a portion of the previous and next slide are visible) as a percentage
var spiritOffset = 0;

//Define the list containing the carousel indicators
var spiritIndicatorList = $('.spirit-indicator-list');
spiritIndicatorList.each(function (index) {
    SetIndicatorListListener($(this), $(spiritImageList[index]), indexOfSpiritImageListActiveSlide, true);
});

//Attach slider actions for all sliders when the carousel indicators trigger a leftward slide in EZSlider, OnMoveIndicatorLeft()

//Attach slider actions for all sliders when the carousel indicators trigger a rightward slide in EZSlider, OnMoveIndicatorRight()

//Attach event handlers to all slider buttons
$(document).ready(function ($) {
    $('.spirit-nav-button.left').each(function (index) {
        $(this).on('click', function () {
            MoveCarouselRight(spiritSlidesToMoveOnButtonClick, $(spiritImageList[index]), spiritImageListWidthOfSlideAsPercent, indexOfSpiritImageListActiveSlide, true, $(spiritIndicatorList[index]), spiritOffset);
        });
    });

    $('.mobile-spirit-carousel-button.left').each(function (index) {
        $(this).on('click', function () {
            MoveCarouselRight(spiritSlidesToMoveOnButtonClick, $(spiritImageList[index]), spiritImageListWidthOfSlideAsPercent, indexOfSpiritImageListActiveSlide, true, $(spiritIndicatorList[index]), spiritOffset);
        });
    });

    $('.spirit-nav-button.right').each(function (index) {
        $(this).on('click', function () {
            MoveCarouselLeft(spiritSlidesToMoveOnButtonClick, $(spiritImageList[index]), spiritImageListWidthOfSlideAsPercent, indexOfSpiritImageListActiveSlide, true, $(spiritIndicatorList[index]), spiritOffset);
        });
    });

    $('.mobile-spirit-carousel-button.right').each(function (index) {
        $(this).on('click', function () {
            MoveCarouselLeft(spiritSlidesToMoveOnButtonClick, $(spiritImageList[index]), spiritImageListWidthOfSlideAsPercent, indexOfSpiritImageListActiveSlide, true, $(spiritIndicatorList[index]), spiritOffset);
        });
    });

    $('.spirit-image-list').each(function (index) {
        $(this).on('swipeleft', function () {
            MoveCarouselLeft(spiritSlidesToMoveOnButtonClick, $(spiritImageList[index]), spiritImageListWidthOfSlideAsPercent, indexOfSpiritImageListActiveSlide, true, $(spiritIndicatorList[index]), spiritOffset);
        });
    });

    $('.spirit-image-list').each(function (index) {
        $(this).on('swiperight', function () {
            MoveCarouselRight(spiritSlidesToMoveOnButtonClick, $(spiritImageList[index]), spiritImageListWidthOfSlideAsPercent, indexOfSpiritImageListActiveSlide, true, $(spiritIndicatorList[index]), spiritOffset);
        });
    });



    //$('.spirit-nav-button.left, .mobile-spirit-carousel-button.left').on('click', function () {
    //    MoveCarouselRight(spiritSlidesToMoveOnButtonClick, spiritImageList, spiritImageListWidthOfSlideAsPercent, indexOfSpiritImageListActiveSlide, true, spiritIndicatorList, spiritOffset);
    //});

    //$('.spirit-nav-button.right, .mobile-spirit-carousel-button.right').on('click', function () {
    //    MoveCarouselLeft(spiritSlidesToMoveOnButtonClick, spiritImageList, spiritImageListWidthOfSlideAsPercent, indexOfSpiritImageListActiveSlide, true, spiritIndicatorList, spiritOffset);
    //});

    //$('.spirit-image-list').on('swipeleft', function () {
    //    MoveCarouselLeft(spiritSlidesToMoveOnButtonClick, spiritImageList, spiritImageListWidthOfSlideAsPercent, indexOfSpiritImageListActiveSlide, true, spiritIndicatorList, spiritOffset);
    //});

    //$('.spirit-image-list').on('swiperight', function () {
    //    MoveCarouselRight(spiritSlidesToMoveOnButtonClick, spiritImageList, spiritImageListWidthOfSlideAsPercent, indexOfSpiritImageListActiveSlide, true, spiritIndicatorList, spiritOffset);
    //});
});;
(function () {

    $('.highlight-box-view-button').hover(
        function () {
            var button = $(this);
            var background = '#fff';
            var color = button.data('button-color');
            button.css({ 'background-color': color });
            button.css({ 'color': background });
        }, function () {
            var button = $(this);
            var background = 'transparent';
            var color = button.data('button-color');
            button.css({ 'background-color': background });
            button.css({ 'color': color });
        }
    );

})();

;

(function () {
    var container = $('#ImpactItemPartialContainer');

    container.on('click', '.sort-tabs-titles', function (e) {
        var categoryId = $(this).data('category-id');

        window.updateQueryString('category', categoryId);

        $.ajax({
            url: "/umbraco/surface/storiessurface/applyfilter",
            data: { 'storyCategoryId': categoryId },
            traditional: true,
            type: 'POST',
            success: function (data) {
                container.html(data);
            }
        });

        return false;
    });

    container.on('click', '.load-more-button', function () {
        $.ajax({
            url: "/umbraco/surface/storiessurface/loadmoreresults",
            traditional: true,
            type: 'POST',
            success: function (data) {
                container.html(data);
            }
        });

        return false;
    });
})();
;
$(document).ready(function () {

    $('.toolkit-image').on('mouseenter', function () {
        var thisParent = $(this).parent();
        $('.toolkit-image-modal', this).fadeIn(150);
        $('.toolkit-buttons-wrapper', thisParent).fadeIn(150);
    });

    $('.toolkit-inner-wrapper').on('mouseleave', function () {
        $('.toolkit-image-modal', this).fadeOut(150);
        $('.toolkit-buttons-wrapper', this).fadeOut(150);
    });

    $('.toolkit-button').tooltip();

    $('.toolkit-button.share-button').on('click', function () {
        //Get the data attribute from the element $(this) by using .data(..) 
        LoadModal($('.resource-sharing-partial').html(), true);

        //Update The Email Link to Share the Data attribute value
        $('.email-button-link').prop('href', 'mailto:?body=' + $(this).closest('a').data('email-link'));
        return false;
    });
});
;
(function () {

    $('.type-of-fund-wrapper').hover(
        function () {
            if ($(window).width() > 991) {
                var fundBody = $('.type-of-fund-title-wrapper .type-of-fund-body', this);
                fundBody.css('display', 'block');
                var fundBodyContentsHeight = fundBody.outerHeight() + $('p:first-child', fundBody).height();
                fundBody.css('height', fundBodyContentsHeight + 'px');
            }

        }, function () {
            if ($(window).width() > 991)
                $('.type-of-fund-body', this).outerHeight(0);
        }
    );

})();
;

$(document).ready(function () {
    GivingOptionsResize();

    $(window).resize(function () {
        GivingOptionsResize();
    });
});

function GivingOptionsResize() {
    var largestBodyHeight = 0;

    $('#GivingOptions').find('.giving-option-body').each(function () {
        $(this).css('height', 'auto');
        if ($(this).outerHeight() > largestBodyHeight) {
            largestBodyHeight = $(this).outerHeight();
        }
    });

    $('#GivingOptions').find('.giving-option-body').each(function () {
        $(this).outerHeight(largestBodyHeight);
    });
}
;
$(document).ready(function () {
    $('.services-info-button').hover(
        function () {
            var button = $(this);
            var background = '#fff';
            var color = button.data('button-color');
            button.css({ 'background-color': color });
            button.css({ 'color': background });
        }, function () {
            var button = $(this);
            var background = 'transparent';
            var color = button.data('button-color');
            button.css({ 'background-color': background });
            button.css({ 'color': color });
        }
    );
});;

(function () {
    $(document).ready(function () {
        $('body').on('click', '.cascading-button, .cascading-title, .cascading-title label', function () {
            var thisSection = $(this).closest('.cascading-section');

            thisSection.toggleClass('expanded');

            var cascadingBody = $('.cascading-body', thisSection);

            if (thisSection.hasClass('expanded')) {
                cascadingBody.css('height', 'auto');
                var height = cascadingBody.outerHeight();
                cascadingBody.outerHeight(0);
                cascadingBody.outerHeight(height);
            }
            else
                cascadingBody.outerHeight(0);

        });
    });
})();
;
$(document).ready(function () {
    $('.special-initiative-more-button').hover(
        function () {
            var button = $(this);
            var background = '#fff';
            var color = button.data('button-color');
            button.css({ 'background-color': color });
            button.css({ 'color': background });
        }, function () {
            var button = $(this);
            var background = 'transparent';
            var color = button.data('button-color');
            button.css({ 'background-color': background });
            button.css({ 'color': color });
        }
    );
});
;

(function () {
    $('#ContactForm').on('submit', function () {
        var form = $(this);
        var successMessage = form.find('.contact-form-thank-you');

        if (!form.valid())
            return false;

        successMessage.slideUp(300, function () {
            $.ajax({
                url: form.attr('action'),
                type: form.attr('method'),
                data: form.serialize(),
                success: function (data) {
                    if (data)
                        alert(data); // Recaptcha failure
                    else {
                        var firstNameInput = form.find('#FirstName');
                        var lastNameInput = form.find('#LastName');
                        var organizationInput = form.find('#Organization');
                        var phoneInput = form.find('#Phone');
                        var emailInput = form.find('#Email');
                        var commentsTextArea = form.find('#Comments');

                        firstNameInput.val('');
                        lastNameInput.val('');
                        organizationInput.val('');
                        phoneInput.val('');
                        emailInput.val('');
                        commentsTextArea.val('');

                        var thankYouUrl = form.data('thank-you-url');

                        if (thankYouUrl)
                            window.location.href = thankYouUrl
                        else
                            successMessage.slideDown(300);
                    }

                    enableSubmit(form);
                },
                error: function () {
                    alert('Something went wrong. Please try again later.');
                }
            });
        });

        return false;
    });

    var newsletterForms = $('.newsletter-form');

    if (!newsletterForms.length)
        return;

    newsletterForms.each(function (i, el) {
        var newsletterForm = $(el);

        $.validator.unobtrusive.parse(newsletterForm);

        newsletterForm.on('change', function () {
            var form = $(this);
            var submitButton = form.find('button[type="submit"]');

            // This is equivalent to form.valid() but does not trigger any UI changes (no error borders on load).
            var formIsValid = form.validate().checkForm();

            submitButton.prop('disabled', !formIsValid);
        });

        newsletterForm.on('submit', function () {
            var form = $(this);

            if (!form.valid())
                return false;

            $.ajax({
                url: form.attr('action'),
                type: form.attr('method'),
                data: form.serialize(),
                success: function (data) {
                    if (data) {
                        alert(data); // Recaptcha failure

                        enableSubmit(form);
                    }
                    else {
                        // GTM Tracking
                        window.dataLayer = window.dataLayer || [];
                        window.dataLayer.push({
                            // ReSharper disable once StringLiteralTypo
                            event: 'ecomm-signup',
                            type: form.data('ecomm-type') === 'inlinealt' ? 'inline' : form.data('ecomm-type'),
                            firstName: form.find('[name="FirstName"]').val(),
                            lastName: form.find('[name="LastName"]').val(),
                            emailAddress: form.find('[name="EmailAddress"]').val()
                        });

                        var thankYouUrl = form.data('thank-you-url');

                        if (thankYouUrl)
                            window.location.href = thankYouUrl;
                        else {
                            var formContents = form.children('.ecomm-form-item-wrapper');
                            var successMessage = form.children('.contact-form-thank-you');

                            if (form.data('ecomm-type') === 'inlinealt') {
                                formContents = form.children('.newsletter-form-group:not(.newsletter-form-thank-you)');
                                successMessage = form.children('.newsletter-form-thank-you');
                            }

                            formContents.slideUp(300);
                            successMessage.slideDown(300);
                        }
                    }
                },
                error: function () {
                    alert('Something went wrong. Please try again later.');
                }
            });

            return false;
        });

        // Trigger the change event on page load
        newsletterForm.trigger('change');
    });
})();

(function () {
    var ecommPopupForm = $('.ecomm-popup-form');

    if (!ecommPopupForm.length || document.cookie.indexOf("tcf-ecomm-hidden=true") !== -1)
        return;

    ecommPopupForm.on('click', '.ecomm-popup-close-button', function () {
        ecommPopupForm.fadeOut();

        // The max-age value is 2 days (in ms)
        document.cookie = 'tcf-ecomm-hidden=true; max-age=172800; path=/';
    });

    var timeDelay = ecommPopupForm.data('ecomm-popup-time-delay');
    var scrollDelay = ecommPopupForm.data('ecomm-popup-scroll-delay');

    // We use these to determine if the delay has been triggered.
    // If the delay is not provided, the check is considered passed.
    var timeDelayPassed = !timeDelay;
    var scrollDelayPassed = !scrollDelay;

    var getScrollPercent = function () {
        var docEl = document.documentElement;
        var body = document.body;
        var scrollTop = docEl.scrollTop || body.scrollTop;
        var scrollHeight = docEl.scrollHeight || body.scrollHeight;

        return (scrollTop / (scrollHeight - docEl.clientHeight)) * 100;
    };

    var tryShowForm = function () {
        if (!timeDelayPassed || !scrollDelayPassed)
            return;

        ecommPopupForm.fadeIn({
            complete: function () {
                // Update the submit button to the correct state
                ecommPopupForm.find('.newsletter-form').trigger('change');
            }
        });

        if (scrollDelay)
            $(window).off('scroll.ecomm-popup');
    };

    if (timeDelay) {
        setTimeout(function () {
            timeDelayPassed = true;

            tryShowForm();
        }, timeDelay * 1000);
    }

    if (scrollDelay) {
        $(window).on('scroll.ecomm-popup', debounce(function () {
            if (getScrollPercent() >= scrollDelay) {
                scrollDelayPassed = true;

                tryShowForm();
            }
        }, 500));
    }
})();
;

(function () {
    var spiritWrapper = $('.spirit-box-partial-wrapper');
    var currentPage = 1;
    var currentCategory = spiritWrapper.find('.spirit-box-category.active').text().trim();

    spiritWrapper.on('click', '.spirit-box-category', function () {
        var category = $(this);

        spiritWrapper.find('.spirit-box-category').removeClass('active');
        category.addClass('active');

        currentCategory = category.text().trim();
        currentPage = 1;

        window.updateQueryString('category', currentCategory);

        $.ajax({
            url: '/umbraco/surface/infoBoxSurface/applyNewFilter',
            data: { category: currentCategory },
            cache: false,
            success: function (data) {
                $('.info-box-container').html(data);
            }
        });

        return false;
    });

    spiritWrapper.on('click', '.spirit-box-load-more-button', function () {
        var button = $(this);

        $.ajax({
            url: '/umbraco/surface/infoBoxSurface/loadMoreResults',
            data: {
                page: currentPage,
                category: currentCategory
            },
            cache: false,
            success: function (data) {
                $('.info-box-container').append(data);
                button.parent().remove(); // the data will contain a new button if we can load more again

                currentPage++;
            }
        });

        return false;
    });

}());

(function () {
    var spiritFilterHeader = $('.spirit-box-filter-header');

    if (!spiritFilterHeader.length)
        return;

    var enableSpiritFilterCollapsing = function () {
        spiritFilterHeader.removeClass('open');
        spiritFilterHeader.siblings('.spirit-box-categories').hide();

        spiritFilterHeader.off('.spirit-filter-collapse');
        spiritFilterHeader.on('click.spirit-filter-collapse', function () {
            spiritFilterHeader.toggleClass('open');
            spiritFilterHeader.siblings('.spirit-box-categories').stop().slideToggle(500);
        });
    };

    var resetSpiritFilterCollapsing = function () {
        spiritFilterHeader.removeClass('open');
        spiritFilterHeader.siblings('.spirit-box-categories').show();

        spiritFilterHeader.off('.spirit-filter-collapse');
    };

    jRes.addFunc([{
        breakpoint: ['xs', 'sm'],
        enter: enableSpiritFilterCollapsing
    }, {
        breakpoint: ['md', 'lg'],
        enter: resetSpiritFilterCollapsing
    }]);

})();
;

(function () {

    // creates ellipses overflow styling for multi-line elements similar to single line overflow:hidden with ellipses
    // add class of "line-clamp" to element
    // add data-lines of "an integer" for number of lines to display
    // put original content in data-content

    var addShowMore = false;

    var getLine = function (thisElement, tempContent, width, isLastLine, showMoreOption) {

        // if no content is left, return an empty string
        if (tempContent.length < 1)
            return '';

        // clear this element
        thisElement.html('');
        var words = tempContent.split(' ');
        var length = 0;
        var indexOfCurrentWord = 0;
        var newLine = '';
        var tempNewLine = '';

        // keep adding words to the new line until it exceeds the length of this element
        while (length < width) {
            newLine = tempNewLine;

            // clear this element
            thisElement.html('');

            // increase tempNewLine by the next word plus a space
            tempNewLine += words[indexOfCurrentWord] + ' ';

            // put tempNewLine into this element
            thisElement.html('<span style="white-space: nowrap;">' + tempNewLine + '</span>');

            // get the length of the new span
            length = thisElement.children('span').width();
            indexOfCurrentWord++;

            // check if this is the last word
            if (indexOfCurrentWord === words.length) {

                // if the tempNewLine fits, return it
                if (length < width) {
                    // remove the last space
                    tempNewLine = tempNewLine.substring(0, tempNewLine.length - 1);
                    return tempNewLine;
                }

                // else, force the while loop to exit
                break;
            }
        }

        if (isLastLine) {
            // remove the last 3 characters and add ellipsis
            newLine = newLine.substring(0, newLine.length - 3);
            newLine += '...';

            addShowMore = showMoreOption;
        }
        return newLine;
    };


    var lineClampElements = function () {
        var elements = $('.line-clamp');
        elements.each(function () {
            var thisElement = $(this);
            var linesToShow = thisElement.data('lines');
            var content = thisElement.data('content');
            var showMoreOption = thisElement.data('show-more');
            var width = thisElement.width();
            var newContent = '';

            // create a span for each line to show
            for (var i = 0; i < linesToShow; i++) {
                var isLastLine = i === linesToShow - 1;
                var newLine = getLine(thisElement, content, width, isLastLine, showMoreOption);
                newContent += '<span>' + newLine + '</span>';

                // remove content used in this span from the content variable
                content = content.replace(newLine, '');
            }

            // add a show more link element if specified
            if (addShowMore)
                $(thisElement.siblings('.line-clamp-show-more')[0]).show();

            // put line-clamped content into this element
            thisElement.html(newContent);
        });
    };

    var addShowHandlers = function () {
        var showMoreElements = $('.line-clamp-show-more');
        var showLessElements = $('.line-clamp-show-less');

        showMoreElements.each(function () {
            var thisShowMoreElement = $(this);
            thisShowMoreElement.on('click', function () {
                var thisLineClamp = $(thisShowMoreElement.siblings('.line-clamp')[0]);
                thisLineClamp.css('max-height', thisShowMoreElement.data('max-height')).data('lines', thisShowMoreElement.data('lines'));
                $(thisShowMoreElement.siblings('.line-clamp-show-less')[0]).show();
                thisShowMoreElement.hide();
                addShowMore = false;
                lineClampElements();
            });
        });

        showLessElements.each(function () {
            var thisShowLessElement = $(this);
            thisShowLessElement.on('click', function () {
                var thisLineClamp = $(thisShowLessElement.siblings('.line-clamp')[0]);
                thisLineClamp.css('max-height', thisShowLessElement.data('max-height')).data('lines', thisShowLessElement.data('lines'));

                // delay is here to allow for transition animation to execute
                $(thisShowLessElement.siblings('.line-clamp-show-more')[0]).delay(600).queue(function () {
                    $(thisShowLessElement.siblings('.line-clamp-show-more')[0]).show();
                    thisShowLessElement.hide();
                    addShowMore = false;
                    lineClampElements();
                    $(this).dequeue();
                });
            });
        });
    };

    $(document).ready(function () {
        lineClampElements();
        addShowHandlers();
    });

    $(window).resize(function () {
        lineClampElements();
    });
})();
;

(function () {
    $(document).ready(function () {
        var logoImageUrl = $('#LogoImageUrl');
        var logoImage = $('#LogoImage');
        var logoImageUpload = $('#LogoImageUpload');
        var uploadLogoImage = $('#UploadLogoImage');
        var chosenLogoFile = $('#ChosenLogoFile');
        var removeLogoImage = $('#RemoveLogoFileButton');

        var portraitImageUrl = $('#PortraitImageUrl');
        var portraitImage = $('#PortraitImage');
        var portraitImageUpload = $('#PortraitImageUpload');
        var uploadPortraitImage = $('#UploadPortraitImage');
        var chosenPortraitFile = $('#ChosenPortraitFile');
        var removePortraitImage = $('#RemovePortraitFileButton');

        $('.request-directory-listing').on('click', '.social-checkbox', function () {
            $(this).next('label').click();
        });

        $('.portrait-contact-item a').html(function (index, html) {
            return html.replace('/', '/\u200B').replace('.', '.\u200B').replace('-', '-\u200B');
        });

        // clear the inputs in the event the image validation failed on the server side
        if ($('.logo-image-validation').hasClass('field-validation-error')) {
            logoImageUrl.val('');
            logoImage.val('');
            logoImageUpload.val('');
            removeLogoImage.addClass('hidden');
        }

        if ($('.portrait-image-validation').hasClass('field-validation-error')) {
            portraitImageUrl.val('');
            portraitImage.val('');
            portraitImageUpload.val('');
            removePortraitImage.addClass('hidden');
        }

        // if there was no validation error and the field has value, re-apply the background image and fileName
        if (logoImageUrl.val()) {
            uploadLogoImage.addClass('picture-is-uploaded').css('background-image', 'url(' + logoImage.val() + ')');
            chosenLogoFile.text(logoImageUrl.val()).addClass('file-chosen');
            removeLogoImage.removeClass('hidden');
        }

        if (portraitImageUrl.val()) {
            uploadPortraitImage.addClass('picture-is-uploaded').css('background-image', 'url(' + portraitImage.val() + ')');
            chosenPortraitFile.text(portraitImageUrl.val()).addClass('file-chosen');
            removePortraitImage.removeClass('hidden');
        }

        body.on('change', 'input[name="LogoImageUpload"]', function () {
            if ($(this).val()) {
                var fileName = $(this).val().replace(/^C:\\fakepath\\/i, '');
                chosenLogoFile.text(fileName).addClass('file-chosen');
                ReadFile(this.files[0], function (e) {
                    uploadLogoImage.addClass('picture-is-uploaded').css('background-image', 'url(' + e.target.result + ')');
                    logoImageUrl.val(fileName);
                    logoImage.val(e.target.result).trigger('focus').trigger('focusout');
                    removeLogoImage.removeClass('hidden');
                });
            }
        });

        body.on('change', 'input[name="PortraitImageUpload"]', function () {
            if ($(this).val()) {
                var fileName = $(this).val().replace(/^C:\\fakepath\\/i, '');
                chosenPortraitFile.text(fileName).addClass('file-chosen');
                ReadFile(this.files[0], function (e) {
                    uploadPortraitImage.addClass('picture-is-uploaded').css('background-image', 'url(' + e.target.result + ')');
                    portraitImageUrl.val(fileName);
                    portraitImage.val(e.target.result).trigger('focus').trigger('focusout');
                    removePortraitImage.removeClass('hidden');
                });
            }
        });

        body.on('click', '#UploadLogoImage', function (e) {
            logoImageUpload.click();
            e.preventDefault();
            e.stopImmediatePropagation();
        });

        body.on('click', '#UploadPortraitImage', function (e) {
            portraitImageUpload.click();
            e.preventDefault();
            e.stopImmediatePropagation();
        });

        removeLogoImage.on('click', function () {
            chosenLogoFile.text('NO FILE CHOSEN').removeClass('file-chosen');
            uploadLogoImage.removeClass('picture-is-uploaded').css('background-image', 'none')
            logoImageUrl.val('');
            logoImage.val('');
            logoImageUpload.val('');
            removeLogoImage.addClass('hidden');
        });

        removePortraitImage.on('click', function () {
            chosenPortraitFile.text('NO FILE CHOSEN').removeClass('file-chosen');
            uploadPortraitImage.removeClass('picture-is-uploaded').css('background-image', 'none')
            portraitImageUrl.val('');
            portraitImage.val('');
            portraitImageUpload.val('');
            removePortraitImage.addClass('hidden');
        });

        var ReadFile = function (file, onLoadCallback) {
            var reader = new FileReader();
            reader.onload = onLoadCallback;
            reader.readAsDataURL(file);
        };

        (function () {
            var givingEventModal = $('#NonprofitDirectoryListingPage').find('#GivingEventModal');

            var callback = function () {
                popUpOverlayContent.off('click.checkout-pop-up');

                popUpOverlayContent.on('click.checkout-pop-up', '.close-modal', function () {
                    HidePopUpModal();
                });
            };

            if (givingEventModal.length)
                LoadPopUpModal(givingEventModal.find('.pop-up-content'), callback);
        })();

        (function () {
            var betterTogetherModal = $('#NonprofitDirectoryListingPage').find('#BetterTogetherModal');

            var callback = function () {
                popUpOverlayContent.off('click.checkout-pop-up');

                popUpOverlayContent.on('click.checkout-pop-up', '.close-modal', function () {
                    HidePopUpModal();
                });
            };

            if (betterTogetherModal.length)
                LoadPopUpModal(betterTogetherModal.find('.pop-up-content'), callback);
        })();
    });
})();
;

(function () {
    $('body').on('click', '.browse-by-category-button', function () {
        var button = $(this);
        var buttonWrapper = button.closest('.browse-by-category-button-wrapper');
        var categoryList = buttonWrapper.nextAll('.program-category-list')

        buttonWrapper.toggleClass('selected');
        categoryList.slideToggle();
    });

    // Toggle the categories to open if we are on the giving event page
    var givingEventButton = $('.giving-event-section .browse-by-category-button');
    if (givingEventButton.length)
        givingEventButton.trigger('click');
})();
;

(function () {
    var promoSliders = $('.promotion-zone-slider');

    promoSliders.each(function (i, el) {
        var take;
        var skip;
        var lazyLoadSkip;
        var promotionZoneSlider = $(el);
        var givingStoreToutList = $('.giving-store-touts-list');
        var dashboardContentTouts = $('.dashboard-content-touts');
        var sliderGivingStoreToutImages = $('.giving-store-tout-image, .embed-responsive:not(.spirit-embed-responsive)', promotionZoneSlider);
        var indicatorWrapper = $('.spirit-indicator-wrapper', promotionZoneSlider);
        var sliderToutBodies = $('.giving-store-tout-body', promotionZoneSlider);
        var sliderBottomSections = $('.giving-store-tout-bottom-section', promotionZoneSlider);
        var sliderVerticalToutImages = $('.vertical-tout-image', promotionZoneSlider);
        var sliderSquareToutImages = $('.square-tout-image', promotionZoneSlider);
        var sliderToutCategories = $('.giving-store-tout-category', promotionZoneSlider);
        var firstSliderToutCategory = sliderToutCategories.eq(0);
        var sliderToutContents = $('.giving-store-tout-content', promotionZoneSlider);
        var firstSliderToutContent = sliderToutContents.eq(0);
        var sliderBodyParagraphs = $('.giving-store-tout-body p', promotionZoneSlider);
        var firstSliderBodyParagraph = sliderBodyParagraphs.eq(0);
        var dashboardSliderWindow = promotionZoneSlider.closest('.dashboard-slider-window');
        var isGivingStore = !!$('#Content .giving-store-content').length;
        var isDashboard = !!$('.dashboard-wrapper').length;
        var hasWhiteLabelSlides = !!promotionZoneSlider.closest('.dashboard-slider-window.has-white-label-slides').length;
        var mediaLargeQuery = window.matchMedia('screen and (min-width: 992px) and (max-width: 1199px)');
        var mediaSmallMediumQuery = window.matchMedia('screen and (max-width: 991px)');

        givingStoreToutList.on('click', '.spirit-box-inner', function () {
            return false;
        });

        // tout sizing, progress bar, and countdown updates on ready, resize and some interval
        $(document).ready(function () {
            if (isGivingStore)
                setToutListImageHeight(givingStoreToutList);
            else
                setToutListImageHeight(dashboardContentTouts);

            resizeGivingStoreTouts();
            resizePromotionZoneSlider();
            $(window).resize(function () {
                if (isGivingStore)
                    setToutListImageHeight(givingStoreToutList);
                else
                    setToutListImageHeight(dashboardContentTouts);

                resizePromotionZoneSlider();
                resizeGivingStoreTouts();
            });

            var loadMoreButton = $('.giving-store-touts-list-load-more-button');
            if (loadMoreButton.data('immediately-load'))
                loadMoreButton.trigger('click');
        });

        // click handler to lazy load more touts
        body.on('click', '.giving-store-touts-list-load-more-button', function () {
            var loadMoreButton = $(this);
            var baseUrl = loadMoreButton.data('lazy-load-url');
            var totalResults = loadMoreButton.data('total-result');
            var immediatelyLoad = loadMoreButton.data('immediately-load');

            if (loadMoreButton.hasClass('disabled'))
                return;

            ToggleLoadingBar($('.loading-bar'));

            take = loadMoreButton.data('take');
            skip = loadMoreButton.data('skip');

            if (immediatelyLoad)
                loadMoreButton.addClass('disabled').hide();
            else {
                // assign lazyloadskip first time only
                lazyLoadSkip = lazyLoadSkip ? lazyLoadSkip : skip + take;

                // update the skip parameter
                baseUrl = baseUrl.replace('&Skip=' + skip, '').replace('Skip=' + skip, '');
                baseUrl += '&Skip=' + lazyLoadSkip;

                loadMoreButton.addClass('disabled');
            }

            lazyLoadMoreTouts(baseUrl, function (data) {
                $('.giving-store-touts').append(data);
                ToggleLoadingBar($('.loading-bar'));
                lazyLoadSkip = (lazyLoadSkip || 0) + take;

                // hide load more button if all results are loaded
                if (totalResults <= lazyLoadSkip)
                    $('.search-load-more').addClass('hidden');

                if (isGivingStore)
                    setToutListImageHeight(givingStoreToutList);
                else
                    setToutListImageHeight(dashboardContentTouts);

                resizeGivingStoreTouts();

                loadMoreButton.removeClass('disabled').show();
                loadMoreButton.data('immediately-load', false);

                window.setBetterTogetherCountdowns();
            });
        });

        // ajax call to lazy load more touts
        var lazyLoadMoreTouts = function (baseUrl, callback) {
            $.ajax({
                type: 'GET',
                dataType: 'html',
                url: baseUrl,
                success: function (response) {
                    return callback(response);
                }
            });
        };

        var resizeGivingStoreTouts = function () {
            var mediaLargeQuery = window.matchMedia('screen and (min-width: 1200px)');
            var mediaMediumQuery = window.matchMedia('screen and (min-width: 991px)');
            var skip = 1;
            if (mediaMediumQuery.matches)
                skip = 2;
            if (mediaLargeQuery.matches)
                skip = 3;
            var givingToutsContentPartial = $('.giving-store-touts', givingStoreToutList);
            var givingToutsContent = $('.giving-store-tout-content', givingToutsContentPartial);
            for (var i = 0; i < givingToutsContent.length; i += skip) {
                var greatestHeight = 0;
                var thisTout;
                var toutBody;
                for (var a = 0; a < skip; a++) {
                    thisTout = givingToutsContent.eq(a + i);
                    thisTout.css('height', 'auto');
                    toutBody = $('.giving-store-tout-body', thisTout);
                    toutBody.css('height', 'auto');
                    if (thisTout.outerHeight() > greatestHeight)
                        greatestHeight = thisTout.outerHeight();
                }
                for (var b = 0; b < skip; b++) {
                    thisTout = givingToutsContent.eq(b + i);
                    greatestHeight = Math.ceil(greatestHeight);
                    var bottom = $('.giving-store-tout-bottom-section', thisTout);
                    toutBody = $('.giving-store-tout-body', bottom);
                    var differenceHeight = greatestHeight - thisTout.outerHeight();
                    toutBody.outerHeight(toutBody.outerHeight() + differenceHeight);
                    thisTout.outerHeight(greatestHeight);
                }
            }
        };

        //Begin Promotion Zone Slider
        var resizePromotionZoneSlider = function () {
            if (hasWhiteLabelSlides)
                resizeWhiteLabelSlider();
            else if (mediaLargeQuery.matches || mediaSmallMediumQuery.matches)
                resizeSliderForMobileAndTablet();
            else
                resizeSliderForDesktop();
        };

        var resizeWhiteLabelSlider = function () {
            var viewWindow = $('.spirit-image-view-window');
            var sliderImageWidth = viewWindow.width();
            var minWidth = Number(viewWindow.css('min-width').replace('px', ''));
            var minHeight = Number(viewWindow.css('min-height').replace('px', ''));
            var imageRatio = minWidth > 0 ? minHeight / minWidth : 1;
            var newHeight = sliderImageWidth * imageRatio;

            viewWindow.height(newHeight);
            $('.spirit-image-list', viewWindow).height(newHeight);
            $('#MyDashboard .has-white-label-slides.dashboard-slider-window').height(newHeight + indicatorWrapper.outerHeight());
        };

        var resizeSliderForMobileAndTablet = function () {
            var imageMarginTop = !sliderGivingStoreToutImages.length ? 0 : Number(sliderGivingStoreToutImages.eq(0).css('margin-top').replace('px', ''));

            // hide the vertical images
            sliderVerticalToutImages.hide();
            sliderSquareToutImages.hide();
            $('.giving-store-tout-image, .embed-responsive:not(.spirit-embed-responsive)', promotionZoneSlider).show();

            // set elements to no height before determining greatest height for resizing
            setSliderToutBodiesToNoHeight();

            // get the height of the tallest bottom section
            var greatestHeight = sliderBottomSections.eq(0).outerHeight();
            for (var i = 0; i < sliderBottomSections.length; i++)
                greatestHeight = sliderBottomSections.eq(i).outerHeight() > greatestHeight ? sliderBottomSections.eq(i).outerHeight() : greatestHeight;

            // get the padding bottom of the paragraph elements and add it to the greatest height
            greatestHeight += getSliderBodyParagraphPaddingBottom();

            // set the image height to the slider height for info box touts
            var imageHeight = getDisplayedImageHeight(promotionZoneSlider);

            //set the height of promotion zone images
            $('.spirit-carousel-item.InfoBox .spirit-box-inner', promotionZoneSlider).css('height', imageHeight + 'px');
            $('.giving-store-tout-content .spirit-box-inner', promotionZoneSlider).css('height', imageHeight + 'px');
            $('.giving-store-tout-image, .embed-responsive:not(.spirit-embed-responsive)', promotionZoneSlider).css('height', imageHeight + 'px');

            // get the height of the category label so it can be added to the slider height
            var heightOfFirstSliderToutCategory = getSliderToutCategoriesHeight();

            // get the slider height
            var sliderHeight = greatestHeight + imageHeight + imageMarginTop + heightOfFirstSliderToutCategory;

            // set the view window and slide list height to the slider height
            setPromotionZoneSliderHeight(sliderHeight);
            dashboardSliderWindow.css('height', sliderHeight + 'px');

            indicatorWrapper.css('top', (imageHeight - sliderHeight) + 'px');

            for (var j = 0; j < sliderBottomSections.length; j++) {
                var thisToutBottomSection = sliderBottomSections.eq(j);
                var thisToutBottomSectionHeight = thisToutBottomSection.outerHeight();
                var thisToutBody = $('.giving-store-tout-body', thisToutBottomSection);

                // add padding below body to correctly position content below it
                var differenceHeight = greatestHeight - thisToutBottomSectionHeight;
                thisToutBody.css('padding-bottom', parseInt(thisToutBody.css('padding-bottom')) + differenceHeight + 'px');
            }
        };

        var getDisplayedImageHeight = function (parentElement) {
            var toutImage = $('.giving-store-tout-image, .embed-responsive:not(.spirit-embed-responsive)', parentElement).eq(0);
            var spiritImage = $('.spirit-box', parentElement).eq(0);
            var imageWidth = toutImage.length ? toutImage.width() : spiritImage.eq(0).width();
            var minHeight = toutImage.length && toutImage.css('min-height')
                ? Number(toutImage.css('min-height').replace('px', ''))
                : spiritImage.length && spiritImage.css('min-height')
                    ? Number(spiritImage.css('min-height').replace('px', ''))
                    : 0;
            var minWidth = toutImage.length && toutImage.css('min-width')
                ? Number(toutImage.css('min-width').replace('px', ''))
                : spiritImage.length && spiritImage.css('min-width')
                    ? Number(spiritImage.css('min-width').replace('px', ''))
                    : 0;

            // if there is no min width, set the ratio to 1
            var imageAspectRatio = minHeight > 0 ? minWidth / minHeight : 1;

            return imageWidth / imageAspectRatio;
        };


        var resizeSliderForDesktop = function () {
            // use min-height on .promotion-zone-slider to set the slider height
            var sliderMinHeight = !promotionZoneSlider.length ? 0 : Number(promotionZoneSlider.css('min-height').replace('px', ''));

            //make sure horizontal tout image has 0 height
            $('.giving-store-tout-image, .embed-responsive:not(.spirit-embed-responsive)', promotionZoneSlider).hide();

            // set the image height to the slider height for info box touts
            $('.spirit-carousel-item.InfoBox .spirit-box-inner', promotionZoneSlider).css('height', sliderMinHeight + 'px');

            if (isDashboard)
                sliderVerticalToutImages.show();
            else
                sliderSquareToutImages.show();

            // get slider window height which is the slider height plus the indicator wrapper height
            var sliderWindowHeight = sliderMinHeight + indicatorWrapper.eq(0).outerHeight();

            // set the view window and slide list height to the slider height
            setPromotionZoneSliderHeight(sliderMinHeight);

            // set the slider window height
            dashboardSliderWindow.css('height', sliderWindowHeight + 'px');

            // set the position of the slider nav buttons to center on the slider
            var sliderButtons = $('.spirit-nav-button', dashboardSliderWindow);
            var buttonHeight = sliderButtons.eq(0).outerHeight();
            sliderButtons.css('top', '-' + ((sliderMinHeight + buttonHeight) / 2 + (buttonHeight / 4)) + 'px');

            // set elements to no height before determining greatest height for resizing
            setSliderToutBodiesToNoHeight();

            for (var i = 0; i < sliderBottomSections.length; i++) {
                var thisToutBottomSection = sliderBottomSections.eq(i);
                var thisToutBottomSectionHeight = thisToutBottomSection.outerHeight();
                var thisToutBody = $('.giving-store-tout-body', thisToutBottomSection);
                var isBetterTogetherTout = thisToutBody.closest('.better-together-tout').length;

                // if the bottom section is taller than the slider height, reduce tout body height to make overall height match slider height
                if (thisToutBottomSectionHeight > sliderMinHeight && !isBetterTogetherTout) {
                    var differenceHeight = thisToutBottomSectionHeight - sliderMinHeight;
                    var newBodyOuterHeight = thisToutBody.outerHeight() - differenceHeight;

                    // need to set the height to a factor of the line height so that the break occurs between lines
                    var lineHeight = thisToutBody.css('line-height').replace('px', '');
                    var linesToShow = Math.floor(newBodyOuterHeight / lineHeight);
                    linesToShow = linesToShow === 0 ? 1 : linesToShow;
                    var newBodyInnerHeight = linesToShow * lineHeight;
                    thisToutBody.css('height', newBodyInnerHeight + 'px');

                    // add difference between new body height and differenceHeight to margin bottom of body
                    thisToutBody.css('margin-bottom', newBodyOuterHeight - newBodyInnerHeight);

                    // show the ellipses :after element
                    thisToutBody.addClass('show-ellipses');
                }
                // else, add padding below body to correctly position content below it
                else {
                    var differenceHeightPadding = sliderMinHeight - thisToutBottomSectionHeight;
                    thisToutBody.css('padding-bottom', parseInt(thisToutBody.css('padding-bottom')) + differenceHeightPadding + 'px');
                    thisToutBody.css('height', thisToutBody.outerHeight() + 'px');
                }
            }

            // reset the body height to the slider height
            sliderBottomSections.css('height', sliderMinHeight + 'px');
            setToutListImageHeight(givingStoreToutList);
            setToutListImageHeight(dashboardContentTouts);
        };

        var setPromotionZoneSliderHeight = function (sliderHeight) {
            if (isDashboard)
                sliderHeight += getSliderBorderHeight();

            promotionZoneSlider.css('height', sliderHeight + 'px');
            $('.dashboard-content .promotion-zone-slider .giving-store-tout-content').css('height', sliderHeight - getSliderToutCategoriesHeight() + 'px');
            $('.spirit-image-view-window', promotionZoneSlider).css('height', sliderHeight + 'px');
            $('.spirit-image-list', dashboardSliderWindow).css('height', sliderHeight + 'px');
            //$('.spirit-info-abstract-inner', dashboardSliderWindow).css('height', sliderHeight + 'px');
        };

        var setSliderToutBodiesToNoHeight = function () {
            // bottom sections
            sliderBottomSections.css('height', 'auto');

            // tout bodies
            sliderToutBodies.css('padding-bottom', 0);
            sliderToutBodies.css('margin-bottom', 0);
            sliderToutBodies.css('height', 'auto');
            sliderToutBodies.removeClass('show-ellipses');
        };

        var getSliderBodyParagraphPaddingBottom = function () {
            return !sliderBodyParagraphs.length ? 0 : Number(firstSliderBodyParagraph.css('padding-bottom').replace('px', ''));
        };

        var getSliderToutCategoriesHeight = function () {
            return !sliderToutCategories.length ? 0 : firstSliderToutCategory.outerHeight();
        };

        var getSliderBorderHeight = function () {
            return !sliderToutContents.length ? 0 : Number(firstSliderToutContent.css('border-top-width').replace('px', '')) + Number(firstSliderToutContent.css('border-bottom-width').replace('px', ''));
        };
        //End Promotion Zone Slider

        //Begin Giving Store Tout Lists
        var setToutListImageHeight = function (parentElement) {
            var imageHeight = getDisplayedImageHeight(parentElement);

            $('.spirit-carousel-item.InfoBox .spirit-box-inner', parentElement).css('height', imageHeight + 'px');
            //$('.giving-store-tout-content .spirit-box-inner', parentElement).css('height', imageHeight + 'px');
            //$('.giving-store-tout-image, .embed-responsive:not(.spirit-embed-responsive)', parentElement).css('height', imageHeight + 'px');
            $('.vertical-tout-image .giving-store-tout-category', parentElement).css('display', 'none');
        };
        //End Giving Store Tout Lists
    });
})();
;

(function () {
    $(document).ready(function () {
        var categoryFilterSelects = $('.categories-select');

        categoryFilterSelects.each(function () {
            $(this).find('.select-value').text($(this).data('filter-name'));
        });

        body.on('click', '.categories-select', function () {
            var isExpanded = $(this).hasClass('expanded');
            categoryFilterSelects.removeClass('expanded');

            if (!isExpanded)
                $(this).addClass('expanded');
        });

        body.on('click', '.categories-select-option', function () {
            var thisSelect = $(this).closest('.categories-select');
            var currentValue = thisSelect.data('filter-name');
            var thisValue = $(this).text();
            var filterUrl = $(this).data('filter-url');

            if (currentValue !== thisValue) {
                thisSelect.data('filter-name', thisValue);
                thisSelect.find('.select-value').text(thisValue);
                window.location = filterUrl;
            }
        });

        body.on('click', '.categories-checkbox', function () {
            var checkbox = $('input[type="checkbox"]', this);
            var filterUrl = $(this).data('filter-url');
            checkbox.prop('checked', !checkbox.is(':checked'));
            window.location = filterUrl;
        });

        $('#categories').on('click', function (e) {
            var thisElement = $(e.target);
            if (!thisElement.hasClass('categories-select') && !thisElement.hasClass('categories-select-option'))
                categoryFilterSelects.removeClass('expanded');
        });
    });
})();
;

(function () {
    var awardsList;
    var awardsListItems;
    var awardsListWidth;
    var awardsListWrapper;
    var awardsListWrapperWidth;
    var leftFade;
    var rightFade;
    var timeout;
    var scrollLeft;

    var instantiateVariables = function () {
        awardsList = $('.awards-list');
        awardsListItems = $('li', awardsList);
        awardsListWidth = 0;
        awardsListItems.each(function () {
            awardsListWidth += $(this).outerWidth() + 3;
        });

        awardsList.outerWidth(awardsListWidth);

        awardsListWrapper = $('.awards-list-wrapper');
        awardsListWrapperWidth = awardsListWrapper.outerWidth();
        leftFade = $('.awards-list-fade.left');
        rightFade = $('.awards-list-fade.right');
        scrollLeft = awardsListWrapper.scrollLeft();

        if (awardsListWidth > awardsListWrapperWidth)
            rightFade.removeClass('no-fade');
    };

    var animateScrollLeft = function () {
        scrollLeft += 20;
        awardsListWrapper.scrollLeft(scrollLeft);
        timeout = setInterval(function () {
            if (scrollLeft < awardsListWidth - awardsListWrapperWidth) {
                scrollLeft += 20;
                rightFade.removeClass('no-fade');
            }
            else {
                scrollLeft = awardsListWidth - awardsListWrapperWidth;
                rightFade.addClass('no-fade');
            }
            if (scrollLeft > 0)
                leftFade.removeClass('no-fade');

            awardsListWrapper.scrollLeft(scrollLeft);
        }, 50);
    };

    var animateScrollRight = function () {
        scrollLeft -= 20;
        awardsListWrapper.scrollLeft(scrollLeft);
        timeout = setInterval(function () {
            if (scrollLeft > 0) {
                scrollLeft -= 20;
                leftFade.removeClass('no-fade');
            }
            else {
                scrollLeft = 0;
                leftFade.addClass('no-fade');
            }

            if (scrollLeft < awardsListWidth - awardsListWrapperWidth)
                rightFade.removeClass('no-fade');

            awardsListWrapper.scrollLeft(scrollLeft);
        }, 50);
    };

    var addHandlers = function () {
        // ReSharper disable StringLiteralTypo
        $('.awards-list-fade').on('mouseout', function () {
            clearInterval(timeout);
        });

        rightFade.on('mouseover', animateScrollLeft);

        leftFade.on('mouseover', animateScrollRight);

        awardsList.on('swipeleft', animateScrollLeft);

        awardsList.on('swiperight', animateScrollRight);

        awardsList.on('touchend mouseup mouseout', function () {
            clearInterval(timeout);
        });
        // ReSharper restore StringLiteralTypo
    };

    $(document).ready(function () {
        instantiateVariables();
        addHandlers();
    });

    $(window).resize(function () {
        instantiateVariables();
    });
})();
;

(function () {
    // used to change the radio values based on the gift type
    var giftForm = $('.portrait-gift-form');

    var giftTypeEnum = {
        'CREDIT CARD GIFT': {
            radio1Text: giftForm.data('gift-option-one-text'),
            radio1Value: giftForm.data('gift-option-one-value'),
            radio2Text: giftForm.data('gift-option-two-text'),
            radio2Value: giftForm.data('gift-option-two-value'),
            radio3Text: giftForm.data('gift-option-three-text'),
            radio3Value: giftForm.data('gift-option-three-value'),
            minimumAmount: giftForm.data('min-gift'),
            otherAmountHelpText: '' // assigned on load
        },
        'RECURRING GIFT': {
            radio1Text: giftForm.data('gift-option-one-text'),
            radio1Value: giftForm.data('gift-option-one-value'),
            radio2Text: giftForm.data('gift-option-two-text'),
            radio2Value: giftForm.data('gift-option-two-value'),
            radio3Text: giftForm.data('gift-option-three-text'),
            radio3Value: giftForm.data('gift-option-three-value'),
            minimumAmount: giftForm.data('min-gift'),
            otherAmountHelpText: '' // assigned on load
        },
        'GRANT': {
            radio1Text: giftForm.data('grant-option-one-text'),
            radio1Value: giftForm.data('grant-option-one-value'),
            radio2Text: giftForm.data('grant-option-two-text'),
            radio2Value: giftForm.data('grant-option-two-value'),
            radio3Text: giftForm.data('grant-option-three-text'),
            radio3Value: giftForm.data('grant-option-three-value'),
            minimumAmount: giftForm.data('min-grant'),
            otherAmountHelpText: '' // assigned on load
        }
    };

    var makeToutsSameHeight = function () {
        var toutRows = $('.portrait-program-row');

        toutRows.each(function () {
            var maxHeight = 0;
            var toutTitles = $('.portrait-program-title', this);

            toutTitles.css('height', 'initial');
            toutTitles.each(function () {
                var thisHeight = $(this).outerHeight();
                maxHeight = thisHeight > maxHeight ? thisHeight : maxHeight;
            });

            toutTitles.css('height', maxHeight + 'px');
        });
    };

    var makeGraphLegendsSameHeight = function () {
        var chartLegends = $('.portrait-financials-wrapper .chart-legend');
        chartLegends.css('height', 'initial');
        var maxHeight = 0;
        chartLegends.each(function (index) {
            var thisHeight = $(this).outerHeight();
            maxHeight = thisHeight > maxHeight ? thisHeight : maxHeight;
            if (index % 2) {
                $(this).css('height', maxHeight + 'px');
                $(chartLegends[index - 1]).css('height', maxHeight + 'px');
                maxHeight = 0;
            }
        });
    };

    var updateGiveRadioValues = function () {
        var selectedValue = $('.portrait-gift-form-select').val();
        var giftTypeEnumValue = giftTypeEnum[selectedValue];

        $('#MinimumAmount').val(giftTypeEnumValue.minimumAmount);
        $('#AmountRadio1').val(giftTypeEnumValue.radio1Value);
        $('label[for="AmountRadio1"]').text(giftTypeEnumValue.radio1Text);
        $('#AmountRadio2').val(giftTypeEnumValue.radio2Value);
        $('label[for="AmountRadio2"]').text(giftTypeEnumValue.radio2Text);
        $('#AmountRadio3').val(giftTypeEnumValue.radio3Value);
        $('label[for="AmountRadio3"]').text(giftTypeEnumValue.radio3Text);
        $('.other-amount-help-text').text(giftTypeEnumValue.otherAmountHelpText);
    };

    body.on('change', '.portrait-gift-form-select', function () {
        updateGiveRadioValues();
    });

    $('#DirectoryListingHero').on('mouseenter', '.directory-listing-social-logo', function () {
        var image = $(this);

        image.attr('src', image.data('logo-hover') || image.data('logo'));
    });

    $('#DirectoryListingHero').on('mouseleave', '.directory-listing-social-logo', function () {
        var image = $(this);

        image.attr('src', image.data('logo'));
    });

    // only run this on pages with this select
    if ($('.portrait-gift-form-select').length) {
        var helpTextElement = $('.other-amount-help-text');
        giftTypeEnum['CREDIT CARD GIFT'].otherAmountHelpText = helpTextElement.data('one-time-help-text') + ' $' + giftTypeEnum['CREDIT CARD GIFT'].minimumAmount;
        giftTypeEnum['RECURRING GIFT'].otherAmountHelpText = helpTextElement.data('one-time-help-text') + ' $' + giftTypeEnum['CREDIT CARD GIFT'].minimumAmount;
        giftTypeEnum['GRANT'].otherAmountHelpText = helpTextElement.data('grant-help-text') + ' $' + giftTypeEnum['GRANT'].minimumAmount;

        updateGiveRadioValues();

        makeToutsSameHeight();
        makeGraphLegendsSameHeight();

        $(window).resize(debounce(function () {
            makeToutsSameHeight();
            makeGraphLegendsSameHeight();
        }, 500));
    }
})();
;

(function () {
    $(document).ready(function () {
        var manageContentForm = $('#ManageContentForm');
        var allImageContainers = $('.manage-content-image-container', manageContentForm);
        var allInputs = $('.manage-input', manageContentForm);
        var contactInputs = $('.manage-contact-input', manageContentForm);
        var allIsApproved = $('.manage-checkbox-label', manageContentForm);
        var clearFieldsButtons = $('.clear-fields-button', manageContentForm);
        var isPreview = false;

        var readFile = function (file, onLoadCallback) {
            var reader = new FileReader();
            reader.onload = onLoadCallback;
            reader.readAsDataURL(file);
        };

        var getForm = function (sliderNumber, callback) {
            $.ajax({
                type: 'GET',
                dataType: 'html',
                url: '/umbraco/surface/manageContentSurface/getManageContentSliderImageAjaxForm?sliderNumber=' + sliderNumber,
                success: function (response) {
                    return callback(response);
                }
            });
        };

        clearFieldsButtons.on('click', function () {
            var container = $(this).closest('.manage-input-container');

            $('.manage-contact-input-container input', container).val('');

            var nameInput = $('.manage-content-contact-name input', container);
            $('.cascading-title', container).text(nameInput.attr('placeholder'));
        });

        allInputs.on('input', function () {
            var thisInput = $(this);
            var container = thisInput.closest('.manage-input-container');
            var originalValue = thisInput.closest('[data-original-value]').data('original-value');
            var originalIsApproved = thisInput.closest('[data-original-is-approved]').data('original-is-approved');
            var currentIsApproved = $('.manage-checkbox', container)[0].checked;

            if (thisInput.val() != originalValue && currentIsApproved)
                $('.manage-checkbox-label', container).click();
            else if (thisInput.val() == originalValue && currentIsApproved != (originalIsApproved == 'True'))
                $('.manage-checkbox-label', container).click();
        });

        contactInputs.on('input', function () {
            var thisInput = $(this);
            var contactContainer = thisInput.closest('.manage-input-container');
            var fieldContainer = thisInput.closest('.manage-contact-input-container');
            var originalIsApproved = contactContainer.data('original-is-approved');
            var originalValue = fieldContainer.data('original-value');
            var currentIsApproved = $('.manage-checkbox', contactContainer)[0].checked;

            if (thisInput.val() != originalValue && currentIsApproved)
                $('.manage-checkbox-label', contactContainer).click();
            else if (thisInput.val() == originalValue && currentIsApproved != (originalIsApproved == 'True'))
                $('.manage-checkbox-label', contactContainer).click();
        });

        allIsApproved.on('click', function () {
            $(this).closest('.manage-input-container').toggleClass('pending-approval');
        });

        allImageContainers.each(function () {
            var thisImageUrl = $('.content-url', this);
            var removeManageContentImage = $('.remove-manage-content-image', this);

            // clear the inputs in the event the image validation failed on the server side
            if ($('.manage-content-image-validation', this).hasClass('field-validation-error')) {
                thisImageUrl.val('');
                $('.content-image-file', this).val('');
                $('.manage-content-image-upload', this).val('');
                removeManageContentImage.addClass('hidden');
            }

            // if there was no validation error and the field has value, re-apply the background image and fileName
            if (thisImageUrl.val()) {
                var fileName = thisImageUrl.val();
                var encodedImage = $('.content-image-file', this).val();
                $('.upload-picture', this).addClass('picture-is-uploaded').css('background-image', 'url(' + encodedImage + ')');
                $('.manage-content-chosen', this).text(fileName.split('/').pop()).addClass('file-chosen');
                removeManageContentImage.removeClass('hidden');
            }
        });

        manageContentForm.on('change', '.manage-content-image-upload', function () {
            var thisElement = $(this);
            var parent = thisElement.closest('.manage-content-image-container');
            var fileName;
            if (thisElement.val()) {
                fileName = thisElement.val().replace(/^C:\\fakepath\\/i, '');
                $('.manage-content-chosen', parent).text(fileName).addClass('file-chosen');
                readFile(this.files[0], function (e) {
                    $('.upload-picture', parent).addClass('picture-is-uploaded').css('background-image', 'url(' + e.target.result + ')');
                    $('.content-url', parent).val(fileName);
                    $('.content-image-file', parent).val(e.target.result).trigger('focus').trigger('focusout');
                    $('.remove-manage-content-image', parent).removeClass('hidden');
                    $('.temp-image', parent).val(e.target.result);
                    $('.changed-status', parent).val('Dirty');
                    var sliderNumber = parent.data('slider-number');
                    getForm(sliderNumber, function (data) {
                        if (parent.hasClass('last-container')) {
                            $('.manage-content-slider-images').append(data);
                            parent.removeClass('last-container');
                        }
                        var newElement = $('.last-container');
                        $('.manage-checkbox-label', newElement).on('click', function () {
                            $(this).closest('.manage-input-container').toggleClass('pending-approval');
                        });
                    });
                });
            }

            // IsApproved
            var container = thisElement.closest('.manage-input-container');
            var originalValue = thisElement.closest('[data-original-value]').data('original-value');
            var originalIsApproved = thisElement.closest('[data-original-is-approved]').data('original-is-approved');
            var currentIsApproved = $('.manage-checkbox', container)[0].checked;

            if (fileName != originalValue && currentIsApproved)
                $('.manage-checkbox-label', container).click();
            else if (fileName == originalValue && currentIsApproved != (originalIsApproved == 'True'))
                $('.manage-checkbox-label', container).click();
        });

        manageContentForm.on('click', '.upload-picture', function (e) {
            var parent = $(this).closest('.manage-content-image-container');
            $('.manage-content-image-upload', parent).click();
            e.preventDefault();
            e.stopImmediatePropagation();
        });

        manageContentForm.on('click', '.manage-content-image-upload-label', function (e) {
            var parent = $(this).closest('.manage-content-image-container');
            $('.manage-content-image-upload', parent).click();
            e.preventDefault();
            e.stopImmediatePropagation();
        });

        manageContentForm.on('click', '.remove-manage-content-image', function () {
            var parent = $(this).closest('.manage-content-image-container');
            var image = $('.content-url', parent);
            $('.remove-manage-content-image', parent).addClass('hidden');
            $('.content-image-file', parent).val('');
            $('.deleted-image-url', parent).val(image.val());
            $('.upload-picture', parent).removeClass('picture-is-uploaded').css('background-image', 'none');
            $('.manage-content-chosen', parent).text('NO FILE CHOSEN').removeClass('file-chosen');
            $('.temp-image', parent).val('');
            $('.changed-status', parent).val('Dirty');
            $('.manage-content-image-upload', parent).val('');
            image.val('');

            // IsApproved
            var container = $(this).closest('.manage-input-container');
            var originalValue = container.data('original-value');
            var originalIsApproved = container.data('original-is-approved');
            var currentIsApproved = $('.manage-checkbox', container)[0].checked;

            if (!!originalValue && currentIsApproved)
                $('.manage-checkbox-label', container).click();
            else if (!originalValue && currentIsApproved != (originalIsApproved == 'True'))
                $('.manage-checkbox-label', container).click();
        });

        $('.manage-content-contacts').on('input', '.manage-content-contact-name input', function () {
            var value = $(this).val();
            if (!value)
                value = $(this).attr('placeholder');

            var parent = $(this).closest('.cascading-section');
            $('.cascading-title', parent).text(value);
        });

        $('.color-box').on('click', function () {
            var box = $(this);
            var color = box.val();
            var currentVal = $('#ShadeColor').val();
            $('.color-box').removeClass('picked-color');

            if (currentVal !== color) {
                box.addClass('picked-color');
                $('#ShadeColor').val(color);
            }
            else
                $('#ShadeColor').val('');
        });

        manageContentForm.on('click', '#MyPreview', function () {
            manageContentForm.attr('target', '_blank');
            isPreview = true;
        });

        manageContentForm.on('click', '#MySubmit', function () {
            manageContentForm.removeAttr('target');
            isPreview = false;
        });

        manageContentForm.submit(function () {
            if (!isPreview)
                $('#MySubmit').attr('disabled', true);
        });

        var previewPage = $('.manage-content-preview');

        if (previewPage.length > 0) {
            var allLinks = document.getElementsByTagName('A');

            for (var i = 0; i < allLinks.length; i++) {
                if (allLinks[i].href !== '#')
                    allLinks[i].href = 'javascript:return false';
            }

            $('.go-to-cart-link').removeClass('go-to-cart-link');
        }

        window.manageContentUpdateSuccess = function () {
            $('#ManageContentSuccess').css('display', 'block');
        };

        window.manageContentUpdateError = function (data) {
            alert(data);
        };
    });
})();
;

(function () {

    var page = $('#SearchPortraits');
    var portraitSearchResults = $('#SearchPortraitsResults');
    var isBackSubmit = localStorage.getItem('isBackButtonSubmit');
    var searchPortraitsForm = $('.search-portraits-form');

    //#region Date Pickers
    var dateFrom = $('#TransactionDateFrom', page);
    var dateTo = $('#TransactionDateTo', page);
    var datepickerOptions = {
        format: 'YYYY-MM-DD', // disables the time picker by not including any time component
        useCurrent: false // disable any date selection when opening the picker,
    };

    dateFrom.datetimepicker(datepickerOptions);
    dateTo.datetimepicker(datepickerOptions);

    /*  These two events tie the two pickers together by ensuring that the from date is never
     *  greater than the to date and that the to date is never less than the from date. --AEM
     *  Using .startOf('day') will truncated the time portion (automatically added) --AEM
     */
    dateFrom.on('dp.change', function (e) { dateTo.data('DateTimePicker').minDate(e.date.startOf('day')); });
    dateTo.on('dp.change', function (e) { dateFrom.data('DateTimePicker').maxDate(e.date.startOf('day')); });
    //#endregion

    $('.portraits-advanced-filter-button', page).on('click', function () {
        $(this).toggleClass('active');
        $('.portraits-advanced-filters').toggleClass('active');
    });

    if (isBackSubmit === "true") {
        var searchParameters = localStorage.getItem('sharedSearchParams') + '&' + 'IsBackSubmit=true';
        var more = localStorage.getItem('moreParams');
        var changedPage = localStorage.getItem('activePage');

        if (!changedPage)
            searchParameters = searchParameters + '&' + more;

        $.ajax({
            type: 'GET',
            dataType: 'html',
            url: '/umbraco/surface/searchPortraitsAjax/loadPortraits',
            traditional: true,
            data: searchParameters,
            success: function (jsonObject) {
                //convert response into jquery object and get index of form
                var form = $(jsonObject)[0];

                $('#OrganizationName').val(form.OrganizationName.value);
                $('#NTEEMajorGroup').val(form.NTEEMajorGroup.value);
                $('#NTEESubgroup').val(form.NTEESubgroup.value);
                $('#LegacyID').val(form.LegacyID.value);
                $('#InactivityStatusKey').val(form.InactivityStatusKey.value);
                $('#Coach').val(form.Coach.value);
                $('#NonprofitStage').val(form.NonprofitStage.value);
                $('#EIN').val(form.EIN.value);

                searchPortraitsSuccess(jsonObject);

                //reset when results have finished loading
                if (!changedPage) {
                    localStorage.setItem('isBackButtonSubmit', '');
                    localStorage.setItem('sharedSearchParams', '');
                }
                else {
                    //load new results page
                    $.ajax({
                        type: 'GET',
                        dataType: 'html',
                        url: changedPage,
                        success: function (newJsonObject) {
                            searchPortraitsSuccess(newJsonObject);
                            localStorage.setItem('isBackButtonSubmit', '');
                            localStorage.setItem('sharedSearchParams', '');
                        }
                    });
                }
            }
        });
    }

    searchPortraitsForm.on('change', '#NTEEMajorGroup', function () {
        localStorage.setItem('majorGroupSelected', 'true');

        var dropdown = $(this);
        var majorCode = dropdown.val();

        fillDropdown(majorCode);
        $('#NTEESubgroup').addClass('is-placeholder');
    });

    searchPortraitsForm.on('click', '#NTEESubgroup', function () {
        var dropdown = $(this);

        if (dropdown.val() === 0)
            $('#NTEESubgroup').addClass('is-placeholder');
    });

    function fillDropdown(code) {
        //NteeGroupList pulled from view
        var list = NteeGroupList.sort(sortByName);
        var selectElement = $('#NTEESubgroup');

        if (code === '')
            var filteredList = removeDuplicateNames(NteeGroupList, "NteeGroupName");

        else {
            filteredList = $.grep(list, function (x) {
                return (x.ParentNteeGroupCode === code);
            });
        }

        createOptions(selectElement, filteredList);
    }

    function sortByName(a, b) {
        if (a.NteeGroupName < b.NteeGroupName)
            return -1;
        if (a.NteeGroupName > b.NteeGroupName)
            return 1;
        return 0;
    }

    function createOptions(select, list) {
        select.find('option').remove();
        list.unshift({ NteeGroupCode: "0", NteeGroupName: "NTEE Subcategory" });
        for (var i = 0; i < list.length; i++) {
            var option = document.createElement('option');

            option.innerHTML = list[i];
            option.value = list[i].NteeGroupCode;
            option.text = list[i].NteeGroupName;
            select.append(option);
        }
    }

    function removeDuplicateNames(list, property) {
        var shortenedArray = [];
        var lookup = {};

        for (var i in list) {
            lookup[list[i][property]] = list[i];
        }

        for (i in lookup) {
            shortenedArray.push(lookup[i]);
        }

        return shortenedArray;
    }

    //add dash to EIN
    $('#EIN').on('input', function () {
        $(this).val($(this).val().replace(/(\d{2})\-?(\d{7})/, '$1-$2'))
    });

    $('#SearchPortraitsForm').on('click', '.blue-border-submit-button', function () {
        setTimeout(inputWrapperErrorStyle, 200);
    });

    $('#PopUpOverlayContent').on('click', '.close-pop-up', function () {
        HideModal(imageOverlay, imageOverlayContent);
        HidePopUpModal();
        return false;
    });

    //ordering results
    page.on('click', '.results-header', function (e) {
        var columnHeader = $(this);
        var orderByName = columnHeader.data('order');

        if (columnHeader.hasClass('closed') || columnHeader.hasClass('open')) {
            $('#IsDescending').attr('value', false);
            $('#OrderBy').attr('value', orderByName);
            submitPortraitOrderForm(e);
        }
        else {
            $('#IsDescending').attr('value', true);
            $('#OrderBy').attr('value', orderByName);
            submitPortraitOrderForm(e);
        }
    });

    $('.left-dashboard-internal-menu-link').on('click', function () {
        localStorage.setItem('sharedSearchParams', '');
        localStorage.setItem('moreParams', '');
        localStorage.setItem('isBackButtonSubmit', '');
        localStorage.setItem('majorGroupSelected', '');
        localStorage.setItem('activePage', '');
    });

    //save search parameters
    $('#SearchPortraitsButton').on('click', function () {
        var params = $('form#SearchPortraitsForm').serialize();

        localStorage.setItem('activePage', '');
        localStorage.setItem('isBackButtonSubmit', '');
        localStorage.setItem('sharedSearchParams', params);
    });

    window.setParams = function (orderBy, desc) {
        var moreParams = {
            OrderBy: orderBy,
            IsDescending: desc,
        };

        localStorage.setItem('moreParams', $.param(moreParams));
    }

    portraitSearchResults.on('click', '.search-pagination a', function (e) {
        var activePage = e.target.href;

        if (activePage === '')
            return;

        localStorage.setItem('moreParams', '');
        localStorage.setItem('activePage', activePage);

        e.stopPropagation();
        e.preventDefault();
        $.ajax({
            type: 'GET',
            dataType: 'html',
            url: activePage,
            success: function (jsonObject) {
                searchPortraitsSuccess(jsonObject);
            }
        });
    });

    page.on('click', '.export-button', function (e) {
        var $f = $(e.currentTarget).closest('form');
        var action = $f.attr('action');
        var formValues = '?' + $f.serialize() + '&Accept=text/csv';

        window.location.href = action + formValues;
    });

    window.submitPortraitOrderForm = function (e) {
        $('form#OrderPortraits').trigger('submit');
        e.preventDefault();
        e.stopImmediatePropagation();
        resetPagination();
    };

    window.searchPortraitsSuccess = function (jsonObject) {
        $('#SearchPortraitsResults').html(jsonObject);
        resetPagination();
        enableSubmit($('#SearchPortraitsForm'));
    };

    window.searchPortraitsError = function (jsonObject) {
        $('#SearchPortraitsResults').html(jsonObject);
        enableSubmit($('#SearchPortraitsForm'));
    };
    /*end global functions*/
})();
;

(function () {
    var shareButtons = $('.floating-share-buttons');

    if (shareButtons.length) {
        $(window).on('scroll', debounce(function () {
            if ($(window).scrollTop() > (window.innerHeight * 2))
                shareButtons.fadeIn();
            else
                shareButtons.fadeOut();
        }, 1000));
    }
})();

(function () {
    var header = $('.giving-event-header');

    if (!header.length)
        return;

    header.on('click', '[data-toggle-header]', function () {
        var expires = new Date();
        expires.setDate(expires.getDate() + 365); // expires in 1 year, should outlive the event

        var show = $(this).data('toggle-header');

        document.cookie = header.data('cookie-name') + '=' + show + '; expires=' + expires.toUTCString() + '; path=/';

        header.find('.giving-event-header-top, .giving-event-header-bottom').slideToggle();

        return false;
    });

    //#region Countdown
    var countdowns = header.find('[data-countdown]');
    var countdownInterval = null;

    countdowns.each(function (i, el) {
        var countdown = $(el);
        var countdownDate = moment.utc(countdown.data('countdown'));
        var daysElement = countdown.find('[data-countdown-part="days"]');
        var hoursElement = countdown.find('[data-countdown-part="hours"]');
        var minutesElement = countdown.find('[data-countdown-part="minutes"]');
        var secondsElement = countdown.find('[data-countdown-part="seconds"]');

        var updateCountdownElement = function (element, value, label) {
            if (!element.length)
                return;

            element.find('strong').text(value);
            element.find('span').text(label);

            if (element.data('hide') && value === 0)
                element.addClass('hidden');
        };

        var updateCountdown = function () {
            var milliseconds = countdownDate.diff(moment());

            if (milliseconds <= 0)
                clearInterval(countdownInterval);

            var seconds = Math.max(0, Math.floor(milliseconds / 1000) % 60);
            var minutes = Math.max(0, Math.floor(milliseconds / (1000 * 60)) % 60);
            var hours = Math.max(0, Math.floor(milliseconds / (1000 * 60 * 60)) % 24);
            var days = Math.max(0, Math.floor(milliseconds / (1000 * 60 * 60 * 24)));

            // ReSharper disable StringLiteralTypo
            updateCountdownElement(secondsElement, seconds, seconds === 1 ? 'SEC' : 'SECS');
            updateCountdownElement(minutesElement, minutes, minutes === 1 ? 'MIN' : 'MINS');
            updateCountdownElement(hoursElement, hours, hours === 1 ? 'HR' : 'HRS');
            updateCountdownElement(daysElement, days, days === 1 ? 'DAY' : 'DAYS');
            // ReSharper restore StringLiteralTypo
        };

        updateCountdown();
        countdownInterval = setInterval(updateCountdown, 1000);
    });
    //#endregion

    //#region Totals
    var totalsElement = header.find('[data-totals]');

    if (totalsElement.length) {
        var eventId = totalsElement.data('totals');
        var interval = totalsElement.data('totals-interval') || 10000;

        var loadTotals = function () {
            $.ajax({
                url: '/umbraco/surface/givingEventSurface/totals',
                data: { eventId: eventId },
                success: function (response) {
                    totalsElement.slideUp(150, function () {
                        totalsElement.html(response);
                        totalsElement.slideDown(150, function () {
                            if (interval > 0)
                                setTimeout(loadTotals, interval);
                        });
                    });
                }
            });
        };

        if (eventId)
            loadTotals();
    }
    //#endregion
})();

(function () {
    var givingEventSpiritSection = $('.giving-event-section.spirit-boxes-section');

    if (!givingEventSpiritSection.length)
        return;

    var currentPageNumber = 1;

    var loadSpirits = function (callback) {
        var categoryOption = givingEventSpiritSection.find('.spirit-box-category.active');
        // ReSharper disable once UnknownCssClass
        var isAll = categoryOption.hasClass('spirit-box-category-all');
        var categories = isAll ? givingEventSpiritSection.data('categories').split('|') : categoryOption.text().trim();
        var layout = givingEventSpiritSection.data('layout').split('|');
        var priorityIds = givingEventSpiritSection.data('priority-ids').split('|');
        var disableAutoFill = givingEventSpiritSection.data('disable-auto-fill');

        $.ajax({
            url: '/umbraco/surface/infoBoxSurface/loadMoreResults',
            data: {
                page: currentPageNumber,
                category: categories,
                layout: layout,
                priorityIds: priorityIds,
                disableAutoFill: disableAutoFill
            },
            cache: false,
            traditional: true,
            success: callback
        });
    }

    givingEventSpiritSection.on('click', '.spirit-box-load-more-button', function () {
        var button = $(this);

        ToggleLoadingBar(button.siblings());

        loadSpirits(function (data) {
            givingEventSpiritSection.find('.info-box-container').append(data);
            button.parent().remove(); // the data will contain a new button if we can load more again

            currentPageNumber++;
        });

        return false;
    });

    givingEventSpiritSection.on('click', '.spirit-box-category', function () {
        var categoryOption = $(this);

        if (categoryOption.hasClass('active'))
            return false;

        // Update the active indicator
        categoryOption.siblings().removeClass('active');
        categoryOption.addClass('active');

        // Reset the paging
        currentPageNumber = 0;

        loadSpirits(function (data) {
            givingEventSpiritSection.find('.info-box-container').html(data);
            currentPageNumber++;
        });

        return false;
    });
})();
;

(function () {
    window.setBetterTogetherCountdowns = function () {
        $('[data-bt-countdown]').each(function (i, el) {
            var countdownElement = $(el);

            if (countdownElement.data('bt-countdown-init'))
                return;

            countdownElement.data('bt-countdown-init', true);

            var countdownDate = moment.utc(countdownElement.data('bt-countdown'));
            var countdownInterval = null;

            var updateBetterTogetherCountdown = function () {
                var milliseconds = countdownDate.diff(moment());

                if (milliseconds <= 0)
                    clearInterval(countdownInterval);

                var seconds = Math.max(0, Math.floor(milliseconds / 1000) % 60);
                var minutes = Math.max(0, Math.floor(milliseconds / (1000 * 60)) % 60);
                var hours = Math.max(0, Math.floor(milliseconds / (1000 * 60 * 60)) % 24);
                var days = Math.max(0, Math.floor(milliseconds / (1000 * 60 * 60 * 24)));

                if (days > 1)
                    countdownElement.html(days + '<br />DAYS<br />LEFT');
                else if (days == 1)
                    countdownElement.html(days + '<br />DAY<br />LEFT');
                else if (hours > 1)
                    countdownElement.html(hours + '<br />HOURS<br />LEFT');
                else if (hours == 1)
                    countdownElement.html(hours + '<br />HOUR<br />LEFT');
                else if (minutes > 1)
                    countdownElement.html(minutes + '<br />MINS<br />LEFT');
                else if (minutes == 1)
                    countdownElement.html(minutes + '<br />MIN<br />LEFT');
                else if (seconds > 1)
                    countdownElement.html(seconds + '<br />SECS<br />LEFT');
                else if (seconds == 1)
                    countdownElement.html(seconds + '<br />SEC<br />LEFT');
                else
                    countdownElement.empty().fadeOut();
            };

            updateBetterTogetherCountdown();
            countdownInterval = setInterval(updateBetterTogetherCountdown, 1000);
            countdownElement.fadeIn(300);
        });
    };

    window.setBetterTogetherCountdowns();
})();;
