blob: b6e8a73221c307f2b04829da45685d35a565a3d9 [file] [log] [blame]
// 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();
});