| // TODO (long-term): Would be easier to manage all this state with React |
| |
| $( document ).ready(function() { |
| var expandText = "[+]"; |
| var closeText = "[-]"; |
| var selectAllKey = "all"; |
| var deselectAllKey = "none"; |
| |
| var defaultActiveTag = "fundamental"; |
| var activeTags = {}; |
| |
| var paramSize = function(paramHash) { |
| return Object.keys(paramHash).length; |
| } |
| |
| // "Lib" for acquiring parameters from the URL |
| var urlParamLib = function() { |
| function initParams() { |
| var sPageURL = decodeURIComponent(window.location.search.substring(1)), |
| sURLVariables = sPageURL.split('&'), |
| sParameterName, |
| i; |
| |
| var paramHash = {}; |
| for (i = 0; i < sURLVariables.length; i++) { |
| sParameterName = sURLVariables[i].split('='); |
| if (sParameterName[0] != "") |
| paramHash[sParameterName[0]] = sParameterName[1]; |
| } |
| |
| if (paramSize(paramHash) == 0) { |
| paramHash[defaultActiveTag] = true; |
| } |
| |
| return paramHash; |
| } |
| |
| function updateParams(paramHash) { |
| var urlWithoutQuery = window.location.href.split('?')[0]; |
| var urlHash = window.location.hash; |
| window.history.pushState(null,null, urlWithoutQuery + "?" + $.param(paramHash) + window.location.hash); |
| } |
| |
| return { |
| initParams: initParams, |
| updateParams: updateParams, |
| }; |
| }(); |
| |
| var initClickFunctions = function() { |
| |
| var deactivateTagTerms = function(elt) { |
| var targetTag = elt.data("target"); |
| var targetClass = "." + targetTag; |
| var tagName = targetTag.split('tag-')[1]; |
| |
| elt.removeClass("active-tag"); |
| $(targetClass).each(function(){ |
| var showCount = $(this).data("show-count"); |
| var newShowCount = showCount - 1; |
| $(this).data("show-count", newShowCount); |
| if (newShowCount < 1) { |
| $(this).addClass("hide"); |
| } |
| }); |
| delete activeTags[tagName]; |
| }; |
| |
| var activateTagTerms = function(elt) { |
| var targetTag = elt.data("target"); |
| var targetClass = "." + targetTag; |
| var tagName = targetTag.split('tag-')[1]; |
| |
| elt.addClass("active-tag"); |
| $(targetClass).each(function(){ |
| var showCount = $(this).data("show-count"); |
| var newShowCount = showCount + 1; |
| $(this).data("show-count", newShowCount); |
| if (newShowCount > 0) { |
| $(this).removeClass("hide"); |
| } |
| }); |
| activeTags[tagName] = true; |
| if (activeTags[deselectAllKey]) { |
| delete activeTags[deselectAllKey]; |
| } |
| }; |
| |
| // Shows/hides glossary terms when their relevant tags are clicked |
| $(".canonical-tag").each(function(){ |
| var placeholder = $("#placeholder"); |
| var targetTag = $(this).data("target"); |
| $(this).mouseenter(function(){ |
| var tagDescription = $("#" + targetTag + "-description").html(); |
| placeholder.html(tagDescription); |
| placeholder.removeClass('invisible'); |
| }).mouseleave(function(){ |
| placeholder.addClass('invisible'); |
| }); |
| |
| $(this).click(function(){ |
| var shouldHide = $(this).hasClass("active-tag"); |
| if (shouldHide) { |
| deactivateTagTerms($(this)); |
| } else { |
| activateTagTerms($(this)); |
| } |
| urlParamLib.updateParams(activeTags); |
| }); |
| }); |
| |
| // Adds functionality to "select all tags" link |
| $("#select-all-tags").click(function(){ |
| $(".canonical-tag").each(function(){ |
| var shouldActivate = !$(this).hasClass("active-tag"); |
| if (shouldActivate) { |
| activateTagTerms($(this)); |
| } |
| }); |
| queryParams = {} |
| queryParams[selectAllKey] = true; |
| urlParamLib.updateParams(queryParams); |
| }); |
| |
| // Adds functionality to "deselect all tags" link |
| $("#deselect-all-tags").click(function(){ |
| $(".canonical-tag").each(function(){ |
| var shouldHide = $(this).hasClass("active-tag"); |
| if (shouldHide) { |
| deactivateTagTerms($(this)); |
| } |
| }); |
| queryParams = {} |
| queryParams[deselectAllKey] = true; |
| urlParamLib.updateParams(queryParams); |
| }); |
| |
| // Expands/hides glossary term definitions when [+] button is clicked |
| $(".click-controller").each(function(){ |
| $(this).click(function() { |
| var targetId = $(this).data("target"); |
| var shouldExpand = $(this).html() == expandText; |
| |
| if (shouldExpand) { |
| $("#" + targetId).removeClass('hide'); |
| $(this).html(closeText); |
| } else { |
| $("#" + targetId).addClass('hide'); |
| $(this).html(expandText); |
| } |
| }); |
| }); |
| |
| // Shows permalink when term name is hovered over |
| $(".term-name").each(function() { |
| var permalink = $($(this).parent().find(".permalink")[0]); |
| $(this).mouseenter(function(){ |
| permalink.removeClass("hide"); |
| }).mouseleave(function(){ |
| permalink.addClass("hide"); |
| });; |
| }); |
| }; |
| |
| function initActiveTags() { |
| if (activeTags[selectAllKey]) { |
| $("#select-all-tags").click(); |
| } else if (activeTags[deselectAllKey]) { |
| $("#deselect-all-tags").click(); |
| } else { |
| for (var tagId in activeTags) { |
| $("#tag-" + tagId).find("a")[0].click(); |
| } |
| } |
| } |
| |
| initClickFunctions(); |
| activeTags = urlParamLib.initParams(); |
| initActiveTags(); |
| |
| }); |