assets/javascripts/search.js (216 lines of code) (raw):
var queryInputFieldId = "query";
var mobileQueryInputFieldId = "mobilequery";
var allguides = new Array();
var guideClassName = "guide";
var multiguideClassName = "multiguide";
var elementsClassNames = new Array();
elementsClassNames.push('training');
elementsClassNames.push('latestguides');
elementsClassNames.push('guidegroup');
elementsClassNames.push('tagsbytopic');
elementsClassNames.push('guidesuggestion');
onload = function () {
var elements = document.getElementsByClassName(guideClassName);
for ( var i = 0; i < elements.length; i++ ) {
var element = elements[i];
var guide = { href: element.getAttribute('href'), title: element.text, tags: tagsAtGuide(element.parentNode) }; /* */
allguides.push(guide);
}
elements = document.getElementsByClassName(multiguideClassName);
for ( var i = 0; i < elements.length; i++ ) {
var element = elements[i];
var guide = { title: titleAtMultiguide(element), versions: versionsAtMultiguide(element) }; /* */
allguides.push(guide);
}
if ( document.getElementById(queryInputFieldId) ) {
var e = document.getElementById(queryInputFieldId);
e.oninput = onQueryChanged;
e.onpropertychange = e.oninput; // for IE8
}
if ( document.getElementById(mobileQueryInputFieldId) ) {
var e = document.getElementById(mobileQueryInputFieldId);
e.oninput = onQueryChanged;
e.onpropertychange = e.oninput; // for IE8
}
};
function hideElementsToDisplaySearchResults() {
for ( var i = 0; i < elementsClassNames.length; i++) {
var className = elementsClassNames[i];
hideElementsByClassName(className);
}
}
function showElementsToDisplaySearchResults() {
for (var i = 0; i < elementsClassNames.length; i++) {
var className = elementsClassNames[i];
showElementsByClassName(className);
}
}
function hideElementsByClassName(className) {
var elements = document.getElementsByClassName(className);
for ( var i = 0; i < elements.length; i++ ) {
var element = elements[i];
element.style.display = "none";
}
}
function showElementsByClassName(className) {
var elements = document.getElementsByClassName(className);
for ( var i = 0; i < elements.length; i++ ) {
var element = elements[i];
element.style.display = "block";
}
}
function titleAtMultiguide(element) {
for (var y = 0; y < element.childNodes.length; y++) {
if (element.childNodes[y].className == "title") {
return element.childNodes[y].textContent;
}
}
return '';
}
function versionsAtMultiguide(element) {
var versions = [];
for (var y = 0; y < element.childNodes.length; y++) {
if (element.childNodes[y].className === "align-left") {
var versionDiv = element.childNodes[y];
var verEl;
var hrefEl;
var tagsArr = [];
for (var x = 0; x < versionDiv.childNodes.length; x++) {
if (versionDiv.childNodes[x].className === "grailsVersion") {
verEl = versionDiv.childNodes[x].textContent
hrefEl = versionDiv.childNodes[x].getAttribute('href');
}
if (versionDiv.childNodes[x].className === "tag") {
var tag = versionDiv.childNodes[x];
tagsArr.push(tag.textContent);
}
}
versions.push({grailsVersion: verEl, href: hrefEl, tags: tagsArr})
}
}
return versions
}
function tagsAtGuide(element) {
var tags = new Array();
for (var y = 0; y < element.childNodes.length; y++) {
if (element.childNodes[y].className == "tag") {
var tag = element.childNodes[y];
tags.push(tag.textContent);
}
}
return tags;
}
function onQueryChanged() {
var query = queryValue();
const resultsDiv = document.getElementsByClassName("searchresults")
query = query.trim();
if ( query === '' ) {
showElementsToDisplaySearchResults();
resultsDiv[0].innerHTML = "";
return;
}
var matchingGuides = [];
if ( query !== '' ) {
for (var i = 0; i < allguides.length; i++) {
var guide = allguides[i];
if ( doesGuideMatchesQuery(guide, query) ) {
matchingGuides.push(guide);
}
}
}
if ( matchingGuides.length > 0 ) {
hideElementsToDisplaySearchResults();
var html = renderGuideGroup(matchingGuides, query);
resultsDiv[0].innerHTML = html;
} else {
resultsDiv[0].innerHTML = "<div class='guidegroup'><div class='guidegroupheader'><h2>No results found</h2></div></div>";
}
}
function doesTagsMatchesQuery(tags, query) {
for ( var x = 0; x < tags.length; x++) {
var tag = tags[x];
if (tag.toLowerCase().indexOf(query.toLowerCase()) !== -1) {
return true;
}
}
return false;
}
function doesTitleMatchesQuery(title, query) {
if (title.toLowerCase().indexOf(query.toLowerCase()) !== -1) {
return true;
}
}
function doesGuideMatchesQuery(guide, query) {
if (doesTitleMatchesQuery(guide.title, query)) {
return true;
}
if (guide.tags === undefined || guide.tags === null) {
for ( var i = 0; i < guide.versions.length; i++) {
var version = guide.versions[i];
if (doesTagsMatchesQuery(version.tags,query)) {
return true;
}
}
} else {
if (doesTagsMatchesQuery(guide.tags, query)) {
return true;
}
}
return false;
}
function queryValue() {
var value = document.getElementById(queryInputFieldId).value;
value = value.trim();
if ( value === '' ) {
if (document.getElementById(mobileQueryInputFieldId)) {
value = document.getElementById(mobileQueryInputFieldId).value;
value = value.trim();
return value;
}
}
return value;
}
function renderGuideGroup(guides, query) {
var html = "";
html += "<div class='guidegroup'>";
html += " <div class='guidegroupheader'>";
html += " <h2>Guides Filtered by: " + queryValue() + "</h2>";
html += " </div>";
html += " <ul>";
for ( var i = 0; i < guides.length; i++ ) {
html += " " + renderGuideAsHtmlLi(guides[i], query);
}
html += " </ul>";
html += "</div>";
return html;
}
function renderGuideAsHtmlLi(guide, query) {
var html = "<li>";
if (guide.tags === undefined || guide.tags === null) {
html += "<div class=\"multiguide\">";
html += "<span class=\"title\">" + guide.title + "</span>";
var titleMatched = doesTitleMatchesQuery(guide.title, query);
for (var i = 0; i < guide.versions.length; i++) {
var version = guide.versions[i];
var tagsMatched = doesTagsMatchesQuery(version.tags, query);
if (titleMatched || tagsMatched) {
html += "<div class=\"align-left\">";
html += "<a class=\"grailsVersion\" href=\""+version.href+"\">"+version.grailsVersion+"</a>"
for (var x = 0; x < version.tags.length; x++) {
var tag = version.tags[x];
html += "<span style='display: none' class='tag'>" + tag + "</span>";
}
html += "</div>";
}
}
html += "</div>";
} else {
html += "<a class='" + guideClassName + "' href='" + guide.href + "'>" + guide.title + "</a>";
for (var i = 0; i < guide.tags.length; i++) {
var tag = guide.tags[i];
html += "<span style='display: none' class='tag'>" + tag + "</span>";
}
}
html += "</li>"
return html;
}