recent merge from upstream
This commit is contained in:
		| @ -6,7 +6,8 @@ define(['jquery','underscore','backbone','goatApp/view/goatRouter','goatApp/cont | ||||
| 		return { | ||||
| 			initApp: function() { | ||||
| 				//TODO: add query/ability to load from where they left off  | ||||
| 				Router.init(); | ||||
| 				console.log('initApp') | ||||
| 				//Router.init(); | ||||
| 			} | ||||
| 		} | ||||
| }); | ||||
| @ -1,20 +0,0 @@ | ||||
| define(['jquery', 'underscore','backbone'], function($,_,Backbone){ | ||||
|  | ||||
| 	return Backbone.Model.extend({ | ||||
| 		urlRoot:null, | ||||
| 		defaults: { | ||||
| 			items:null, | ||||
| 			selectedItem:null | ||||
| 		}, | ||||
| 		initialize: function (options) { | ||||
| 			var self = this; | ||||
| 			this.urlRoot = 'attack.jsp?Screen='+options.screen + '&menu=' + options.menu; | ||||
| 			this.fetch().then(function(content){ | ||||
| 				self.lessonContent = content | ||||
| 			}); | ||||
| 		}, | ||||
| 		getHint: function (i) { | ||||
|  | ||||
| 		} | ||||
| 	}); | ||||
| }); | ||||
| @ -1,32 +0,0 @@ | ||||
| //var goatApp = goatApp || {}; | ||||
|  | ||||
| define(['jquery','underscore','backbone'], function($,_,Backbone) { | ||||
|  | ||||
| var menuData = Backbone.Model.extend({ | ||||
| 		urlRoot:'/webgoat/service/lessonmenu.mvc', | ||||
| 		defaults: { | ||||
| 			items:null, | ||||
| 			selectedItem:null | ||||
| 		}, | ||||
| 		initialize: function () { | ||||
| 			var self = this; | ||||
| 			this.fetch().then(function(menuItems){ | ||||
| 				menuItems = goatUtils.enhanceMenuData(menuItems,this.selectedItem); | ||||
| 				this.setDataItems(menuItems); | ||||
| 			}); | ||||
| 		}, | ||||
| 	 | ||||
| 		update: function() { | ||||
| 			var self = this; | ||||
| 			this.fetch().then(function(menuItems) { | ||||
| 				menuItems = goatUtils.enhanceMenuData(menuItems,this.selectedItem); | ||||
| 				self.setDataItems(menuItems); | ||||
| 			}); | ||||
| 		}, | ||||
|  | ||||
| 		setDataItems: function (data) { | ||||
| 			this.items = data; | ||||
| 		} | ||||
| 	}); | ||||
|  | ||||
| }); | ||||
| @ -1,22 +0,0 @@ | ||||
| var menuData = Backbone.Model.extend({ | ||||
| 		urlRoot:'/webgoat/service/lessonmenu.mvc', | ||||
| 		defaults: { | ||||
| 			items:null, | ||||
| 			selectedItem:null | ||||
| 		}, | ||||
| 		initialize: function () { | ||||
| 			var self = this; | ||||
| 			this.fetch().then(function(menuItems){ | ||||
| 				menuItems = goatUtils.enhanceMenuData(menuItems,this.selectedItem); | ||||
| 				self.items = menuItems; | ||||
| 			}); | ||||
| 		}, | ||||
| 	 | ||||
| 		update: function() { | ||||
| 			var self = this; | ||||
| 			this.fetch().then(function(data) { | ||||
| 				self.items = data; | ||||
| 				self.render(0); | ||||
| 			}); | ||||
| 		} | ||||
| 	}); | ||||
| @ -20,4 +20,6 @@ function($,_,Backbone,LessonData) { | ||||
| 			this.$el.html(this.content); | ||||
| 		} | ||||
| 	}); | ||||
|  | ||||
| 	return contentView; | ||||
| }); | ||||
| @ -5,7 +5,7 @@ define(['jquery', | ||||
| 	'goatApp/controller/MenuController', | ||||
| 	'goatApp/view/LessonContentView', | ||||
| 	'goatApp/view/MenuView' | ||||
| 	], function ($,_,Backbone,LessonController,MenuController,LessonView,MenuView) { | ||||
| 	], function ($,_,Backbone,LessonController,MenuController,LessonContentView,MenuView) { | ||||
|  | ||||
| 		var lessonView = new LessonContentView(); | ||||
| 		var menuView = new MenuView();  | ||||
| @ -20,7 +20,7 @@ define(['jquery', | ||||
| 			}), | ||||
| 			menuView: new MenuController({ | ||||
| 				menuView:menuView | ||||
| 			}); | ||||
| 			}) | ||||
| 		}); | ||||
|  | ||||
| 		var init = function() { | ||||
|  | ||||
| @ -1,35 +0,0 @@ | ||||
| //goatConstants | ||||
|  | ||||
| var goatConstants = { | ||||
| 	CATEGORYCLASS:'fa-angle-right pull-right', | ||||
| 	lessonCompleteClass:'glyphicon glyphicon-check lessonComplete', | ||||
| 	selectedMenuClass:'selected', | ||||
| 	keepOpenClass:'keepOpen', | ||||
| 	menuPrefix : [ | ||||
| 		{ | ||||
| 		name:'LESSONS', | ||||
| 		type:'STATIC', | ||||
| 		complete:false, | ||||
| 		link:'', | ||||
| 		children:null, | ||||
| 		class:'fa-bars static' | ||||
| 	}], | ||||
| 	//services | ||||
| 	lessonService: 'service/lessonmenu.mvc', | ||||
| 	cookieService: 'service/cookie.mvc', //cookies_widget.mvc | ||||
| 	hintService:'service/hint.mvc', | ||||
| 	sourceService:'service/source.mvc', | ||||
| 	solutionService:'service/solution.mvc', | ||||
| 	lessonPlanService:'service/lessonplan.mvc', | ||||
| 	menuService: 'service/lessonmenu.mvc', | ||||
| 	lessonTitleService: 'service/lessontitle.mvc', | ||||
| 	restartLessonService: 'service/restartlesson.mvc', | ||||
| 	 | ||||
| 	// literal messages | ||||
| 	notFound: 'Could not find', | ||||
| 	noHints: 'There are no hints defined.', | ||||
| 	noSourcePulled: 'No source was retrieved for this lesson' | ||||
| 	 | ||||
| }; | ||||
|  | ||||
|  | ||||
| @ -1,265 +0,0 @@ | ||||
| //main goat application file | ||||
| //TODO: reorg | ||||
|  | ||||
| /* ### GOAT CONTROLLERS ### */ | ||||
|  | ||||
| /* menu controller */ | ||||
| var goatMenu = function($scope, $http, $modal, $log, $templateCache) { | ||||
|     $scope.cookies = []; | ||||
|     $scope.params = []; | ||||
|     $scope.renderMenu = function() { | ||||
|         goat.data.loadMenu($http).then(//$http({method: 'GET', url: goatConstants.lessonService}) | ||||
|                 function(menuData) { | ||||
|                     var menuItems = goat.utils.addMenuClasses(goatConstants.menuPrefix.concat(menuData.data)); | ||||
|                     //top-tier 'categories' | ||||
|                     for (var i = 0; i < menuItems.length; i++) { | ||||
|                         menuItems[i].id = goat.utils.makeId(menuItems[i].name);//TODO move the replace routine into util function | ||||
|                         menuItems[i].displayClass = ($scope.openMenu === menuItems[i].id) ? goatConstants.keepOpenClass : ''; | ||||
|                         if (menuItems[i].children) { | ||||
|                             for (var j = 0; j < menuItems[i].children.length; j++) { | ||||
|                                 menuItems[i].children[j].id = goat.utils.makeId(menuItems[i].children[j].name); | ||||
|                                 //handle selected Menu state | ||||
|                                 if (menuItems[i].children[j].id === $scope.curMenuItemSelected) { | ||||
|                                     menuItems[i].children[j].selectedClass = goatConstants.selectedMenuClass; | ||||
|                                     menuItems[i].selectedClass = goatConstants.selectedMenuClass; | ||||
|                                 } | ||||
|                                 //handle complete state | ||||
|                                 if (menuItems[i].children[j].complete) { | ||||
|                                     menuItems[i].children[j].completeClass = goatConstants.lessonCompleteClass; | ||||
|                                 } else { | ||||
|                                     menuItems[i].children[j].completeClass = ''; | ||||
|                                 } | ||||
|                                 if (menuItems[i].children[j].children) { | ||||
|                                     for (var k = 0; k < menuItems[i].children[j].children.length; k++) { | ||||
|                                         //TODO make utility function for name >> id | ||||
|                                         menuItems[i].children[j].children[k].id = goat.utils.makeId(menuItems[i].children[j].children[k].name); | ||||
|                                         //menuItems[i].children[j].children[k].id = menuItems[i].children[j].children[k].name.replace(/\s|\(|\)/g,''); | ||||
|                                         //handle selected Menu state | ||||
|                                         if (menuItems[i].children[j].children[k].id === $scope.curMenuItemSelected) { | ||||
|                                             menuItems[i].children[j].children[k].selectedClass = goatConstants.selectedMenuClass; | ||||
|                                             menuItems[i].children[j].selectedClass = goatConstants.selectedMenuClass; | ||||
|                                         } | ||||
|                                         //handle complete state | ||||
|                                         if (menuItems[i].children[j].children[k].complete) { | ||||
|                                             menuItems[i].children[j].children[k].completeClass = goatConstants.lessonCompleteClass; | ||||
|                                         } else { | ||||
|                                             menuItems[i].children[j].children[k].completeClass = '' | ||||
|                                         } | ||||
|                                     } | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                     $scope.menuTopics = menuItems; | ||||
|                     // | ||||
|                     if ($scope.openMenu) { | ||||
|                         $('ul' + $scope.openMenu).show(); | ||||
|                     } | ||||
|  | ||||
|                 }, | ||||
|                 function(error) { | ||||
|                     // TODO - handle this some way other than an alert | ||||
|                     console.error("Error rendering menu: " + error); | ||||
|                 } | ||||
|         ); | ||||
|     }; | ||||
|  | ||||
|     $scope.renderLesson = function(id, url, showControls) {//TODO convert to single object parameter | ||||
|         $scope.hintIndex = 0; | ||||
|         var curScope = $scope; | ||||
|         $('.lessonHelp').hide(); | ||||
|         // clean up menus, mark selected | ||||
|         $scope.curMenuItemSelected = id; | ||||
|         goat.utils.highlightCurrentLessonMenu(id); | ||||
|         curScope.parameters = goat.utils.scrapeParams(url); | ||||
|         // lesson content | ||||
|         goat.data.loadLessonContent($http, url).then( | ||||
|                 function(reply) { | ||||
|                     goat.data.loadLessonTitle($http).then( | ||||
|                             function(reply) { | ||||
|                                 $("#lessonTitle").text(reply.data); | ||||
|                             } | ||||
|                     ); | ||||
|                     //TODO encode html or get angular js portion working | ||||
|                     $("#lesson_content").html(reply.data); | ||||
|                     //hook forms and links (safe to call twice) | ||||
|                     // links are hooked with each lesson now (see Java class Screen.getContent()) | ||||
|                     goat.utils.makeFormsAjax();// inject form? | ||||
|                     goat.utils.ajaxifyAttackHref(); | ||||
|                     $('#leftside-navigation').height($('#main-content').height() + 15)//TODO: get ride of fixed value (15)here | ||||
|                     //notifies goatLesson Controller of the less change | ||||
|                     $scope.$emit('lessonUpdate', {params: curScope.parameters, 'showControls': showControls}); | ||||
|                 } | ||||
|         ) | ||||
|         $scope.renderMenu(); | ||||
|     }; | ||||
|     $scope.accordionMenu = function(id) { | ||||
|         if ($('ul#' + id).attr('isOpen') == 0) { | ||||
|             $scope.expandMe = true; | ||||
|         } else { | ||||
|             $('ul#' + id).slideUp(300).attr('isOpen', 0); | ||||
|             return; | ||||
|         } | ||||
|         $scope.openMenu = id; | ||||
|         $('.lessonsAndStages').not('ul#' + id).slideUp(300).attr('isOpen', 0); | ||||
|         if ($scope.expandMe) { | ||||
|             $('ul#' + id).slideDown(300).attr('isOpen', 1); | ||||
|         } | ||||
|     } | ||||
|     $scope.renderMenu(); | ||||
|     // runs on first loadcan be augmented later to ' | ||||
|     // resume' for a given user ... currently kluged to start at fixed lesson | ||||
|     var url = 'attack?Screen=32&menu=5'; | ||||
|     angular.element($('#leftside-navigation')).scope().renderLesson(null, url); | ||||
| } | ||||
|  | ||||
| /* lesson controller */ | ||||
| var goatLesson = function($scope, $http, $log) { | ||||
|  | ||||
|     $('#hintsView').hide(); | ||||
|     // adjust menu to lessonContent size if necssary | ||||
|     //cookies | ||||
|  | ||||
|     $scope.$on('lessonUpdate', function(params) { | ||||
|         $scope.parameters = arguments[1].params; | ||||
|         $scope.showHints = (arguments[1].showControls && arguments[1].showControls.showHints); | ||||
|         $scope.showSource = (arguments[1].showControls && arguments[1].showControls.showSource); | ||||
|         curScope = $scope; //TODO .. update below, this curScope is probably not needed | ||||
|         goat.data.loadCookies($http).then( | ||||
|                 function(resp) { | ||||
|                     curScope.cookies = resp.data; | ||||
|                 } | ||||
|         ); | ||||
|         //hints | ||||
|         curScope.hintIndex = 0; | ||||
|         if ($scope.showHints) { | ||||
|             goat.data.loadHints($http).then( | ||||
|                     function(resp) { | ||||
|                         curScope.hints = resp.data; | ||||
|                         if (curScope.hints.length > 0 && curScope.hints[0].hint.indexOf(goatConstants.noHints) === -1) { | ||||
|                             goat.utils.displayButton('showHintsBtn', true); | ||||
|                         } else { | ||||
|                             goat.utils.displayButton('showHintsBtn', false); | ||||
|                         } | ||||
|                     } | ||||
|             ); | ||||
|         } else { | ||||
|             $scope.hints = null; | ||||
|             goat.utils.displayButton('showHintsBtn', false); | ||||
|         } | ||||
|         //source | ||||
|         if ($scope.showSource) { | ||||
|             goat.data.loadSource($http).then( | ||||
|                     function(resp) { | ||||
|                         curScope.source = resp.data; | ||||
|                     } | ||||
|             ); | ||||
|         } else { | ||||
|             $scope.source = goatConstants.noSourcePulled; | ||||
|         } | ||||
|  | ||||
|         //plan | ||||
|         goat.data.loadPlan($http).then( | ||||
|                 function(resp) { | ||||
|                     curScope.plan = resp.data; | ||||
|                 } | ||||
|         ); | ||||
|         //solution | ||||
|         goat.data.loadSolution($http).then( | ||||
|                 function(resp) { | ||||
|                     curScope.solution = resp.data; | ||||
|                 } | ||||
|         ); | ||||
|     }); | ||||
|  | ||||
|     //goat.utils.scrollToTop(); | ||||
|  | ||||
|  | ||||
|     $scope.showLessonSource = function() { | ||||
|         $('.lessonHelp').hide(); | ||||
|         $('#lesson_source_row').show(); | ||||
|         goat.utils.scrollToHelp(); | ||||
|     } | ||||
|  | ||||
|     $scope.showLessonPlan = function() { | ||||
|         $('.lessonHelp').hide(); | ||||
|         $("#lesson_plan").html($scope.plan); | ||||
|         $('#lesson_plan_row').show(); | ||||
|         goat.utils.scrollToHelp(); | ||||
|     } | ||||
|  | ||||
|     $scope.showLessonSolution = function() { | ||||
|         $('.lessonHelp').hide(); | ||||
|         $("#lesson_solution").html($scope.solution); | ||||
|         $('#lesson_solution_row').show(); | ||||
|         goat.utils.scrollToHelp(); | ||||
|     } | ||||
|  | ||||
|     $scope.manageHintButtons = function() { | ||||
|         if ($scope.hintIndex === $scope.hints.length - 1) { | ||||
|             $('#showNextHintBtn').css('visibility', 'hidden'); | ||||
|         } else if ($scope.hintIndex < $scope.hints.length - 1) { | ||||
|             $('#showNextHintBtn').css('visibility', 'visible'); | ||||
|         } | ||||
|         // | ||||
|         if ($scope.hintIndex === 0) { | ||||
|             $('#showPrevHintBtn').css('visibility', 'hidden'); | ||||
|         } else if ($scope.hintIndex > 0) { | ||||
|             $('#showPrevHintBtn').css('visibility', 'visible'); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     $scope.viewHints = function() { | ||||
|         if (!$scope.hints) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         $('.lessonHelp').hide(); | ||||
|         $('#lesson_hint_row').show(); | ||||
|         //goat.utils.scrollToHelp(); | ||||
|         //TODO | ||||
|         $scope.curHint = $scope.hints[$scope.hintIndex].hint; | ||||
|         //$scope.curHint = $sce.trustAsHtml($scope.hints[$scope.hintIndex].hint); | ||||
|         //TODO get html binding workin in the UI ... in the meantime ... | ||||
|         //$scope.renderCurHint(); | ||||
|         $scope.manageHintButtons(); | ||||
|     }; | ||||
|  | ||||
|     $scope.viewNextHint = function() { | ||||
|         $scope.hintIndex++; | ||||
|         $scope.curHint = $scope.hints[$scope.hintIndex].hint; | ||||
|         $scope.renderCurHint(); | ||||
|         $scope.manageHintButtons(); | ||||
|     }; | ||||
|  | ||||
|     $scope.viewPrevHint = function() { | ||||
|         $scope.hintIndex--; | ||||
|         $scope.curHint = $scope.hints[$scope.hintIndex].hint; | ||||
|         $scope.renderCurHint(); | ||||
|         $scope.manageHintButtons(); | ||||
|     }; | ||||
|  | ||||
|     $scope.renderCurHint = function() { | ||||
|         $('#curHintContainer').html($scope.curHint); | ||||
|     } | ||||
|  | ||||
|     $scope.hideHints = function() { | ||||
|  | ||||
|     }; | ||||
|  | ||||
|     $scope.restartLesson = function() { | ||||
|         goat.data.loadRestart($http).then( | ||||
|                 function(resp) { | ||||
|                     angular.element($('#leftside-navigation')).scope().renderLesson(null, resp.data, {showSource: $scope.showSource, showHints: $scope.showHints}); | ||||
|                 } | ||||
|         ) | ||||
|     } | ||||
|  | ||||
|     $scope.showAbout = function() { | ||||
|         $('#aboutModal').modal({ | ||||
|             //remote: 'about.mvc' | ||||
|         }); | ||||
|     }; | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -1,44 +0,0 @@ | ||||
| /* ### GOAT DATA/PROMISES ### */ | ||||
|  | ||||
| goat.data = { | ||||
|     /**** jQuery loads ... ****/ | ||||
|     loadLessonContent: function ($http,_url) { | ||||
|     //TODO: switch to $http (angular) later | ||||
|         return $http({method:'GET', url: _url}); | ||||
|     //return $.get(_url, {}, null, "html"); | ||||
|     }, | ||||
|     loadCookies: function($http) { | ||||
|         return $http({method: 'GET', url: goatConstants.cookieService}); | ||||
|         //return $.get(goatConstants.cookieService, {}); | ||||
|     }, | ||||
|     loadHints: function ($http) { | ||||
|         return $http({method: 'GET', url: goatConstants.hintService}); | ||||
|         //return $.get(goatConstants.hintService, {}); | ||||
|     }, | ||||
|     loadSource: function($http) { | ||||
|         return $http({method: 'GET', url: goatConstants.sourceService}); | ||||
|         //return $.get(goatConstants.sourceService, {}); | ||||
|     }, | ||||
|     loadSolution: function ($http) { | ||||
|         return $http({method: 'GET', url: goatConstants.solutionService}); | ||||
|         //return $.get(goatConstants.solutionService, {}); | ||||
|     }, | ||||
|     loadPlan: function ($http) { | ||||
|         return $http({method: 'GET', url: goatConstants.lessonPlanService}); | ||||
|         //return $.get(goatConstants.lessonPlanService, {}); | ||||
|     }, | ||||
|     loadParams: function($http) { | ||||
|         return $http({method: 'GET', url: goatConstants.paramsService}); | ||||
|         //return $.get(goatConstants.paramsService,{}); | ||||
|     }, | ||||
|     loadMenu: function($http) { | ||||
|         return $http({method: 'GET', url: goatConstants.lessonService}); | ||||
|     }, | ||||
|     loadLessonTitle: function ($http) { | ||||
|         return $http({method: 'GET', url: goatConstants.lessonTitleService}); | ||||
|     }, | ||||
|     loadRestart: function ($http) { | ||||
|         return $http({method: 'GET', url:goatConstants.restartLessonService}) | ||||
|     } | ||||
|      | ||||
| }; | ||||
| @ -1,110 +0,0 @@ | ||||
| // goat.lesson name space | ||||
| goat.lesson = { | ||||
|     CurLesson: function(_lessonUrl) { | ||||
|         return { | ||||
|             hints:[], | ||||
|             hintIndex:0, | ||||
|             solution:null, | ||||
|             plan:null, | ||||
|             cookiesAndParams:[], | ||||
|             params:[], | ||||
|             source:null, | ||||
|             lessonUrl:(_lessonUrl || null), | ||||
|             clearInfo: function() { | ||||
|                 this.hints = null; | ||||
|                 this.solution = null; | ||||
|                 this.plan = null; | ||||
|                 this.cookies = null; | ||||
|                 this.source = null; | ||||
|                 this.params = null; | ||||
|             }, | ||||
|             loadInfo: function() { | ||||
|                 this.getHints(); | ||||
|                 this.getPlan(); | ||||
|                 this.getSolution(); | ||||
|                 this.getCookies(); | ||||
|                 this.getSource(); | ||||
|                 this.getParams(); | ||||
|             }, | ||||
|             getHints:function() { | ||||
|                 var scope = this; | ||||
|                 goat.data.loadHints().then( | ||||
|                     function(resp) { | ||||
|                         scope.hints = resp.data; | ||||
|                         if (scope.hints.length > 0 && scope.hints[0].hint.indexOf(goatConstants.noHints) === -1) { | ||||
|                             goat.utils.displayButton('showHintsBtn',true); | ||||
|                         } else { | ||||
|                             goat.utils.displayButton('showHintsBtn',false); | ||||
|                         } | ||||
|                         return scope; | ||||
|                     }, | ||||
|                     function(err){ | ||||
|                         goat.utils.displayButton('showHintsBtn',false); | ||||
|                         //TODO handle errors | ||||
|                     } | ||||
|                 ); | ||||
|             }, | ||||
|             getSolution:function() { | ||||
|                 var scope = this; | ||||
|                 goat.data.loadSolution().then( | ||||
|                     function(resp) { | ||||
|                         scope.solution = resp.data; | ||||
|                         goat.utils.displayButton('showSolutionBtn',true); | ||||
|                         $('#showSolutionBtn').unbind().click(goat.utils.showLessonSolution); | ||||
|                         return scope; | ||||
|                     }, | ||||
|                     function(err){ | ||||
|                         scope.solution = null; | ||||
|                         goat.utils.displayButton('showSolutionBtn',false); | ||||
|                         //TODO handle errors | ||||
|                     } | ||||
|                 );                 | ||||
|             }, | ||||
|             getPlan: function() { | ||||
|                 var scope = this; | ||||
|                 goat.data.loadPlan().then( | ||||
|                     function(resp) { | ||||
|                         scope.plan = resp.data; | ||||
|                         goat.utils.displayButton('showPlanBtn',true); | ||||
|                         $('#showPlanBtn').unbind().click(goat.utils.showLessonPlan); | ||||
|                         return scope; | ||||
|                     }, | ||||
|                     function(err){ | ||||
|                         goat.utils.displayButton('showPlanBtn',false); | ||||
|                         //TODO handle errors | ||||
|                     } | ||||
|                 ); | ||||
|             }, | ||||
|             getSource: function() { | ||||
|                 var scope = this; | ||||
|                 goat.data.loadSource().then( | ||||
|                     function(resp) { | ||||
|                         scope.source = resp.data; | ||||
|                         goat.utils.displayButton('showSourceBtn',true); | ||||
|                         $('#showSourceBtn').unbind().click(goat.utils.showLessonSource); | ||||
|                         return scope; | ||||
|                     }, | ||||
|                     function(err){ | ||||
|                         goat.utils.displayButton('showSourceBtn',false); | ||||
|                         //TODO handle errors | ||||
|                     } | ||||
|                 ); | ||||
|             }, | ||||
|             getCookies: function() { | ||||
|                 var scope = this; | ||||
|                 goat.data.loadCookies().then( | ||||
|                     function(resp) { | ||||
|                         scope.cookies = resp.data; | ||||
|                         return scope; | ||||
|                     }, | ||||
|                     function(err){ | ||||
|                         //TODO handle errors | ||||
|                     } | ||||
|                 ); | ||||
|             }, | ||||
|             getParams: function() { | ||||
|                 this.params = goat.utils.scrapeParams(this.lessonUrl); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| }; | ||||
| @ -1,189 +0,0 @@ | ||||
| goat.utils = { | ||||
|     //TODO add recursion to handle arr[i].children objects | ||||
|     // ... in case lower-level's need classes as well ... don't right now | ||||
|     addMenuClasses: function(arr) { | ||||
|         for (var i = 0; i < arr.length; i++) { | ||||
|             var menuItem = arr[i]; | ||||
|             //console.log(menuItem); | ||||
|             if (menuItem.type && menuItem.type === 'CATEGORY') { | ||||
|                 menuItem.class = 'fa-angle-right pull-right'; | ||||
|             } | ||||
|         } | ||||
|         return arr; | ||||
|     }, | ||||
|     debugFormSubmission: false, | ||||
|     // pre-submit callback  | ||||
|     showRequest: function(formData, jqForm, options) { | ||||
|         if (goat.utils.debugFormSubmission) { | ||||
|             // formData is an array; here we use $.param to convert it to a string to display it  | ||||
|             // but the form plugin does this for you automatically when it submits the data  | ||||
|             var queryString = $.param(formData); | ||||
|  | ||||
|             // jqForm is a jQuery object encapsulating the form element.  To access the  | ||||
|             // DOM element for the form do this:  | ||||
|             // var formElement = jqForm[0];  | ||||
|  | ||||
|             alert('About to submit: \n\n' + queryString); | ||||
|         } | ||||
|         // here we could return false to prevent the form from being submitted;  | ||||
|         // returning anything other than false will allow the form submit to continue  | ||||
|         return true; | ||||
|     }, | ||||
|     // post-submit callback  | ||||
|     showResponse: function(responseText, statusText, xhr, $form) { | ||||
|         // for normal html responses, the first argument to the success callback  | ||||
|         // is the XMLHttpRequest object's responseText property  | ||||
|  | ||||
|         // if the ajaxForm method was passed an Options Object with the dataType  | ||||
|         // property set to 'xml' then the first argument to the success callback  | ||||
|         // is the XMLHttpRequest object's responseXML property  | ||||
|  | ||||
|         // if the ajaxForm method was passed an Options Object with the dataType  | ||||
|         // property set to 'json' then the first argument to the success callback  | ||||
|         // is the json data object returned by the server  | ||||
|         if (goat.utils.debugFormSubmission) { | ||||
|             alert('status: ' + statusText + '\n\nresponseText: \n' + responseText + | ||||
|                     '\n\nThe output div should have already been updated with the responseText.'); | ||||
|         } | ||||
|         // update lesson cookies and params | ||||
|         // make any embedded forms ajaxy | ||||
|         goat.utils.showLessonCookiesAndParams(); | ||||
|         // forms and links are now hooked with each standard lesson render (see Java class Screen.getContent()) | ||||
|         // but these are safe to call twice | ||||
|         goat.utils.makeFormsAjax(); | ||||
|         goat.utils.ajaxifyAttackHref(); //TODO find some way to hook scope for current menu. Likely needs larger refactor which is already started/stashed | ||||
|         //refresh menu | ||||
|         angular.element($('#leftside-navigation')).scope().renderMenu(); | ||||
|     }, | ||||
|     makeFormsAjax: function() { | ||||
|         // make all forms ajax forms | ||||
|         var options = { | ||||
|             target: '#lesson_content', // target element(s) to be updated with server response                      | ||||
|             beforeSubmit: goat.utils.showRequest, // pre-submit callback, comment out after debugging  | ||||
|             success: goat.utils.showResponse  // post-submit callback, comment out after debugging  | ||||
|  | ||||
|                     // other available options:  | ||||
|                     //url:       url         // override for form's 'action' attribute  | ||||
|                     //type:      type        // 'get' or 'post', override for form's 'method' attribute  | ||||
|                     //dataType:  null        // 'xml', 'script', or 'json' (expected server response type)  | ||||
|                     //clearForm: true        // clear all form fields after successful submit  | ||||
|                     //resetForm: true        // reset the form after successful submit  | ||||
|  | ||||
|                     // $.ajax options can be used here too, for example:  | ||||
|                     //timeout:   3000  | ||||
|         }; | ||||
|         //console.log("Hooking any lesson forms to make them ajax"); | ||||
|         $("form").ajaxForm(options); | ||||
|     }, | ||||
|     displayButton: function(id, show) { | ||||
|         if ($('#' + id)) { | ||||
|             if (show) { | ||||
|                 $('#' + id).show(); | ||||
|             } else { | ||||
|                 $('#' + id).hide(); | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     showLessonCookiesAndParams: function() { | ||||
|         $.get(goatConstants.cookieService, {}, function(reply) { | ||||
|             $("#lesson_cookies").html(reply); | ||||
|         }, "html"); | ||||
|     }, | ||||
|     showLessonHints: function() { | ||||
|         $('.lessonHelp').hide(); | ||||
|         $('#lesson_hint').html(); | ||||
|         $('#lesson_hint_row').show(); | ||||
|     }, | ||||
|     showLessonSource: function(source) { | ||||
|         $('.lessonHelp').hide(); | ||||
|         //$('#lesson_source').html("<pre>"+goat.lesson.lessonInfo.source+"</pre>"); | ||||
|         $('#lesson_source_row').show(); | ||||
|         goat.utils.scrollToHelp(); | ||||
|     }, | ||||
|     showLessonSolution: function() { | ||||
|         $('.lessonHelp').hide(); | ||||
|         $('#lesson_solution').html(goat.lesson.lessonInfo.solution); | ||||
|         $('#lesson_solution_row').show(); | ||||
|         goat.utils.scrollToHelp(); | ||||
|     }, | ||||
|     showLessonPlan: function(plan) { | ||||
|         $('.lessonHelp').hide(); | ||||
|         $("#lesson_plan").html(goat.lesson.lessonInfo.plan); | ||||
|         $('#lesson_plan_row').show(); | ||||
|         goat.utils.scrollToHelp(); | ||||
|     }, | ||||
|     scrollToHelp: function() { | ||||
|         $('#leftside-navigation').height($('#main-content').height() + 15) | ||||
|         var target = $('#lessonHelpsWrapper'); | ||||
|         goat.utils.scrollEasy(target); | ||||
|     }, | ||||
|     scrollToTop: function() { | ||||
|         $('.lessonHelp').hide(); | ||||
|         var target = $('#container'); | ||||
|         goat.utils.scrollEasy(target); | ||||
|     }, | ||||
|     scrollEasy: function(target) { | ||||
|         $('html,body').animate({ | ||||
|             scrollTop: target.offset().top | ||||
|         }, 1000); | ||||
|     }, | ||||
|     scrapeParams: function(url) { | ||||
|         if (!url) { | ||||
|             return; | ||||
|         } | ||||
|         var params = url.split('?')[1].split('&'); | ||||
|         var paramsArr = []; | ||||
|         for (var i = 0; i < params.length; i++) { | ||||
|             var paramObj = {}; | ||||
|             paramObj.name = params[i].split('=')[0]; | ||||
|             paramObj.value = params[i].split('=')[1]; | ||||
|             paramsArr.push(paramObj); | ||||
|         } | ||||
|         return paramsArr; | ||||
|     }, | ||||
|     highlightCurrentLessonMenu: function(id) { | ||||
|         //TODO: move selectors in first two lines into goatConstants | ||||
|         $('ul li.selected').removeClass(goatConstants.selectedMenuClass) | ||||
|         $('ul li.selected a.selected').removeClass(goatConstants.selectedMenuClass) | ||||
|         $('#' + id).addClass(goatConstants.selectedMenuClass); | ||||
|         $('#' + id).parent().addClass(goatConstants.selectedMenuClass); | ||||
|     }, | ||||
|     makeId: function(lessonName) { | ||||
|         return lessonName.replace(/\s|\(|\)|\!|\:|\;|\@|\#|\$|\%|\^|\&|\*/g, '');//TODO move the replace routine into util function | ||||
|     }, | ||||
|     ajaxifyAttackHref: function() { | ||||
|         /* Jason I commented this implementation out | ||||
|          * I think we should show the attack link on the lessons that need it by modifying the lesson | ||||
|          * itself or we could add a new button up top for "show lesson link"       | ||||
|          $.each($('a[href^="attack?"]'), | ||||
|          function(i,el) { | ||||
|          var url = $(el).attr('href'); | ||||
|          $(el).attr('href','#'); | ||||
|          $(el).attr('link',url); | ||||
|          //TODO pull currentMenuId | ||||
|          $(el).click( | ||||
|          function() { | ||||
|          var _url = $(el).attr('link'); | ||||
|          $.get(_url, {success:showResponse}); | ||||
|          } | ||||
|          ) | ||||
|          } | ||||
|          ); | ||||
|          */ | ||||
|         // alternate implementation | ||||
|         // unbind any bound events so we are safe to be called twice | ||||
|         $('#lesson_content a').unbind('click'); | ||||
|         $('#lesson_content a').bind('click', function(event) { | ||||
|             event.preventDefault(); | ||||
|             $.get(this.href, {}, function(response) { | ||||
|                 $('#lesson_content').html(response); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| }; | ||||
|  | ||||
|  | ||||
| $(window).resize(function() { | ||||
|     //$('#leftside-navigation').css('height',$('div.panel-body').height()); | ||||
|     console.log($(window).height()); | ||||
| }); | ||||
| @ -15,7 +15,7 @@ require.config({ | ||||
|   paths: { | ||||
|     jquery: 'libs/jquery-1.10.2.min', | ||||
|     underscore: 'libs/underscore-min', | ||||
|     backbone: 'libs/backbone-min'//, | ||||
|     backbone: 'libs/backbone-min' | ||||
|   } | ||||
| , | ||||
|   shim: { | ||||
| @ -30,8 +30,5 @@ require.config({ | ||||
| }); | ||||
|  | ||||
| require(['jquery','underscore','backbone','goatApp/goatApp'], function($,_,Backbone,Goat){ | ||||
|    | ||||
|   Goat.initApp(); | ||||
|   //var lessonController = new LessonController(); | ||||
|  | ||||
| }); | ||||
		Reference in New Issue
	
	Block a user