define([ 'dojo/_base/declare', 'dojo/_base/event', 'dojo/_base/lang', 'dojo/when', '../store', '../app/Content', '../app/Router', '../app/Page', '../model/classes/Question', '../model/widgets/QuestionEditorPreview', '../model/widgets/QuestionEditorToolkit', 'dojo/text!./templates/question.html' ],function(declare, event, lang, when, store, Content, Router, Page, Question, QuestionEditorPreview, QuestionEditorToolkit, template){ return declare([Page], { templateString: template, question: null, _toolkit: null, _preview: null, startup: function() { if ( this._started ) { return; } this.inherited(arguments); if ( !this.questionId ) { throw new Error("Error: no reference to object set!"); } this._setupEditor(); if (this.questionId === "new") { this.question = Question.create(); this._refresh(); } else { when(store.get(this.questionId)) .then(lang.hitch(this, function(obj) { this.question = obj; this._refresh(); })); } }, onLeave: function() { this.inherited(arguments); }, _refresh: function () { this.titleNode.innerHTML = Question.DisplayTitle.get(this.question); this._toolkit.set('value',this.question); this._preview.appendItems(Question.Content.get(this.question)); }, _onSave: function(evt) { lang.mixin(this.question, this._toolkit.get('value')); Question.Content.set(this.question, this._preview.getItems()); store.put(this.question) .then(function() { Router.go('/questions'); },function(err){ Content.notify(err,'error'); }); if ( evt ) { event.stop( evt ); } return false; }, _onDiscard: function() { Router.go('/questions'); return true; }, _setupEditor: function() { this._toolkit = new QuestionEditorToolkit({ },this.QuestionEditorToolkitNode); this._toolkit.on('submit',lang.hitch(this,"_onSave")); this._toolkit.startup(); this._preview = new QuestionEditorPreview({ },this.QuestionEditorPreviewNode); this._preview.startup(); this._supportingWidgets.push(this._toolkit, this._preview); } }); });