From ede956e1d654da3097e55361f5e4e83184a06b9b Mon Sep 17 00:00:00 2001 From: benmcmahon100 Date: Sun, 23 Aug 2015 21:59:29 +0100 Subject: [PATCH 01/10] Merge of the frameworks: an unexpected merge --- public/js/lib/coursewares/commonFrameWork.js | 469 ++++++++++++++++++ .../coursewaresHCJQFramework_0.1.9.js | 280 ----------- .../coursewaresJSFramework_0.0.6.js | 394 --------------- server/views/coursewares/showHTML.jade | 11 +- server/views/coursewares/showJS.jade | 4 +- 5 files changed, 479 insertions(+), 679 deletions(-) create mode 100644 public/js/lib/coursewares/commonFrameWork.js delete mode 100644 public/js/lib/coursewares/coursewaresHCJQFramework_0.1.9.js delete mode 100644 public/js/lib/coursewares/coursewaresJSFramework_0.0.6.js diff --git a/public/js/lib/coursewares/commonFrameWork.js b/public/js/lib/coursewares/commonFrameWork.js new file mode 100644 index 0000000000..a2717ca7e1 --- /dev/null +++ b/public/js/lib/coursewares/commonFrameWork.js @@ -0,0 +1,469 @@ +var editor; +var widgets = []; +editor = CodeMirror.fromTextArea(document.getElementById("codeEditor"), { + lineNumbers: true, + mode: "text", + theme: 'monokai', + runnable: true, + matchBrackets: true, + autoCloseBrackets: true, + scrollbarStyle: 'null', + lineWrapping: true, + gutters: ["CodeMirror-lint-markers"], + onKeyEvent: doLinting +}); + +var myCodeMirror = editor; + +var codeStorage = { + version: 0.01, + keyVersion:"saveVersion", + keyValue: null,//where the value of the editor is saved + updateWait: 2000,// 2 seconds + updateTimeoutId: null, + eventArray: []//for firing saves +}; +codeStorage.hasSaved = function(){ + return ( updateTimeoutId === null ); +}; +codeStorage.onSave = function(func){ + codeStorage.eventArray.push(func); +}; +codeStorage.setSaveKey = function(key){ + codeStorage.keyValue = key + 'Val'; +}; +codeStorage.getEditorValue = function(){ + return ('' + localStorage.getItem(codeStorage.keyValue)); +}; + +codeStorage.isAlive = function() { + var val = this.getEditorValue(); + return val !== 'null' && + val !== 'undefined' && + (val && val.length > 0); +}; +codeStorage.updateStorage = function(){ + if(typeof(Storage) !== undefined) { + var value = editor.getValue(); + localStorage.setItem(codeStorage.keyValue, value); + } else { + var debugging = false; + if( debugging ){ + console.log('no web storage'); + } + } + codeStorage.updateTimeoutId = null; + codeStorage.eventArray.forEach(function(func){ + func(); + }); +}; +(function(){ + var savedVersion = localStorage.getItem('saveVersion'); + if( savedVersion === null ){ + localStorage.setItem(codeStorage.keyVersion, codeStorage.version);//just write current version + }else{ + if( savedVersion !== codeStorage.version ){ + //Update version + } + } +})(); +codeStorage.setSaveKey(challenge_Name); +editor.on('keyup', function(){ + window.clearTimeout(codeStorage.updateTimeoutId); + codeStorage.updateTimeoutId = window.setTimeout(codeStorage.updateStorage, codeStorage.updateWait); +}); +var editorValue; +var challengeSeed = challengeSeed || null; +var tests = tests || []; +var allSeeds = ''; +(function() { + challengeSeed.forEach(function(elem) { + allSeeds += elem + '\n'; + }); +})(); + +function doLinting() { + editor.operation(function() { + for (var i = 0; i < widgets.length; ++i) + editor.removeLineWidget(widgets[i]); + widgets.length = 0; + JSHINT(editor.getValue()); + for (var i = 0; i < JSHINT.errors.length; ++i) { + var err = JSHINT.errors[i]; + if (!err) continue; + var msg = document.createElement("div"); + var icon = msg.appendChild(document.createElement("span")); + icon.innerHTML = "!!"; + icon.className = "lint-error-icon"; + msg.appendChild(document.createTextNode(err.reason)); + msg.className = "lint-error"; + widgets.push(editor.addLineWidget(err.line - 1, msg, { + coverGutter: false, + noHScroll: true + })); + } + }); +} + +/*var defaultKeymap = { + 'Cmd-E': 'emmet.expand_abbreviation', + 'Tab': 'emmet.expand_abbreviation_with_tab', + 'Enter': 'emmet.insert_formatted_line_break_only' + }; + + emmetCodeMirror(editor, defaultKeymap);*/ + +// Hijack tab key to insert two spaces instead +editor.setOption("extraKeys", { + Tab: function(cm) { + if (cm.somethingSelected()){ + cm.indentSelection("add"); + } else { + var spaces = Array(cm.getOption("indentUnit") + 1).join(" "); + cm.replaceSelection(spaces); + } + }, + "Shift-Tab": function(cm) { + if (cm.somethingSelected()){ + cm.indentSelection("subtract"); + } else { + var spaces = Array(cm.getOption("indentUnit") + 1).join(" "); + cm.replaceSelection(spaces); + } + }, + "Ctrl-Enter": function() { + bonfireExecute(); + return false; + } +}); + +editor.setSize("100%", "auto"); + +var libraryIncludes = "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""; + + +var editorValueForIFrame; +var iFrameScript = ""; + +var delay; +// Initialize CodeMirror editor with a nice html5 canvas demo. +editor.on("keyup", function () { + clearTimeout(delay); + delay = setTimeout(updatePreview, 300); +}); + +if(typeof prodOrDev !== 'undefined') { + var nodeEnv = prodOrDev === 'production' ? 'http://www.freecodecamp.com' : 'http://localhost:3001'; + + function updatePreview() { + editorValueForIFrame = editor.getValue(); + var failedCommentTest = false; + if (editorValueForIFrame.match(/\<\!\-\-/gi) && editorValueForIFrame.match(/\-\-\>/gi) == null) { + failedCommentTest = true; + } + else if (editorValueForIFrame.match(/\<\!\-\-/gi) && editorValueForIFrame.match(/\<\!\-\-/gi).length > editorValueForIFrame.match(/\-\-\>/gi).length) { + failedCommentTest = true; + } + if (failedCommentTest) { + editor.setValue(editor.getValue() + "-->"); + editorValueForIFrame = editorValueForIFrame + "-->"; + } + goodTests = 0; + var previewFrame = document.getElementById('preview'); + var preview = previewFrame.contentDocument || previewFrame.contentWindow.document; + preview.open(); + preview.write(libraryIncludes + editor.getValue()); + codeStorage.updateStorage(); + preview.close(); + + } + + setTimeout(updatePreview, 300); +} +/** + * "post" methods + */ + +var testResults = []; +var postSuccess = function(data) { + var testDoc = document.createElement("div"); + $(testDoc) + .html("
" + JSON.parse(data) + "
"); + $('#testSuite').append(testDoc); + testSuccess(); +}; + +var postError = function(data) { + var testDoc = document.createElement("div"); + $(testDoc) + .html("
" + JSON.parse(data) + "
"); + $('#testSuite').append(testDoc); +}; +var goodTests = 0; +var testSuccess = function() { + goodTests++; + if (goodTests === tests.length) { + showCompletion(); + } +}; + +function showCompletion() { + var time = Math.floor(Date.now()) - started; + ga('send', 'event', 'Challenge', 'solved', challenge_Name + ', Time: ' + time + + ', Attempts: ' + attempts); + var bonfireSolution = myCodeMirror.getValue(); + var didCompleteWith = $('#completed-with').val() || null; + $.post( + '/completed-bonfire/', { + challengeInfo: { + challengeId: challenge_Id, + challengeName: challenge_Name, + completedWith: didCompleteWith, + challengeType: challengeType, + solution: bonfireSolution + } + }, + function(res) { + if (res) { + $('#complete-courseware-dialog').modal('show'); + $('#complete-courseware-dialog').keydown(function(e) { + if (e.ctrlKey && e.keyCode == 13) { + $('#next-courseware-button').click(); + } + }); + } + } + ); +} + +var resetEditor = function resetEditor() { + editor.setValue(allSeeds.replace((/fccss/gi), '')); + updatePreview(); + codeStorage.updateStorage(); +}; + +var attempts = 0; +if (attempts) { + attempts = 0; +} + +console.log(challengeType); +if(challengeType !== "0") { + var codeOutput = CodeMirror.fromTextArea(document.getElementById("codeOutput"), { + lineNumbers: false, + mode: "text", + theme: 'monokai', + readOnly: 'nocursor', + lineWrapping: true + }); + + codeOutput.setValue('/**\n' + + ' * Your output will go here.\n' + ' * Console.log() -type statements\n' + + ' * will appear in your browser\'s\n' + ' * DevTools JavaScript console.\n' + + ' */'); + codeOutput.setSize("100%", "100%"); +} +var info = editor.getScrollInfo(); +var after = editor.charCoords({ + line: editor.getCursor().line + 1, + ch: 0 +}, "local").top; +if (info.top + info.clientHeight < after) + editor.scrollTo(null, after - info.clientHeight + 3); + +var userTests; +var testSalt = Math.random(); + + +var scrapeTests = function(userJavaScript) { + + // insert tests from mongo + for (var i = 0; i < tests.length; i++) { + userJavaScript += '\n' + tests[i]; + } + + var counter = 0; + var regex = new RegExp( + /(expect(\s+)?\(.*\;)|(assert(\s+)?\(.*\;)|(assert\.\w.*\;)|(.*\.should\..*\;)/ + ); + var match = regex.exec(userJavaScript); + while (match != null) { + var replacement = '//' + counter + testSalt; + userJavaScript = userJavaScript.substring(0, match.index) + replacement + + userJavaScript.substring(match.index + match[0].length); + + if (!userTests) { + userTests = []; + } + userTests.push({ + "text": match[0], + "line": counter, + "err": null + }); + counter++; + match = regex.exec(userJavaScript); + } + + return userJavaScript; +}; + +function removeComments(userJavaScript) { + var regex = new RegExp(/(\/\*[^(\*\/)]*\*\/)|\/\/[^\n]*/g); + return userJavaScript.replace(regex, ''); +} + +function removeLogs(userJavaScript) { + return userJavaScript.replace(/(console\.[\w]+\s*\(.*\;)/g, ''); +} + +var pushed = false; +var createTestDisplay = function() { + if (pushed) { + userTests.pop(); + } + for (var i = 0; i < userTests.length; i++) { + var test = userTests[i]; + var testDoc = document.createElement("div"); + if (test.err != null) { + console.log('Should be displaying bad tests'); + $(testDoc) + .html( + "
" + + test.text + "
" + + test.err + "
") + .appendTo($('#testSuite')); + } else { + $(testDoc) + .html( + "
" + + test.text + "
") + .appendTo($('#testSuite')); + } + }; +}; + +var expect = chai.expect; +var assert = chai.assert; +var should = chai.should(); + + +var reassembleTest = function(test, data) { + var lineNum = test.line; + var regexp = new RegExp("\/\/" + lineNum + testSalt); + return data.input.replace(regexp, test.text); +}; + +var runTests = function(err, data) { + //userTests = userTests ? null : []; + var allTestsPassed = true; + pushed = false; + $('#testSuite').children().remove(); + if (err && userTests.length > 0) { + userTests = [{ + text: "Program Execution Failure", + err: "No user tests were run." + }]; + createTestDisplay(); + } + //Add blocks to test exploits here! + else if(editorValue.match(/if\s\(null\)\sconsole\.log\(1\);/gi)){ + allTestsPassed = false; + userTests = [{ + text: "Program Execution Failure", + err: "Invalid if (null) console.log(1); detected" + }]; + createTestDisplay(); + } + else if (userTests) { + userTests.push(false); + pushed = true; + userTests.forEach(function(chaiTestFromJSON, indexOfTestArray, + __testArray) { + try { + if (chaiTestFromJSON) { + var output = eval(reassembleTest(chaiTestFromJSON, data)); + } + } catch (error) { + allTestsPassed = false; + __testArray[indexOfTestArray].err = error.message; + } finally { + if (!chaiTestFromJSON) { + createTestDisplay(); + } + } + }); + + if (allTestsPassed) { + allTestsPassed = false; + showCompletion(); + } + + } +}; + +function bonfireExecute() { + attempts++; + ga('send', 'event', 'Challenge', 'ran-code', challenge_Name); + userTests = null; + if(challengeType === "0"){ + $('#testSuite').empty(); + + editorValueForIFrame = editor.getValue(); + goodTests = 0; + var previewFrame = document.getElementById('preview'); + var preview = previewFrame.contentDocument || previewFrame.contentWindow.document; + preview.open(); + preview.write(libraryIncludes + editor.getValue() + ""); + codeStorage.updateStorage(); + preview.close(); + } + else { + var userJavaScript = myCodeMirror.getValue(); + var failedCommentTest = false; + if (userJavaScript.match(/\/\*/gi) && userJavaScript.match(/\*\//gi) == null) { + failedCommentTest = true; + } + else if (!failedCommentTest && userJavaScript.match(/\/\*/gi) && userJavaScript.match(/\/\*/gi).length > userJavaScript.match(/\*\//gi).length) { + failedCommentTest = true; + } + userJavaScript = removeComments(userJavaScript); + userJavaScript = scrapeTests(userJavaScript); + // simple fix in case the user forgets to invoke their function + + submit(userJavaScript, function (cls, message) { + if (failedCommentTest) { + myCodeMirror.setValue(myCodeMirror.getValue() + "*/"); + console.log('Caught Unfinished Comment'); + codeOutput.setValue("Unfinished mulit-line comment"); + failedCommentTest = false; + } + else if (cls) { + codeOutput.setValue(message.error); + runTests('Error', null); + } else { + codeOutput.setValue(message.output); + codeOutput.setValue(codeOutput.getValue().replace(/\\\"/gi, '')); + message.input = removeLogs(message.input); + runTests(null, message); + } + }); + } +} + +$('#submitButton').on('click', function() { + bonfireExecute(); +}); + +$(document).ready(function(){ + editorValue = (codeStorage.isAlive())? codeStorage.getEditorValue() : allSeeds; + myCodeMirror.setValue(editorValue); + bonfireExecute(); +}); diff --git a/public/js/lib/coursewares/coursewaresHCJQFramework_0.1.9.js b/public/js/lib/coursewares/coursewaresHCJQFramework_0.1.9.js deleted file mode 100644 index 89dc0d9dd6..0000000000 --- a/public/js/lib/coursewares/coursewaresHCJQFramework_0.1.9.js +++ /dev/null @@ -1,280 +0,0 @@ -/** - * Created by nathanleniz on 2/2/15. - */ - -var widgets = []; -var editor = CodeMirror.fromTextArea(document.getElementById("codeEditor"), { - lineNumbers: true, - mode: "text/html", - theme: 'monokai', - runnable: true, - matchBrackets: true, - autoCloseBrackets: true, - scrollbarStyle: 'null', - lineWrapping: true, - gutters: ["CodeMirror-lint-markers"], - onKeyEvent: doLinting -}); - -var defaultKeymap = { - 'Cmd-E': 'emmet.expand_abbreviation', - 'Tab': 'emmet.expand_abbreviation_with_tab', - 'Enter': 'emmet.insert_formatted_line_break_only' -}; - -emmetCodeMirror(editor, defaultKeymap); - - -// Hijack tab key to insert two spaces instead -editor.setOption("extraKeys", { - Tab: function(cm) { - if (cm.somethingSelected()){ - cm.indentSelection("add"); - } else { - var spaces = Array(cm.getOption("indentUnit") + 1).join(" "); - cm.replaceSelection(spaces); - } - }, - "Shift-Tab": function(cm) { - if (cm.somethingSelected()){ - cm.indentSelection("subtract"); - } else { - var spaces = Array(cm.getOption("indentUnit") + 1).join(" "); - cm.replaceSelection(spaces); - } - } -}); - -editor.setSize("100%", "auto"); - -var libraryIncludes = "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - ""; - - -var editorValueForIFrame; -var iFrameScript = ""; - -var delay; -// Initialize CodeMirror editor with a nice html5 canvas demo. -editor.on("keyup", function () { - clearTimeout(delay); - delay = setTimeout(updatePreview, 300); -}); - -var nodeEnv = prodOrDev === 'production' ? 'http://www.freecodecamp.com' : 'http://localhost:3001'; -function updatePreview() { - editorValueForIFrame = editor.getValue(); - var failedCommentTest = false; - if(editorValueForIFrame.match(/\<\!\-\-/gi) && editorValueForIFrame.match(/\-\-\>/gi) == null){ - failedCommentTest = true; - } - else if(editorValueForIFrame.match(/\<\!\-\-/gi) && editorValueForIFrame.match(/\<\!\-\-/gi).length > editorValueForIFrame.match(/\-\-\>/gi).length){ - failedCommentTest = true; - } - if(failedCommentTest){ - editor.setValue(editor.getValue()+ "-->"); - editorValueForIFrame = editorValueForIFrame + "-->"; - } - goodTests = 0; - var previewFrame = document.getElementById('preview'); - var preview = previewFrame.contentDocument || previewFrame.contentWindow.document; - preview.open(); - $('#testSuite').empty(); - preview.write(libraryIncludes + editor.getValue() + iFrameScript); - codeStorage.updateStorage(); - preview.close(); - -} -setTimeout(updatePreview, 300); - -/** - * "post" methods - */ - -var testResults = []; -var postSuccess = function(data) { - var testDoc = document.createElement("div"); - $(testDoc) - .html("
" + JSON.parse(data) + "
"); - $('#testSuite').append(testDoc); - testSuccess(); -}; - -var postError = function(data) { - var testDoc = document.createElement("div"); - $(testDoc) - .html("
" + JSON.parse(data) + "
"); - $('#testSuite').append(testDoc); -}; -var goodTests = 0; -var testSuccess = function() { - goodTests++; - if (goodTests === tests.length) { - showCompletion(); - } -}; - -function doLinting () { - editor.operation(function () { - for (var i = 0; i < widgets.length; ++i) - editor.removeLineWidget(widgets[i]); - widgets.length = 0; - JSHINT(editor.getValue()); - for (var i = 0; i < JSHINT.errors.length; ++i) { - var err = JSHINT.errors[i]; - if (!err) continue; - var msg = document.createElement("div"); - var icon = msg.appendChild(document.createElement("span")); - icon.innerHTML = "!!"; - icon.className = "lint-error-icon"; - msg.appendChild(document.createTextNode(err.reason)); - msg.className = "lint-error"; - widgets.push(editor.addLineWidget(err.line - 1, msg, { - coverGutter: false, - noHScroll: true - })); - } - }); -}; - -//$('#testSuite').empty(); -function showCompletion() { - var time = Math.floor(Date.now()) - started; - ga('send', 'event', 'Challenge', 'solved', challenge_Name + ', Time: ' + time); - $('#next-courseware-button').removeAttr('disabled'); - $('#next-courseware-button').addClass('animated tada'); - if (!userLoggedIn) { - $('#complete-courseware-dialog').modal('show'); - } - $('body').keydown(function(e) { - if (e.ctrlKey && e.keyCode == 13) { - $('#next-courseware-button').click(); - $('#next-courseware-button').unbind('click'); - } - }); -} - -/* - Local Storage Update System By Andrew Cay(Resto) - codeStorage: singleton object that contains properties and methods related to - dealing with the localStorage system. - The keys work off of the variable challenge_name to make unique identifiers per bonfire - - Two extra functionalities: - Added anonymous version checking system incase of future updates to the system - Added keyup listener to editor(myCodeMirror) so the last update has been saved to storage - */ -var codeStorage = { - version: 0.01, - keyVersion:"saveVersion", - keyValue: null,//where the value of the editor is saved - updateWait: 2000,// 2 seconds - updateTimeoutId: null, - eventArray: []//for firing saves -}; -// Returns true if the editor code was saved since last key press (use this if you want to make a "saved" notification somewhere") -codeStorage.hasSaved = function(){ - return ( updateTimeoutId === null ); -}; -codeStorage.onSave = function(func){ - codeStorage.eventArray.push(func); -}; -codeStorage.setSaveKey = function(key){ - codeStorage.keyValue = key + 'Val'; -}; -codeStorage.getEditorValue = function(){ - return ('' + localStorage.getItem(codeStorage.keyValue)); -}; - -codeStorage.isAlive = function() { - var val = this.getEditorValue() - return val !== 'null' && - val !== 'undefined' && - (val && val.length > 0); -}; -codeStorage.updateStorage = function(){ - if(typeof(Storage) !== undefined) { - var value = editor.getValue(); - localStorage.setItem(codeStorage.keyValue, value); - } else { - var debugging = false; - if( debugging ){ - console.log('no web storage'); - } - } - codeStorage.updateTimeoutId = null; - codeStorage.eventArray.forEach(function(func){ - func(); - }); -}; -//Update Version -(function(){ - var savedVersion = localStorage.getItem('saveVersion'); - if( savedVersion === null ){ - localStorage.setItem(codeStorage.keyVersion, codeStorage.version);//just write current version - }else{ - if( savedVersion !== codeStorage.version ){ - //Update version - } - } -})(); - - - -///Set everything up one page -/// Update local save when editor has changed -codeStorage.setSaveKey(challenge_Name); -editor.on('keyup', function(){ - window.clearTimeout(codeStorage.updateTimeoutId); - codeStorage.updateTimeoutId = window.setTimeout(codeStorage.updateStorage, codeStorage.updateWait); -}); - -var editorValue; - - -var challengeSeed = challengeSeed || null; -var tests = tests || []; - - -var allSeeds = ''; -(function() { - challengeSeed.forEach(function(elem) { - allSeeds += elem + '\n'; - }); -})(); - -editorValue = (codeStorage.isAlive())? codeStorage.getEditorValue() : allSeeds; - -editor.setValue(editorValue.replace((/fccss/gi), '')); -editor.refresh(); - -var resetEditor = function resetEditor() { - editor.setValue(allSeeds.replace((/fccss/gi), '')); - updatePreview(); - codeStorage.updateStorage(); -}; - - - -/* -var challengeSeed = challengeSeed || null; -var allSeeds = ''; -(function() { - challengeSeed.forEach(function(elem) { - allSeeds += elem.replace(/fccss/g, '') + '\n'; - }); - editor.setValue(allSeeds); - (function() { - setTimeout(function() { - editor.refresh(); - }, 200); - })(); -})(); -*/ diff --git a/public/js/lib/coursewares/coursewaresJSFramework_0.0.6.js b/public/js/lib/coursewares/coursewaresJSFramework_0.0.6.js deleted file mode 100644 index ddeb9519f4..0000000000 --- a/public/js/lib/coursewares/coursewaresJSFramework_0.0.6.js +++ /dev/null @@ -1,394 +0,0 @@ -var widgets = []; -var myCodeMirror = CodeMirror.fromTextArea(document.getElementById("codeEditor"), { - lineNumbers: true, - mode: "javascript", - theme: 'monokai', - runnable: true, - lint: true, - matchBrackets: true, - autoCloseBrackets: true, - scrollbarStyle: 'null', - lineWrapping: true, - gutters: ["CodeMirror-lint-markers"], - onKeyEvent: doLinting -}); -var editor = myCodeMirror; -editor.setSize("100%", "auto"); - -// Hijack tab key to enter two spaces intead -editor.setOption("extraKeys", { - Tab: function(cm) { - if (cm.somethingSelected()) { - cm.indentSelection("add"); - } else { - var spaces = Array(cm.getOption("indentUnit") + 1).join(" "); - cm.replaceSelection(spaces); - } - }, - "Shift-Tab": function(cm) { - if (cm.somethingSelected()) { - cm.indentSelection("subtract"); - } else { - var spaces = Array(cm.getOption("indentUnit") + 1).join(" "); - cm.replaceSelection(spaces); - } - }, - "Ctrl-Enter": function() { - bonfireExecute(); - return false; - } -}); - - -var attempts = 0; -if (attempts) { - attempts = 0; -} - - -var codeOutput = CodeMirror.fromTextArea(document.getElementById("codeOutput"), { - lineNumbers: false, - mode: "text", - theme: 'monokai', - readOnly: 'nocursor', - lineWrapping: true -}); - -codeOutput.setValue('/**\n' + - ' * Your output will go here.\n' + ' * Console.log() -type statements\n' + - ' * will appear in your browser\'s\n' + ' * DevTools JavaScript console.\n' + - ' */'); -codeOutput.setSize("100%", "100%"); -var info = editor.getScrollInfo(); -var after = editor.charCoords({ - line: editor.getCursor().line + 1, - ch: 0 -}, "local").top; -if (info.top + info.clientHeight < after) - editor.scrollTo(null, after - info.clientHeight + 3); - -function doLinting() { - editor.operation(function() { - for (var i = 0; i < widgets.length; ++i) - editor.removeLineWidget(widgets[i]); - widgets.length = 0; - JSHINT(editor.getValue()); - for (var i = 0; i < JSHINT.errors.length; ++i) { - var err = JSHINT.errors[i]; - if (!err) continue; - var msg = document.createElement("div"); - var icon = msg.appendChild(document.createElement("span")); - icon.innerHTML = "!!"; - icon.className = "lint-error-icon"; - msg.appendChild(document.createTextNode(err.reason)); - msg.className = "lint-error"; - widgets.push(editor.addLineWidget(err.line - 1, msg, { - coverGutter: false, - noHScroll: true - })); - } - }); -} - -$('#submitButton').on('click', function() { - bonfireExecute(); -}); - -function bonfireExecute() { - attempts++; - ga('send', 'event', 'Challenge', 'ran-code', challenge_Name); - userTests = null; - $('#codeOutput').empty(); - var userJavaScript = myCodeMirror.getValue(); - var failedCommentTest = false; - if(userJavaScript.match(/\/\*/gi) && userJavaScript.match(/\*\//gi) == null){ - failedCommentTest = true; - } - else if(!failedCommentTest && userJavaScript.match(/\/\*/gi) && userJavaScript.match(/\/\*/gi).length > userJavaScript.match(/\*\//gi).length){ - failedCommentTest = true; - } - userJavaScript = removeComments(userJavaScript); - userJavaScript = scrapeTests(userJavaScript); - // simple fix in case the user forgets to invoke their function - - submit(userJavaScript, function(cls, message) { - if(failedCommentTest){ - myCodeMirror.setValue(myCodeMirror.getValue() + "*/"); - console.log('Caught Unfinished Comment'); - codeOutput.setValue("Unfinished mulit-line comment"); - failedCommentTest = false; - } - else if (cls) { - codeOutput.setValue(message.error); - runTests('Error', null); - } else { - codeOutput.setValue(message.output); - codeOutput.setValue(codeOutput.getValue().replace(/\\\"/gi,'')); - message.input = removeLogs(message.input); - runTests(null, message); - } - }); -} - - -var userTests; -var testSalt = Math.random(); - - -var scrapeTests = function(userJavaScript) { - - // insert tests from mongo - for (var i = 0; i < tests.length; i++) { - userJavaScript += '\n' + tests[i]; - } - - var counter = 0; - var regex = new RegExp( - /(expect(\s+)?\(.*\;)|(assert(\s+)?\(.*\;)|(assert\.\w.*\;)|(.*\.should\..*\;)/ - ); - var match = regex.exec(userJavaScript); - while (match != null) { - var replacement = '//' + counter + testSalt; - userJavaScript = userJavaScript.substring(0, match.index) + replacement + - userJavaScript.substring(match.index + match[0].length); - - if (!userTests) { - userTests = []; - } - userTests.push({ - "text": match[0], - "line": counter, - "err": null - }); - counter++; - match = regex.exec(userJavaScript); - } - - return userJavaScript; -}; - -function removeComments(userJavaScript) { - var regex = new RegExp(/(\/\*[^(\*\/)]*\*\/)|\/\/[^\n]*/g); - return userJavaScript.replace(regex, ''); -} - -function removeLogs(userJavaScript) { - return userJavaScript.replace(/(console\.[\w]+\s*\(.*\;)/g, ''); -} - -var pushed = false; -var createTestDisplay = function() { - if (pushed) { - userTests.pop(); - } - for (var i = 0; i < userTests.length; i++) { - var test = userTests[i]; - var testDoc = document.createElement("div"); - if (test.err != null) { - console.log('Should be displaying bad tests'); - $(testDoc) - .html( - "
" + - test.text + "
" + - test.err + "
") - .appendTo($('#testSuite')); - } else { - $(testDoc) - .html( - "
" + - test.text + "
") - .appendTo($('#testSuite')); - } - }; -}; - -var expect = chai.expect; -var assert = chai.assert; -var should = chai.should(); - - -var reassembleTest = function(test, data) { - var lineNum = test.line; - var regexp = new RegExp("\/\/" + lineNum + testSalt); - return data.input.replace(regexp, test.text); -}; - -var runTests = function(err, data) { - var allTestsPassed = true; - pushed = false; - $('#testSuite').children().remove(); - if (err && userTests.length > 0) { - userTests = [{ - text: "Program Execution Failure", - err: "No user tests were run." - }]; - createTestDisplay(); - } - //Add blocks to test exploits here! - else if(editorValue.match(/if\s\(null\)\sconsole\.log\(1\);/gi)){ - allTestsPassed = false; - userTests = [{ - text: "Program Execution Failure", - err: "Invalid if (null) console.log(1); detected" - }]; - createTestDisplay(); - } - else if (userTests) { - userTests.push(false); - pushed = true; - userTests.forEach(function(chaiTestFromJSON, indexOfTestArray, - __testArray) { - try { - if (chaiTestFromJSON) { - var output = eval(reassembleTest(chaiTestFromJSON, data)); - } - } catch (error) { - allTestsPassed = false; - __testArray[indexOfTestArray].err = error.message; - } finally { - if (!chaiTestFromJSON) { - createTestDisplay(); - } - } - }); - - if (allTestsPassed) { - allTestsPassed = false; - showCompletion(); - } - - } -}; - -function showCompletion() { - var time = Math.floor(Date.now()) - started; - ga('send', 'event', 'Challenge', 'solved', challenge_Name + ', Time: ' + time + - ', Attempts: ' + attempts); - var bonfireSolution = myCodeMirror.getValue(); - var didCompleteWith = $('#completed-with').val() || null; - $.post( - '/completed-bonfire/', { - challengeInfo: { - challengeId: challenge_Id, - challengeName: challenge_Name, - completedWith: didCompleteWith, - challengeType: challengeType, - solution: bonfireSolution - } - }, - function(res) { - if (res) { - $('#complete-courseware-dialog').modal('show'); - $('#complete-courseware-dialog').keydown(function(e) { - if (e.ctrlKey && e.keyCode == 13) { - $('#next-courseware-button').click(); - } - }); - } - } - ); - -} - - -/* - Local Storage Update System By Andrew Cay(Resto) - codeStorage: singleton object that contains properties and methods related to - dealing with the localStorage system. - The keys work off of the variable challenge_name to make unique identifiers per bonfire - - Two extra functionalities: - Added anonymous version checking system incase of future updates to the system - Added keyup listener to editor(myCodeMirror) so the last update has been saved to storage - */ -var codeStorage = { - version: 0.01, - keyVersion:"saveVersion", - keyValue: null,//where the value of the editor is saved - updateWait: 2000,// 2 seconds - updateTimeoutId: null, - eventArray: []//for firing saves -}; -// Returns true if the editor code was saved since last key press (use this if you want to make a "saved" notification somewhere") -codeStorage.hasSaved = function(){ - return ( updateTimeoutId === null ); -}; -codeStorage.onSave = function(func){ - codeStorage.eventArray.push(func); -}; -codeStorage.setSaveKey = function(key){ - codeStorage.keyValue = key + 'Val'; -}; -codeStorage.getEditorValue = function(){ - return ('' + localStorage.getItem(codeStorage.keyValue)); -}; - -codeStorage.isAlive = function() { - var val = this.getEditorValue() - return val !== 'null' && - val !== 'undefined' && - (val && val.length > 0); -} -codeStorage.updateStorage = function(){ - if(typeof(Storage) !== undefined) { - var value = editor.getValue(); - localStorage.setItem(codeStorage.keyValue, value); - } else { - var debugging = false; - if( debugging ){ - console.log('no web storage'); - } - } - codeStorage.updateTimeoutId = null; - codeStorage.eventArray.forEach(function(func){ - func(); - }); -}; -//Update Version -(function(){ - var savedVersion = localStorage.getItem('saveVersion'); - if( savedVersion === null ){ - localStorage.setItem(codeStorage.keyVersion, codeStorage.version);//just write current version - }else{ - if( savedVersion !== codeStorage.version ){ - //Update version - } - } -})(); - - - -///Set everything up one page -/// Update local save when editor has changed -codeStorage.setSaveKey(challenge_Name); -editor.on('keyup', function(){ - window.clearTimeout(codeStorage.updateTimeoutId); - codeStorage.updateTimeoutId = window.setTimeout(codeStorage.updateStorage, codeStorage.updateWait); -}); - -var editorValue; - - -var challengeSeed = challengeSeed || null; -var tests = tests || []; - - -var allSeeds = ''; -(function() { - challengeSeed.forEach(function(elem) { - allSeeds += elem + '\n'; - }); -})(); - -editorValue = (codeStorage.isAlive())? codeStorage.getEditorValue() : allSeeds; - -myCodeMirror.setValue(editorValue); - -var resetEditor = function resetEditor() { - editor.setValue(allSeeds); - codeStorage.updateStorage(); -}; - -$(document).ready(function(){ - bonfireExecute(); -}); diff --git a/server/views/coursewares/showHTML.jade b/server/views/coursewares/showHTML.jade index 85970895f9..f22fbdfb76 100644 --- a/server/views/coursewares/showHTML.jade +++ b/server/views/coursewares/showHTML.jade @@ -31,10 +31,11 @@ block content for sentence in details p.wrappable.negative-10!= sentence .negative-bottom-margin-30 + label.negative-10.btn.btn-primary.btn-block#submitButton + i.fa.fa-play + |   Run code (ctrl + enter) + br if (user) - label.btn.btn-primary.btn-block.negative-10#next-courseware-button - .ion-checkmark-circled - |   Go to my next challenge (ctrl + enter) .button-spacer .btn-group.input-group.btn-group-justified label.btn.btn-success#trigger-reset-modal @@ -71,6 +72,9 @@ block content form.code .codeMirrorView textarea#codeEditor(autofocus=true, style='display: none;') + script(src = '/js/lib/coursewares/commonFrameWork.js') + script. + editor.setOption("mode", "text/html"); .col-md-4.col-lg-3 .hidden-xs.hidden-sm img.iphone-position.iframe-scroll(src="https://s3.amazonaws.com/freecodecamp/iphone6-frame.png", style = "z-index: -2;") @@ -88,4 +92,3 @@ block content span.completion-icon.ion-checkmark-circled.text-primary a.animated.fadeIn.btn.btn-lg.signup-btn.btn-block(href='/login') Sign in so you can save your progress include ../partials/challenge-modals - script(src="/js/lib/coursewares/coursewaresHCJQFramework_0.1.9.js") diff --git a/server/views/coursewares/showJS.jade b/server/views/coursewares/showJS.jade index 85ab33adaa..2d8acf85a3 100644 --- a/server/views/coursewares/showJS.jade +++ b/server/views/coursewares/showJS.jade @@ -72,7 +72,9 @@ block content form.code .codeMirrorView textarea#codeEditor(autofocus=true, style='display: none;') - script(src='/js/lib/coursewares/coursewaresJSFramework_0.0.6.js') + script(src = '/js/lib/coursewares/commonFrameWork.js') + script. + editor.setOption("mode", "javascript"); #complete-courseware-dialog.modal(tabindex='-1') .modal-dialog.animated.zoomIn.fast-animation .modal-content From 1477f56f97e309ad78ef947a9690ed72d4e46652 Mon Sep 17 00:00:00 2001 From: benmcmahon100 Date: Sun, 23 Aug 2015 22:26:02 +0100 Subject: [PATCH 02/10] Merge of the frameworks: the desolation of the views --- server/views/coursewares/showHTML.jade | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/views/coursewares/showHTML.jade b/server/views/coursewares/showHTML.jade index f22fbdfb76..65659f2f9c 100644 --- a/server/views/coursewares/showHTML.jade +++ b/server/views/coursewares/showHTML.jade @@ -90,5 +90,8 @@ block content .text-center .animated.zoomInDown.delay-half span.completion-icon.ion-checkmark-circled.text-primary - a.animated.fadeIn.btn.btn-lg.signup-btn.btn-block(href='/login') Sign in so you can save your progress + if(user) + a.animated.fadeIn.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge') Go to the next challenge + else + a.animated.fadeIn.btn.btn-lg.signup-btn.btn-block(href='/login') Sign in so you can save your progress include ../partials/challenge-modals From 390469a1b64edc8d4af58fdcd5f0cd6d635c5603 Mon Sep 17 00:00:00 2001 From: benmcmahon100 Date: Sun, 23 Aug 2015 22:45:28 +0100 Subject: [PATCH 03/10] Framework work not working - in progress --- public/js/lib/coursewares/commonFrameWork.js | 85 +++++++++++--------- 1 file changed, 45 insertions(+), 40 deletions(-) diff --git a/public/js/lib/coursewares/commonFrameWork.js b/public/js/lib/coursewares/commonFrameWork.js index a2717ca7e1..bfaba9dc93 100644 --- a/public/js/lib/coursewares/commonFrameWork.js +++ b/public/js/lib/coursewares/commonFrameWork.js @@ -176,14 +176,15 @@ if(typeof prodOrDev !== 'undefined') { editor.setValue(editor.getValue() + "-->"); editorValueForIFrame = editorValueForIFrame + "-->"; } - goodTests = 0; var previewFrame = document.getElementById('preview'); var preview = previewFrame.contentDocument || previewFrame.contentWindow.document; + + //Here is the issue + preview.open(); - preview.write(libraryIncludes + editor.getValue()); + //preview.write(libraryIncludes + editor.getValue()); codeStorage.updateStorage(); preview.close(); - } setTimeout(updatePreview, 300); @@ -405,6 +406,20 @@ var runTests = function(err, data) { allTestsPassed = false; showCompletion(); } + else{ + if(challengeType === "0"){ + $('#testSuite').empty(); + + editorValueForIFrame = editor.getValue(); + goodTests = 0; + var previewFrame = document.getElementById('preview'); + var preview = previewFrame.contentDocument || previewFrame.contentWindow.document; + preview.open(); + preview.write(libraryIncludes + editor.getValue() + ""); + codeStorage.updateStorage(); + preview.close(); + } + } } }; @@ -413,49 +428,39 @@ function bonfireExecute() { attempts++; ga('send', 'event', 'Challenge', 'ran-code', challenge_Name); userTests = null; - if(challengeType === "0"){ - $('#testSuite').empty(); - - editorValueForIFrame = editor.getValue(); - goodTests = 0; - var previewFrame = document.getElementById('preview'); - var preview = previewFrame.contentDocument || previewFrame.contentWindow.document; - preview.open(); - preview.write(libraryIncludes + editor.getValue() + ""); - codeStorage.updateStorage(); - preview.close(); + var userJavaScript = myCodeMirror.getValue(); + var failedCommentTest = false; + if (userJavaScript.match(/\/\*/gi) && userJavaScript.match(/\*\//gi) == null) { + failedCommentTest = true; } - else { - var userJavaScript = myCodeMirror.getValue(); - var failedCommentTest = false; - if (userJavaScript.match(/\/\*/gi) && userJavaScript.match(/\*\//gi) == null) { - failedCommentTest = true; - } - else if (!failedCommentTest && userJavaScript.match(/\/\*/gi) && userJavaScript.match(/\/\*/gi).length > userJavaScript.match(/\*\//gi).length) { - failedCommentTest = true; - } - userJavaScript = removeComments(userJavaScript); - userJavaScript = scrapeTests(userJavaScript); - // simple fix in case the user forgets to invoke their function + else if (!failedCommentTest && userJavaScript.match(/\/\*/gi) && userJavaScript.match(/\/\*/gi).length > userJavaScript.match(/\*\//gi).length) { + failedCommentTest = true; + } + userJavaScript = removeComments(userJavaScript); + userJavaScript = scrapeTests(userJavaScript); + // simple fix in case the user forgets to invoke their function - submit(userJavaScript, function (cls, message) { - if (failedCommentTest) { - myCodeMirror.setValue(myCodeMirror.getValue() + "*/"); - console.log('Caught Unfinished Comment'); + submit(userJavaScript, function (cls, message) { + if (failedCommentTest) { + myCodeMirror.setValue(myCodeMirror.getValue() + "*/"); + console.log('Caught Unfinished Comment'); + if(challengeType !== 0) codeOutput.setValue("Unfinished mulit-line comment"); - failedCommentTest = false; - } - else if (cls) { + failedCommentTest = false; + } + else if (cls) { + if(challengeType !== 0) codeOutput.setValue(message.error); - runTests('Error', null); - } else { + runTests('Error', null); + } else { + if(challengeType !== 0) codeOutput.setValue(message.output); + if(challengeType !== 0) codeOutput.setValue(codeOutput.getValue().replace(/\\\"/gi, '')); - message.input = removeLogs(message.input); - runTests(null, message); - } - }); - } + message.input = removeLogs(message.input); + runTests(null, message); + } + }); } $('#submitButton').on('click', function() { From f06d6ca650ec9785e41309c356842647d9c3ea9d Mon Sep 17 00:00:00 2001 From: benmcmahon100 Date: Mon, 24 Aug 2015 01:16:15 +0100 Subject: [PATCH 04/10] Merging of the framework: Ready for QA run --- public/js/lib/coursewares/commonFrameWork.js | 149 ++++++++++++------- public/js/lib/coursewares/sandbox.js | 4 +- 2 files changed, 101 insertions(+), 52 deletions(-) diff --git a/public/js/lib/coursewares/commonFrameWork.js b/public/js/lib/coursewares/commonFrameWork.js index bfaba9dc93..c2c461500a 100644 --- a/public/js/lib/coursewares/commonFrameWork.js +++ b/public/js/lib/coursewares/commonFrameWork.js @@ -160,34 +160,76 @@ editor.on("keyup", function () { delay = setTimeout(updatePreview, 300); }); +function safeHTMLRun(test){ + var previewFrame = document.getElementById('preview'); + var preview = previewFrame.contentDocument || previewFrame.contentWindow.document; + if(editor.getValue().match(/\/gi) !== null) { + var s = editor.getValue().split(/\<\s?script\s?\>/gi)[1].split(/\<\s?\/\s?script\s?\>/gi)[0]; + submit( + s, function (cls, message) { + if (cls) { + console.log(message.error); + $('#mainEditorPanel').html("
" + message.error + "
" + $('#mainEditorPanel').html()); + $('.runTimeError').hide().fadeIn(function(){ + setTimeout(function(){ + $(this).remove(); + }, 3000) + }); + } else { + if(test){ + preview.open(); + preview.write(libraryIncludes + editor.getValue() +iFrameScript); + codeStorage.updateStorage(); + preview.close(); + } + else{ + preview.open(); + preview.write(libraryIncludes + editor.getValue()); + codeStorage.updateStorage(); + preview.close(); + } + } + } + ); + } + else { + if(test){ + preview.open(); + preview.write(libraryIncludes + editor.getValue() +iFrameScript); + codeStorage.updateStorage(); + preview.close(); + } + else{ + preview.open(); + preview.write(libraryIncludes + editor.getValue()); + codeStorage.updateStorage(); + preview.close(); + } + } +} + if(typeof prodOrDev !== 'undefined') { var nodeEnv = prodOrDev === 'production' ? 'http://www.freecodecamp.com' : 'http://localhost:3001'; - - function updatePreview() { - editorValueForIFrame = editor.getValue(); - var failedCommentTest = false; - if (editorValueForIFrame.match(/\<\!\-\-/gi) && editorValueForIFrame.match(/\-\-\>/gi) == null) { - failedCommentTest = true; + if(challengeType === "0") + { + function updatePreview() { + editorValueForIFrame = editor.getValue(); + var failedCommentTest = false; + if (editorValueForIFrame.match(/\<\!\-\-/gi) && editorValueForIFrame.match(/\-\-\>/gi) == null) { + failedCommentTest = true; + } + else if (editorValueForIFrame.match(/\<\!\-\-/gi) && editorValueForIFrame.match(/\<\!\-\-/gi).length > editorValueForIFrame.match(/\-\-\>/gi).length) { + failedCommentTest = true; + } + if (failedCommentTest) { + editor.setValue(editor.getValue() + "-->"); + editorValueForIFrame = editorValueForIFrame + "-->"; + } + safeHTMLRun(false); } - else if (editorValueForIFrame.match(/\<\!\-\-/gi) && editorValueForIFrame.match(/\<\!\-\-/gi).length > editorValueForIFrame.match(/\-\-\>/gi).length) { - failedCommentTest = true; - } - if (failedCommentTest) { - editor.setValue(editor.getValue() + "-->"); - editorValueForIFrame = editorValueForIFrame + "-->"; - } - var previewFrame = document.getElementById('preview'); - var preview = previewFrame.contentDocument || previewFrame.contentWindow.document; - //Here is the issue - - preview.open(); - //preview.write(libraryIncludes + editor.getValue()); - codeStorage.updateStorage(); - preview.close(); + setTimeout(updatePreview, 300); } - - setTimeout(updatePreview, 300); } /** * "post" methods @@ -256,7 +298,6 @@ if (attempts) { attempts = 0; } -console.log(challengeType); if(challengeType !== "0") { var codeOutput = CodeMirror.fromTextArea(document.getElementById("codeOutput"), { lineNumbers: false, @@ -428,39 +469,45 @@ function bonfireExecute() { attempts++; ga('send', 'event', 'Challenge', 'ran-code', challenge_Name); userTests = null; - var userJavaScript = myCodeMirror.getValue(); - var failedCommentTest = false; - if (userJavaScript.match(/\/\*/gi) && userJavaScript.match(/\*\//gi) == null) { - failedCommentTest = true; - } - else if (!failedCommentTest && userJavaScript.match(/\/\*/gi) && userJavaScript.match(/\/\*/gi).length > userJavaScript.match(/\*\//gi).length) { - failedCommentTest = true; - } - userJavaScript = removeComments(userJavaScript); - userJavaScript = scrapeTests(userJavaScript); - // simple fix in case the user forgets to invoke their function + if(challengeType !== "0"){ + var userJavaScript = myCodeMirror.getValue(); + var failedCommentTest = false; + if (userJavaScript.match(/\/\*/gi) && userJavaScript.match(/\*\//gi) == null) { + failedCommentTest = true; + } + else if (!failedCommentTest && userJavaScript.match(/\/\*/gi) && userJavaScript.match(/\/\*/gi).length > userJavaScript.match(/\*\//gi).length) { + failedCommentTest = true; + } + userJavaScript = removeComments(userJavaScript); + userJavaScript = scrapeTests(userJavaScript); + // simple fix in case the user forgets to invoke their function - submit(userJavaScript, function (cls, message) { - if (failedCommentTest) { - myCodeMirror.setValue(myCodeMirror.getValue() + "*/"); - console.log('Caught Unfinished Comment'); - if(challengeType !== 0) + submit(userJavaScript, function (cls, message) { + if (failedCommentTest) { + myCodeMirror.setValue(myCodeMirror.getValue() + "*/"); + console.log('Caught Unfinished Comment'); codeOutput.setValue("Unfinished mulit-line comment"); - failedCommentTest = false; - } - else if (cls) { - if(challengeType !== 0) + failedCommentTest = false; + } + else if (cls) { codeOutput.setValue(message.error); - runTests('Error', null); - } else { - if(challengeType !== 0) + runTests('Error', null); + } else { codeOutput.setValue(message.output); - if(challengeType !== 0) codeOutput.setValue(codeOutput.getValue().replace(/\\\"/gi, '')); - message.input = removeLogs(message.input); - runTests(null, message); + message.input = removeLogs(message.input); + runTests(null, message); + } + }); + } + else { + editorValueForIFrame = editor.getValue(); + if (failedCommentTest) { + editor.setValue(editor.getValue() + "-->"); + editorValueForIFrame = editorValueForIFrame + "-->"; } - }); + safeHTMLRun(true); + } } $('#submitButton').on('click', function() { diff --git a/public/js/lib/coursewares/sandbox.js b/public/js/lib/coursewares/sandbox.js index 55c80ea99d..75452114eb 100644 --- a/public/js/lib/coursewares/sandbox.js +++ b/public/js/lib/coursewares/sandbox.js @@ -73,7 +73,9 @@ var reset = function() { setTimeout( function() { endLoading(); console.log("resetting on fatal plugin error"); - codeOutput.setValue("Sorry, your code is either too slow, has a fatal error, or contains an infinite loop."); + if(challengeType === 0){ + codeOutput.setValue("Sorry, your code is either too slow, has a fatal error, or contains an infinite loop."); + } reset(); }, 10); }); From b0a572bbfcb38a40547e87018727d203cbd9547d Mon Sep 17 00:00:00 2001 From: benmcmahon100 Date: Tue, 25 Aug 2015 00:49:19 +0100 Subject: [PATCH 05/10] Merging of the framework: Ready for QA run - Now with nice errors and function fatal + $($) fatal detection --- public/js/lib/coursewares/commonFrameWork.js | 72 +++++++++++++------- 1 file changed, 48 insertions(+), 24 deletions(-) diff --git a/public/js/lib/coursewares/commonFrameWork.js b/public/js/lib/coursewares/commonFrameWork.js index c2c461500a..68137481fe 100644 --- a/public/js/lib/coursewares/commonFrameWork.js +++ b/public/js/lib/coursewares/commonFrameWork.js @@ -160,25 +160,37 @@ editor.on("keyup", function () { delay = setTimeout(updatePreview, 300); }); +function workerError(error){ + var display = $('.runTimeError'); + var housing = $('#testSuite'); + if(display.html() != error){ + display.remove(); + housing.prepend("
" + error + "
"); + display.hide().fadeIn(function(){ + setTimeout(function(){ + display.fadeOut(function(){ + display.remove(); + }); + }, 1000) + }); + } +} + function safeHTMLRun(test){ var previewFrame = document.getElementById('preview'); var preview = previewFrame.contentDocument || previewFrame.contentWindow.document; if(editor.getValue().match(/\/gi) !== null) { var s = editor.getValue().split(/\<\s?script\s?\>/gi)[1].split(/\<\s?\/\s?script\s?\>/gi)[0]; + s = "var $ = function(){return(new function(){this.add=function(){return(null);};this.addBack=function(){return(null);};this.addClass=function(){return(null);};this.after=function(){return(null);};this.ajaxComplete=function(){return(null);};this.ajaxError=function(){return(null);};this.ajaxSend=function(){return(null);};this.ajaxStart=function(){return(null);};this.ajaxStop=function(){return(null);};this.ajaxSuccess=function(){return(null);};this.andSelf=function(){return(null);};this.animate=function(){return(null);};this.append=function(){return(null);};this.appendTo=function(){return(null);};this.attr=function(){return(null);};this.before=function(){return(null);};this.bind=function(){return(null);};this.blur=function(){return(null);};this.callbacksadd=function(){return(null);};this.callbacksdisable=function(){return(null);};this.callbacksdisabled=function(){return(null);};this.callbacksempty=function(){return(null);};this.callbacksfire=function(){return(null);};this.callbacksfired=function(){return(null);};this.callbacksfireWith=function(){return(null);};this.callbackshas=function(){return(null);};this.callbackslock=function(){return(null);};this.callbackslocked=function(){return(null);};this.callbacksremove=function(){return(null);};this.change=function(){return(null);};this.children=function(){return(null);};this.clearQueue=function(){return(null);};this.click=function(){return(null);};this.clone=function(){return(null);};this.closest=function(){return(null);};this.contents=function(){return(null);};this.context=function(){return(null);};this.css=function(){return(null);};this.data=function(){return(null);};this.dblclick=function(){return(null);};this.deferredalways=function(){return(null);};this.deferreddone=function(){return(null);};this.deferredfail=function(){return(null);};this.deferredisRejected=function(){return(null);};this.deferredisResolved=function(){return(null);};this.deferrednotify=function(){return(null);};this.deferrednotifyWith=function(){return(null);};this.deferredpipe=function(){return(null);};this.deferredprogress=function(){return(null);};this.deferredpromise=function(){return(null);};this.deferredreject=function(){return(null);};this.deferredrejectWith=function(){return(null);};this.deferredresolve=function(){return(null);};this.deferredresolveWith=function(){return(null);};this.deferredstate=function(){return(null);};this.deferredthen=function(){return(null);};this.delay=function(){return(null);};this.delegate=function(){return(null);};this.dequeue=function(){return(null);};this.detach=function(){return(null);};this.die=function(){return(null);};this.each=function(){return(null);};this.empty=function(){return(null);};this.end=function(){return(null);};this.eq=function(){return(null);};this.error=function(){return(null);};this.eventcurrentTarget=function(){return(null);};this.eventdata=function(){return(null);};this.eventdelegateTarget=function(){return(null);};this.eventisDefaultPrevented=function(){return(null);};this.eventisImmediatePropagationStopped=function(){return(null);};this.eventisPropagationStopped=function(){return(null);};this.eventmetaKey=function(){return(null);};this.eventnamespace=function(){return(null);};this.eventpageX=function(){return(null);};this.eventpageY=function(){return(null);};this.eventpreventDefault=function(){return(null);};this.eventrelatedTarget=function(){return(null);};this.eventresult=function(){return(null);};this.eventstopImmediatePropagation=function(){return(null);};this.eventstopPropagation=function(){return(null);};this.eventtarget=function(){return(null);};this.eventtimeStamp=function(){return(null);};this.eventtype=function(){return(null);};this.eventwhich=function(){return(null);};this.fadeIn=function(){return(null);};this.fadeOut=function(){return(null);};this.fadeTo=function(){return(null);};this.fadeToggle=function(){return(null);};this.filter=function(){return(null);};this.find=function(){return(null);};this.finish=function(){return(null);};this.first=function(){return(null);};this.focus=function(){return(null);};this.focusin=function(){return(null);};this.focusout=function(){return(null);};this.get=function(){return(null);};this.has=function(){return(null);};this.hasClass=function(){return(null);};this.height=function(){return(null);};this.hide=function(){return(null);};this.hover=function(){return(null);};this.html=function(){return(null);};this.index=function(){return(null);};this.innerHeight=function(){return(null);};this.innerWidth=function(){return(null);};this.insertAfter=function(){return(null);};this.insertBefore=function(){return(null);};this.is=function(){return(null);};this.jQuery=function(){return(null);};this.jquery=function(){return(null);};this.jQueryajax=function(){return(null);};this.jQueryajaxPrefilter=function(){return(null);};this.jQueryajaxSetup=function(){return(null);};this.jQueryajaxTransport=function(){return(null);};this.jQueryboxModel=function(){return(null);};this.jQuerybrowser=function(){return(null);};this.jQueryCallbacks=function(){return(null);};this.jQuerycontains=function(){return(null);};this.jQuerycssHooks=function(){return(null);};this.jQuerycssNumber=function(){return(null);};this.jQuerydata=function(){return(null);};this.jQueryDeferred=function(){return(null);};this.jQuerydequeue=function(){return(null);};this.jQueryeach=function(){return(null);};this.jQueryerror=function(){return(null);};this.jQueryextend=function(){return(null);};this.jQueryfnextend=function(){return(null);};this.jQueryfxinterval=function(){return(null);};this.jQueryfxoff=function(){return(null);};this.jQueryget=function(){return(null);};this.jQuerygetJSON=function(){return(null);};this.jQuerygetScript=function(){return(null);};this.jQueryglobalEval=function(){return(null);};this.jQuerygrep=function(){return(null);};this.jQueryhasData=function(){return(null);};this.jQueryholdReady=function(){return(null);};this.jQueryinArray=function(){return(null);};this.jQueryisArray=function(){return(null);};this.jQueryisEmptyObject=function(){return(null);};this.jQueryisFunction=function(){return(null);};this.jQueryisNumeric=function(){return(null);};this.jQueryisPlainObject=function(){return(null);};this.jQueryisWindow=function(){return(null);};this.jQueryisXMLDoc=function(){return(null);};this.jQuerymakeArray=function(){return(null);};this.jQuerymap=function(){return(null);};this.jQuerymerge=function(){return(null);};this.jQuerynoConflict=function(){return(null);};this.jQuerynoop=function(){return(null);};this.jQuerynow=function(){return(null);};this.jQueryparam=function(){return(null);};this.jQueryparseHTML=function(){return(null);};this.jQueryparseJSON=function(){return(null);};this.jQueryparseXML=function(){return(null);};this.jQuerypost=function(){return(null);};this.jQueryproxy=function(){return(null);};this.jQueryqueue=function(){return(null);};this.jQueryremoveData=function(){return(null);};this.jQuerysub=function(){return(null);};this.jQuerysupport=function(){return(null);};this.jQuerytrim=function(){return(null);};this.jQuerytype=function(){return(null);};this.jQueryunique=function(){return(null);};this.jQuerywhen=function(){return(null);};this.keydown=function(){return(null);};this.keypress=function(){return(null);};this.keyup=function(){return(null);};this.last=function(){return(null);};this.length=function(){return(null);};this.live=function(){return(null);};this.load=function(){return(null);};this.load=function(){return(null);};this.map=function(){return(null);};this.mousedown=function(){return(null);};this.mouseenter=function(){return(null);};this.mouseleave=function(){return(null);};this.mousemove=function(){return(null);};this.mouseout=function(){return(null);};this.mouseover=function(){return(null);};this.mouseup=function(){return(null);};this.next=function(){return(null);};this.nextAll=function(){return(null);};this.nextUntil=function(){return(null);};this.not=function(){return(null);};this.off=function(){return(null);};this.offset=function(){return(null);};this.offsetParent=function(){return(null);};this.on=function(){return(null);};this.one=function(){return(null);};this.outerHeight=function(){return(null);};this.outerWidth=function(){return(null);};this.parent=function(){return(null);};this.parents=function(){return(null);};this.parentsUntil=function(){return(null);};this.position=function(){return(null);};this.prepend=function(){return(null);};this.prependTo=function(){return(null);};this.prev=function(){return(null);};this.prevAll=function(){return(null);};this.prevUntil=function(){return(null);};this.promise=function(){return(null);};this.prop=function(){return(null);};this.pushStack=function(){return(null);};this.queue=function(){return(null);};this.ready=function(){return(null);};this.remove=function(){return(null);};this.removeAttr=function(){return(null);};this.removeClass=function(){return(null);};this.removeData=function(){return(null);};this.removeProp=function(){return(null);};this.replaceAll=function(){return(null);};this.replaceWith=function(){return(null);};this.resize=function(){return(null);};this.scroll=function(){return(null);};this.scrollLeft=function(){return(null);};this.scrollTop=function(){return(null);};this.select=function(){return(null);};this.selector=function(){return(null);};this.serialize=function(){return(null);};this.serializeArray=function(){return(null);};this.show=function(){return(null);};this.siblings=function(){return(null);};this.size=function(){return(null);};this.slice=function(){return(null);};this.slideDown=function(){return(null);};this.slideToggle=function(){return(null);};this.slideUp=function(){return(null);};this.stop=function(){return(null);};this.submit=function(){return(null);};this.text=function(){return(null);};this.toArray=function(){return(null);};this.toggle=function(){return(null);};this.toggle=function(){return(null);};this.toggleClass=function(){return(null);};this.trigger=function(){return(null);};this.triggerHandler=function(){return(null);};this.unbind=function(){return(null);};this.undelegate=function(){return(null);};this.unload=function(){return(null);};this.unwrap=function(){return(null);};this.val=function(){return(null);};this.width=function(){return(null);};this.wrap=function(){return(null);};this.wrapAll=function(){return(null);};this.wrapInner=function(){return(null);}});};"+s; submit( s, function (cls, message) { if (cls) { console.log(message.error); - $('#mainEditorPanel').html("
" + message.error + "
" + $('#mainEditorPanel').html()); - $('.runTimeError').hide().fadeIn(function(){ - setTimeout(function(){ - $(this).remove(); - }, 3000) - }); + workerError(message.error); } else { if(test){ preview.open(); - preview.write(libraryIncludes + editor.getValue() +iFrameScript); + preview.write(libraryIncludes + editor.getValue() + iFrameScript); codeStorage.updateStorage(); preview.close(); } @@ -191,6 +203,7 @@ function safeHTMLRun(test){ } } ); + } else { if(test){ @@ -225,7 +238,9 @@ if(typeof prodOrDev !== 'undefined') { editor.setValue(editor.getValue() + "-->"); editorValueForIFrame = editorValueForIFrame + "-->"; } - safeHTMLRun(false); + if(!editor.getValue().match(/\$\(\$\)/gi)) { + safeHTMLRun(false); + } } setTimeout(updatePreview, 300); @@ -482,23 +497,30 @@ function bonfireExecute() { userJavaScript = scrapeTests(userJavaScript); // simple fix in case the user forgets to invoke their function - submit(userJavaScript, function (cls, message) { - if (failedCommentTest) { - myCodeMirror.setValue(myCodeMirror.getValue() + "*/"); - console.log('Caught Unfinished Comment'); - codeOutput.setValue("Unfinished mulit-line comment"); - failedCommentTest = false; + if(userJavaScript.match(/function/gi)){ + if(userJavaScript.match(/function\s+?\(|function\s+\w+\s+?\(/gi)){ + submit(userJavaScript, function (cls, message) { + if (failedCommentTest) { + myCodeMirror.setValue(myCodeMirror.getValue() + "*/"); + console.log('Caught Unfinished Comment'); + codeOutput.setValue("Unfinished mulit-line comment"); + failedCommentTest = false; + } + else if (cls) { + codeOutput.setValue(message.error); + runTests('Error', null); + } else { + codeOutput.setValue(message.output); + codeOutput.setValue(codeOutput.getValue().replace(/\\\"/gi, '')); + message.input = removeLogs(message.input); + runTests(null, message); + } + }); } - else if (cls) { - codeOutput.setValue(message.error); - runTests('Error', null); - } else { - codeOutput.setValue(message.output); - codeOutput.setValue(codeOutput.getValue().replace(/\\\"/gi, '')); - message.input = removeLogs(message.input); - runTests(null, message); + else{ + codeOutput.setValue("Unsafe or Unfinished function declaration"); } - }); + } } else { editorValueForIFrame = editor.getValue(); @@ -506,7 +528,9 @@ function bonfireExecute() { editor.setValue(editor.getValue() + "-->"); editorValueForIFrame = editorValueForIFrame + "-->"; } - safeHTMLRun(true); + if(!editor.getValue().match(/\$\(\$\)/gi)) { + safeHTMLRun(true); + } } } From 473d40baa8e5bff8550ea027a312e7ded71a0701 Mon Sep 17 00:00:00 2001 From: benmcmahon100 Date: Tue, 25 Aug 2015 14:43:34 +0100 Subject: [PATCH 06/10] Fixed the bugged test window replicating tests --- public/js/lib/coursewares/commonFrameWork.js | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/public/js/lib/coursewares/commonFrameWork.js b/public/js/lib/coursewares/commonFrameWork.js index 68137481fe..935d560ed9 100644 --- a/public/js/lib/coursewares/commonFrameWork.js +++ b/public/js/lib/coursewares/commonFrameWork.js @@ -462,21 +462,6 @@ var runTests = function(err, data) { allTestsPassed = false; showCompletion(); } - else{ - if(challengeType === "0"){ - $('#testSuite').empty(); - - editorValueForIFrame = editor.getValue(); - goodTests = 0; - var previewFrame = document.getElementById('preview'); - var preview = previewFrame.contentDocument || previewFrame.contentWindow.document; - preview.open(); - preview.write(libraryIncludes + editor.getValue() + ""); - codeStorage.updateStorage(); - preview.close(); - } - } - } }; @@ -484,6 +469,7 @@ function bonfireExecute() { attempts++; ga('send', 'event', 'Challenge', 'ran-code', challenge_Name); userTests = null; + $('#testSuite').empty(); if(challengeType !== "0"){ var userJavaScript = myCodeMirror.getValue(); var failedCommentTest = false; From e2c3ff08a8cc5c83b8b6ef4b7b413413a159cf48 Mon Sep 17 00:00:00 2001 From: benmcmahon100 Date: Tue, 25 Aug 2015 14:46:23 +0100 Subject: [PATCH 07/10] Fixed the goodTests var not resetting --- public/js/lib/coursewares/commonFrameWork.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/js/lib/coursewares/commonFrameWork.js b/public/js/lib/coursewares/commonFrameWork.js index 935d560ed9..c2bdd3c56d 100644 --- a/public/js/lib/coursewares/commonFrameWork.js +++ b/public/js/lib/coursewares/commonFrameWork.js @@ -466,6 +466,7 @@ var runTests = function(err, data) { }; function bonfireExecute() { + goodTests = 0; attempts++; ga('send', 'event', 'Challenge', 'ran-code', challenge_Name); userTests = null; From 1133aeda9b71d2c15b38df541d17d53225ea5c39 Mon Sep 17 00:00:00 2001 From: benmcmahon100 Date: Tue, 25 Aug 2015 16:10:11 +0100 Subject: [PATCH 08/10] Stopped the scripts needed for the preview being loaded on each keyDown --- public/js/lib/coursewares/commonFrameWork.js | 42 ++++++++++++++++---- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/public/js/lib/coursewares/commonFrameWork.js b/public/js/lib/coursewares/commonFrameWork.js index c2bdd3c56d..e2db213eff 100644 --- a/public/js/lib/coursewares/commonFrameWork.js +++ b/public/js/lib/coursewares/commonFrameWork.js @@ -1,4 +1,6 @@ var editor; +var blockRender = true; +var allowCompletetion = false; var widgets = []; editor = CodeMirror.fromTextArea(document.getElementById("codeEditor"), { lineNumbers: true, @@ -139,7 +141,33 @@ editor.setOption("extraKeys", { editor.setSize("100%", "auto"); -var libraryIncludes = "" + +if(challengeType === "0") { + var libraryIncludes = ""; + + $.getScript('/js/lib/jquery-2.1.1.min.js', function (scriptOne) { + $.getScript('/js/lib/chai/chai.js', function (scriptTwo) { + $.getScript('/js/lib/chai/chai-jquery.js', function (scriptThree) { + $.getScript('//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.min.js', function (scriptFour) { + libraryIncludes = "" + "" + + "" + + "" + + "" + + ""; + blockRender = false; + editorValue = (codeStorage.isAlive()) ? codeStorage.getEditorValue() : allSeeds; + myCodeMirror.setValue(editorValue); + setTimeout(function () { + $(document).ready(function () { + bonfireExecute(); + }); + }, 100); + }); + }); + }); + }); +} + +/*var libraryIncludes = "" + "" + "" + "" + @@ -147,7 +175,7 @@ var libraryIncludes = ""; + "";*/ var editorValueForIFrame; @@ -466,6 +494,9 @@ var runTests = function(err, data) { }; function bonfireExecute() { + if(!blockRender){ + + } goodTests = 0; attempts++; ga('send', 'event', 'Challenge', 'ran-code', challenge_Name); @@ -523,10 +554,5 @@ function bonfireExecute() { $('#submitButton').on('click', function() { bonfireExecute(); -}); - -$(document).ready(function(){ - editorValue = (codeStorage.isAlive())? codeStorage.getEditorValue() : allSeeds; - myCodeMirror.setValue(editorValue); - bonfireExecute(); + allowCompletetion = true; }); From 14cc6a7cefc778625dd0e190e9f5a881971c64b6 Mon Sep 17 00:00:00 2001 From: benmcmahon100 Date: Tue, 25 Aug 2015 19:28:13 +0100 Subject: [PATCH 09/10] Final touch up to the framework before merge --- public/js/lib/chai/chai.js | 4 +- public/js/lib/coursewares/commonFrameWork.js | 96 ++++++++++++-------- server/views/coursewares/showBonfire.jade | 4 +- 3 files changed, 61 insertions(+), 43 deletions(-) diff --git a/public/js/lib/chai/chai.js b/public/js/lib/chai/chai.js index 77451223e0..4191939dfa 100644 --- a/public/js/lib/chai/chai.js +++ b/public/js/lib/chai/chai.js @@ -1,5 +1,5 @@ -;(function(){ +(function(){ /** * Require the module at `name`. @@ -4797,4 +4797,4 @@ } else { (this || window)["chai"] = require("chai"); } -})() \ No newline at end of file +})(); diff --git a/public/js/lib/coursewares/commonFrameWork.js b/public/js/lib/coursewares/commonFrameWork.js index c2c461500a..22294f9265 100644 --- a/public/js/lib/coursewares/commonFrameWork.js +++ b/public/js/lib/coursewares/commonFrameWork.js @@ -150,6 +150,7 @@ var libraryIncludes = ""; @@ -160,25 +161,41 @@ editor.on("keyup", function () { delay = setTimeout(updatePreview, 300); }); +function workerError(error){ + var display = $('.runTimeError'); + var housing = $('#testSuite'); + if(display.html() != error){ + display.remove(); + housing.prepend("
" + error + "
"); + display.hide().fadeIn(function(){ + setTimeout(function(){ + display.fadeOut(function(){ + display.remove(); + }); + }, 1000) + }); + } +} + +function scopejQuery(s){ + return(s.replace(/\$/gi, "j$").replace(/document/gi, "jdocument").replace(/jQuery/gi, "jjQuery")); +} + function safeHTMLRun(test){ var previewFrame = document.getElementById('preview'); var preview = previewFrame.contentDocument || previewFrame.contentWindow.document; if(editor.getValue().match(/\/gi) !== null) { var s = editor.getValue().split(/\<\s?script\s?\>/gi)[1].split(/\<\s?\/\s?script\s?\>/gi)[0]; + s = "var document = \"\"; var $ = function(){return(new function(){this.add=function(){return(null);};this.addBack=function(){return(null);};this.addClass=function(){return(null);};this.after=function(){return(null);};this.ajaxComplete=function(){return(null);};this.ajaxError=function(){return(null);};this.ajaxSend=function(){return(null);};this.ajaxStart=function(){return(null);};this.ajaxStop=function(){return(null);};this.ajaxSuccess=function(){return(null);};this.andSelf=function(){return(null);};this.animate=function(){return(null);};this.append=function(){return(null);};this.appendTo=function(){return(null);};this.attr=function(){return(null);};this.before=function(){return(null);};this.bind=function(){return(null);};this.blur=function(){return(null);};this.callbacksadd=function(){return(null);};this.callbacksdisable=function(){return(null);};this.callbacksdisabled=function(){return(null);};this.callbacksempty=function(){return(null);};this.callbacksfire=function(){return(null);};this.callbacksfired=function(){return(null);};this.callbacksfireWith=function(){return(null);};this.callbackshas=function(){return(null);};this.callbackslock=function(){return(null);};this.callbackslocked=function(){return(null);};this.callbacksremove=function(){return(null);};this.change=function(){return(null);};this.children=function(){return(null);};this.clearQueue=function(){return(null);};this.click=function(){return(null);};this.clone=function(){return(null);};this.closest=function(){return(null);};this.contents=function(){return(null);};this.context=function(){return(null);};this.css=function(){return(null);};this.data=function(){return(null);};this.dblclick=function(){return(null);};this.deferredalways=function(){return(null);};this.deferreddone=function(){return(null);};this.deferredfail=function(){return(null);};this.deferredisRejected=function(){return(null);};this.deferredisResolved=function(){return(null);};this.deferrednotify=function(){return(null);};this.deferrednotifyWith=function(){return(null);};this.deferredpipe=function(){return(null);};this.deferredprogress=function(){return(null);};this.deferredpromise=function(){return(null);};this.deferredreject=function(){return(null);};this.deferredrejectWith=function(){return(null);};this.deferredresolve=function(){return(null);};this.deferredresolveWith=function(){return(null);};this.deferredstate=function(){return(null);};this.deferredthen=function(){return(null);};this.delay=function(){return(null);};this.delegate=function(){return(null);};this.dequeue=function(){return(null);};this.detach=function(){return(null);};this.die=function(){return(null);};this.each=function(){return(null);};this.empty=function(){return(null);};this.end=function(){return(null);};this.eq=function(){return(null);};this.error=function(){return(null);};this.eventcurrentTarget=function(){return(null);};this.eventdata=function(){return(null);};this.eventdelegateTarget=function(){return(null);};this.eventisDefaultPrevented=function(){return(null);};this.eventisImmediatePropagationStopped=function(){return(null);};this.eventisPropagationStopped=function(){return(null);};this.eventmetaKey=function(){return(null);};this.eventnamespace=function(){return(null);};this.eventpageX=function(){return(null);};this.eventpageY=function(){return(null);};this.eventpreventDefault=function(){return(null);};this.eventrelatedTarget=function(){return(null);};this.eventresult=function(){return(null);};this.eventstopImmediatePropagation=function(){return(null);};this.eventstopPropagation=function(){return(null);};this.eventtarget=function(){return(null);};this.eventtimeStamp=function(){return(null);};this.eventtype=function(){return(null);};this.eventwhich=function(){return(null);};this.fadeIn=function(){return(null);};this.fadeOut=function(){return(null);};this.fadeTo=function(){return(null);};this.fadeToggle=function(){return(null);};this.filter=function(){return(null);};this.find=function(){return(null);};this.finish=function(){return(null);};this.first=function(){return(null);};this.focus=function(){return(null);};this.focusin=function(){return(null);};this.focusout=function(){return(null);};this.get=function(){return(null);};this.has=function(){return(null);};this.hasClass=function(){return(null);};this.height=function(){return(null);};this.hide=function(){return(null);};this.hover=function(){return(null);};this.html=function(){return(null);};this.index=function(){return(null);};this.innerHeight=function(){return(null);};this.innerWidth=function(){return(null);};this.insertAfter=function(){return(null);};this.insertBefore=function(){return(null);};this.is=function(){return(null);};this.jQuery=function(){return(null);};this.jquery=function(){return(null);};this.jQueryajax=function(){return(null);};this.jQueryajaxPrefilter=function(){return(null);};this.jQueryajaxSetup=function(){return(null);};this.jQueryajaxTransport=function(){return(null);};this.jQueryboxModel=function(){return(null);};this.jQuerybrowser=function(){return(null);};this.jQueryCallbacks=function(){return(null);};this.jQuerycontains=function(){return(null);};this.jQuerycssHooks=function(){return(null);};this.jQuerycssNumber=function(){return(null);};this.jQuerydata=function(){return(null);};this.jQueryDeferred=function(){return(null);};this.jQuerydequeue=function(){return(null);};this.jQueryeach=function(){return(null);};this.jQueryerror=function(){return(null);};this.jQueryextend=function(){return(null);};this.jQueryfnextend=function(){return(null);};this.jQueryfxinterval=function(){return(null);};this.jQueryfxoff=function(){return(null);};this.jQueryget=function(){return(null);};this.jQuerygetJSON=function(){return(null);};this.jQuerygetScript=function(){return(null);};this.jQueryglobalEval=function(){return(null);};this.jQuerygrep=function(){return(null);};this.jQueryhasData=function(){return(null);};this.jQueryholdReady=function(){return(null);};this.jQueryinArray=function(){return(null);};this.jQueryisArray=function(){return(null);};this.jQueryisEmptyObject=function(){return(null);};this.jQueryisFunction=function(){return(null);};this.jQueryisNumeric=function(){return(null);};this.jQueryisPlainObject=function(){return(null);};this.jQueryisWindow=function(){return(null);};this.jQueryisXMLDoc=function(){return(null);};this.jQuerymakeArray=function(){return(null);};this.jQuerymap=function(){return(null);};this.jQuerymerge=function(){return(null);};this.jQuerynoConflict=function(){return(null);};this.jQuerynoop=function(){return(null);};this.jQuerynow=function(){return(null);};this.jQueryparam=function(){return(null);};this.jQueryparseHTML=function(){return(null);};this.jQueryparseJSON=function(){return(null);};this.jQueryparseXML=function(){return(null);};this.jQuerypost=function(){return(null);};this.jQueryproxy=function(){return(null);};this.jQueryqueue=function(){return(null);};this.jQueryremoveData=function(){return(null);};this.jQuerysub=function(){return(null);};this.jQuerysupport=function(){return(null);};this.jQuerytrim=function(){return(null);};this.jQuerytype=function(){return(null);};this.jQueryunique=function(){return(null);};this.jQuerywhen=function(){return(null);};this.keydown=function(){return(null);};this.keypress=function(){return(null);};this.keyup=function(){return(null);};this.last=function(){return(null);};this.length=function(){return(null);};this.live=function(){return(null);};this.load=function(){return(null);};this.load=function(){return(null);};this.map=function(){return(null);};this.mousedown=function(){return(null);};this.mouseenter=function(){return(null);};this.mouseleave=function(){return(null);};this.mousemove=function(){return(null);};this.mouseout=function(){return(null);};this.mouseover=function(){return(null);};this.mouseup=function(){return(null);};this.next=function(){return(null);};this.nextAll=function(){return(null);};this.nextUntil=function(){return(null);};this.not=function(){return(null);};this.off=function(){return(null);};this.offset=function(){return(null);};this.offsetParent=function(){return(null);};this.on=function(){return(null);};this.one=function(){return(null);};this.outerHeight=function(){return(null);};this.outerWidth=function(){return(null);};this.parent=function(){return(null);};this.parents=function(){return(null);};this.parentsUntil=function(){return(null);};this.position=function(){return(null);};this.prepend=function(){return(null);};this.prependTo=function(){return(null);};this.prev=function(){return(null);};this.prevAll=function(){return(null);};this.prevUntil=function(){return(null);};this.promise=function(){return(null);};this.prop=function(){return(null);};this.pushStack=function(){return(null);};this.queue=function(){return(null);};this.ready=function(){return(null);};this.remove=function(){return(null);};this.removeAttr=function(){return(null);};this.removeClass=function(){return(null);};this.removeData=function(){return(null);};this.removeProp=function(){return(null);};this.replaceAll=function(){return(null);};this.replaceWith=function(){return(null);};this.resize=function(){return(null);};this.scroll=function(){return(null);};this.scrollLeft=function(){return(null);};this.scrollTop=function(){return(null);};this.select=function(){return(null);};this.selector=function(){return(null);};this.serialize=function(){return(null);};this.serializeArray=function(){return(null);};this.show=function(){return(null);};this.siblings=function(){return(null);};this.size=function(){return(null);};this.slice=function(){return(null);};this.slideDown=function(){return(null);};this.slideToggle=function(){return(null);};this.slideUp=function(){return(null);};this.stop=function(){return(null);};this.submit=function(){return(null);};this.text=function(){return(null);};this.toArray=function(){return(null);};this.toggle=function(){return(null);};this.toggle=function(){return(null);};this.toggleClass=function(){return(null);};this.trigger=function(){return(null);};this.triggerHandler=function(){return(null);};this.unbind=function(){return(null);};this.undelegate=function(){return(null);};this.unload=function(){return(null);};this.unwrap=function(){return(null);};this.val=function(){return(null);};this.width=function(){return(null);};this.wrap=function(){return(null);};this.wrapAll=function(){return(null);};this.wrapInner=function(){return(null);}});};"+s; submit( - s, function (cls, message) { + scopejQuery(s), function (cls, message) { if (cls) { console.log(message.error); - $('#mainEditorPanel').html("
" + message.error + "
" + $('#mainEditorPanel').html()); - $('.runTimeError').hide().fadeIn(function(){ - setTimeout(function(){ - $(this).remove(); - }, 3000) - }); + workerError(message.error); } else { if(test){ preview.open(); - preview.write(libraryIncludes + editor.getValue() +iFrameScript); + preview.write(libraryIncludes + editor.getValue() + iFrameScript); codeStorage.updateStorage(); preview.close(); } @@ -191,6 +208,7 @@ function safeHTMLRun(test){ } } ); + } else { if(test){ @@ -225,7 +243,9 @@ if(typeof prodOrDev !== 'undefined') { editor.setValue(editor.getValue() + "-->"); editorValueForIFrame = editorValueForIFrame + "-->"; } - safeHTMLRun(false); + if(!editor.getValue().match(/\$\(\$\)/gi) ) { + safeHTMLRun(false); + } } setTimeout(updatePreview, 300); @@ -447,28 +467,15 @@ var runTests = function(err, data) { allTestsPassed = false; showCompletion(); } - else{ - if(challengeType === "0"){ - $('#testSuite').empty(); - - editorValueForIFrame = editor.getValue(); - goodTests = 0; - var previewFrame = document.getElementById('preview'); - var preview = previewFrame.contentDocument || previewFrame.contentWindow.document; - preview.open(); - preview.write(libraryIncludes + editor.getValue() + ""); - codeStorage.updateStorage(); - preview.close(); - } - } - } }; function bonfireExecute() { + goodTests = 0; attempts++; ga('send', 'event', 'Challenge', 'ran-code', challenge_Name); userTests = null; + $('#testSuite').empty(); if(challengeType !== "0"){ var userJavaScript = myCodeMirror.getValue(); var failedCommentTest = false; @@ -482,23 +489,30 @@ function bonfireExecute() { userJavaScript = scrapeTests(userJavaScript); // simple fix in case the user forgets to invoke their function - submit(userJavaScript, function (cls, message) { - if (failedCommentTest) { - myCodeMirror.setValue(myCodeMirror.getValue() + "*/"); - console.log('Caught Unfinished Comment'); - codeOutput.setValue("Unfinished mulit-line comment"); - failedCommentTest = false; + if(userJavaScript.match(/function/gi)){ + if(userJavaScript.match(/function\s+?\(|function\s+\w+\s*?\(/gi)){ + submit(userJavaScript, function (cls, message) { + if (failedCommentTest) { + myCodeMirror.setValue(myCodeMirror.getValue() + "*/"); + console.log('Caught Unfinished Comment'); + codeOutput.setValue("Unfinished mulit-line comment"); + failedCommentTest = false; + } + else if (cls) { + codeOutput.setValue(message.error); + runTests('Error', null); + } else { + codeOutput.setValue(message.output); + codeOutput.setValue(codeOutput.getValue().replace(/\\\"/gi, '')); + message.input = removeLogs(message.input); + runTests(null, message); + } + }); } - else if (cls) { - codeOutput.setValue(message.error); - runTests('Error', null); - } else { - codeOutput.setValue(message.output); - codeOutput.setValue(codeOutput.getValue().replace(/\\\"/gi, '')); - message.input = removeLogs(message.input); - runTests(null, message); + else{ + codeOutput.setValue("Unsafe or Unfinished function declaration"); } - }); + } } else { editorValueForIFrame = editor.getValue(); @@ -506,7 +520,9 @@ function bonfireExecute() { editor.setValue(editor.getValue() + "-->"); editorValueForIFrame = editorValueForIFrame + "-->"; } - safeHTMLRun(true); + if(!editor.getValue().match(/\$\(\$\)/gi) && challengeType === "0") { + safeHTMLRun(true); + } } } diff --git a/server/views/coursewares/showBonfire.jade b/server/views/coursewares/showBonfire.jade index 769311c29c..58a00b5f54 100644 --- a/server/views/coursewares/showBonfire.jade +++ b/server/views/coursewares/showBonfire.jade @@ -123,7 +123,9 @@ block content form.code .form-group.codeMirrorView textarea#codeEditor(autofocus=true, style='display: none;') - script(src='/js/lib/coursewares/coursewaresJSFramework_0.0.6.js') + script(src='/js/lib/coursewares/commonFrameWork.js') + script. + editor.setOption("mode", "javascript"); #complete-courseware-dialog.modal(tabindex='-1') .modal-dialog.animated.zoomIn.fast-animation From 7f467dbb8d1f4caf8225299f20fd8c34d73549b3 Mon Sep 17 00:00:00 2001 From: benmcmahon100 Date: Tue, 25 Aug 2015 20:23:47 +0100 Subject: [PATCH 10/10] Fixed scoped jQuery showing up in error messages and jQuery methods and chaining in spoofed jQuery --- public/js/lib/coursewares/commonFrameWork.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/js/lib/coursewares/commonFrameWork.js b/public/js/lib/coursewares/commonFrameWork.js index 22294f9265..0cdac5519f 100644 --- a/public/js/lib/coursewares/commonFrameWork.js +++ b/public/js/lib/coursewares/commonFrameWork.js @@ -166,7 +166,7 @@ function workerError(error){ var housing = $('#testSuite'); if(display.html() != error){ display.remove(); - housing.prepend("
" + error + "
"); + housing.prepend("
" + error.replace(/j\$/gi, "$").replace(/jdocument/gi, "document").replace(/jjQuery/gi, "jQuery") + "
"); display.hide().fadeIn(function(){ setTimeout(function(){ display.fadeOut(function(){ @@ -186,7 +186,7 @@ function safeHTMLRun(test){ var preview = previewFrame.contentDocument || previewFrame.contentWindow.document; if(editor.getValue().match(/\/gi) !== null) { var s = editor.getValue().split(/\<\s?script\s?\>/gi)[1].split(/\<\s?\/\s?script\s?\>/gi)[0]; - s = "var document = \"\"; var $ = function(){return(new function(){this.add=function(){return(null);};this.addBack=function(){return(null);};this.addClass=function(){return(null);};this.after=function(){return(null);};this.ajaxComplete=function(){return(null);};this.ajaxError=function(){return(null);};this.ajaxSend=function(){return(null);};this.ajaxStart=function(){return(null);};this.ajaxStop=function(){return(null);};this.ajaxSuccess=function(){return(null);};this.andSelf=function(){return(null);};this.animate=function(){return(null);};this.append=function(){return(null);};this.appendTo=function(){return(null);};this.attr=function(){return(null);};this.before=function(){return(null);};this.bind=function(){return(null);};this.blur=function(){return(null);};this.callbacksadd=function(){return(null);};this.callbacksdisable=function(){return(null);};this.callbacksdisabled=function(){return(null);};this.callbacksempty=function(){return(null);};this.callbacksfire=function(){return(null);};this.callbacksfired=function(){return(null);};this.callbacksfireWith=function(){return(null);};this.callbackshas=function(){return(null);};this.callbackslock=function(){return(null);};this.callbackslocked=function(){return(null);};this.callbacksremove=function(){return(null);};this.change=function(){return(null);};this.children=function(){return(null);};this.clearQueue=function(){return(null);};this.click=function(){return(null);};this.clone=function(){return(null);};this.closest=function(){return(null);};this.contents=function(){return(null);};this.context=function(){return(null);};this.css=function(){return(null);};this.data=function(){return(null);};this.dblclick=function(){return(null);};this.deferredalways=function(){return(null);};this.deferreddone=function(){return(null);};this.deferredfail=function(){return(null);};this.deferredisRejected=function(){return(null);};this.deferredisResolved=function(){return(null);};this.deferrednotify=function(){return(null);};this.deferrednotifyWith=function(){return(null);};this.deferredpipe=function(){return(null);};this.deferredprogress=function(){return(null);};this.deferredpromise=function(){return(null);};this.deferredreject=function(){return(null);};this.deferredrejectWith=function(){return(null);};this.deferredresolve=function(){return(null);};this.deferredresolveWith=function(){return(null);};this.deferredstate=function(){return(null);};this.deferredthen=function(){return(null);};this.delay=function(){return(null);};this.delegate=function(){return(null);};this.dequeue=function(){return(null);};this.detach=function(){return(null);};this.die=function(){return(null);};this.each=function(){return(null);};this.empty=function(){return(null);};this.end=function(){return(null);};this.eq=function(){return(null);};this.error=function(){return(null);};this.eventcurrentTarget=function(){return(null);};this.eventdata=function(){return(null);};this.eventdelegateTarget=function(){return(null);};this.eventisDefaultPrevented=function(){return(null);};this.eventisImmediatePropagationStopped=function(){return(null);};this.eventisPropagationStopped=function(){return(null);};this.eventmetaKey=function(){return(null);};this.eventnamespace=function(){return(null);};this.eventpageX=function(){return(null);};this.eventpageY=function(){return(null);};this.eventpreventDefault=function(){return(null);};this.eventrelatedTarget=function(){return(null);};this.eventresult=function(){return(null);};this.eventstopImmediatePropagation=function(){return(null);};this.eventstopPropagation=function(){return(null);};this.eventtarget=function(){return(null);};this.eventtimeStamp=function(){return(null);};this.eventtype=function(){return(null);};this.eventwhich=function(){return(null);};this.fadeIn=function(){return(null);};this.fadeOut=function(){return(null);};this.fadeTo=function(){return(null);};this.fadeToggle=function(){return(null);};this.filter=function(){return(null);};this.find=function(){return(null);};this.finish=function(){return(null);};this.first=function(){return(null);};this.focus=function(){return(null);};this.focusin=function(){return(null);};this.focusout=function(){return(null);};this.get=function(){return(null);};this.has=function(){return(null);};this.hasClass=function(){return(null);};this.height=function(){return(null);};this.hide=function(){return(null);};this.hover=function(){return(null);};this.html=function(){return(null);};this.index=function(){return(null);};this.innerHeight=function(){return(null);};this.innerWidth=function(){return(null);};this.insertAfter=function(){return(null);};this.insertBefore=function(){return(null);};this.is=function(){return(null);};this.jQuery=function(){return(null);};this.jquery=function(){return(null);};this.jQueryajax=function(){return(null);};this.jQueryajaxPrefilter=function(){return(null);};this.jQueryajaxSetup=function(){return(null);};this.jQueryajaxTransport=function(){return(null);};this.jQueryboxModel=function(){return(null);};this.jQuerybrowser=function(){return(null);};this.jQueryCallbacks=function(){return(null);};this.jQuerycontains=function(){return(null);};this.jQuerycssHooks=function(){return(null);};this.jQuerycssNumber=function(){return(null);};this.jQuerydata=function(){return(null);};this.jQueryDeferred=function(){return(null);};this.jQuerydequeue=function(){return(null);};this.jQueryeach=function(){return(null);};this.jQueryerror=function(){return(null);};this.jQueryextend=function(){return(null);};this.jQueryfnextend=function(){return(null);};this.jQueryfxinterval=function(){return(null);};this.jQueryfxoff=function(){return(null);};this.jQueryget=function(){return(null);};this.jQuerygetJSON=function(){return(null);};this.jQuerygetScript=function(){return(null);};this.jQueryglobalEval=function(){return(null);};this.jQuerygrep=function(){return(null);};this.jQueryhasData=function(){return(null);};this.jQueryholdReady=function(){return(null);};this.jQueryinArray=function(){return(null);};this.jQueryisArray=function(){return(null);};this.jQueryisEmptyObject=function(){return(null);};this.jQueryisFunction=function(){return(null);};this.jQueryisNumeric=function(){return(null);};this.jQueryisPlainObject=function(){return(null);};this.jQueryisWindow=function(){return(null);};this.jQueryisXMLDoc=function(){return(null);};this.jQuerymakeArray=function(){return(null);};this.jQuerymap=function(){return(null);};this.jQuerymerge=function(){return(null);};this.jQuerynoConflict=function(){return(null);};this.jQuerynoop=function(){return(null);};this.jQuerynow=function(){return(null);};this.jQueryparam=function(){return(null);};this.jQueryparseHTML=function(){return(null);};this.jQueryparseJSON=function(){return(null);};this.jQueryparseXML=function(){return(null);};this.jQuerypost=function(){return(null);};this.jQueryproxy=function(){return(null);};this.jQueryqueue=function(){return(null);};this.jQueryremoveData=function(){return(null);};this.jQuerysub=function(){return(null);};this.jQuerysupport=function(){return(null);};this.jQuerytrim=function(){return(null);};this.jQuerytype=function(){return(null);};this.jQueryunique=function(){return(null);};this.jQuerywhen=function(){return(null);};this.keydown=function(){return(null);};this.keypress=function(){return(null);};this.keyup=function(){return(null);};this.last=function(){return(null);};this.length=function(){return(null);};this.live=function(){return(null);};this.load=function(){return(null);};this.load=function(){return(null);};this.map=function(){return(null);};this.mousedown=function(){return(null);};this.mouseenter=function(){return(null);};this.mouseleave=function(){return(null);};this.mousemove=function(){return(null);};this.mouseout=function(){return(null);};this.mouseover=function(){return(null);};this.mouseup=function(){return(null);};this.next=function(){return(null);};this.nextAll=function(){return(null);};this.nextUntil=function(){return(null);};this.not=function(){return(null);};this.off=function(){return(null);};this.offset=function(){return(null);};this.offsetParent=function(){return(null);};this.on=function(){return(null);};this.one=function(){return(null);};this.outerHeight=function(){return(null);};this.outerWidth=function(){return(null);};this.parent=function(){return(null);};this.parents=function(){return(null);};this.parentsUntil=function(){return(null);};this.position=function(){return(null);};this.prepend=function(){return(null);};this.prependTo=function(){return(null);};this.prev=function(){return(null);};this.prevAll=function(){return(null);};this.prevUntil=function(){return(null);};this.promise=function(){return(null);};this.prop=function(){return(null);};this.pushStack=function(){return(null);};this.queue=function(){return(null);};this.ready=function(){return(null);};this.remove=function(){return(null);};this.removeAttr=function(){return(null);};this.removeClass=function(){return(null);};this.removeData=function(){return(null);};this.removeProp=function(){return(null);};this.replaceAll=function(){return(null);};this.replaceWith=function(){return(null);};this.resize=function(){return(null);};this.scroll=function(){return(null);};this.scrollLeft=function(){return(null);};this.scrollTop=function(){return(null);};this.select=function(){return(null);};this.selector=function(){return(null);};this.serialize=function(){return(null);};this.serializeArray=function(){return(null);};this.show=function(){return(null);};this.siblings=function(){return(null);};this.size=function(){return(null);};this.slice=function(){return(null);};this.slideDown=function(){return(null);};this.slideToggle=function(){return(null);};this.slideUp=function(){return(null);};this.stop=function(){return(null);};this.submit=function(){return(null);};this.text=function(){return(null);};this.toArray=function(){return(null);};this.toggle=function(){return(null);};this.toggle=function(){return(null);};this.toggleClass=function(){return(null);};this.trigger=function(){return(null);};this.triggerHandler=function(){return(null);};this.unbind=function(){return(null);};this.undelegate=function(){return(null);};this.unload=function(){return(null);};this.unwrap=function(){return(null);};this.val=function(){return(null);};this.width=function(){return(null);};this.wrap=function(){return(null);};this.wrapAll=function(){return(null);};this.wrapInner=function(){return(null);}});};"+s; + s = "var document = \"\"; var $ = function(){return(new function(){this.add=function(){return(this);};this.addBack=function(){return(this);};this.addClass=function(){return(this);};this.after=function(){return(this);};this.ajaxComplete=function(){return(this);};this.ajaxError=function(){return(this);};this.ajaxSend=function(){return(this);};this.ajaxStart=function(){return(this);};this.ajaxStop=function(){return(this);};this.ajaxSuccess=function(){return(this);};this.andSelf=function(){return(this);};this.animate=function(){return(this);};this.append=function(){return(this);};this.appendTo=function(){return(this);};this.attr=function(){return(this);};this.before=function(){return(this);};this.bind=function(){return(this);};this.blur=function(){return(this);};this.callbacksadd=function(){return(this);};this.callbacksdisable=function(){return(this);};this.callbacksdisabled=function(){return(this);};this.callbacksempty=function(){return(this);};this.callbacksfire=function(){return(this);};this.callbacksfired=function(){return(this);};this.callbacksfireWith=function(){return(this);};this.callbackshas=function(){return(this);};this.callbackslock=function(){return(this);};this.callbackslocked=function(){return(this);};this.callbacksremove=function(){return(this);};this.change=function(){return(this);};this.children=function(){return(this);};this.clearQueue=function(){return(this);};this.click=function(){return(this);};this.clone=function(){return(this);};this.closest=function(){return(this);};this.contents=function(){return(this);};this.context=function(){return(this);};this.css=function(){return(this);};this.data=function(){return(this);};this.dblclick=function(){return(this);};this.delay=function(){return(this);};this.delegate=function(){return(this);};this.dequeue=function(){return(this);};this.detach=function(){return(this);};this.die=function(){return(this);};this.each=function(){return(this);};this.empty=function(){return(this);};this.end=function(){return(this);};this.eq=function(){return(this);};this.error=function(){return(this);};this.fadeIn=function(){return(this);};this.fadeOut=function(){return(this);};this.fadeTo=function(){return(this);};this.fadeToggle=function(){return(this);};this.filter=function(){return(this);};this.find=function(){return(this);};this.finish=function(){return(this);};this.first=function(){return(this);};this.focus=function(){return(this);};this.focusin=function(){return(this);};this.focusout=function(){return(this);};this.get=function(){return(this);};this.has=function(){return(this);};this.hasClass=function(){return(this);};this.height=function(){return(this);};this.hide=function(){return(this);};this.hover=function(){return(this);};this.html=function(){return(this);};this.index=function(){return(this);};this.innerHeight=function(){return(this);};this.innerWidth=function(){return(this);};this.insertAfter=function(){return(this);};this.insertBefore=function(){return(this);};this.is=function(){return(this);};this.jQuery=function(){return(this);};this.jquery=function(){return(this);};this.keydown=function(){return(this);};this.keypress=function(){return(this);};this.keyup=function(){return(this);};this.last=function(){return(this);};this.length=function(){return(this);};this.live=function(){return(this);};this.load=function(){return(this);};this.load=function(){return(this);};this.map=function(){return(this);};this.mousedown=function(){return(this);};this.mouseenter=function(){return(this);};this.mouseleave=function(){return(this);};this.mousemove=function(){return(this);};this.mouseout=function(){return(this);};this.mouseover=function(){return(this);};this.mouseup=function(){return(this);};this.next=function(){return(this);};this.nextAll=function(){return(this);};this.nextUntil=function(){return(this);};this.not=function(){return(this);};this.off=function(){return(this);};this.offset=function(){return(this);};this.offsetParent=function(){return(this);};this.on=function(){return(this);};this.one=function(){return(this);};this.outerHeight=function(){return(this);};this.outerWidth=function(){return(this);};this.parent=function(){return(this);};this.parents=function(){return(this);};this.parentsUntil=function(){return(this);};this.position=function(){return(this);};this.prepend=function(){return(this);};this.prependTo=function(){return(this);};this.prev=function(){return(this);};this.prevAll=function(){return(this);};this.prevUntil=function(){return(this);};this.promise=function(){return(this);};this.prop=function(){return(this);};this.pushStack=function(){return(this);};this.queue=function(){return(this);};this.ready=function(){return(this);};this.remove=function(){return(this);};this.removeAttr=function(){return(this);};this.removeClass=function(){return(this);};this.removeData=function(){return(this);};this.removeProp=function(){return(this);};this.replaceAll=function(){return(this);};this.replaceWith=function(){return(this);};this.resize=function(){return(this);};this.scroll=function(){return(this);};this.scrollLeft=function(){return(this);};this.scrollTop=function(){return(this);};this.select=function(){return(this);};this.selector=function(){return(this);};this.serialize=function(){return(this);};this.serializeArray=function(){return(this);};this.show=function(){return(this);};this.siblings=function(){return(this);};this.size=function(){return(this);};this.slice=function(){return(this);};this.slideDown=function(){return(this);};this.slideToggle=function(){return(this);};this.slideUp=function(){return(this);};this.stop=function(){return(this);};this.submit=function(){return(this);};this.text=function(){return(this);};this.toArray=function(){return(this);};this.toggle=function(){return(this);};this.toggle=function(){return(this);};this.toggleClass=function(){return(this);};this.trigger=function(){return(this);};this.triggerHandler=function(){return(this);};this.unbind=function(){return(this);};this.undelegate=function(){return(this);};this.unload=function(){return(this);};this.unwrap=function(){return(this);};this.val=function(){return(this);};this.width=function(){return(this);};this.wrap=function(){return(this);};this.wrapAll=function(){return(this);};this.wrapInner=function(){return(this);}});};$.ajax=function(){return($);};$.ajaxPrefilter=function(){return($);};$.ajaxSetup=function(){return($);};$.ajaxTransport=function(){return($);};$.boxModel=function(){return($);};$.browser=function(){return($);};$.Callbacks=function(){return($);};$.contains=function(){return($);};$.cssHooks=function(){return($);};$.cssNumber=function(){return($);};$.data=function(){return($);};$.Deferred=function(){return($);};$.dequeue=function(){return($);};$.each=function(){return($);};$.error=function(){return($);};$.extend=function(){return($);};$.fnextend=function(){return($);};$.fxinterval=function(){return($);};$.fxoff=function(){return($);};$.get=function(){return($);};$.getJSON=function(){return($);};$.getScript=function(){return($);};$.globalEval=function(){return($);};$.grep=function(){return($);};$.hasData=function(){return($);};$.holdReady=function(){return($);};$.inArray=function(){return($);};$.isArray=function(){return($);};$.isEmptyObject=function(){return($);};$.isFunction=function(){return($);};$.isNumeric=function(){return($);};$.isPlainObject=function(){return($);};$.isWindow=function(){return($);};$.isXMLDoc=function(){return($);};$.makeArray=function(){return($);};$.map=function(){return($);};$.merge=function(){return($);};$.noConflict=function(){return($);};$.noop=function(){return($);};$.now=function(){return($);};$.param=function(){return($);};$.parseHTML=function(){return($);};$.parseJSON=function(){return($);};$.parseXML=function(){return($);};$.post=function(){return($);};$.proxy=function(){return($);};$.queue=function(){return($);};$.removeData=function(){return($);};$.sub=function(){return($);};$.support=function(){return($);};$.trim=function(){return($);};$.type=function(){return($);};$.unique=function(){return($);};$.when=function(){return($);};$.always=function(){return($);};$.done=function(){return($);};$.fail=function(){return($);};$.isRejected=function(){return($);};$.isResolved=function(){return($);};$.notify=function(){return($);};$.notifyWith=function(){return($);};$.pipe=function(){return($);};$.progress=function(){return($);};$.promise=function(){return($);};$.reject=function(){return($);};$.rejectWith=function(){return($);};$.resolve=function(){return($);};$.resolveWith=function(){return($);};$.state=function(){return($);};$.then=function(){return($);};$.currentTarget=function(){return($);};$.data=function(){return($);};$.delegateTarget=function(){return($);};$.isDefaultPrevented=function(){return($);};$.isImmediatePropagationStopped=function(){return($);};$.isPropagationStopped=function(){return($);};$.metaKey=function(){return($);};$.namespace=function(){return($);};$.pageX=function(){return($);};$.pageY=function(){return($);};$.preventDefault=function(){return($);};$.relatedTarget=function(){return($);};$.result=function(){return($);};$.stopImmediatePropagation=function(){return($);};$.stopPropagation=function(){return($);};$.target=function(){return($);};$.timeStamp=function(){return($);};$.type=function(){return($);};$.which=function(){return($);};"+s; submit( scopejQuery(s), function (cls, message) { if (cls) {