2015-10-06 07:13:51 +00:00
|
|
|
var main = window.main || {};
|
|
|
|
|
|
|
|
main.mapShareKey = 'map-shares';
|
|
|
|
|
2015-10-15 04:26:22 +00:00
|
|
|
main.ga = window.ga || function() {};
|
|
|
|
|
2016-01-25 04:46:21 +00:00
|
|
|
main = (function(main, global) {
|
|
|
|
const { Mousetrap } = global;
|
2015-10-16 18:57:33 +00:00
|
|
|
|
2015-10-16 23:10:45 +00:00
|
|
|
// should be set before gitter script loads
|
2015-10-16 18:57:33 +00:00
|
|
|
((window.gitter = {}).chat = {}).options = {
|
|
|
|
disableDefaultChat: true
|
|
|
|
};
|
|
|
|
// wait for sidecar to load
|
|
|
|
|
|
|
|
main.chat = {};
|
|
|
|
main.chat.isOpen = false;
|
|
|
|
main.chat.createHelpChat = function createHelpChat() {
|
|
|
|
throw new Error('Sidecar chat has not initialized');
|
|
|
|
};
|
|
|
|
|
|
|
|
document.addEventListener('gitter-sidecar-ready', function(e) {
|
|
|
|
main.chat.GitterChat = e.detail.Chat;
|
|
|
|
|
2015-10-16 23:10:45 +00:00
|
|
|
main.chat.createHelpChat = function(room, helpChatBtnClass, roomTitle) {
|
2016-01-15 08:55:08 +00:00
|
|
|
// room is always in PascalCase
|
|
|
|
roomTitle = room
|
|
|
|
.replace(/([A-Z])/g, ' $1')
|
|
|
|
.replace('Java Script', 'JavaScript');
|
2015-10-16 20:28:53 +00:00
|
|
|
|
|
|
|
$('body').append(
|
|
|
|
'<aside id="chat-embed-help" class="gitter-chat-embed is-collapsed" />'
|
|
|
|
);
|
|
|
|
|
2015-10-16 18:57:33 +00:00
|
|
|
main.chat.helpChat = new main.chat.GitterChat({
|
2016-01-15 08:55:08 +00:00
|
|
|
room: `freecodecamp/${room}`,
|
2015-10-16 20:28:53 +00:00
|
|
|
activationElement: false,
|
|
|
|
targetElement: $('#chat-embed-help')
|
2015-10-16 18:57:33 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
$(helpChatBtnClass).on('click', function() {
|
2015-10-16 22:00:26 +00:00
|
|
|
// is button already pressed?
|
|
|
|
// no? open chat
|
|
|
|
// yes? close chat
|
|
|
|
var shouldChatBeOpen = !$(this).hasClass('active');
|
|
|
|
main.chat.helpChat.toggleChat(shouldChatBeOpen);
|
|
|
|
if (shouldChatBeOpen) {
|
|
|
|
$(helpChatBtnClass).addClass('active');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2015-10-16 23:10:45 +00:00
|
|
|
var helpTitleAdd = false;
|
2015-10-16 22:00:26 +00:00
|
|
|
$('#chat-embed-help').on('gitter-chat-toggle', function(e) {
|
|
|
|
var shouldButtonBePressed = !!e.originalEvent.detail.state;
|
2015-10-16 23:10:45 +00:00
|
|
|
|
|
|
|
if (!helpTitleAdd) {
|
|
|
|
helpTitleAdd = true;
|
|
|
|
$('#chat-embed-help > .gitter-chat-embed-action-bar').prepend(
|
|
|
|
'<div class="chat-embed-main-title">' +
|
|
|
|
'<span>' +
|
|
|
|
roomTitle +
|
|
|
|
'</span>' +
|
|
|
|
'</div>'
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2015-10-16 22:00:26 +00:00
|
|
|
if (shouldButtonBePressed) {
|
|
|
|
return $(helpChatBtnClass).addClass('active');
|
|
|
|
}
|
|
|
|
return $(helpChatBtnClass).removeClass('active');
|
2015-10-16 18:57:33 +00:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2015-10-16 20:28:53 +00:00
|
|
|
$('body').append(
|
|
|
|
'<aside id="chat-embed-main" class="gitter-chat-embed is-collapsed" />'
|
|
|
|
);
|
|
|
|
|
2015-10-16 18:57:33 +00:00
|
|
|
main.chat.mainChat = new main.chat.GitterChat({
|
|
|
|
room: 'freecodecamp/freecodecamp',
|
2015-10-16 20:28:53 +00:00
|
|
|
activationElement: false,
|
|
|
|
targetElement: $('#chat-embed-main')
|
2015-10-16 18:57:33 +00:00
|
|
|
});
|
|
|
|
|
2015-10-16 23:10:45 +00:00
|
|
|
var mainChatTitleAdded = false;
|
|
|
|
$('#chat-embed-main').on('gitter-chat-toggle', function() {
|
|
|
|
if (mainChatTitleAdded) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
mainChatTitleAdded = true;
|
|
|
|
|
|
|
|
$('#chat-embed-main > .gitter-chat-embed-action-bar').prepend(
|
|
|
|
'<div class="chat-embed-main-title">' +
|
|
|
|
'<span>Free Code Camp\'s Main Chat</span>' +
|
|
|
|
'</div>'
|
|
|
|
);
|
2016-03-03 04:54:14 +00:00
|
|
|
return null;
|
2015-10-16 23:10:45 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
|
2016-04-13 02:28:48 +00:00
|
|
|
$('#nav-chat-btn').on('click', function(event) {
|
|
|
|
if (!(event.ctrlKey || event.metaKey)) {
|
|
|
|
toggleMainChat();
|
|
|
|
}
|
|
|
|
});
|
2015-10-16 18:57:33 +00:00
|
|
|
|
2016-01-24 21:14:26 +00:00
|
|
|
function showMainChat() {
|
|
|
|
if (!main.chat.isOpen) {
|
2015-10-16 20:28:53 +00:00
|
|
|
main.chat.mainChat.toggleChat(true);
|
|
|
|
}
|
2016-01-24 21:14:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function collapseMainChat() {
|
|
|
|
$('#chat-embed-main').addClass('is-collapsed');
|
2016-02-07 09:51:57 +00:00
|
|
|
document.activeElement.blur();
|
2016-01-24 21:14:26 +00:00
|
|
|
}
|
|
|
|
|
2016-02-07 09:51:57 +00:00
|
|
|
function toggleMainChat() {
|
2016-01-24 21:14:26 +00:00
|
|
|
var isCollapsed = $('#chat-embed-main').hasClass('is-collapsed');
|
|
|
|
|
|
|
|
if (isCollapsed) {
|
|
|
|
showMainChat();
|
|
|
|
} else {
|
|
|
|
collapseMainChat();
|
|
|
|
}
|
2016-02-07 09:51:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// keyboard shortcuts: open main chat
|
|
|
|
Mousetrap.bind('g c', toggleMainChat);
|
2015-10-16 18:57:33 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
return main;
|
2016-01-25 04:46:21 +00:00
|
|
|
}(main, window));
|
2015-10-16 18:57:33 +00:00
|
|
|
|
2015-09-29 02:47:45 +00:00
|
|
|
var lastCompleted = typeof lastCompleted !== 'undefined' ?
|
|
|
|
lastCompleted :
|
|
|
|
'';
|
2015-09-22 20:17:48 +00:00
|
|
|
|
2015-11-18 05:25:16 +00:00
|
|
|
main.getMapShares = function getMapShares() {
|
2015-10-06 07:13:51 +00:00
|
|
|
var alreadyShared = JSON.parse(
|
|
|
|
localStorage.getItem(main.mapShareKey) ||
|
|
|
|
'[]'
|
|
|
|
);
|
|
|
|
|
2015-09-22 20:17:48 +00:00
|
|
|
if (!alreadyShared || !Array.isArray(alreadyShared)) {
|
2015-10-06 07:13:51 +00:00
|
|
|
localStorage.setItem(main.mapShareKey, JSON.stringify([]));
|
2015-09-22 20:17:48 +00:00
|
|
|
alreadyShared = [];
|
|
|
|
}
|
|
|
|
return alreadyShared;
|
2015-11-18 05:25:16 +00:00
|
|
|
};
|
2015-09-22 20:17:48 +00:00
|
|
|
|
2015-11-18 05:25:16 +00:00
|
|
|
main.setMapShare = function setMapShare(id) {
|
|
|
|
var alreadyShared = main.getMapShares();
|
2015-09-22 20:17:48 +00:00
|
|
|
var found = false;
|
|
|
|
alreadyShared.forEach(function(_id) {
|
|
|
|
if (_id === id) {
|
|
|
|
found = true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
if (!found) {
|
|
|
|
alreadyShared.push(id);
|
|
|
|
}
|
2015-10-06 07:13:51 +00:00
|
|
|
localStorage.setItem(main.mapShareKey, JSON.stringify(alreadyShared));
|
2015-09-22 20:17:48 +00:00
|
|
|
return alreadyShared;
|
2015-11-18 05:25:16 +00:00
|
|
|
};
|
2015-09-22 20:17:48 +00:00
|
|
|
|
2014-10-18 02:23:53 +00:00
|
|
|
$(document).ready(function() {
|
2015-09-17 07:18:43 +00:00
|
|
|
|
2015-03-29 11:39:41 +00:00
|
|
|
var CSRF_HEADER = 'X-CSRF-Token';
|
|
|
|
|
|
|
|
var setCSRFToken = function(securityToken) {
|
|
|
|
jQuery.ajaxPrefilter(function(options, _, xhr) {
|
|
|
|
if (!xhr.crossDomain) {
|
|
|
|
xhr.setRequestHeader(CSRF_HEADER, securityToken);
|
2015-03-11 15:03:56 +00:00
|
|
|
}
|
|
|
|
});
|
2015-03-29 11:39:41 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
setCSRFToken($('meta[name="csrf-token"]').attr('content'));
|
|
|
|
|
2015-11-07 00:35:57 +00:00
|
|
|
$('img').error(function() {
|
|
|
|
$(this)
|
|
|
|
.unbind('error')
|
|
|
|
.attr(
|
|
|
|
'src',
|
|
|
|
'https://s3.amazonaws.com/freecodecamp/camper-image-placeholder.png'
|
|
|
|
);
|
2015-04-13 06:41:42 +00:00
|
|
|
});
|
|
|
|
|
2015-08-01 02:51:21 +00:00
|
|
|
function upvoteHandler(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
var upvoteBtn = this;
|
|
|
|
var id = upvoteBtn.id;
|
|
|
|
var upVotes = $(upvoteBtn).data().upVotes;
|
|
|
|
var username = typeof username !== 'undefined' ? username : '';
|
2015-03-29 11:39:41 +00:00
|
|
|
var alreadyUpvoted = false;
|
|
|
|
for (var i = 0; i < upVotes.length; i++) {
|
2015-08-01 02:51:21 +00:00
|
|
|
if (upVotes[i].upVotedBy === username) {
|
2015-03-29 11:39:41 +00:00
|
|
|
alreadyUpvoted = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!alreadyUpvoted) {
|
2015-08-01 02:51:21 +00:00
|
|
|
$.post('/stories/upvote', { id: id })
|
2015-11-07 00:35:57 +00:00
|
|
|
.fail(function() {
|
2015-08-01 02:51:21 +00:00
|
|
|
$(upvoteBtn).bind('click', upvoteHandler);
|
2015-03-29 11:39:41 +00:00
|
|
|
})
|
2015-11-07 00:35:57 +00:00
|
|
|
.done(function(data) {
|
|
|
|
$(upvoteBtn)
|
|
|
|
.text('Upvoted!')
|
|
|
|
.addClass('disabled');
|
2015-03-29 11:39:41 +00:00
|
|
|
|
2015-11-07 00:35:57 +00:00
|
|
|
$('#storyRank').text(data.rank + ' points');
|
2015-03-29 11:39:41 +00:00
|
|
|
});
|
|
|
|
}
|
2015-11-07 00:35:57 +00:00
|
|
|
}
|
|
|
|
|
2015-08-01 02:51:21 +00:00
|
|
|
$('#story-list').on('click', 'button.btn-upvote', upvoteHandler);
|
2015-01-28 07:22:12 +00:00
|
|
|
|
2015-03-29 11:39:41 +00:00
|
|
|
var storySubmitButtonHandler = function storySubmitButtonHandler() {
|
2015-03-03 13:03:33 +00:00
|
|
|
|
2015-12-05 03:23:06 +00:00
|
|
|
if (!$('#story-submission-form')[0].checkValidity()) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2015-03-29 11:39:41 +00:00
|
|
|
var link = $('#story-url').val();
|
|
|
|
var headline = $('#story-title').val();
|
|
|
|
var description = $('#description-box').val();
|
2015-11-07 00:35:57 +00:00
|
|
|
var data = {
|
|
|
|
data: {
|
|
|
|
link: link,
|
|
|
|
headline: headline,
|
|
|
|
timePosted: Date.now(),
|
|
|
|
description: description,
|
|
|
|
storyMetaDescription: main.storyMetaDescription,
|
|
|
|
rank: 1,
|
|
|
|
image: main.storyImage
|
|
|
|
}
|
|
|
|
};
|
2015-04-19 07:36:54 +00:00
|
|
|
|
2015-03-29 11:39:41 +00:00
|
|
|
$('#story-submit').unbind('click');
|
2016-03-03 04:54:14 +00:00
|
|
|
return $.post('/stories/', data)
|
2015-11-07 00:35:57 +00:00
|
|
|
.fail(function() {
|
2015-03-29 11:39:41 +00:00
|
|
|
$('#story-submit').bind('click', storySubmitButtonHandler);
|
|
|
|
})
|
2016-01-13 06:07:19 +00:00
|
|
|
.done(function({ storyLink, isBanned }) {
|
|
|
|
if (isBanned) {
|
|
|
|
window.location = '/news';
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
window.location = '/stories/' + storyLink;
|
2016-03-03 04:54:14 +00:00
|
|
|
return null;
|
2015-03-29 11:39:41 +00:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
$('#story-submit').on('click', storySubmitButtonHandler);
|
2015-09-22 20:17:48 +00:00
|
|
|
|
|
|
|
|
|
|
|
// map sharing
|
2015-11-18 05:25:16 +00:00
|
|
|
var alreadyShared = main.getMapShares();
|
2015-09-29 02:47:45 +00:00
|
|
|
|
|
|
|
if (lastCompleted && alreadyShared.indexOf(lastCompleted) === -1) {
|
|
|
|
$('div[id="' + lastCompleted + '"]')
|
|
|
|
.parent()
|
|
|
|
.parent()
|
|
|
|
.removeClass('hidden');
|
|
|
|
}
|
2015-09-22 20:17:48 +00:00
|
|
|
|
|
|
|
// on map view
|
|
|
|
$('.map-challenge-block-share').on('click', function(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
var challengeBlockName = $(this).children().attr('id');
|
|
|
|
var challengeBlockEscapedName = challengeBlockName.replace(/\s/, '%20');
|
2015-09-29 02:47:45 +00:00
|
|
|
var username = typeof window.username !== 'undefined' ?
|
|
|
|
window.username :
|
|
|
|
'';
|
2015-09-22 20:17:48 +00:00
|
|
|
|
|
|
|
var link = 'https://www.facebook.com/dialog/feed?' +
|
|
|
|
'app_id=1644598365767721' +
|
|
|
|
'&display=page&' +
|
2015-09-29 02:04:44 +00:00
|
|
|
'caption=I%20just%20completed%20the%20' +
|
2015-09-22 20:17:48 +00:00
|
|
|
challengeBlockEscapedName +
|
2015-09-29 03:05:22 +00:00
|
|
|
'%20section%20on%20Free%20Code%20Camp%2E' +
|
2015-09-29 02:04:44 +00:00
|
|
|
'&link=http%3A%2F%2Ffreecodecamp%2Ecom%2F' +
|
|
|
|
username +
|
|
|
|
'&redirect_uri=http%3A%2F%2Ffreecodecamp%2Ecom%2Fmap';
|
2015-09-29 02:47:45 +00:00
|
|
|
|
2015-11-18 05:25:16 +00:00
|
|
|
main.setMapShare(challengeBlockName);
|
|
|
|
window.ga('send', 'event', 'FB_LINK', 'SHARE', 'Facebook map share');
|
2015-09-22 20:17:48 +00:00
|
|
|
window.location.href = link;
|
|
|
|
});
|
2016-01-13 06:26:19 +00:00
|
|
|
|
2016-01-26 10:54:56 +00:00
|
|
|
function expandCaret(item) {
|
|
|
|
$(item)
|
|
|
|
.prev().find('.fa-caret-right')
|
|
|
|
.removeClass('fa-caret-right').addClass('fa-caret-down');
|
|
|
|
}
|
|
|
|
|
|
|
|
function collapseCaret(item) {
|
|
|
|
$(item)
|
|
|
|
.prev().find('.fa-caret-down')
|
|
|
|
.removeClass('fa-caret-down').addClass('fa-caret-right');
|
|
|
|
}
|
|
|
|
|
|
|
|
function expandBlock(item) {
|
2016-03-17 03:13:08 +00:00
|
|
|
$(item).addClass('in').css('height', 'auto');
|
2016-01-26 10:54:56 +00:00
|
|
|
expandCaret(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
function collapseBlock(item) {
|
2016-03-17 03:13:08 +00:00
|
|
|
$(item).removeClass('in').css('height', 'auto');
|
2016-01-26 10:54:56 +00:00
|
|
|
collapseCaret(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
$.each($('.sr-only'), function(i, span) {
|
|
|
|
if ($(span).text() === ' Complete') {
|
|
|
|
$(span).parents('p').addClass('manip-hidden');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
$.each($('.map-collapse'), function(i, div) {
|
|
|
|
if ($(div).find('.manip-hidden').length ===
|
|
|
|
$(div).find('p').length) {
|
|
|
|
collapseBlock(div);
|
2016-02-01 17:02:20 +00:00
|
|
|
$(div).prev('h3').addClass('faded');
|
2016-01-26 10:54:56 +00:00
|
|
|
$(div).prev('h2').addClass('faded');
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2016-01-19 09:08:46 +00:00
|
|
|
var scrollTo, dashedName = localStorage.getItem('currentDashedName'),
|
|
|
|
elemsToSearch = $('p.padded-ionic-icon a'), currOrLastChallenge;
|
|
|
|
if (!dashedName && $('.sr-only').length) {
|
|
|
|
elemsToSearch = $('.sr-only');
|
|
|
|
}
|
|
|
|
|
|
|
|
currOrLastChallenge = elemsToSearch.filter(function() {
|
|
|
|
if (dashedName) {
|
|
|
|
return $(this).attr('href').match(dashedName);
|
2016-01-16 18:31:42 +00:00
|
|
|
}
|
2016-01-19 09:08:46 +00:00
|
|
|
return $(this).text() === ' Complete';
|
|
|
|
});
|
|
|
|
|
|
|
|
if (currOrLastChallenge.length) {
|
|
|
|
currOrLastChallenge = currOrLastChallenge[currOrLastChallenge.length - 1];
|
|
|
|
scrollTo = $(currOrLastChallenge).offset().top - 380;
|
|
|
|
$('html, body, .map-accordion').scrollTop(scrollTo);
|
2016-01-16 17:30:47 +00:00
|
|
|
}
|
|
|
|
|
2016-01-18 22:47:51 +00:00
|
|
|
if (String(window.location).match(/\/map$/ig)) {
|
2016-02-10 21:56:53 +00:00
|
|
|
$('body>.flashMessage').find('.alert').css('display', 'none');
|
2016-01-19 06:59:05 +00:00
|
|
|
$('.map-fixed-header').css('top', '50px');
|
2016-01-18 22:47:51 +00:00
|
|
|
}
|
|
|
|
|
2016-01-31 21:09:43 +00:00
|
|
|
// map global selectors
|
|
|
|
var mapFilter = $('#map-filter');
|
|
|
|
var mapShowAll = $('#showAll');
|
|
|
|
|
2016-04-13 02:28:48 +00:00
|
|
|
$('#nav-map-btn').on('click', function(event) {
|
|
|
|
if (!(event.ctrlKey || event.metaKey)) {
|
|
|
|
toggleMap();
|
|
|
|
}
|
|
|
|
});
|
2016-01-24 21:14:26 +00:00
|
|
|
|
|
|
|
$('.map-aside-action-collapse').on('click', collapseMap);
|
|
|
|
|
|
|
|
function showMap() {
|
2016-01-13 23:35:39 +00:00
|
|
|
if (!main.isMapAsideLoad) {
|
2016-04-08 22:13:41 +00:00
|
|
|
var mapAside = $('<iframe id = "map-aside-frame" >');
|
2016-02-13 02:11:01 +00:00
|
|
|
mapAside.attr({
|
|
|
|
src: '/map-aside',
|
2016-03-04 00:00:47 +00:00
|
|
|
frameBorder: '0'
|
2016-02-14 02:26:59 +00:00
|
|
|
});
|
2016-03-04 00:00:47 +00:00
|
|
|
$('.map-aside').append(mapAside);
|
2016-01-13 23:35:39 +00:00
|
|
|
main.isMapAsideLoad = true;
|
|
|
|
}
|
2016-01-13 06:26:19 +00:00
|
|
|
$('.map-aside').removeClass('is-collapsed');
|
2016-01-24 21:14:26 +00:00
|
|
|
}
|
2016-01-13 06:26:19 +00:00
|
|
|
|
2016-01-24 21:14:26 +00:00
|
|
|
function collapseMap() {
|
2016-01-13 06:26:19 +00:00
|
|
|
$('.map-aside').addClass('is-collapsed');
|
2016-02-07 09:51:57 +00:00
|
|
|
document.activeElement.blur();
|
|
|
|
}
|
|
|
|
|
|
|
|
function toggleMap() {
|
|
|
|
var isCollapsed = $('.map-aside').hasClass('is-collapsed');
|
|
|
|
if (isCollapsed) {
|
|
|
|
showMap();
|
|
|
|
} else {
|
|
|
|
collapseMap();
|
|
|
|
}
|
2016-01-24 21:14:26 +00:00
|
|
|
}
|
2016-01-16 09:03:22 +00:00
|
|
|
|
2016-04-13 02:28:48 +00:00
|
|
|
$('#nav-wiki-btn').on('click', function(event) {
|
|
|
|
if (!(event.ctrlKey || event.metaKey)) {
|
|
|
|
toggleWiki();
|
|
|
|
}
|
|
|
|
});
|
2016-02-09 20:44:08 +00:00
|
|
|
|
|
|
|
$('.wiki-aside-action-collapse').on('click', collapseWiki);
|
|
|
|
|
|
|
|
function showWiki() {
|
|
|
|
if (!main.isWikiAsideLoad) {
|
2016-02-10 04:57:23 +00:00
|
|
|
var lang = window.location.toString().match(/\/\w{2}\//);
|
|
|
|
lang = (lang) ? lang[0] : '/en/';
|
2016-03-17 13:48:36 +00:00
|
|
|
var wikiURL = '//freecodecamp.github.io/wiki' + lang;
|
2016-02-09 20:44:08 +00:00
|
|
|
var wikiAside = $('<iframe>');
|
2016-02-13 02:11:01 +00:00
|
|
|
wikiAside.attr({
|
|
|
|
src: wikiURL,
|
2016-03-04 00:00:47 +00:00
|
|
|
frameBorder: '0'
|
2016-02-13 02:11:01 +00:00
|
|
|
});
|
2016-03-04 00:00:47 +00:00
|
|
|
$('.wiki-aside').append(wikiAside);
|
2016-02-09 20:44:08 +00:00
|
|
|
main.isWikiAsideLoad = true;
|
|
|
|
}
|
|
|
|
$('.wiki-aside').removeClass('is-collapsed');
|
|
|
|
}
|
|
|
|
|
|
|
|
function collapseWiki() {
|
|
|
|
$('.wiki-aside').addClass('is-collapsed');
|
|
|
|
document.activeElement.blur();
|
|
|
|
}
|
|
|
|
|
|
|
|
function toggleWiki() {
|
|
|
|
var isCollapsed = $('.wiki-aside').hasClass('is-collapsed');
|
|
|
|
if (isCollapsed) {
|
|
|
|
showWiki();
|
|
|
|
} else {
|
|
|
|
collapseWiki();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-16 11:55:09 +00:00
|
|
|
$('#accordion').on('show.bs.collapse', function(e) {
|
2016-01-31 21:09:43 +00:00
|
|
|
expandCaret(e.target);
|
|
|
|
if ($('a[data-toggle=collapse]').length === $('.fa-caret-down').length) {
|
|
|
|
mapShowAll.text('Collapse all challenges');
|
|
|
|
mapShowAll.addClass('active');
|
|
|
|
}
|
2016-01-16 11:55:09 +00:00
|
|
|
}).on('hide.bs.collapse', function(e) {
|
2016-01-31 21:09:43 +00:00
|
|
|
collapseCaret(e.target);
|
|
|
|
if ($('a[data-toggle=collapse]').length === $('.fa-caret-right').length) {
|
|
|
|
mapShowAll.text('Expand all challenges');
|
|
|
|
mapShowAll.removeClass('active');
|
|
|
|
}
|
2016-01-16 11:55:09 +00:00
|
|
|
});
|
|
|
|
|
2016-01-31 21:09:43 +00:00
|
|
|
mapShowAll.on('click', () => {
|
|
|
|
var mapExpanded = mapShowAll.hasClass('active');
|
2016-01-16 11:55:09 +00:00
|
|
|
if (!mapExpanded) {
|
2016-01-26 10:54:56 +00:00
|
|
|
$.each($('.map-collapse:not(".in")'),
|
|
|
|
function(i, div) {
|
|
|
|
expandBlock(div);
|
2016-01-18 21:40:36 +00:00
|
|
|
});
|
2016-01-31 21:09:43 +00:00
|
|
|
mapShowAll.text('Collapse all challenges');
|
|
|
|
return mapShowAll.addClass('active');
|
2016-01-16 11:55:09 +00:00
|
|
|
} else {
|
2016-01-26 10:54:56 +00:00
|
|
|
$.each($('.map-collapse.in'), function(i, div) {
|
|
|
|
collapseBlock(div);
|
2016-01-18 21:40:36 +00:00
|
|
|
});
|
2016-01-31 21:09:43 +00:00
|
|
|
mapShowAll.text('Expand all challenges');
|
|
|
|
return mapShowAll.removeClass('active');
|
2016-01-16 11:55:09 +00:00
|
|
|
}
|
2016-01-16 09:03:22 +00:00
|
|
|
});
|
2016-01-24 21:14:26 +00:00
|
|
|
|
2016-01-31 21:09:43 +00:00
|
|
|
// Map live filter
|
|
|
|
mapFilter.on('keyup', () => {
|
|
|
|
if (mapFilter.val().length > 0) {
|
2016-04-18 16:36:21 +00:00
|
|
|
var regexString = mapFilter.val().replace(/ /g, '.');
|
|
|
|
var regex = new RegExp(regexString.split('').join('.*'), 'i');
|
2016-01-31 21:09:43 +00:00
|
|
|
|
|
|
|
// Hide/unhide challenges that match the regex
|
2016-01-30 19:01:37 +00:00
|
|
|
$('.challenge-title').each((index, title) => {
|
2016-01-31 21:09:43 +00:00
|
|
|
if (regex.test($(title).attr('name'))) {
|
|
|
|
expandBlock($(title).closest('.chapterBlock'));
|
2016-01-31 01:31:26 +00:00
|
|
|
expandBlock($(title).closest('.certBlock'));
|
2016-01-31 21:09:43 +00:00
|
|
|
$(title).removeClass('hidden');
|
2016-01-30 19:01:37 +00:00
|
|
|
} else {
|
|
|
|
$(title).addClass('hidden');
|
|
|
|
}
|
|
|
|
});
|
2016-01-31 21:09:43 +00:00
|
|
|
|
|
|
|
// Hide/unhide blocks with no matches
|
2016-01-31 01:31:26 +00:00
|
|
|
$.each($('.chapterBlock'), function(i, div) {
|
2016-01-30 19:01:37 +00:00
|
|
|
if ($(div).find('.hidden').length ===
|
2016-01-31 21:09:43 +00:00
|
|
|
$(div).find('p').length) {
|
|
|
|
$(div).addClass('hidden');
|
|
|
|
$(div).prev('h3').addClass('hidden');
|
2016-01-31 01:31:26 +00:00
|
|
|
} else {
|
2016-01-31 21:09:43 +00:00
|
|
|
$(div).removeClass('hidden');
|
|
|
|
$(div).prev('h3').removeClass('hidden');
|
2016-01-30 19:01:37 +00:00
|
|
|
}
|
|
|
|
});
|
2016-01-31 21:09:43 +00:00
|
|
|
|
|
|
|
// Hide/unhide superblocks with no matches
|
2016-01-31 01:31:26 +00:00
|
|
|
$.each($('.certBlock'), function(i, div) {
|
|
|
|
if ($(div).children('#nested').children('h3.hidden').length ===
|
2016-01-31 21:09:43 +00:00
|
|
|
$(div).children('#nested').children('h3').length) {
|
|
|
|
$(div).prev('h2').addClass('hidden');
|
2016-01-31 01:31:26 +00:00
|
|
|
} else {
|
2016-01-31 21:09:43 +00:00
|
|
|
$(div).prev('h2').removeClass('hidden');
|
2016-01-31 01:31:26 +00:00
|
|
|
}
|
2016-01-30 19:01:37 +00:00
|
|
|
});
|
2016-01-31 21:09:43 +00:00
|
|
|
|
|
|
|
// Display "Clear Filter" element
|
|
|
|
if (mapFilter.next().children().hasClass('fa-search')) {
|
|
|
|
mapFilter.next()
|
|
|
|
.children()
|
|
|
|
.removeClass('fa-search')
|
|
|
|
.addClass('fa-times');
|
|
|
|
mapFilter.next().addClass('filled');
|
|
|
|
// Scroll to the top of the page
|
|
|
|
$('html, body, .map-accordion').scrollTop(0);
|
|
|
|
}
|
2016-01-31 01:31:26 +00:00
|
|
|
} else {
|
2016-01-31 21:09:43 +00:00
|
|
|
clearMapFilter();
|
2016-01-31 01:31:26 +00:00
|
|
|
}
|
2016-01-31 21:09:43 +00:00
|
|
|
|
|
|
|
// Display not found if everything is hidden
|
|
|
|
if ($.find('.certBlock').length ===
|
|
|
|
$('.map-accordion').children('.hidden').length) {
|
|
|
|
$('#noneFound').show();
|
|
|
|
} else {
|
|
|
|
$('#noneFound').hide();
|
2016-01-30 19:01:37 +00:00
|
|
|
}
|
|
|
|
});
|
2016-01-31 21:09:43 +00:00
|
|
|
|
|
|
|
// Give focus to the search box by default
|
|
|
|
mapFilter.focus();
|
|
|
|
|
|
|
|
// Clicking the search button or x clears the map
|
2016-01-31 01:31:26 +00:00
|
|
|
$('.map-buttons .input-group-addon').on('click', clearMapFilter);
|
2016-01-30 19:01:37 +00:00
|
|
|
|
2016-01-31 21:09:43 +00:00
|
|
|
function clearMapFilter() {
|
|
|
|
mapFilter.val('');
|
|
|
|
mapFilter.next().children().removeClass('fa-times').addClass('fa-search');
|
|
|
|
mapFilter.next().removeClass('filled');
|
|
|
|
$('.map-accordion').find('.hidden').removeClass('hidden');
|
|
|
|
$('#noneFound').hide();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Clear the search on escape key
|
|
|
|
mapFilter.on('keydown', (e) => {
|
|
|
|
if (e.keyCode === 27) {
|
|
|
|
e.preventDefault();
|
|
|
|
clearMapFilter();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
window.Mousetrap.bind('esc', clearMapFilter);
|
|
|
|
|
2016-01-24 21:14:26 +00:00
|
|
|
// keyboard shortcuts: open map
|
2016-02-07 09:51:57 +00:00
|
|
|
window.Mousetrap.bind('g m', toggleMap);
|
2016-04-08 22:13:41 +00:00
|
|
|
|
|
|
|
// Night Mode
|
|
|
|
function changeMode() {
|
|
|
|
var newValue = false;
|
|
|
|
try {
|
|
|
|
newValue = !JSON.parse(localStorage.getItem('nightMode'));
|
|
|
|
} catch (e) {
|
|
|
|
console.error('Error parsing value form local storage:', 'nightMode', e);
|
|
|
|
}
|
|
|
|
localStorage.setItem('nightMode', String(newValue));
|
|
|
|
toggleNightMode(newValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
function toggleNightMode(nightModeEnabled) {
|
|
|
|
var iframe = document.getElementById('map-aside-frame');
|
|
|
|
if (iframe) {
|
|
|
|
iframe.src = iframe.src;
|
|
|
|
}
|
|
|
|
var body = $('body');
|
|
|
|
body.hide();
|
|
|
|
if (nightModeEnabled) {
|
|
|
|
body.addClass('night');
|
|
|
|
} else {
|
|
|
|
body.removeClass('night');
|
|
|
|
}
|
|
|
|
body.fadeIn('100');
|
|
|
|
}
|
|
|
|
|
|
|
|
if (typeof localStorage.getItem('nightMode') !== 'undefined') {
|
|
|
|
var oldVal = false;
|
|
|
|
try {
|
|
|
|
oldVal = JSON.parse(localStorage.getItem('nightMode'));
|
|
|
|
} catch (e) {
|
|
|
|
console.error('Error parsing value form local storage:', 'nightMode', e);
|
|
|
|
}
|
|
|
|
toggleNightMode(oldVal);
|
|
|
|
$('.nightMode-btn').on('click', function() {
|
|
|
|
changeMode();
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
localStorage.setItem('nightMode', 'false');
|
|
|
|
toggleNightMode('false');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Hot Keys
|
|
|
|
window.Mousetrap.bind('g t n', changeMode);
|
|
|
|
window.Mousetrap.bind('g n n', () => {
|
|
|
|
// Next Challenge
|
|
|
|
window.location = '/challenges/next-challenge';
|
|
|
|
});
|
|
|
|
window.Mousetrap.bind('g n a', () => {
|
|
|
|
// Account
|
|
|
|
window.location = '/account';
|
|
|
|
});
|
|
|
|
window.Mousetrap.bind('g n m', () => {
|
|
|
|
// Map
|
|
|
|
window.location = '/map';
|
|
|
|
});
|
|
|
|
window.Mousetrap.bind('g n w', () => {
|
|
|
|
// Wiki
|
|
|
|
window.location = '/wiki';
|
|
|
|
});
|
|
|
|
window.Mousetrap.bind('g n a', () => {
|
|
|
|
// About
|
|
|
|
window.location = '/about';
|
|
|
|
});
|
|
|
|
window.Mousetrap.bind('g n s', () => {
|
|
|
|
// Shop
|
|
|
|
window.location = '/shop';
|
|
|
|
});
|
|
|
|
window.Mousetrap.bind('g n o', () => {
|
|
|
|
// Settings
|
|
|
|
window.location = '/settings';
|
|
|
|
});
|
|
|
|
window.Mousetrap.bind('g n r', () => {
|
|
|
|
// Repo
|
|
|
|
window.location = 'https://github.com/freecodecamp/freecodecamp/';
|
|
|
|
});
|
2016-04-15 02:49:19 +00:00
|
|
|
|
|
|
|
(function getFlyer() {
|
|
|
|
const flyerKey = '__flyerId__';
|
|
|
|
$.ajax({
|
|
|
|
url: '/api/flyers/findOne',
|
|
|
|
method: 'GET',
|
|
|
|
dataType: 'JSON',
|
|
|
|
data: { filter: { order: 'id DESC' } }
|
|
|
|
})
|
|
|
|
// log error
|
|
|
|
.fail(err => console.error(err))
|
|
|
|
.done(flyer => {
|
|
|
|
const lastFlyerId = localStorage.getItem(flyerKey);
|
|
|
|
if (
|
|
|
|
!flyer ||
|
|
|
|
!flyer.isActive ||
|
|
|
|
lastFlyerId === flyer.id
|
|
|
|
) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
$('#dismiss-bill').on('click', () => {
|
|
|
|
localStorage.setItem(flyerKey, flyer.id);
|
|
|
|
});
|
|
|
|
$('#bill-content').html(flyer.message);
|
|
|
|
$('#bill-board').fadeIn();
|
|
|
|
});
|
|
|
|
}());
|
2014-11-07 01:38:47 +00:00
|
|
|
});
|