Merge branch 'master' into remove-angular

Conflicts:
	bower.json
	client/main.js
	server/views/coursewares/showZiplineOrBasejump.jade
	server/views/partials/scripts.jade
This commit is contained in:
Quincy Larson
2015-12-04 18:49:38 -06:00
366 changed files with 12566 additions and 124259 deletions

View File

@@ -1,19 +1,127 @@
var mapShareKey = 'map-shares';
var main = window.main || {};
main.mapShareKey = 'map-shares';
main.ga = window.ga || function() {};
main = (function(main) {
// should be set before gitter script loads
((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;
main.chat.createHelpChat = function(room, helpChatBtnClass, roomTitle) {
roomTitle = roomTitle || 'Waypoint Help';
$('body').append(
'<aside id="chat-embed-help" class="gitter-chat-embed is-collapsed" />'
);
main.chat.helpChat = new main.chat.GitterChat({
room: room,
activationElement: false,
targetElement: $('#chat-embed-help')
});
$(helpChatBtnClass).on('click', function() {
// 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');
}
});
var helpTitleAdd = false;
$('#chat-embed-help').on('gitter-chat-toggle', function(e) {
var shouldButtonBePressed = !!e.originalEvent.detail.state;
if (!helpTitleAdd) {
helpTitleAdd = true;
$('#chat-embed-help > .gitter-chat-embed-action-bar').prepend(
'<div class="chat-embed-main-title">' +
'<span>' +
roomTitle +
'</span>' +
'</div>'
);
}
if (shouldButtonBePressed) {
return $(helpChatBtnClass).addClass('active');
}
return $(helpChatBtnClass).removeClass('active');
});
};
$('body').append(
'<aside id="chat-embed-main" class="gitter-chat-embed is-collapsed" />'
);
main.chat.mainChat = new main.chat.GitterChat({
room: 'freecodecamp/freecodecamp',
activationElement: false,
targetElement: $('#chat-embed-main')
});
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>'
);
});
$('#nav-chat-btn').on('click', function() {
if (!main.chat.isOpen) {
main.chat.mainChat.toggleChat(true);
}
});
});
return main;
}(main));
var lastCompleted = typeof lastCompleted !== 'undefined' ?
lastCompleted :
'';
function getMapShares() {
var alreadyShared = JSON.parse(localStorage.getItem(mapShareKey) || '[]');
main.getMapShares = function getMapShares() {
var alreadyShared = JSON.parse(
localStorage.getItem(main.mapShareKey) ||
'[]'
);
if (!alreadyShared || !Array.isArray(alreadyShared)) {
localStorage.setItem(mapShareKey, JSON.stringify([]));
localStorage.setItem(main.mapShareKey, JSON.stringify([]));
alreadyShared = [];
}
return alreadyShared;
}
};
function setMapShare(id) {
var alreadyShared = getMapShares();
main.setMapShare = function setMapShare(id) {
var alreadyShared = main.getMapShares();
var found = false;
alreadyShared.forEach(function(_id) {
if (_id === id) {
@@ -23,24 +131,12 @@ function setMapShare(id) {
if (!found) {
alreadyShared.push(id);
}
localStorage.setItem(mapShareKey, JSON.stringify(alreadyShared));
localStorage.setItem(main.mapShareKey, JSON.stringify(alreadyShared));
return alreadyShared;
}
};
$(document).ready(function() {
var challengeName = typeof challengeName !== 'undefined' ?
challengeName :
'Untitled';
if (challengeName) {
ga('send', 'event', 'Challenge', 'load', challengeName);
}
if (typeof editor !== 'undefined') {
$('#reset-button').on('click', resetEditor);
}
var CSRF_HEADER = 'X-CSRF-Token';
var setCSRFToken = function(securityToken) {
@@ -53,247 +149,15 @@ $(document).ready(function() {
setCSRFToken($('meta[name="csrf-token"]').attr('content'));
$('.checklist-element').each(function() {
var checklistElementId = $(this).attr('id');
if(!!localStorage[checklistElementId]) {
$(this).children().children('li').addClass('faded');
$(this).children().children('input').trigger('click');
}
$('img').error(function() {
$(this)
.unbind('error')
.attr(
'src',
'https://s3.amazonaws.com/freecodecamp/camper-image-placeholder.png'
);
});
$('.start-challenge').on('click', function() {
$(this).parent().remove();
$('.challenge-content')
.removeClass('hidden-element')
.addClass('animated fadeInDown');
});
$('.challenge-list-checkbox').on('change', function() {
var checkboxId = $(this).parent().parent().attr('id');
if ($(this).is(":checked")) {
$(this).parent().siblings().children().addClass('faded');
if (!localStorage || !localStorage[checkboxId]) {
localStorage[checkboxId] = true;
}
}
if (!$(this).is(":checked")) {
$(this).parent().siblings().children().removeClass('faded');
if (localStorage[checkboxId]) {
localStorage.removeItem(checkboxId);
}
}
});
$("img").error(function () {
$(this).unbind("error").attr("src", "https://s3.amazonaws.com/freecodecamp/camper-image-placeholder.png");
});
function reBindModals(){
$('.close-modal').unbind('click');
$('.close-modal').on('click', function(){
setTimeout(function() {
$('.close-modal').parent().parent().parent().parent().modal('hide');
}, 200);
});
$('#search-issue').unbind('click');
$('#search-issue').on('click', function() {
var queryIssue = window.location.href.toString();
window.open('https://github.com/FreeCodeCamp/FreeCodeCamp/issues?q=' +
'is:issue is:all ' + (challenge_Name || challengeName) + ' OR ' +
queryIssue.substr(queryIssue.lastIndexOf('challenges/') + 11)
.replace('/', ''), '_blank');
});
$('#help-ive-found-a-bug-wiki-article').unbind('click');
$('#help-ive-found-a-bug-wiki-article').on('click', function() {
window.open("https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Help-I've-Found-a-Bug", '_blank');
});
$('#report-issue').unbind('click');
$('#report-issue').on('click', function() {
var textMessage = [
'Challenge [',
(challenge_Name || challengeName || window.location.href),
'](',
window.location.href,
') has an issue.\n',
'User Agent is: <code>',
navigator.userAgent,
'</code>.\n',
'Please describe how to reproduce this issue, and include ',
'links to screenshots if possible.\n\n'
].join('');
if (editor.getValue().trim()) {
var type;
switch (challengeType) {
case challengeTypes.HTML_CSS_JQ:
type = 'html';
break;
case challengeTypes.JAVASCRIPT:
type = 'javascript';
break;
default:
type = '';
}
textMessage += [
'My code:\n```',
type,
'\n',
editor.getValue(),
'\n```\n\n'
].join('');
}
textMessage = encodeURIComponent(textMessage);
$('#issue-modal').modal('hide');
window.open(
'https://github.com/freecodecamp/freecodecamp/issues/new?&body=' +
textMessage, '_blank'
);
});
$('#completed-courseware').unbind('click');
$('#completed-courseware').on('click', function() {
$('#complete-courseware-dialog').modal('show');
});
$('#completed-courseware-editorless').unbind('click');
$('#completed-courseware-editorless').on('click', function() {
$('#complete-courseware-editorless-dialog').modal('show');
});
$('#trigger-pair-modal').unbind('click');
$('#trigger-pair-modal').on('click', function() {
$('#pair-modal').modal('show');
});
$('#trigger-reset-modal').unbind('click');
$('#trigger-reset-modal').on('click', function() {
$('#reset-modal').modal('show');
});
$('#trigger-help-modal').unbind('click');
$('#trigger-help-modal').on('click', function() {
$('#help-modal').modal('show');
});
$('#trigger-issue-modal').unbind('click');
$('#trigger-issue-modal').on('click', function() {
$('#issue-modal').modal('show');
});
$('#completed-zipline-or-basejump').unbind('click');
$('#completed-zipline-or-basejump').on('click', function() {
$('#complete-zipline-or-basejump-dialog').modal('show');
});
$('#next-courseware-button').unbind('click');
$('#next-courseware-button').on('click', function() {
$('#next-courseware-button').unbind('click');
if ($('.signup-btn-nav').length < 1) {
switch (challengeType) {
case challengeTypes.HTML_CSS_JQ:
case challengeTypes.JAVASCRIPT:
case challengeTypes.VIDEO:
$.post(
'/completed-challenge/',
{
challengeInfo: {
challengeId: challenge_Id,
challengeName: challenge_Name
}
}).success(
function(res) {
if (res) {
window.location.href = '/challenges/next-challenge?id=' + challenge_Id;
}
}).fail(
function() {
window.location.href="/challenges";
}
);
break;
case challengeTypes.ZIPLINE:
var didCompleteWith = $('#completed-with').val() || null;
var publicURL = $('#public-url').val() || null;
console.log("debug", didCompleteWith, publicURL);
$.post(
'/completed-zipline-or-basejump/',
{
challengeInfo: {
challengeId: challenge_Id,
challengeName: challenge_Name,
completedWith: didCompleteWith,
publicURL: publicURL,
challengeType: challengeType
}
}).success(
function() {
window.location.href = '/challenges/next-challenge?id=' + challenge_Id;
}).fail(
function() {
window.location.href = '/challenges';
});
break;
case challengeTypes.BASEJUMP:
var didCompleteWith = $('#completed-with').val() || null;
var publicURL = $('#public-url').val() || null;
var githubURL = $('#github-url').val() || null;
$.post(
'/completed-zipline-or-basejump/',
{
challengeInfo: {
challengeId: challenge_Id,
challengeName: challenge_Name,
completedWith: didCompleteWith,
publicURL: publicURL,
githubURL: githubURL,
challengeType: challengeType,
verified: false
}
}).success(function() {
window.location.href = '/challenges/next-challenge?id=' + challenge_Id;
}).fail(function() {
window.location.replace(window.location.href);
});
break;
case challengeTypes.BONFIRE:
window.location.href = '/challenges/next-challenge?id=' + challenge_Id;
default:
break;
}
}
});
$('#complete-courseware-dialog').on('hidden.bs.modal', function() {
editor.focus();
});
$('#complete-zipline-or-basejump').on('hidden.bs.modal', function() {
editor.focus();
});
};
$(window).resize(function(){
reBindModals();
});
reBindModals();
var challengeTypes = {
'HTML_CSS_JQ': '0',
'JAVASCRIPT': '1',
'VIDEO': '2',
'ZIPLINE': '3',
'BASEJUMP': '4',
'BONFIRE': '5'
};
function upvoteHandler(e) {
e.preventDefault();
var upvoteBtn = this;
@@ -309,16 +173,19 @@ $(document).ready(function() {
}
if (!alreadyUpvoted) {
$.post('/stories/upvote', { id: id })
.fail(function(xhr, textStatus, errorThrown) {
.fail(function() {
$(upvoteBtn).bind('click', upvoteHandler);
})
.done(function(data, textStatus, xhr) {
$(upvoteBtn).text('Upvoted!').addClass('disabled');
.done(function(data) {
$(upvoteBtn)
.text('Upvoted!')
.addClass('disabled');
$('#storyRank').text(data.rank + " points");
$('#storyRank').text(data.rank + ' points');
});
}
};
}
$('#story-list').on('click', 'button.btn-upvote', upvoteHandler);
var storySubmitButtonHandler = function storySubmitButtonHandler() {
@@ -326,95 +193,33 @@ $(document).ready(function() {
var link = $('#story-url').val();
var headline = $('#story-title').val();
var description = $('#description-box').val();
var data = {
data: {
link: link,
headline: headline,
timePosted: Date.now(),
description: description,
storyMetaDescription: main.storyMetaDescription,
rank: 1,
image: main.storyImage
}
};
$('#story-submit').unbind('click');
$.post('/stories/',
{
data: {
link: link,
headline: headline,
timePosted: Date.now(),
description: description,
storyMetaDescription: storyMetaDescription,
rank: 1,
image: storyImage
}
})
.fail(function (xhr, textStatus, errorThrown) {
$.post('/stories/', data)
.fail(function() {
$('#story-submit').bind('click', storySubmitButtonHandler);
})
.done(function(data, textStatus, xhr) {
.done(function(data) {
window.location = '/stories/' + data.storyLink;
});
};
$('#story-submit').on('click', storySubmitButtonHandler);
//fakeiphone positioning hotfix
if($('.iphone-position').html() !==undefined || $('.iphone').html() !== undefined){
var startIphonePosition = parseInt($('.iphone-position').css('top').replace('px', ''));
var startIphone = parseInt($('.iphone').css('top').replace('px', ''));
$(window).on('scroll', function(){
if((($('.courseware-height').height() + $('.courseware-height').offset().top)-$(window).scrollTop()-$('.iphone-position').height()) <= 0){
$('.iphone-position').css('top', startIphonePosition+(($('.courseware-height').height() + $('.courseware-height').offset().top)-$(window).scrollTop()-$('.iphone-position').height()));
$('.iphone').css('top', startIphonePosition+(($('.courseware-height').height() + $('.courseware-height').offset().top)-$(window).scrollTop()-$('.iphone-position').height())+120);
}
else{
$('.iphone-position').css('top', startIphonePosition);
$('.iphone').css('top', startIphone);
}
});
}
if($('.scroll-locker').html() != undefined){
function lockTop(){
if ($(window).width() >= 990) {
if($('.editorScrollDiv').html() !== 'undefined'){
var magiVal = $(window).height()-($('.navbar').height()+$('.footer').height());
if(magiVal < 0){
magiVal = 0;
}
$('.editorScrollDiv').css("height", (magiVal-85) + "px");
}
magiVal = $(window).height()-($('.navbar').height()+$('.footer').height());
if(magiVal < 0){
magiVal = 0;
}
$('.scroll-locker').css("min-height", $('.editorScrollDiv').height()).css("height",magiVal-185);
}
else {
$('.editorScrollDiv').css("max-height", 500 + "px");
$('.scroll-locker').css('position', 'inherit').css('top', 'inherit').css('width', '100%').css('max-height', '85%');
}
}
if ($('.scroll-locker').html()){
lockTop();
$(window).on('resize', function(){
lockTop();
});
$(window).on('scroll', function() {
lockTop();
});
}
var execInProgress = false;
document.getElementById('scroll-locker').addEventListener('previewUpdateSpy', function(e){
if (!execInProgress){
execInProgress = true;
setTimeout(function(){
if($($('.scroll-locker').children()[0]).height()-800 > e.detail){
$('.scroll-locker').scrollTop(e.detail);
}
else {
$('.scroll-locker').animate({"scrollTop":$($('.scroll-locker').children()[0]).height()}, 175);
}
execInProgress = false;
}, 750);
}
}, false);
}
// map sharing
var alreadyShared = getMapShares();
var alreadyShared = main.getMapShares();
if (lastCompleted && alreadyShared.indexOf(lastCompleted) === -1) {
$('div[id="' + lastCompleted + '"]')
@@ -442,11 +247,8 @@ $(document).ready(function() {
username +
'&redirect_uri=http%3A%2F%2Ffreecodecamp%2Ecom%2Fmap';
setMapShare(challengeBlockName);
main.setMapShare(challengeBlockName);
window.ga('send', 'event', 'FB_LINK', 'SHARE', 'Facebook map share');
window.location.href = link;
});
});
function defCheck(a){
if(a !== 'undefined'){return(true);}else{return(false);}
}