/**
* Functionality specific to the UWM Web Identity theme.
*
* Provides helper functions to enhance the theme experience.
*/
( function( $ ) {
var body = $( 'body' ),
_window = $( window ),
searchstatus = false, // toggle status of search.
sitemenustatus = false, // toggle status of site menu.
moremenustatus = false; // toggle status of more menu.
/**
* Enables menu toggle for small screens.
*/
( function() {
var nav = $( '#site-navigation' ), button, menu;
if ( ! nav )
return;
button = nav.find( '.menu-toggle' );
if ( ! button )
return;
// Hide button if menu is missing or empty.
menu = nav.find( '.nav-menu' );
if ( ! menu || ! menu.children().length ) {
button.hide();
return;
}
$( '.menu-toggle' ).on( 'click.twentythirteen', function() {
if (moremenustatus == true) { // if more menu is toggled on, close it.
$('body').removeClass( 'moremenu-active' );
moremenustatus = false;
}
if (searchstatus == true) { // if search is toggled on, close it.
closeSearch();
searchstatus = false;
}
nav.toggleClass( 'toggled-on' );
if ($(nav).hasClass('toggled-on')) {
sitemenustatus = true;
} else {
sitemenustatus = false;
}
} );
$( '.menu-toggle-child' ).on( 'click.twentythirteen', function() {
$(this).parent().siblings().removeClass('child-toggled-on');
$(this).parent().siblings().find( 'li' ).removeClass('child-toggled-on');
$(this).parent().toggleClass( 'child-toggled-on' );
} );
} )();
/**
* Toggle more menu.
*/
$('.menu-more-toggle').click(function(event){
event.preventDefault();
if (sitemenustatus == true) { // if site menu is toggled on, close it.
$('nav').removeClass( 'toggled-on' );
sitemenustatus = false;
}
if (searchstatus == true) { // if search is toggled on, close it.
closeSearch();
searchstatus = false;
}
if( _window.width() < 959 ){
$('body').toggleClass('moremenu-active');
if ($('body').hasClass('moremenu-active')) {
moremenustatus = true;
} else {
moremenustatus = false;
}
} else {
$('.menu-more').slideToggle(200);
}
});
/**
* Toggle search field.
*/
$('.search-toggle').click(function(event) {
event.preventDefault();
if (sitemenustatus == true) { // if site menu is toggled on, close it.
$('nav').removeClass( 'toggled-on' );
sitemenustatus = false;
}
if (moremenustatus == true) { // if more menu is toggled on, close it.
$('body').removeClass( 'moremenu-active' );
moremenustatus = false;
}
$('.search-toggle a').toggleClass('toggled-on');
$('.search-form-wrapper').toggle();
if ($('.search-toggle a').hasClass('toggled-on')) {
$('.search-field').focus();
searchstatus = true;
} else {
$('.search-field').val('').blur();
searchstatus = false;
}
});
function closeSearch() {
$('.search-toggle a').removeClass('toggled-on');
$('.search-form-wrapper').hide();
$('.search-field').val('').blur();
searchstatus = false;
}
/**
* Makes "skip to content" link work correctly in IE9 and Chrome for better
* accessibility.
*
* @link http://www.nczonline.net/blog/2013/01/15/fixing-skip-to-content-links/
*/
_window.on( 'hashchange.twentythirteen', function() {
var element = document.getElementById( location.hash.substring( 1 ) );
if ( element ) {
if ( ! /^(?:a|select|input|button|textarea)$/i.test( element.tagName ) )
element.tabIndex = -1;
element.focus();
}
} );
/**
* Generates On This Page navigation.
*/
$('.entry-content h2').each(function(i,e){
$(this).attr('id','a'+i);
});
if ( $('.entry-content h2[id]').size() > 0 && $('#secondary').length > 0 ) {
var otp = '
On this page
';
$('.entry-content h2[id]').each(function(index, value){ otp = otp + '- '+$(this).text()+'
'; });
otp = otp + '
';
$('.entry-content').before(otp);
$('.widget_uwmwebid_onthispage_widget').prepend(otp);
$('.onthispage-nav a').on('click.twentythirteen', function() {
var elementClicked = $(this).attr("href");
var destination = $(elementClicked).offset().top;
$("html:not(:animated),body:not(:animated)").animate({ scrollTop: destination-20}, 500 );
return false;
});
} else {
$('.widget_uwmwebid_onthispage_widget').hide();
}
/**
* Show or hide back to top button.
*/
_window.scroll(function() {
if ($(this).scrollTop() > 200) {
$('.backtotop').fadeIn(200);
} else {
$('.backtotop').fadeOut(200);
}
});
/**
* Animate scroll to top.
*/
$('.backtotop').click(function(event){
event.preventDefault();
$('html, body').animate({scrollTop: 0}, 300);
});
/**
* Check for logotype top.
*/
if (!$('span').hasClass('logotype-top')) {
$('.logotype-bottom').closest('h2').addClass("no-logotype-top");
$('.footer-social').addClass("no-logotype-top");
}
} )( jQuery );
/**
* Navigation search.
*/
var input = document.getElementById('search-input');
var navSuggestions = document.getElementById('nav-suggestions');
var origQuery = '';
var suggestedQuery = '';
var query = '';
var highlightIndex = null;
var numSuggestions = 10;
var suggestionCount = 0;
var returnedFunction = debounce(function (query) {
// getSuggestions(query);
}, 100);
input.addEventListener('input', function (event) {
query = event.target.value;
returnedFunction(event.target.value);
origQuery = query;
});
input.addEventListener('keyup', function (e) {
if (e.key == "Escape") {
clearSuggestions();
input.blur();
input.value = origQuery;
highlightIndex = null;
}
});
input.addEventListener('keydown', function (e) {
if (e.key == 'ArrowDown') {
// loop through suggestions and add highlight class
if (highlightIndex === null) {
origQuery = query;
highlightIndex = 0;
} else {
highlightIndex += 1;
}
setTerm();
}
if (e.key == 'ArrowUp') {
highlightIndex -= 1;
setTerm();
}
});
input.addEventListener('focus', function () {
// getSuggestions(query);
});
function setTerm() {
var suggestionNodes = document.getElementById('nav-suggestions').childNodes;
suggestionNodes.forEach(function (n) {
return n.classList.remove("highlight");
});
if (highlightIndex < 0 || highlightIndex > suggestionCount - 1) {
highlightIndex = null;
query = origQuery;
} else {
var getHighlightedTerm = document.getElementById('nav-suggestions').childNodes[highlightIndex].innerHTML.trim();
document.getElementById('nav-suggestions').childNodes[highlightIndex].classList.add('highlight');
suggestedQuery = getHighlightedTerm;
query = getHighlightedTerm;
}
input.value = query;
}
function clearSuggestions() {
navSuggestions.style.display = 'none';
navSuggestions.innerHTML = '';
}
function getSuggestions(query) {
// https://search.uwm.edu/api/solr/uwm-main/suggest?suggest=true&suggest.build=false&suggest.dictionary=mySuggester&suggest.count=30&suggest.q=
axios.get('https://search.uwm.edu/api/solr/uwm-main/suggest', {
params: {
suggest: true,
'suggest.build': false,
'suggest.dictionary': 'mySuggester',
'suggest.count': 30,
'suggest.q': query
},
headers: {
'Authorization': 'Basic dXdtc2VhcmNoOkVBP0tEUEpUSjJzd0x4UUU='
}
}).then(function (response) {
var s = response.data.suggest.mySuggester[query].suggestions;
var terms = s.map(function (x) {
return x.term.toLowerCase();
});
function onlyUnique(value, index, self) {
return self.indexOf(value) === index;
}
var suggestions = terms.filter(onlyUnique);
if (suggestions) {
suggestionCount = suggestions.length;
displaySuggestions(suggestions);
}
}).catch(function (error) {
console.log('Error! Could not reach the API. ' + error);
});
}
function displaySuggestions(suggestions) {
// clear suggestions
clearSuggestions();
// limit suggestions
var limitSuggestions = suggestions.slice(0, numSuggestions);
// add new suggestions
limitSuggestions.forEach(function (s, index) {
navSuggestions.innerHTML += '' + s + '
';
});
navSuggestions.addEventListener('click', function (e) {
if (e.target !== e.currentTarget) {
var clickedItem = e.target;
submitForm(clickedItem.innerHTML);
}
e.stopPropagation();
});
// show suggestions
navSuggestions.style.display = 'block';
}
function submitForm(term) {
document.getElementById('search-input').value = term;
document.getElementById('nav-search').submit();
}
// Credit David Walsh (https://davidwalsh.name/javascript-debounce-function)
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
function debounce(func, wait, immediate) {
var timeout;
return function executedFunction() {
var context = this;
var args = arguments;
var later = function later() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
}