123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341 |
- "use strict";
- // Copyright 2012 United States Government, as represented by the Secretary of Defense, Under
- // Secretary of Defense (Personnel & Readiness).
- //
- // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- // in compliance with the License. You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software distributed under the License
- // is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- // or implied. See the License for the specific language governing permissions and limitations under
- // the License.
- /// vwf/view/lesson creates a view interface for instruction text.
- ///
- /// @module vwf/view/lesson
- /// @requires vwf/view
- define( [ "module", "vwf/view", "jquery", "jquery-ui" ], function( module, view, $ ) {
- return view.load( module, {
- // == Module Definition ====================================================================
- initialize: function() {
- var self = this;
- this.lessonSteps = {};
- this.progressWidth = 10;
- this.currentTaskName = undefined;
- // Add CSS files
- var lessonCss = document.createElement('link');
- lessonCss.rel = 'stylesheet';
- lessonCss.type = 'text/css';
- lessonCss.href = 'vwf/view/lesson/jquery-ui-1.10.4.custom.min.css';
- $('head').append(lessonCss);
- lessonCss = document.createElement('link');
- lessonCss.rel = 'stylesheet';
- lessonCss.type = 'text/css';
- lessonCss.href = 'vwf/view/lesson/lesson.css';
- $('head').append(lessonCss);
- // Create instruction panel
- var instructionPanelDiv = document.createElement('div');
- instructionPanelDiv.className = 'lesson';
- instructionPanelDiv.id = 'instructionPanel';
- // Create instruction accordion
- var accordionDiv = document.createElement('div');
- accordionDiv.className = 'lesson';
- accordionDiv.id = 'accordion';
- // Create lesson progress bar
- var progressDiv = document.createElement('div');
- progressDiv.className = 'lesson';
- progressDiv.id = 'progress';
- var innerProgressDiv = document.createElement('div');
- innerProgressDiv.className = 'lesson progress';
- var innerProgressBarDiv = document.createElement('div');
- innerProgressBarDiv.className = 'lesson bar';
- innerProgressBarDiv.id = 'lessonProgressBar';
- $(innerProgressDiv).append(innerProgressBarDiv);
- $(progressDiv).append(innerProgressDiv);
- // Create navigation buttons
- var navigationDiv = document.createElement('div');
- navigationDiv.className = 'lesson';
- navigationDiv.id = 'navigation';
- var buttonList = document.createElement('ul');
- buttonList.className = 'lesson';
- var messageListItem = document.createElement('li');
- messageListItem.className = 'lesson';
- messageListItem.id = 'message';
- var messageListItemLabel = document.createElement('label');
- messageListItemLabel.className = 'lesson buttonLabel';
- $(messageListItem).append(messageListItemLabel);
- var startButtonListItem = document.createElement('li');
- startButtonListItem.className = 'lesson';
- startButtonListItem.id = 'startButton';
- var startButtonItemButton = document.createElement('button');
- startButtonItemButton.type = 'button';
- startButtonItemButton.className = 'lesson btn btn-info';
- startButtonItemButton.onclick = function () {
- startLesson.call(self);
- };
- var startButtonItemLabel = document.createElement('label');
- startButtonItemLabel.className = 'lesson buttonLabel';
- startButtonItemLabel.innerHTML = 'Start';
- $(startButtonItemButton).append(startButtonItemLabel);
- $(startButtonListItem).append(startButtonItemButton);
- // TODO: Implement previous method
- // var previousButtonListItem = document.createElement('li');
- // previousButtonListItem.id = 'previousButton';
- // var previousButtonItemButton = document.createElement('button');
- // previousButtonItemButton.type = 'button';
- // previousButtonItemButton.className = 'btn btn-info';
- // previousButtonItemButton.onclick = function () {
- // previousTask.call(self);
- // };
- // var previousButtonItemLabel = document.createElement('label');
- // previousButtonItemLabel.className = 'buttonLabel';
- // previousButtonItemLabel.innerHTML = 'Previous';
- // $(previousButtonItemButton).append(previousButtonItemLabel);
- // $(previousButtonListItem).append(previousButtonItemButton);
- var nextButtonListItem = document.createElement('li');
- nextButtonListItem.className = 'lesson';
- nextButtonListItem.id = 'nextButton';
- var nextButtonItemButton = document.createElement('button');
- nextButtonItemButton.type = 'button';
- nextButtonItemButton.className = 'lesson btn btn-info';
- nextButtonItemButton.onclick = function () {
- nextTask.call(self);
- };
- var nextButtonItemLabel = document.createElement('label');
- nextButtonItemLabel.className = 'lesson buttonLabel';
- nextButtonItemLabel.innerHTML = 'Next';
- $(nextButtonItemButton).append(nextButtonItemLabel);
- $(nextButtonListItem).append(nextButtonItemButton);
- var completeButtonListItem = document.createElement('li');
- completeButtonListItem.className = 'lesson';
- completeButtonListItem.id = 'completeButton';
- var completeButtonItemButton = document.createElement('button');
- completeButtonItemButton.type = 'button';
- completeButtonItemButton.className = 'lesson btn btn-info';
- completeButtonItemButton.onclick = function () {
- completeLesson.call(self);
- };
- var completeButtonItemLabel = document.createElement('label');
- completeButtonItemLabel.className = 'lesson buttonLabel';
- completeButtonItemLabel.innerHTML = 'Complete';
- $(completeButtonItemButton).append(completeButtonItemLabel);
- $(completeButtonListItem).append(completeButtonItemButton);
- $(buttonList).append(messageListItem);
- $(buttonList).append(startButtonListItem);
- // $(buttonList).append(previousButtonListItem);
- $(buttonList).append(nextButtonListItem);
- $(buttonList).append(completeButtonListItem);
- $(navigationDiv).append(buttonList);
- $(instructionPanelDiv).append(accordionDiv);
- $(instructionPanelDiv).append(progressDiv);
- $(instructionPanelDiv).append(navigationDiv);
- $('body').append(instructionPanelDiv);
- },
-
- createdProperty: function( nodeId, propertyName, propertyValue ) {
- return this.satProperty( nodeId, propertyName, propertyValue );
- },
- initializedProperty: function (nodeId, propertyName, propertyValue) {
- return this.satProperty( nodeId, propertyName, propertyValue );
- },
- satProperty: function( nodeId, propertyName, propertyValue ) {
- switch ( propertyName ) {
- case "status":
- var status = propertyValue;
- if ( nodeId === vwf_view.kernel.find( '', '/lesson' )[ 0 ] ) {
- switch ( status ) {
- case "entered":
- this.currentTaskName = vwf_view.kernel.name( nodeId );
- this.progressWidth = 10;
- $( '#lessonProgressBar' ).css( 'display', 'block' );
- $( '#lessonProgressBar' ).css( 'width', '10px' );
- $( '#message' ).css( 'display', 'none' );
- $( '#startButton' ).css( 'display', 'none' );
- $( '#nextButton' ).css( 'display', 'inline-block' );
- $( 'a' ).css( 'color', 'white' );
- if ( $( '#accordion' ).html() == '' ) {
- updateLessonInstructions.call( self, this.lessonSteps );
- }
- break;
- case "completed":
- $('#lessonProgressBar').css('width', '100%');
- $('#nextButton').css('display', 'none');
- $('#completeButton').css('display', 'inline-block');
- break;
- case "inactive":
- $( '#lessonProgressBar' ).css( 'display', 'none' );
- $( '#completeButton' ).css( 'display', 'none' );
- $( '#message' ).css( 'display', 'inline-block' );
- $( '#startButton' ).css( 'display', 'inline-block' );
- break;
- }
- } else {
- var stepDivId = nodeId.replace( /\:/g, "_" ).replace( /\./g, "-" ).replace(/\//g, "_");
- switch ( status ) {
- case "entered":
- this.currentTaskName = vwf_view.kernel.name( nodeId );
- var $stepDiv = $( "#" + stepDivId );
- if ( $stepDiv.length ) {
- var $accordion = $stepDiv.parent().parent();
- if ( $accordion.length ) {
- $accordion.accordion( "option", "active",
- Number( $stepDiv.attr( "data-index" ) ) );
- }
- }
- break;
- case "completed":
- if ( $( '#div--' + stepDivId ) ) {
- $( '#' + stepDivId ).css( 'color', 'green' );
- }
- var numTasks = 0;
- for ( var step in this.lessonSteps ) {
- numTasks++;
- }
- var widthDelta = Math.ceil( 100 / numTasks );
- var pixelWidth = $( '#progress' ).css( 'width' );
- pixelWidth = pixelWidth.substring( 0, pixelWidth.length - 2 );
- this.progressWidth = this.progressWidth +
- ( pixelWidth * widthDelta * 0.01 );
- $( '#lessonProgressBar' ).css( 'width', this.progressWidth + 'px' );
- break;
- case "inactive":
- var $accordion = $( '#accordion--' + stepDivId );
- if ( $accordion.length ) {
- $accordion.accordion( "option", "active", false );
- }
- break;
- }
- }
- break;
- case "text":
- if ( propertyValue ) {
- this.lessonSteps[ nodeId ] = propertyValue;
- }
- break;
- }
- },
- } );
- // -- updateLessonInstructions ----------------------------------------------------------
- function updateLessonInstructions( lessonSteps )
- {
- var lessonID = vwf_view.kernel.find('', '/lesson')[ 0 ];
- var stepIds = vwf_view.kernel.find( lessonID, "./*" );
- var $accordion = $( "#accordion" );
- for ( var i = 0; i < stepIds.length; i++ ) {
- var step = stepIds[ i ];
- var stepText = lessonSteps[ step ];
- var stepSafeId = step.replace(/\:/g, "_").replace(/\./g, "-").replace(/\//g, "_");
- var $subAccordionDiv = [];
- if ( stepText ) {
- $subAccordionDiv = $( "<div/>", {
- id: "accordion--" + stepSafeId,
- "data-index": i
- } );
- $accordion.append( "<p class='lesson taskTitle'>" + stepText + "</p>" );
- $accordion.append( $subAccordionDiv );
- $accordion.append( "<br />" );
- }
- var substepIds = vwf_view.kernel.find( step, "./*" );
- for ( var j = 0; j < substepIds.length; j++ ) {
- var substep = substepIds[ j ];
- var substepText = lessonSteps[ substep ];
- if ( substepText ) {
- var substepSafeId = substep.replace(/\:/g, "_").replace(/\./g, "-").replace(/\//g, "_");
- $subAccordionDiv.append( [
- "<h2>",
- " <a id='" + substepSafeId + "' data-index='" + j + "' href='#'>" + substepText + "</a>",
- "</h2>"
- ].join( "\n" ) );
- $subAccordionDiv.append( "<div id='div--" + substepSafeId + "'></div>");
- }
- vwf_view.kernel.find( substep, "./*", function( subsubstep ) {
- processSubSubSteps( substep, subsubstep );
- } );
- }
- }
- $accordion.children('div').accordion({ active: false, collapsible: true });
- function processSubSubSteps( parentStepID, childStepID ) {
- var text = lessonSteps[childStepID];
- if ( text ) {
- var htmlParent = parentStepID.replace(/\:/g, "_").replace(/\./g, "-").replace(/\//g, "_");
- while(! $('#div--' + htmlParent).length)
- {
- htmlParent = htmlParent.substring(0, htmlParent.lastIndexOf('_'));
- }
- if( $('#div--' + htmlParent).html() != "" ) $('#div--' + htmlParent).append("<br />");
- $('#div--' + htmlParent).append(text + "<br />");
- }
- vwf_view.kernel.find( childStepID, "./*", function( childSubStepID ) {
- processSubSubSteps( childStepID, childSubStepID );
- } );
- };
- }
- // -- startLesson -----------------------------------------------------------------------
- function startLesson()
- {
- vwf_view.kernel.callMethod(vwf_view.kernel.find('','/lesson')[0], 'enter', []);
- }
- // -- nextTask --------------------------------------------------------------------------
- function nextTask()
- {
- vwf_view.kernel.callMethod(vwf_view.kernel.find('','//'+this.currentTaskName)[0], 'next', []);
- }
- // -- completeLesson --------------------------------------------------------------------
- function completeLesson()
- {
- vwf_view.kernel.callMethod(vwf_view.kernel.find('','/lesson')[0], 'exit', []);
- }
- } );
|