{"version":3,"sources":["../../../config-wrap-start-default.js","vendor/almond.js","vendor/wp-hooks.js","underscore.js","backbone.js","jquery.js","vendor/backbone.collectionView.js","vendor/backbone.trackit.js","Models/Image.js","Models/_Relationships.js","Models/QuestionChoice.js","Collections/QuestionChoices.js","Models/QuestionType.js","Models/_Utilities.js","Models/Question.js","Collections/Questions.js","Schemas/Quiz.js","Models/Quiz.js","Schemas/Lesson.js","Models/Lesson.js","Collections/Lessons.js","Collections/QuestionTypes.js","Models/Section.js","Collections/Sections.js","Collections/loader.js","Models/Abstract.js","Models/Course.js","Models/loader.js","Views/_Detachable.js","Views/_Editable.js","Views/_Receivable.js","Views/_Shiftable.js","Views/_Subview.js","Views/_Trashable.js","Views/_loader.js","Controllers/Construct.js","Controllers/Debug.js","Controllers/Schemas.js","Controllers/Sync.js","Views/Lesson.js","Views/LessonList.js","Views/Section.js","Views/SectionList.js","Views/Course.js","Views/SettingsFields.js","Views/LessonEditor.js","Views/Popover.js","Views/PostSearch.js","Views/QuestionType.js","Views/QuestionBank.js","Views/QuestionChoice.js","Views/QuestionChoiceList.js","Views/Question.js","Views/QuestionList.js","Views/Quiz.js","Views/Assignment.js","Views/Editor.js","Views/Elements.js","Views/Utilities.js","Views/Sidebar.js","main.js"],"names":["$","requirejs","require","define","undef","hasProp","obj","prop","hasOwn","call","normalize","name","baseName","nameParts","nameSegment","mapValue","foundMap","lastIndex","foundI","foundStarMap","starI","i","j","part","normalizedBaseParts","baseParts","split","map","config","starMap","length","nodeIdCompat","jsSuffixRegExp","test","replace","charAt","slice","concat","splice","join","makeRequire","relName","forceSync","args","aps","arguments","push","req","apply","makeNormalize","makeLoad","depName","value","defined","callDep","waiting","defining","main","Error","splitPrefix","prefix","index","indexOf","substring","makeRelParts","makeConfig","makeMap","handlers","Object","prototype","hasOwnProperty","relParts","plugin","parts","relResourceName","f","n","pr","p","exports","e","module","id","uri","deps","callback","cjsModule","ret","usingExports","callbackType","load","undefined","alt","setTimeout","cfg","_defined","amd","jQuery","window","llms","wp","hooks","t","r","o","l","m","c","d","defineProperty","configurable","enumerable","get","__esModule","default","s","209","console","error","u","priority","namespace","a","__current","forEach","currentIndex","runs","b","Array","pop","create","addAction","addFilter","removeAction","removeFilter","hasAction","hasFilter","removeAllActions","removeAllFilters","doAction","applyFilters","currentAction","currentFilter","doingAction","doingFilter","didAction","didFilter","actions","filters","v","A","_","F","g","y","k","x","I","w","O","T","z","Z","h","Backbone","root","factory","Zepto","this","_normalizeOptionDeclarations","optionDeclarations","normalizedOptionDeclarations","isArray","each","thisOptionDeclaration","thisOptionName","thisOptionRequired","thisOptionDefaultValue","isString","isObject","first","keys","isFunction","clone","required","isUndefined","defaultValue","mDefaultModelViewConstructor","View","kOptionsRequiringRerendering","kStylesForEmptyListCaption","background","border","box-shadow","CollectionView","extend","tagName","events","mousedown > li, tbody > tr > td","dblclick > li, tbody > tr > td","click","click ul.collection-view, table.collection-view","keydown","spawnMessages","focus","passMessages","*","initializationOptions","collection","modelView","modelViewOptions","itemTemplate","itemTemplateFunction","selectable","clickToSelect","selectableModelsFilter","visibleModelsFilter","sortableModelsFilter","selectMultiple","clickToToggle","processKeyEvents","sortable","sortableOptions","reuseModelViews","detachedRendering","emptyListCaption","initialize","options","ViewOptions","add","setOptions","Collection","_hasBeenRendered","_isBackboneCourierAvailable","Courier","$el","data","addClass","attr","selectedItems","_updateItemTemplate","_registerCollectionEvents","viewManager","ChildViewContainer","_onOptionsChanged","changedOptions","originalOptions","_this","rerender","changedOptionKey","newVal","oldVal","stopListening","setSelectedModel","by","setSelectedModels","removeAttr","_setupSortable","reapplyFilter","view","remove","contains","render","setOption","optionName","optionValue","optionHash","getSelectedModel","getSelectedModels","referenceBy","items","item","curLineNumber","_getVisibleItemEls","is","findByModel","newSelectedItems","silent","newSelectedCids","thisModel","cid","pluck","model","thisItemEl","oldSelectedModels","oldSelectedCids","_convertStringsToInts","_validateSelection","newSelectedModels","_containSameElements","_addSelectedClassToSelectedItems","spawn","selectedModels","trigger","updateDependentControls","newSelectedItem","getView","reference","itemElements","_saveSelection","modelViewContainerEl","_getContainerEl","oldViewManager","thisModelView","detach","empty","fragmentContainer","document","createDocumentFragment","findByModelCid","_createNewModelView","_getModelViewOptions","_insertAndRenderModelView","append","_showEmptyListCaptionIfAppropriate","_restoreSelection","forceRerenderOnNextSortEvent","_removeEmptyListCaption","emptyListString","$emptyListCaptionEl","$varEl","_isRenderedAsList","wrapAll","parent","css","find","parentElOrDocumentFragment","atIndex","thisModelViewWrapped","_wrapModelView","nodeType","appendChild","numberOfModelViewsCurrentlyInDOM","children","eq","before","hide","hideThisModelView","toggle","toggleClass","whichFilter","notVisible","_modelViewHasWrapperLI","closest","notSortable","notSelectable","_removeModelView","_validateSelectionAndRender","listenTo","_isRenderedAsTable","tbody","_getClickedItemId","theEvent","clickedItemId","clickedItemEl","currentTarget","clickedItem","isNumeric","parseInt","itemTemplateHtml","html","template","modelReferenceIds","models","intersection","filter","thisItemId","savedSelection","offset","oldItemsIdsWithSelectedClass","itemsIdsFromWhichSelectedClassNeedsToBeRemoved","without","removeClass","itemsIdsFromWhichSelectedClassNeedsToBeAdded","_reorderCollectionBasedOnHTML","thisModelCid","sort","comparator","_getModelViewConstructor","modelViewConstructor","newModelView","collectionListView","collectionView","modelViewWrapperEl","theArray","thisEl","thisElAsNumber","arrayA","arrayB","toLowerCase","_charCodes","upArrow","downArrow","axis","distance","forcePlaceholderSize","start","bind","_sortStart","change","_sortChange","stop","_sortStop","receive","_receive","over","_over","result","event","ui","modelBeingSorted","newIndex","senderListEl","sender","senderCollectionListView","modelReceived","at","_onKeydown","trap","currentOffset","which","_listItem_onMousedown","clickedModel","metaKeyPressed","ctrlKey","metaKey","thisMethod","shiftKey","firstSelectedItemIndex","thisItemModel","clickedItemIndex","shiftKeyRootSelectedItemIndex","minSelectedItemIndex","Math","min","maxSelectedItemIndex","max","thisIndex","selection","getSelection","sel","removeAllRanges","union","_listItem_onDoubleClick","_listBackground_onClick","target","setDefaultModelViewConstructor","theConstructor","optionsDeclarationsProperty","optionsThatWereChanged","optionsThatWereChangedPreviousValues","thisOptionProperties","oldValue","newValue","onOptionsChanged","getOptions","optionsNames","pick","Container","views","_views","_indexByModel","_indexByCustom","_updateLength","customIndex","viewCid","modelCid","findByCid","findByCustom","findByIndex","values","findIndexByCid","any","key","method","tail","size","methods","toArray","unsavedModels","updateUnsavedModels","isEmpty","_unsavedChanges","findWhere","getPrompt","fnName","prompt","rest","evaluateModelFn","fn","isBoolean","_unsavedConfig","History","navigate","wrap","oldNav","fragment","confirm","onbeforeunload","Model","unsaved","_trackingChanges","_originalAttrs","startTracking","unloadRouterPrompt","unloadWindowPrompt","_resetTracking","_triggerUnsavedChanges","stopTracking","restartTracking","resetAttributes","attributes","unsavedAttributes","attrs","val","changed","old","isEqual","set","oldSet","sync","oldSync","success","oldSuccess","textStatus","jqXHR","defaults","enabled","src","relationship_defaults","relationships","init_relationships","rels","get_relationships","set_parent","child_data","child_key","conditional","child","child_val","lookup","type","llms_builder","construct","get_model","class","get_collection","_maybe_set_parent_reference","child_model","get_child_props","props","get_parent","Image","Relationships","choice","uniqueId","choice_type","correct","marker","question_id","get_trash_id","is_selectable","get_choice_selectable","on","update_order","update_correct","count_correct","get_correct","siblings","question","self","get_choice_markers","choices","clarifications","default_choices","description","icon","image","keywords","placeholder","points","video","get_keywords","_get_choice_option","get_choice_type","get_min_choices","get_max_choices","get_multi_choices","option","fields","get_edit_post_link","has_temp_id","admin_url","get_settings_fields","schema","schemas","isNumber","init_custom_schema","groups","group","flatten","field","attribute","customs","switch_attribute","attribute_prefix","Questions","QuestionChoices","QuestionType","Utilities","questions","question_type","content","description_enabled","multi_choices","menu_order","parent_id","title","video_enabled","video_src","_expanded","_ensure_min_choices","delay","update_points","add_choice","pubSub","before_save","atts","sync_type","get_l10n_type","plural","LLMS","l10n","translate","get_type_index","curr_type","get_type_iterator","get_qid","get_parent_question","is_in_group","get_parent_quiz","get_points","get_points_percentage","total","toFixed","update_parent","toggleable","label","tip","Lesson","Question","QuizSchema","lesson_id","status","allowed_attempts","limit_attempts","limit_time","passing_percent","random_answers","time_limit","show_correct_answer","_points","permalink","_show_settings","_questions_loaded","get_total_points","add_question","load_questions","cb","Ajax","action","action_type","course_id","CourseModel","load_id","xhr","log","debug","res","condition","assignments","label_after","tip_position","is_first_in_course","get_available_prereq_options","get_course","date_format","timepicker","datepicker","Quiz","LessonSchema","parents","quiz","order","parent_course","course","parent_section","edit_url","view_url","audio_embed","has_prerequisite","require_passing_grade","require_assignment_passing_grade","video_embed","free_lesson","assignment","assignment_enabled","quiz_enabled","_forceSync","maybe_init_assignments","parent_section_index","lesson_index_in_section","section","curr_sec_index","%1$d","%2$s","lesson","curr_les_index","add_quiz","%1$s","is_first_in_section","is_last_in_course","is_last_in_section","get_prev","get_sibling","get_next","direction","is_course_limit_reached_f","sibling_index_increment","get_sibling_lesson_in_sibling_section_f","sibling_index","sibling_lesson","cur_section","sibling_section","on_reorder","validate_prereqs","prerequisite","Lessons","lessons","_selected","add_lesson","circular","_get_sibling","last","QuestionTypes","Sections","sections","add_section","add_existing_lesson","prepareQuizObjectForCloning","prepareAssignmentObjectForCloning","prepareExistingPostObjectDataForAddingOrCloning","get_selected_section","selected","lesson_points","Abstract","Course","QuestionChoice","Section","click a[href=\"#llms-detach-model\"]","detach_model","preventDefault","stopPropagation","msg","%s","media_lib","click .llms-add-image","click a[href=\"#llms-edit-slug\"]","click a[href=\"#llms-remove-image\"]","change .llms-editable-select select","change .llms-switch input[type=\"checkbox\"]","change .llms-editable-radio input","focusin .llms-input","focusout .llms-input","keydown .llms-input","input .llms-input[type=\"number\"]","paste .llms-input[data-formatting]","get_allowed_tags","tag","trim","get_content","hasClass","stripFormatting","text","has_changed","is_valid","_validate_url","slug","beforeSend","Spinner","init_datepickers","datetimepicker","format","onClose","current_time","$input","blur","init_formatting_els","formatting","ed","Quill","modules","toolbar","keyboard","bindings","tab","handler","range","context","13","theme","delta","oldDelta","source","init_selects","llmsSelect2","width","on_blur","save_edits","revert_edits","on_focus","on_paste","originalEvent","clipboardData","getData","execCommand","on_select","multi","$selected","on_radio_select","on_keydown","keyCode","shift","open_media_lib","uploader","param","media","frames","file_frame","button","multiple","url","attachment","state","toJSON","sizes","open","remove_image","toggle_switch","init_editor","settings","editor","getEditor","getDefaultSettings","mediaButtons","tinymce","toolbar1","toolbar2","setup","on_editor_ready","make_slug_editable","$btn","$link","prevAll","prev","full_url","short_url","color","pointer-events","text-decoration","show","$ed","$parent","$label","prependTo","getContent","str","createElement","href","host","location","helper","maybe_hide_shiftable_buttons","old_index","new_index","shift_down","shift_up","subscriptions","get_subview","events_subscribe","func","events_unsubscribe","off","remove_subview","instance","remove_subviews","undelegateEvents","render_subviews","view_data","render_subview","set_state","click a[href=\"#llms-trash-model\"]","trash_model","Detachable","Editable","Receivable","Shiftable","Subview","Trashable","Collections","Models","Views","extend_view","classname","register_collection","register_model","disable","enable","custom_schemas","custom","model_type","add_error_msg","err","message","check_for_changes","changes","get_unsaved_changes","has_unsaved_changes","saving","do_ajax_save","JSON","stringify","responseText","process_removals","process_updates","get_changed_attributes","exclude","omit","get_changes_to_object","object","changed_atts","model_changes","maybe_restart_tracking","unset","removals","detached","trash","trashed","coll","errors","info","process_object_updates","main_data","orig_id","updates","autosave","check_interval","check_interval_ms","save_now","heartbeat","connectNow","set_check_interval","ms","clearInterval","setInterval","statusText","data-id","data-section-id","className","click .edit-lesson","click .edit-quiz","click .edit-assignment","click .section-prev","click .section-next","click .shift-up--lesson","click .shift-down--lesson","open_assignment_editor","set_hash","open_lesson_editor","open_quiz_editor","section_next","_move_to_section","section_prev","subtab","hash","to_section","from_coll","LessonView","connectWith","cursor","handle","sortable_start","sortable_stop","LessonListView","click .expand","click .collapse","click .shift-up--section","click .shift-down--section","mouseenter .llms-lessons","toggle_expanded","lessonListView","on_lesson_add","dragTimeout","expand","collapse","el","active_lesson_change","maybe_hide_trash_button","current","previous","update","on_mouseenter","SectionView","mousedown > li.llms-section > .llms-builder-header .llms-headline","click ul.collection-view","SectionListView","sectionListView","active_section_change","on_section_add","on_section_toggle","expand_section","click .llms-settings-group-toggle","get_editor_fields","is_editor_field","get_groups","is_group_hidden","group_id","localStorage","getItem","get_switch_attribute","has_switch","is_default_field","is_switch_condition_met","switch_on","render_editor","wpEditor","render_select_options","option_html","setup_field","orig_field","field_index","classes","input_type","orig_settings","switch_off","deepClone","has_images","should_rerender_on_toggle","field_type","toggle_group","$group","setItem","removeItem","SettingsFields","change_events","render_points_percentage","placement","style","animation","closeable","backdrop","onShow","onHide","container","webuiPopover","select2:select","post_type","searching_message","add_post","params","ajax","dataType","ajaxurl","term","page","_ajax_nonce","ajax_nonce","dropdownParent","escapeMarkup","markup","templateResult","render_result","$html","loading","$side","$main","Popover","QuestionSearch","click .llms-add-question","add_existing_question_click","add_new_question","dismissible","offsetLeft","offsetTop","add_existing_question","prepareQuestionObjectForCloning","QuestionView","change input[name=\"correct\"]","click .llms-action-icon[href=\"#llms-add-choice\"]","click .llms-action-icon[href=\"#llms-del-choice\"]","maybe_disable_buttons","del_choice","toggle_correct","ChoiceView","ChoiceListView","click .clone--question","click .delete--question","click .expand--question","click .collapse--question","change input[name=\"question_points\"]","multi_choices_toggle","choiceListView","questionListView","get_question_list","_get_question_clone","choice_clone","delete","selector","QuizModel","PostSearch","QuestionBank","QuestionList","bank","list","click #llms-existing-quiz","click #llms-new-quiz","click #llms-show-question-bank","click .bulk-toggle","render_points","on_trashed","last_group","alert","$questions","animate","scrollTop","bulk_toggle","expanded","add_new_quiz","add_existing_quiz","post_search_popover","add_existing_quiz_click","once","show_tools","addon_events","is_addon_available","get_view_events","click #llms-existing-assignment","click #llms-new-assignment","add_new_assignment","get_assignment","show_ad_popover","add_existing_assignment","add_existing_assignment_click","h3","btn","ad_popover","LessonEditor","Assignment","click .llms-editor-nav a[href=\"#llms-editor-close\"]","click .llms-editor-nav a:not([href=\"#llms-editor-close\"])","SidebarView","close_editor","switch_tab","LessonSearch","click #llms-new-section","click #llms-new-lesson","click #llms-existing-lesson","CourseView","draggable","appendTo","cancel","connectToSortable","add_new_section","add_new_lesson","$els","click #llms-collapse-all","click #llms-expand-all","collapse_all","expand_all","Editor","Elements","elements","utilities","click #llms-save-button","click #llms-exit-button","click .llms-builder-error","changes_made","heartbeat_send","heartbeat_tick","on_lesson_select","on_editor_close","$saveButton","add_error","$err","prepend","clear_errors","exit_now","data-status","disabled","txt","is_editor_active","lesson_model","Hooks","CV","TrackIt","Construct","Debug","Schemas","Sync","value_compare","expected","actual","mixin","checked","oldEditor","autop","assignment_type","tasks","task","assignment_id","post_data","author","allowed_tags","not","replaceWith","innerHTML","Events","Sidebar","sidebar","$lesson","wait_for"],"mappings":"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","file":"../../js/llms-builder.min.js","sourcesContent":["(function($){\n","/**\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\n */\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\n//be followed.\n/*global setTimeout: false */\n\nvar requirejs, require, define;\n(function (undef) {\n\tvar main, req, makeMap, handlers,\n\t\tdefined = {},\n\t\twaiting = {},\n\t\tconfig = {},\n\t\tdefining = {},\n\t\thasOwn = Object.prototype.hasOwnProperty,\n\t\taps = [].slice,\n\t\tjsSuffixRegExp = /\\.js$/;\n\n\tfunction hasProp(obj, prop) {\n\t\treturn hasOwn.call(obj, prop);\n\t}\n\n\t/**\n\t * Given a relative module name, like ./something, normalize it to\n\t * a real name that can be mapped to a path.\n\t * @param {String} name the relative name\n\t * @param {String} baseName a real name that the name arg is relative\n\t * to.\n\t * @returns {String} normalized name\n\t */\n\tfunction normalize(name, baseName) {\n\t\tvar nameParts, nameSegment, mapValue, foundMap, lastIndex,\n\t\t\tfoundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\n\t\t\tbaseParts = baseName && baseName.split(\"/\"),\n\t\t\tmap = config.map,\n\t\t\tstarMap = (map && map['*']) || {};\n\n\t\t//Adjust any relative paths.\n\t\tif (name) {\n\t\t\tname = name.split('/');\n\t\t\tlastIndex = name.length - 1;\n\n\t\t\t// If wanting node ID compatibility, strip .js from end\n\t\t\t// of IDs. Have to do this here, and not in nameToUrl\n\t\t\t// because node allows either .js or non .js to map\n\t\t\t// to same file.\n\t\t\tif (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\n\t\t\t\tname[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\n\t\t\t}\n\n\t\t\t// Starts with a '.' so need the baseName\n\t\t\tif (name[0].charAt(0) === '.' && baseParts) {\n\t\t\t\t//Convert baseName to array, and lop off the last part,\n\t\t\t\t//so that . matches that 'directory' and not name of the baseName's\n\t\t\t\t//module. For instance, baseName of 'one/two/three', maps to\n\t\t\t\t//'one/two/three.js', but we want the directory, 'one/two' for\n\t\t\t\t//this normalization.\n\t\t\t\tnormalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\n\t\t\t\tname = normalizedBaseParts.concat(name);\n\t\t\t}\n\n\t\t\t//start trimDots\n\t\t\tfor (i = 0; i < name.length; i++) {\n\t\t\t\tpart = name[i];\n\t\t\t\tif (part === '.') {\n\t\t\t\t\tname.splice(i, 1);\n\t\t\t\t\ti -= 1;\n\t\t\t\t} else if (part === '..') {\n\t\t\t\t\t// If at the start, or previous value is still ..,\n\t\t\t\t\t// keep them so that when converted to a path it may\n\t\t\t\t\t// still work when converted to a path, even though\n\t\t\t\t\t// as an ID it is less than ideal. In larger point\n\t\t\t\t\t// releases, may be better to just kick out an error.\n\t\t\t\t\tif (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else if (i > 0) {\n\t\t\t\t\t\tname.splice(i - 1, 2);\n\t\t\t\t\t\ti -= 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t//end trimDots\n\n\t\t\tname = name.join('/');\n\t\t}\n\n\t\t//Apply map config if available.\n\t\tif ((baseParts || starMap) && map) {\n\t\t\tnameParts = name.split('/');\n\n\t\t\tfor (i = nameParts.length; i > 0; i -= 1) {\n\t\t\t\tnameSegment = nameParts.slice(0, i).join(\"/\");\n\n\t\t\t\tif (baseParts) {\n\t\t\t\t\t//Find the longest baseName segment match in the config.\n\t\t\t\t\t//So, do joins on the biggest to smallest lengths of baseParts.\n\t\t\t\t\tfor (j = baseParts.length; j > 0; j -= 1) {\n\t\t\t\t\t\tmapValue = map[baseParts.slice(0, j).join('/')];\n\n\t\t\t\t\t\t//baseName segment has config, find if it has one for\n\t\t\t\t\t\t//this name.\n\t\t\t\t\t\tif (mapValue) {\n\t\t\t\t\t\t\tmapValue = mapValue[nameSegment];\n\t\t\t\t\t\t\tif (mapValue) {\n\t\t\t\t\t\t\t\t//Match, update name to the new value.\n\t\t\t\t\t\t\t\tfoundMap = mapValue;\n\t\t\t\t\t\t\t\tfoundI = i;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (foundMap) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t//Check for a star map match, but just hold on to it,\n\t\t\t\t//if there is a shorter segment match later in a matching\n\t\t\t\t//config, then favor over this star map.\n\t\t\t\tif (!foundStarMap && starMap && starMap[nameSegment]) {\n\t\t\t\t\tfoundStarMap = starMap[nameSegment];\n\t\t\t\t\tstarI = i;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!foundMap && foundStarMap) {\n\t\t\t\tfoundMap = foundStarMap;\n\t\t\t\tfoundI = starI;\n\t\t\t}\n\n\t\t\tif (foundMap) {\n\t\t\t\tnameParts.splice(0, foundI, foundMap);\n\t\t\t\tname = nameParts.join('/');\n\t\t\t}\n\t\t}\n\n\t\treturn name;\n\t}\n\n\tfunction makeRequire(relName, forceSync) {\n\t\treturn function () {\n\t\t\t//A version of a require function that passes a moduleName\n\t\t\t//value for items that may need to\n\t\t\t//look up paths relative to the moduleName\n\t\t\tvar args = aps.call(arguments, 0);\n\n\t\t\t//If first arg is not require('string'), and there is only\n\t\t\t//one arg, it is the array form without a callback. Insert\n\t\t\t//a null so that the following concat is correct.\n\t\t\tif (typeof args[0] !== 'string' && args.length === 1) {\n\t\t\t\targs.push(null);\n\t\t\t}\n\t\t\treturn req.apply(undef, args.concat([relName, forceSync]));\n\t\t};\n\t}\n\n\tfunction makeNormalize(relName) {\n\t\treturn function (name) {\n\t\t\treturn normalize(name, relName);\n\t\t};\n\t}\n\n\tfunction makeLoad(depName) {\n\t\treturn function (value) {\n\t\t\tdefined[depName] = value;\n\t\t};\n\t}\n\n\tfunction callDep(name) {\n\t\tif (hasProp(waiting, name)) {\n\t\t\tvar args = waiting[name];\n\t\t\tdelete waiting[name];\n\t\t\tdefining[name] = true;\n\t\t\tmain.apply(undef, args);\n\t\t}\n\n\t\tif (!hasProp(defined, name) && !hasProp(defining, name)) {\n\t\t\tthrow new Error('No ' + name);\n\t\t}\n\t\treturn defined[name];\n\t}\n\n\t//Turns a plugin!resource to [plugin, resource]\n\t//with the plugin being undefined if the name\n\t//did not have a plugin prefix.\n\tfunction splitPrefix(name) {\n\t\tvar prefix,\n\t\t\tindex = name ? name.indexOf('!') : -1;\n\t\tif (index > -1) {\n\t\t\tprefix = name.substring(0, index);\n\t\t\tname = name.substring(index + 1, name.length);\n\t\t}\n\t\treturn [prefix, name];\n\t}\n\n\t//Creates a parts array for a relName where first part is plugin ID,\n\t//second part is resource ID. Assumes relName has already been normalized.\n\tfunction makeRelParts(relName) {\n\t\treturn relName ? splitPrefix(relName) : [];\n\t}\n\n\t/**\n\t * Makes a name map, normalizing the name, and using a plugin\n\t * for normalization if necessary. Grabs a ref to plugin\n\t * too, as an optimization.\n\t */\n\tmakeMap = function (name, relParts) {\n\t\tvar plugin,\n\t\t\tparts = splitPrefix(name),\n\t\t\tprefix = parts[0],\n\t\t\trelResourceName = relParts[1];\n\n\t\tname = parts[1];\n\n\t\tif (prefix) {\n\t\t\tprefix = normalize(prefix, relResourceName);\n\t\t\tplugin = callDep(prefix);\n\t\t}\n\n\t\t//Normalize according\n\t\tif (prefix) {\n\t\t\tif (plugin && plugin.normalize) {\n\t\t\t\tname = plugin.normalize(name, makeNormalize(relResourceName));\n\t\t\t} else {\n\t\t\t\tname = normalize(name, relResourceName);\n\t\t\t}\n\t\t} else {\n\t\t\tname = normalize(name, relResourceName);\n\t\t\tparts = splitPrefix(name);\n\t\t\tprefix = parts[0];\n\t\t\tname = parts[1];\n\t\t\tif (prefix) {\n\t\t\t\tplugin = callDep(prefix);\n\t\t\t}\n\t\t}\n\n\t\t//Using ridiculous property names for space reasons\n\t\treturn {\n\t\t\tf: prefix ? prefix + '!' + name : name, //fullName\n\t\t\tn: name,\n\t\t\tpr: prefix,\n\t\t\tp: plugin\n\t\t};\n\t};\n\n\tfunction makeConfig(name) {\n\t\treturn function () {\n\t\t\treturn (config && config.config && config.config[name]) || {};\n\t\t};\n\t}\n\n\thandlers = {\n\t\trequire: function (name) {\n\t\t\treturn makeRequire(name);\n\t\t},\n\t\texports: function (name) {\n\t\t\tvar e = defined[name];\n\t\t\tif (typeof e !== 'undefined') {\n\t\t\t\treturn e;\n\t\t\t} else {\n\t\t\t\treturn (defined[name] = {});\n\t\t\t}\n\t\t},\n\t\tmodule: function (name) {\n\t\t\treturn {\n\t\t\t\tid: name,\n\t\t\t\turi: '',\n\t\t\t\texports: defined[name],\n\t\t\t\tconfig: makeConfig(name)\n\t\t\t};\n\t\t}\n\t};\n\n\tmain = function (name, deps, callback, relName) {\n\t\tvar cjsModule, depName, ret, map, i, relParts,\n\t\t\targs = [],\n\t\t\tcallbackType = typeof callback,\n\t\t\tusingExports;\n\n\t\t//Use name if no relName\n\t\trelName = relName || name;\n\t\trelParts = makeRelParts(relName);\n\n\t\t//Call the callback to define the module, if necessary.\n\t\tif (callbackType === 'undefined' || callbackType === 'function') {\n\t\t\t//Pull out the defined dependencies and pass the ordered\n\t\t\t//values to the callback.\n\t\t\t//Default to [require, exports, module] if no deps\n\t\t\tdeps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\n\t\t\tfor (i = 0; i < deps.length; i += 1) {\n\t\t\t\tmap = makeMap(deps[i], relParts);\n\t\t\t\tdepName = map.f;\n\n\t\t\t\t//Fast path CommonJS standard dependencies.\n\t\t\t\tif (depName === \"require\") {\n\t\t\t\t\targs[i] = handlers.require(name);\n\t\t\t\t} else if (depName === \"exports\") {\n\t\t\t\t\t//CommonJS module spec 1.1\n\t\t\t\t\targs[i] = handlers.exports(name);\n\t\t\t\t\tusingExports = true;\n\t\t\t\t} else if (depName === \"module\") {\n\t\t\t\t\t//CommonJS module spec 1.1\n\t\t\t\t\tcjsModule = args[i] = handlers.module(name);\n\t\t\t\t} else if (hasProp(defined, depName) ||\n\t\t\t\t\t\t hasProp(waiting, depName) ||\n\t\t\t\t\t\t hasProp(defining, depName)) {\n\t\t\t\t\targs[i] = callDep(depName);\n\t\t\t\t} else if (map.p) {\n\t\t\t\t\tmap.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\n\t\t\t\t\targs[i] = defined[depName];\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(name + ' missing ' + depName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tret = callback ? callback.apply(defined[name], args) : undefined;\n\n\t\t\tif (name) {\n\t\t\t\t//If setting exports via \"module\" is in play,\n\t\t\t\t//favor that over return value and exports. After that,\n\t\t\t\t//favor a non-undefined return value over exports use.\n\t\t\t\tif (cjsModule && cjsModule.exports !== undef &&\n\t\t\t\t\t\tcjsModule.exports !== defined[name]) {\n\t\t\t\t\tdefined[name] = cjsModule.exports;\n\t\t\t\t} else if (ret !== undef || !usingExports) {\n\t\t\t\t\t//Use the return value from the function.\n\t\t\t\t\tdefined[name] = ret;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (name) {\n\t\t\t//May just be an object definition for the module. Only\n\t\t\t//worry about defining if have a module name.\n\t\t\tdefined[name] = callback;\n\t\t}\n\t};\n\n\trequirejs = require = req = function (deps, callback, relName, forceSync, alt) {\n\t\tif (typeof deps === \"string\") {\n\t\t\tif (handlers[deps]) {\n\t\t\t\t//callback in this case is really relName\n\t\t\t\treturn handlers[deps](callback);\n\t\t\t}\n\t\t\t//Just return the module wanted. In this scenario, the\n\t\t\t//deps arg is the module name, and second arg (if passed)\n\t\t\t//is just the relName.\n\t\t\t//Normalize module name, if it contains . or ..\n\t\t\treturn callDep(makeMap(deps, makeRelParts(callback)).f);\n\t\t} else if (!deps.splice) {\n\t\t\t//deps is a config object, not an array.\n\t\t\tconfig = deps;\n\t\t\tif (config.deps) {\n\t\t\t\treq(config.deps, config.callback);\n\t\t\t}\n\t\t\tif (!callback) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (callback.splice) {\n\t\t\t\t//callback is an array, which means it is a dependency list.\n\t\t\t\t//Adjust args if there are dependencies\n\t\t\t\tdeps = callback;\n\t\t\t\tcallback = relName;\n\t\t\t\trelName = null;\n\t\t\t} else {\n\t\t\t\tdeps = undef;\n\t\t\t}\n\t\t}\n\n\t\t//Support require(['a'])\n\t\tcallback = callback || function () {};\n\n\t\t//If relName is a function, it is an errback handler,\n\t\t//so remove it.\n\t\tif (typeof relName === 'function') {\n\t\t\trelName = forceSync;\n\t\t\tforceSync = alt;\n\t\t}\n\n\t\t//Simulate async callback;\n\t\tif (forceSync) {\n\t\t\tmain(undef, deps, callback, relName);\n\t\t} else {\n\t\t\t//Using a non-zero value because of concern for what old browsers\n\t\t\t//do, and latest browsers \"upgrade\" to 4 if lower value is used:\n\t\t\t//http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\n\t\t\t//If want a value immediately, use require('id') instead -- something\n\t\t\t//that works in almond on the global level, but not guaranteed and\n\t\t\t//unlikely to work in other AMD implementations.\n\t\t\tsetTimeout(function () {\n\t\t\t\tmain(undef, deps, callback, relName);\n\t\t\t}, 4);\n\t\t}\n\n\t\treturn req;\n\t};\n\n\t/**\n\t * Just drops the config on the floor, but returns req in case\n\t * the config return value is used.\n\t */\n\treq.config = function (cfg) {\n\t\treturn req(cfg);\n\t};\n\n\t/**\n\t * Expose module registry for debugging and tooling\n\t */\n\trequirejs._defined = defined;\n\n\tdefine = function (name, deps, callback) {\n\t\tif (typeof name !== 'string') {\n\t\t\tthrow new Error('See almond README: incorrect module build, no module name');\n\t\t}\n\n\t\t//This module may not have dependencies\n\t\tif (!deps.splice) {\n\t\t\t//deps is not an array, so probably means\n\t\t\t//an object literal or factory function for\n\t\t\t//the value. Adjust args.\n\t\t\tcallback = deps;\n\t\t\tdeps = [];\n\t\t}\n\n\t\tif (!hasProp(defined, name) && !hasProp(waiting, name)) {\n\t\t\twaiting[name] = [name, deps, callback];\n\t\t}\n\t};\n\n\tdefine.amd = {\n\t\tjQuery: true\n\t};\n}());\n\ndefine(\"vendor/almond\", function(){});\n\n","/**\n * This is a slightly modified and forward compatible version of the @wordpress/hooks package\n * as included in the Gutenberg feature plugin version 3.8.0\n */\nwindow.llms=window.llms||{};\n// use the core hooks if available\nif ( 'undefined' !== typeof window.wp && 'undefined' !== typeof window.wp.hooks ) {\n\twindow.llms.hooks = window.wp.hooks;\n// otherwise load our own\n} else {\n\twindow.llms.hooks=function(n){var r={};function e(t){if(r[t])return r[t].exports;var o=r[t]={i:t,l:!1,exports:{}};return n[t].call(o.exports,o,o.exports,e),o.l=!0,o.exports}return e.m=n,e.c=r,e.d=function(n,r,t){e.o(n,r)||Object.defineProperty(n,r,{configurable:!1,enumerable:!0,get:t})},e.r=function(n){Object.defineProperty(n,\"__esModule\",{value:!0})},e.n=function(n){var r=n&&n.__esModule?function(){return n.default}:function(){return n};return e.d(r,\"a\",r),r},e.o=function(n,r){return Object.prototype.hasOwnProperty.call(n,r)},e.p=\"\",e(e.s=209)}({209:function(n,r,e){\"use strict\";e.r(r);var t=function(n){return\"string\"!=typeof n||\"\"===n?(console.error(\"The namespace must be a non-empty string.\"),!1):!!/^[a-zA-Z][a-zA-Z0-9_.\\-\\/]*$/.test(n)||(console.error(\"The namespace can only contain numbers, letters, dashes, periods, underscores and slashes.\"),!1)};var o=function(n){return\"string\"!=typeof n||\"\"===n?(console.error(\"The hook name must be a non-empty string.\"),!1):/^__/.test(n)?(console.error(\"The hook name cannot begin with `__`.\"),!1):!!/^[a-zA-Z][a-zA-Z0-9_.-]*$/.test(n)||(console.error(\"The hook name can only contain numbers, letters, dashes, periods and underscores.\"),!1)};var i=function(n){return function(r,e,i){var u=arguments.length>3&&void 0!==arguments[3]?arguments[3]:10;if(o(r)&&t(e))if(\"function\"==typeof i)if(\"number\"==typeof u){var c={callback:i,priority:u,namespace:e};if(n[r]){for(var a=n[r].handlers,l=0;l<a.length&&!(a[l].priority>u);)l++;a.splice(l,0,c),(n.__current||[]).forEach(function(n){n.name===r&&n.currentIndex>=l&&n.currentIndex++})}else n[r]={handlers:[c],runs:0};\"hookAdded\"!==r&&b(\"hookAdded\",r,e,i,u)}else console.error(\"If specified, the hook priority must be a number.\");else console.error(\"The hook callback must be a function.\")}};var u=function(n,r){return function(e,i){if(o(e)&&(r||t(i))){if(!n[e])return 0;var u=0;if(r)u=n[e].handlers.length,n[e]={runs:n[e].runs,handlers:[]};else for(var c=n[e].handlers,a=function(r){c[r].namespace===i&&(c.splice(r,1),u++,(n.__current||[]).forEach(function(n){n.name===e&&n.currentIndex>=r&&n.currentIndex--}))},l=c.length-1;l>=0;l--)a(l);return\"hookRemoved\"!==e&&b(\"hookRemoved\",e,i),u}}};var c=function(n){return function(r){return r in n}};var a=function(n,r){return function(e){n[e]||(n[e]={handlers:[],runs:0}),n[e].runs++;for(var t=n[e].handlers,o=arguments.length,i=new Array(o>1?o-1:0),u=1;u<o;u++)i[u-1]=arguments[u];if(!t||!t.length)return r?i[0]:void 0;var c={name:e,currentIndex:0};for(n.__current.push(c),n[e]||(n[e]={runs:0,handlers:[]});c.currentIndex<t.length;){var a=t[c.currentIndex].callback.apply(null,i);r&&(i[0]=a),c.currentIndex++}return n.__current.pop(),r?i[0]:void 0}};var l=function(n){return function(){return n.__current&&n.__current.length?n.__current[n.__current.length-1].name:null}};var s=function(n){return function(r){return void 0===r?void 0!==n.__current[0]:!!n.__current[0]&&r===n.__current[0].name}};var d=function(n){return function(r){if(o(r))return n[r]&&n[r].runs?n[r].runs:0}};var f=function(){var n=Object.create(null),r=Object.create(null);return n.__current=[],r.__current=[],{addAction:i(n),addFilter:i(r),removeAction:u(n),removeFilter:u(r),hasAction:c(n),hasFilter:c(r),removeAllActions:u(n,!0),removeAllFilters:u(r,!0),doAction:a(n),applyFilters:a(r,!0),currentAction:l(n),currentFilter:l(r),doingAction:s(n),doingFilter:s(r),didAction:d(n),didFilter:d(r),actions:n,filters:r}};e.d(r,\"addAction\",function(){return p}),e.d(r,\"addFilter\",function(){return v}),e.d(r,\"removeAction\",function(){return m}),e.d(r,\"removeFilter\",function(){return A}),e.d(r,\"hasAction\",function(){return _}),e.d(r,\"hasFilter\",function(){return F}),e.d(r,\"removeAllActions\",function(){return g}),e.d(r,\"removeAllFilters\",function(){return y}),e.d(r,\"doAction\",function(){return b}),e.d(r,\"applyFilters\",function(){return k}),e.d(r,\"currentAction\",function(){return x}),e.d(r,\"currentFilter\",function(){return I}),e.d(r,\"doingAction\",function(){return w}),e.d(r,\"doingFilter\",function(){return O}),e.d(r,\"didAction\",function(){return T}),e.d(r,\"didFilter\",function(){return j}),e.d(r,\"actions\",function(){return z}),e.d(r,\"filters\",function(){return Z}),e.d(r,\"createHooks\",function(){return f});var h=f(),p=h.addAction,v=h.addFilter,m=h.removeAction,A=h.removeFilter,_=h.hasAction,F=h.hasFilter,g=h.removeAllActions,y=h.removeAllFilters,b=h.doAction,k=h.applyFilters,x=h.currentAction,I=h.currentFilter,w=h.doingAction,O=h.doingFilter,T=h.didAction,j=h.didFilter,z=h.actions,Z=h.filters}});\n}\n;\ndefine(\"vendor/wp-hooks\", function(){});\n\n","/**\n * Returns the WordPress-loaded version of Underscore for use with things that need it and use Require.\n *\n * @return obj\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'underscore',[],function() {\n\treturn _;\n} );\n\n","/**\n * Returns the WordPress-loaded version of Backbone for use with things that need it and use Require.\n *\n * @return obj\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'backbone',[],function() {\n\treturn Backbone;\n} );\n\n","/**\n * Returns the WordPress-loaded version of Underscore for use with things that need it and use Require.\n *\n * @package LifterLMS/Scripts\n *\n * @since 3.16.0\n * @version 3.16.0\n */\n\ndefine( 'jquery',[],function() {\n\treturn jQuery;\n} );\n\n","/*!\n* Backbone.CollectionView, v1.3.4\n* Copyright (c)2013 Rotunda Software, LLC.\n* Distributed under MIT license\n* http://github.com/rotundasoftware/backbone-collection-view\n*/\n\n( function( root, factory ) {\n\t// UMD wrapper\n\tif ( typeof define === 'function' && define.amd ) {\n\t\t// AMD\n\t\tdefine( 'vendor/backbone.collectionView',[ 'underscore', 'backbone', 'jquery' ], factory );\n\t} else if ( typeof exports !== 'undefined' ) {\n\t\t// Node/CommonJS\n\t\tmodule.exports = factory( require('underscore' ), require( 'backbone' ), require( 'backbone' ).$ );\n\t} else {\n\t\t// Browser globals\n\t\tfactory( root._, root.Backbone, ( root.jQuery || root.Zepto || root.$ ) );\n\t}\n}( this, function( _, Backbone, $ ) {\n\tvar mDefaultModelViewConstructor = Backbone.View;\n\n\tvar kDefaultReferenceBy = \"model\";\n\n\tvar kOptionsRequiringRerendering = [ \"collection\", \"modelView\", \"modelViewOptions\", \"itemTemplate\", \"itemTemplateFunction\", \"detachedRendering\" ];\n\n\tvar kStylesForEmptyListCaption = {\n\t\t\"background\" : \"transparent\",\n\t\t\"border\" : \"none\",\n\t\t\"box-shadow\" : \"none\"\n\t};\n\n\tBackbone.CollectionView = Backbone.View.extend( {\n\n\t\ttagName : \"ul\",\n\n\t\tevents : {\n\t\t\t\"mousedown > li, tbody > tr > td\" : \"_listItem_onMousedown\",\n\t\t\t\"dblclick > li, tbody > tr > td\" : \"_listItem_onDoubleClick\",\n\t\t\t\"click\" : \"_listBackground_onClick\",\n\t\t\t\"click ul.collection-view, table.collection-view\" : \"_listBackground_onClick\",\n\t\t\t\"keydown\" : \"_onKeydown\"\n\t\t},\n\n\t\t// only used if Backbone.Courier is available\n\t\tspawnMessages : {\n\t\t\t\"focus\" : \"focus\"\n\t\t},\n\n\t\t//only used if Backbone.Courier is available\n\t\tpassMessages : { \"*\" : \".\" },\n\n\t\t// viewOption definitions with default values.\n\t\tinitializationOptions : [\n\t\t\t{ \"collection\" : null },\n\t\t\t{ \"modelView\" : null },\n\t\t\t{ \"modelViewOptions\" : {} },\n\t\t\t{ \"itemTemplate\" : null },\n\t\t\t{ \"itemTemplateFunction\" : null },\n\t\t\t{ \"selectable\" : true },\n\t\t\t{ \"clickToSelect\" : true },\n\t\t\t{ \"selectableModelsFilter\" : null },\n\t\t\t{ \"visibleModelsFilter\" : null },\n\t\t\t{ \"sortableModelsFilter\" : null },\n\t\t\t{ \"selectMultiple\" : false },\n\t\t\t{ \"clickToToggle\" : false },\n\t\t\t{ \"processKeyEvents\" : true },\n\t\t\t{ \"sortable\" : false },\n\t\t\t{ \"sortableOptions\" : null },\n\t\t\t{ \"reuseModelViews\" : true },\n\t\t\t{ \"detachedRendering\" : false },\n\t\t\t{ \"emptyListCaption\" : null }\n\t\t],\n\n\t\tinitialize : function( options ) {\n\t\t\tBackbone.ViewOptions.add( this, \"initializationOptions\" ); // setup the ViewOptions functionality.\n\t\t\tthis.setOptions( options ); // and make use of any provided options\n\n\t\t\tif( ! this.collection ) this.collection = new Backbone.Collection();\n\n\t\t\tthis._hasBeenRendered = false;\n\n\t\t\tif( this._isBackboneCourierAvailable() ) {\n\t\t\t\tBackbone.Courier.add( this );\n\t\t\t}\n\n\t\t\tthis.$el.data( \"view\", this ); // needed for connected sortable lists\n\t\t\tthis.$el.addClass( \"collection-view collection-list\" ); // collection-list is in there for legacy purposes\n\t\t\tif( this.selectable ) this.$el.addClass( \"selectable\" );\n\n\t\t\tif( this.selectable && this.processKeyEvents )\n\t\t\t\tthis.$el.attr( \"tabindex\", 0 ); // so we get keyboard events\n\n\t\t\tthis.selectedItems = [];\n\n\t\t\tthis._updateItemTemplate();\n\n\t\t\tif( this.collection )\n\t\t\t\tthis._registerCollectionEvents();\n\n\t\t\tthis.viewManager = new ChildViewContainer();\n\t\t},\n\n\t\t_onOptionsChanged : function( changedOptions, originalOptions ) {\n\t\t\tvar _this = this;\n\t\t\tvar rerender = false;\n\n\t\t\t_.each( _.keys( changedOptions ), function( changedOptionKey ) {\n\t\t\t\tvar newVal = changedOptions[ changedOptionKey ];\n\t\t\t\tvar oldVal = originalOptions[ changedOptionKey ];\n\t\t\t\tswitch( changedOptionKey ) {\n\t\t\t\t\tcase \"collection\" :\n\t\t\t\t\t\tif ( newVal !== oldVal ) {\n\t\t\t\t\t\t\t_this.stopListening( oldVal );\n\t\t\t\t\t\t\t_this._registerCollectionEvents();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"selectMultiple\" :\n\t\t\t\t\t\tif( ! newVal && _this.selectedItems.length > 1 )\n\t\t\t\t\t\t\t_this.setSelectedModel( _.first( _this.selectedItems ), { by : \"cid\" } );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"selectable\" :\n\t\t\t\t\t\tif( ! newVal && _this.selectedItems.length > 0 )\n\t\t\t\t\t\t\t_this.setSelectedModels( [] );\n\n\t\t\t\t\t\tif( newVal && this.processKeyEvents ) _this.$el.attr( \"tabindex\", 0 ); // so we get keyboard events\n\t\t\t\t\t\telse _this.$el.removeAttr( \"tabindex\", 0 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"sortable\" :\n\t\t\t\t\t\tchangedOptions.sortable ? _this._setupSortable() : _this.$el.sortable( \"destroy\" );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"selectableModelsFilter\" :\n\t\t\t\t\t\t_this.reapplyFilter( 'selectableModels' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"sortableOptions\" :\n\t\t\t\t\t\t_this.$el.sortable( \"destroy\" );\n\t\t\t\t\t\t_this._setupSortable();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"sortableModelsFilter\" :\n\t\t\t\t\t\t_this.reapplyFilter( 'sortableModels' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"visibleModelsFilter\" :\n\t\t\t\t\t\t_this.reapplyFilter( 'visibleModels' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"itemTemplate\" :\n\t\t\t\t\t\t_this._updateItemTemplate();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"processKeyEvents\" :\n\t\t\t\t\t\tif( newVal && this.selectable ) _this.$el.attr( \"tabindex\", 0 ); // so we get keyboard events\n\t\t\t\t\t\telse _this.$el.removeAttr( \"tabindex\", 0 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"modelView\" :\n\t\t\t\t\t\t//need to remove all old view instances\n\t\t\t\t\t\t_this.viewManager.each( function( view ) {\n\t\t\t\t\t\t\t_this.viewManager.remove( view );\n\t\t\t\t\t\t\t// destroy the View itself\n\t\t\t\t\t\t\tview.remove();\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif( _.contains( kOptionsRequiringRerendering, changedOptionKey ) ) rerender = true;\n\t\t\t} );\n\n\t\t\tif( this._hasBeenRendered && rerender ) {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t},\n\n\t\tsetOption : function( optionName, optionValue ) { // now is merely a wrapper around backbone.viewOptions' setOptions()\n\t\t\tvar optionHash = {};\n\t\t\toptionHash[ optionName ] = optionValue;\n\t\t\tthis.setOptions( optionHash );\n\t\t},\n\n\t\tgetSelectedModel : function( options ) {\n\t\t\treturn this.selectedItems.length ? _.first( this.getSelectedModels( options ) ) : null;\n\t\t},\n\n\t\tgetSelectedModels : function ( options ) {\n\t\t\tvar _this = this;\n\n\t\t\toptions = _.extend( {}, {\n\t\t\t\tby : kDefaultReferenceBy\n\t\t\t}, options );\n\n\t\t\tvar referenceBy = options.by;\n\t\t\tvar items = [];\n\n\t\t\tswitch( referenceBy ) {\n\t\t\t\tcase \"id\" :\n\t\t\t\t\t_.each( this.selectedItems, function ( item ) {\n\t\t\t\t\t\titems.push( _this.collection.get( item ).id );\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"cid\" :\n\t\t\t\t\titems = items.concat( this.selectedItems );\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"offset\" :\n\t\t\t\t\tvar curLineNumber = 0;\n\n\t\t\t\t\tvar itemElements = this._getVisibleItemEls();\n\n\t\t\t\t\titemElements.each( function() {\n\t\t\t\t\t\tvar thisItemEl = $( this );\n\t\t\t\t\t\tif( thisItemEl.is( \".selected\" ) )\n\t\t\t\t\t\t\titems.push( curLineNumber );\n\t\t\t\t\t\tcurLineNumber++;\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"model\" :\n\t\t\t\t\t_.each( this.selectedItems, function ( item ) {\n\t\t\t\t\t\titems.push( _this.collection.get( item ) );\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"view\" :\n\t\t\t\t\t_.each( this.selectedItems, function ( item ) {\n\t\t\t\t\t\titems.push( _this.viewManager.findByModel( _this.collection.get( item ) ) );\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault :\n\t\t\t\t\tthrow new Error( \"Invalid referenceBy option: \" + referenceBy );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn items;\n\n\t\t},\n\n\t\tsetSelectedModels : function( newSelectedItems, options ) {\n\t\t\tif( ! _.isArray( newSelectedItems ) ) throw \"Invalid parameter value\";\n\t\t\tif( ! this.selectable && newSelectedItems.length > 0 ) return; // used to throw error, but there are some circumstances in which a list can be selectable at times and not at others, don't want to have to worry about catching errors\n\n\t\t\toptions = _.extend( {}, {\n\t\t\t\tsilent : false,\n\t\t\t\tby : kDefaultReferenceBy\n\t\t\t}, options );\n\n\t\t\tvar referenceBy = options.by;\n\t\t\tvar newSelectedCids = [];\n\n\t\t\tswitch( referenceBy ) {\n\t\t\t\tcase \"cid\" :\n\t\t\t\t\tnewSelectedCids = newSelectedItems;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"id\" :\n\t\t\t\t\tthis.collection.each( function( thisModel ) {\n\t\t\t\t\t\tif( _.contains( newSelectedItems, thisModel.id ) ) newSelectedCids.push( thisModel.cid );\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"model\" :\n\t\t\t\t\tnewSelectedCids = _.pluck( newSelectedItems, \"cid\" );\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"view\" :\n\t\t\t\t\t_.each( newSelectedItems, function( item ) {\n\t\t\t\t\t\tnewSelectedCids.push( item.model.cid );\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"offset\" :\n\t\t\t\t\tvar curLineNumber = 0;\n\t\t\t\t\tvar selectedItems = [];\n\n\t\t\t\t\tvar itemElements = this._getVisibleItemEls();\n\t\t\t\t\titemElements.each( function() {\n\t\t\t\t\t\tvar thisItemEl = $( this );\n\t\t\t\t\t\tif( _.contains( newSelectedItems, curLineNumber ) )\n\t\t\t\t\t\t\tnewSelectedCids.push( thisItemEl.attr( \"data-model-cid\" ) );\n\t\t\t\t\t\tcurLineNumber++;\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault :\n\t\t\t\t\tthrow new Error( \"Invalid referenceBy option: \" + referenceBy );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tvar oldSelectedModels = this.getSelectedModels();\n\t\t\tvar oldSelectedCids = _.clone( this.selectedItems );\n\n\t\t\tthis.selectedItems = this._convertStringsToInts( newSelectedCids );\n\t\t\tthis._validateSelection();\n\n\t\t\tvar newSelectedModels = this.getSelectedModels();\n\n\t\t\tif( ! this._containSameElements( oldSelectedCids, this.selectedItems ) )\n\t\t\t{\n\t\t\t\tthis._addSelectedClassToSelectedItems( oldSelectedCids );\n\n\t\t\t\tif( ! options.silent )\n\t\t\t\t{\n\t\t\t\t\tif( this._isBackboneCourierAvailable() ) {\n\t\t\t\t\t\tthis.spawn( \"selectionChanged\", {\n\t\t\t\t\t\t\tselectedModels : newSelectedModels,\n\t\t\t\t\t\t\toldSelectedModels : oldSelectedModels\n\t\t\t\t\t\t} );\n\t\t\t\t\t} else this.trigger( \"selectionChanged\", newSelectedModels, oldSelectedModels );\n\t\t\t\t}\n\n\t\t\t\tthis.updateDependentControls();\n\t\t\t}\n\t\t},\n\n\t\tsetSelectedModel : function( newSelectedItem, options ) {\n\t\t\tif( ! newSelectedItem && newSelectedItem !== 0 )\n\t\t\t\tthis.setSelectedModels( [], options );\n\t\t\telse\n\t\t\t\tthis.setSelectedModels( [ newSelectedItem ], options );\n\t\t},\n\n\t\tgetView : function( reference, options ) {\n\t\t\toptions = _.extend( {}, {\n\t\t\t\tby : kDefaultReferenceBy\n\t\t\t}, options );\n\n\t\t\tswitch( options.by ) {\n\t\t\t\tcase \"id\" :\n\t\t\t\tcase \"cid\" :\n\t\t\t\t\tvar model = this.collection.get( reference ) || null;\n\t\t\t\t\treturn model && this.viewManager.findByModel( model );\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"offset\" :\n\t\t\t\t\tvar itemElements = this._getVisibleItemEls();\n\t\t\t\t\treturn $( itemElements.get( reference ) );\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"model\" :\n\t\t\t\t\treturn this.viewManager.findByModel( reference );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault :\n\t\t\t\t\tthrow new Error( \"Invalid referenceBy option: \" + referenceBy );\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\n\t\trender : function() {\n\t\t\tvar _this = this;\n\n\t\t\tthis._hasBeenRendered = true;\n\n\t\t\tif( this.selectable ) this._saveSelection();\n\n\t\t\tvar modelViewContainerEl;\n\n\t\t\t// If collection view element is a table and it has a tbody\n\t\t\t// within it, render the model views inside of the tbody\n\t\t\tmodelViewContainerEl = this._getContainerEl();\n\n\t\t\tvar oldViewManager = this.viewManager;\n\t\t\tthis.viewManager = new ChildViewContainer();\n\n\t\t\t// detach each of our subviews that we have already created to represent models\n\t\t\t// in the collection. We are going to re-use the ones that represent models that\n\t\t\t// are still here, instead of creating new ones, so that we don't loose state\n\t\t\t// information in the views.\n\t\t\toldViewManager.each( function( thisModelView ) {\n\t\t\t\t// to boost performance, only detach those views that will be sticking around.\n\t\t\t\t// we won't need the other ones later, so no need to detach them individually.\n\t\t\t\tif( this.reuseModelViews && this.collection.get( thisModelView.model.cid ) ) {\n\t\t\t\t\tthisModelView.$el.detach();\n\t\t\t\t} else thisModelView.remove();\n\t\t\t}, this );\n\n\t\t\tmodelViewContainerEl.empty();\n\t\t\tvar fragmentContainer;\n\n\t\t\tif( this.detachedRendering )\n\t\t\t\tfragmentContainer = document.createDocumentFragment();\n\n\t\t\tthis.collection.each( function( thisModel ) {\n\t\t\t\tvar thisModelView = oldViewManager.findByModelCid( thisModel.cid );\n\t\t\t\tif( ! this.reuseModelViews || _.isUndefined( thisModelView ) ) {\n\t\t\t\t\t// if the model view has not already been created on a\n\t\t\t\t\t// previous render then create and initialize it now.\n\t\t\t\t\tthisModelView = this._createNewModelView( thisModel, this._getModelViewOptions( thisModel ) );\n\t\t\t\t}\n\n\t\t\t\tthis._insertAndRenderModelView( thisModelView, fragmentContainer || modelViewContainerEl );\n\t\t\t}, this );\n\n\t\t\tif( this.detachedRendering )\n\t\t\t\tmodelViewContainerEl.append( fragmentContainer );\n\n\t\t\tif( this.sortable ) this._setupSortable();\n\n\t\t\tthis._showEmptyListCaptionIfAppropriate();\n\n\t\t\tif( this._isBackboneCourierAvailable() )\n\t\t\t\tthis.spawn( \"render\" );\n\t\t\telse this.trigger( \"render\" );\n\n\t\t\tif( this.selectable ) {\n\t\t\t\tthis._restoreSelection();\n\t\t\t\tthis.updateDependentControls();\n\t\t\t}\n\n\t\t\tthis.forceRerenderOnNextSortEvent = false;\n\t\t},\n\n\t\t_showEmptyListCaptionIfAppropriate : function ( ) {\n\t\t\tthis._removeEmptyListCaption();\n\n\t\t\tif( this.emptyListCaption ) {\n\t\t\t\tvar visibleEls = this._getVisibleItemEls();\n\n\t\t\t\tif( visibleEls.length === 0 ) {\n\t\t\t\t\tvar emptyListString;\n\n\t\t\t\t\tif( _.isFunction( this.emptyListCaption ) )\n\t\t\t\t\t\temptyListString = this.emptyListCaption();\n\t\t\t\t\telse\n\t\t\t\t\t\temptyListString = this.emptyListCaption;\n\n\t\t\t\t\tvar $emptyListCaptionEl;\n\t\t\t\t\tvar $varEl = $( \"<var class='empty-list-caption'>\" + emptyListString + \"</var>\" );\n\n\t\t\t\t\t// need to wrap the empty caption to make it fit the rendered list structure (either with an li or a tr td)\n\t\t\t\t\tif( this._isRenderedAsList() )\n\t\t\t\t\t\t$emptyListCaptionEl = $varEl.wrapAll( \"<li class='not-sortable'></li>\" ).parent().css( kStylesForEmptyListCaption );\n\t\t\t\t\telse\n\t\t\t\t\t\t$emptyListCaptionEl = $varEl.wrapAll( \"<tr class='not-sortable'><td colspan='1000'></td></tr>\" ).parent().parent().css( kStylesForEmptyListCaption );\n\n\t\t\t\t\tthis._getContainerEl().append( $emptyListCaptionEl );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_removeEmptyListCaption : function( ) {\n\t\t\tif( this._isRenderedAsList() )\n\t\t\t\tthis._getContainerEl().find( \"> li > var.empty-list-caption\" ).parent().remove();\n\t\t\telse\n\t\t\t\tthis._getContainerEl().find( \"> tr > td > var.empty-list-caption\" ).parent().parent().remove();\n\t\t},\n\n\t\t// Render a single model view in container object \"parentElOrDocumentFragment\", which is either\n\t\t// a documentFragment or a jquery object. optional arg atIndex is not support for document fragments.\n\t\t_insertAndRenderModelView : function( modelView, parentElOrDocumentFragment, atIndex ) {\n\t\t\tvar thisModelViewWrapped = this._wrapModelView( modelView );\n\n\t\t\tif( parentElOrDocumentFragment.nodeType === 11 ) // if we are inserting into a document fragment, we need to use the DOM appendChild method\n\t\t\t\tparentElOrDocumentFragment.appendChild( thisModelViewWrapped.get( 0 ) );\n\t\t\telse {\n\t\t\t\tvar numberOfModelViewsCurrentlyInDOM = parentElOrDocumentFragment.children().length;\n\t\t\t\tif( ! _.isUndefined( atIndex ) && atIndex >= 0 && atIndex < numberOfModelViewsCurrentlyInDOM )\n\t\t\t\t\t// note this.collection.length might be greater than parentElOrDocumentFragment.children().length here\n\t\t\t\t\tparentElOrDocumentFragment.children().eq( atIndex ).before( thisModelViewWrapped );\n\t\t\t\telse {\n\t\t\t\t\t// if we are attempting to insert a modelView in an position that is beyond what is currently in the\n\t\t\t\t\t// DOM, then make a note that we need to re-render the collection view on the next sort event. If we dont\n\t\t\t\t\t// force this re-render, we can end up with modelViews in the wrong order when the collection defines\n\t\t\t\t\t// a comparator and multiple models are added at once. See https://github.com/rotundasoftware/backbone.collectionView/issues/69\n\t\t\t\t\tif( ! _.isUndefined( atIndex ) && atIndex > numberOfModelViewsCurrentlyInDOM ) this.forceRerenderOnNextSortEvent = true;\n\n\t\t\t\t\tparentElOrDocumentFragment.append( thisModelViewWrapped );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.viewManager.add( modelView );\n\n\t\t\t// we have to render the modelView after it has been put in context, as opposed to in the\n\t\t\t// initialize function of the modelView, because some rendering might be dependent on\n\t\t\t// the modelView's context in the DOM tree. For example, if the modelView stretch()'s itself,\n\t\t\t// it must be in full context in the DOM tree or else the stretch will not behave as intended.\n\t\t\tvar renderResult = modelView.render();\n\n\t\t\t// return false from the view's render function to hide this item\n\t\t\tif( renderResult === false ) {\n\t\t\t\tthisModelViewWrapped.hide();\n\t\t\t\tthisModelViewWrapped.addClass( \"not-visible\" );\n\t\t\t}\n\n\t\t\tvar hideThisModelView = false;\n\t\t\tif( _.isFunction( this.visibleModelsFilter ) )\n\t\t\t\thideThisModelView = ! this.visibleModelsFilter( modelView.model );\n\n\t\t\tif( thisModelViewWrapped.children().length === 1 )\n\t\t\t\tthisModelViewWrapped.toggle( ! hideThisModelView );\n\t\t\telse modelView.$el.toggle( ! hideThisModelView );\n\n\t\t\tthisModelViewWrapped.toggleClass( \"not-visible\", hideThisModelView );\n\n\t\t\tif( ! hideThisModelView && this.emptyListCaption ) this._removeEmptyListCaption();\n\t\t},\n\n\t\tupdateDependentControls : function() {\n\t\t\tif( this._isBackboneCourierAvailable() ) {\n\t\t\t\tthis.spawn( \"updateDependentControls\", {\n\t\t\t\t\tselectedModels : this.getSelectedModels()\n\t\t\t\t} );\n\t\t\t} else this.trigger( \"updateDependentControls\", this.getSelectedModels() );\n\t\t},\n\n\t\t// Override `Backbone.View.remove` to also destroy all Views in `viewManager`\n\t\tremove : function() {\n\t\t\tthis.viewManager.each( function( view ) {\n\t\t\t\tview.remove();\n\t\t\t} );\n\n\t\t\tBackbone.View.prototype.remove.apply( this, arguments );\n\t\t},\n\n\t\treapplyFilter : function( whichFilter ) {\n\t\t\tvar _this = this;\n\n\t\t\tif( ! _.contains( [ \"selectableModels\", \"sortableModels\", \"visibleModels\" ], whichFilter ) ) {\n\t\t\t\tthrow new Error( \"Invalid filter identifier supplied to reapplyFilter: \" + whichFilter );\n\t\t\t}\n\n\t\t\tswitch( whichFilter ) {\n\t\t\t\tcase \"visibleModels\":\n\t\t\t\t\t_this.viewManager.each( function( thisModelView ) {\n\t\t\t\t\t\tvar notVisible = _this.visibleModelsFilter && ! _this.visibleModelsFilter.call( _this, thisModelView.model );\n\n\t\t\t\t\t\tthisModelView.$el.toggleClass( \"not-visible\", notVisible );\n\t\t\t\t\t\tif( _this._modelViewHasWrapperLI( thisModelView ) ) {\n\t\t\t\t\t\t\tthisModelView.$el.closest( \"li\" ).toggleClass( \"not-visible\", notVisible ).toggle( ! notVisible );\n\t\t\t\t\t\t} else thisModelView.$el.toggle( ! notVisible );\n\t\t\t\t\t} );\n\n\t\t\t\t\tthis._showEmptyListCaptionIfAppropriate();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"sortableModels\":\n\t\t\t\t\t_this.$el.sortable( \"destroy\" );\n\n\t\t\t\t\t_this.viewManager.each( function( thisModelView ) {\n\t\t\t\t\t\tvar notSortable = _this.sortableModelsFilter && ! _this.sortableModelsFilter.call( _this, thisModelView.model );\n\n\t\t\t\t\t\tthisModelView.$el.toggleClass( \"not-sortable\", notSortable );\n\t\t\t\t\t\tif( _this._modelViewHasWrapperLI( thisModelView ) ) {\n\t\t\t\t\t\t\tthisModelView.$el.closest( \"li\" ).toggleClass( \"not-sortable\", notSortable );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\t_this._setupSortable();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"selectableModels\":\n\t\t\t\t\t_this.viewManager.each( function( thisModelView ) {\n\t\t\t\t\t\tvar notSelectable = _this.selectableModelsFilter && ! _this.selectableModelsFilter.call( _this, thisModelView.model );\n\n\t\t\t\t\t\tthisModelView.$el.toggleClass( \"not-selectable\", notSelectable );\n\t\t\t\t\t\tif( _this._modelViewHasWrapperLI( thisModelView ) ) {\n\t\t\t\t\t\t\tthisModelView.$el.closest( \"li\" ).toggleClass( \"not-selectable\", notSelectable );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\t_this._validateSelection();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\n\t\t// A method to remove the view relating to model.\n\t\t_removeModelView : function( modelView ) {\n\t\t\tif( this.selectable ) this._saveSelection();\n\n\t\t\tthis.viewManager.remove( modelView ); // Remove the view from the viewManager\n\t\t\tif( this._modelViewHasWrapperLI( modelView ) ) modelView.$el.parent().remove(); // Remove the li wrapper from the DOM\n\t\t\tmodelView.remove(); // Remove the view from the DOM and stop listening to events\n\n\t\t\tif( this.selectable ) this._restoreSelection();\n\n\t\t\tthis._showEmptyListCaptionIfAppropriate();\n\t\t},\n\n\t\t_validateSelectionAndRender : function() {\n\t\t\tthis._validateSelection();\n\t\t\tthis.render();\n\t\t},\n\n\t\t_registerCollectionEvents : function() {\n\n\t\t\tthis.listenTo( this.collection, \"add\", function( model ) {\n\t\t\t\tvar modelView;\n\t\t\t\tif( this._hasBeenRendered ) {\n\t\t\t\t\tmodelView = this._createNewModelView( model, this._getModelViewOptions( model ) );\n\t\t\t\t\tthis._insertAndRenderModelView( modelView, this._getContainerEl(), this.collection.indexOf( model ) );\n\t\t\t\t}\n\n\t\t\t\tif( this._isBackboneCourierAvailable() )\n\t\t\t\t\tthis.spawn( \"add\", modelView );\n\t\t\t\telse this.trigger( \"add\", modelView );\n\t\t\t} );\n\n\t\t\tthis.listenTo( this.collection, \"remove\", function( model ) {\n\t\t\t\tvar modelView;\n\n\t\t\t\tif( this._hasBeenRendered ) {\n\t\t\t\t\tmodelView = this.viewManager.findByModelCid( model.cid );\n\t\t\t\t\tthis._removeModelView( modelView );\n\t\t\t\t}\n\n\t\t\t\tif( this._isBackboneCourierAvailable() )\n\t\t\t\t\tthis.spawn( \"remove\" );\n\t\t\t\telse this.trigger( \"remove\" );\n\t\t\t} );\n\n\t\t\tthis.listenTo( this.collection, \"reset\", function() {\n\t\t\t\tif( this._hasBeenRendered ) this.render();\n\t\t\t\tif( this._isBackboneCourierAvailable() )\n\t\t\t\t\tthis.spawn( \"reset\" );\n\t\t\t\telse this.trigger( \"reset\" );\n\t\t\t} );\n\n\t\t\t// we should not be listening to change events on the model as a default behavior. the models\n\t\t\t// should be responsible for re-rendering themselves if necessary, and if the collection does\n\t\t\t// also need to re-render as a result of a model change, this should be handled by overriding\n\t\t\t// this method. by default the collection view should not re-render in response to model changes\n\t\t\t// this.listenTo( this.collection, \"change\", function( model ) {\n\t\t\t// \tif( this._hasBeenRendered ) this.viewManager.findByModel( model ).render();\n\t\t\t// \tif( this._isBackboneCourierAvailable() )\n\t\t\t// \t\tthis.spawn( \"change\", { model : model } );\n\t\t\t// } );\n\n\t\t\tthis.listenTo( this.collection, \"sort\", function( collection, options ) {\n\t\t\t\tif( this._hasBeenRendered && ( options.add !== true || this.forceRerenderOnNextSortEvent ) ) this.render();\n\t\t\t\tif( this._isBackboneCourierAvailable() )\n\t\t\t\t\tthis.spawn( \"sort\" );\n\t\t\t\telse this.trigger( \"sort\" );\n\t\t\t} );\n\t\t},\n\n\t\t_getContainerEl : function() {\n\t\t\tif ( this._isRenderedAsTable() ) {\n\t\t\t\t// not all tables have a tbody, so we test\n\t\t\t\tvar tbody = this.$el.find( \"> tbody\" );\n\t\t\t\tif ( tbody.length > 0 )\n\t\t\t\t\treturn tbody;\n\t\t\t}\n\t\t\treturn this.$el;\n\t\t},\n\n\t\t_getClickedItemId : function( theEvent ) {\n\t\t\tvar clickedItemId = null;\n\n\t\t\t// important to use currentTarget as opposed to target, since we could be bubbling\n\t\t\t// an event that took place within another collectionList\n\t\t\tvar clickedItemEl = $( theEvent.currentTarget );\n\t\t\tif( clickedItemEl.closest( \".collection-view\" ).get(0) !== this.$el.get(0) ) return;\n\n\t\t\t// determine which list item was clicked. If we clicked in the blank area\n\t\t\t// underneath all the elements, we want to know that too, since in this\n\t\t\t// case we will want to deselect all elements. so check to see if the clicked\n\t\t\t// DOM element is the list itself to find that out.\n\t\t\tvar clickedItem = clickedItemEl.closest( \"[data-model-cid]\" );\n\t\t\tif( clickedItem.length > 0 )\n\t\t\t{\n\t\t\t\tclickedItemId = clickedItem.attr( \"data-model-cid\" );\n\t\t\t\tif( $.isNumeric( clickedItemId ) ) clickedItemId = parseInt( clickedItemId, 10 );\n\t\t\t}\n\n\t\t\treturn clickedItemId;\n\t\t},\n\n\t\t_updateItemTemplate : function() {\n\t\t\tvar itemTemplateHtml;\n\t\t\tif( this.itemTemplate )\n\t\t\t{\n\t\t\t\tif( $( this.itemTemplate ).length === 0 )\n\t\t\t\t\tthrow \"Could not find item template from selector: \" + this.itemTemplate;\n\n\t\t\t\titemTemplateHtml = $( this.itemTemplate ).html();\n\t\t\t}\n\t\t\telse\n\t\t\t\titemTemplateHtml = this.$( \".item-template\" ).html();\n\n\t\t\tif( itemTemplateHtml ) this.itemTemplateFunction = _.template( itemTemplateHtml );\n\n\t\t},\n\n\t\t_validateSelection : function() {\n\t\t\t// note can't use the collection's proxy to underscore because \"cid\" is not an attribute,\n\t\t\t// but an element of the model object itself.\n\t\t\tvar modelReferenceIds = _.pluck( this.collection.models, \"cid\" );\n\t\t\tthis.selectedItems = _.intersection( modelReferenceIds, this.selectedItems );\n\n\t\t\tif( _.isFunction( this.selectableModelsFilter ) )\n\t\t\t{\n\t\t\t\tthis.selectedItems = _.filter( this.selectedItems, function( thisItemId ) {\n\t\t\t\t\treturn this.selectableModelsFilter.call( this, this.collection.get( thisItemId ) );\n\t\t\t\t}, this );\n\t\t\t}\n\t\t},\n\n\t\t_saveSelection : function() {\n\t\t\t// save the current selection. use restoreSelection() to restore the selection to the state it was in the last time saveSelection() was called.\n\t\t\tif( ! this.selectable ) throw \"Attempt to save selection on non-selectable list\";\n\t\t\tthis.savedSelection = {\n\t\t\t\titems : _.clone( this.selectedItems ),\n\t\t\t\toffset : this.getSelectedModel( { by : \"offset\" } )\n\t\t\t};\n\t\t},\n\n\t\t_restoreSelection : function() {\n\t\t\tif( ! this.savedSelection ) throw \"Attempt to restore selection but no selection has been saved!\";\n\n\t\t\t// reset selectedItems to empty so that we \"redraw\" all \"selected\" classes\n\t\t\t// when we set our new selection. We do this because it is likely that our\n\t\t\t// contents have been refreshed, and we have thus lost all old \"selected\" classes.\n\t\t\tthis.setSelectedModels( [], { silent : true } );\n\n\t\t\tif( this.savedSelection.items.length > 0 )\n\t\t\t{\n\t\t\t\t// first try to restore the old selected items using their reference ids.\n\t\t\t\tthis.setSelectedModels( this.savedSelection.items, { by : \"cid\", silent : true } );\n\n\t\t\t\t// all the items with the saved reference ids have been removed from the list.\n\t\t\t\t// ok. try to restore the selection based on the offset that used to be selected.\n\t\t\t\t// this is the expected behavior after a item is deleted from a list (i.e. select\n\t\t\t\t// the line that immediately follows the deleted line).\n\t\t\t\tif( this.selectedItems.length === 0 )\n\t\t\t\t\tthis.setSelectedModel( this.savedSelection.offset, { by : \"offset\" } );\n\n\t\t\t\t// Trigger a selection changed if the previously selected items were not all found\n\t\t\t\tif (this.selectedItems.length !== this.savedSelection.items.length)\n\t\t\t\t{\n\t\t\t\t\tif( this._isBackboneCourierAvailable() ) {\n\t\t\t\t\t\tthis.spawn( \"selectionChanged\", {\n\t\t\t\t\t\t\tselectedModels : this.getSelectedModels(),\n\t\t\t\t\t\t\toldSelectedModels : []\n\t\t\t\t\t\t} );\n\t\t\t\t\t} else this.trigger( \"selectionChanged\", this.getSelectedModels(), [] );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_addSelectedClassToSelectedItems : function( oldItemsIdsWithSelectedClass ) {\n\t\t\tif( _.isUndefined( oldItemsIdsWithSelectedClass ) ) oldItemsIdsWithSelectedClass = [];\n\n\t\t\t// oldItemsIdsWithSelectedClass is used for optimization purposes only. If this info is supplied then we\n\t\t\t// only have to add / remove the \"selected\" class from those items that \"selected\" state has changed.\n\n\t\t\tvar itemsIdsFromWhichSelectedClassNeedsToBeRemoved = oldItemsIdsWithSelectedClass;\n\t\t\titemsIdsFromWhichSelectedClassNeedsToBeRemoved = _.without( itemsIdsFromWhichSelectedClassNeedsToBeRemoved, this.selectedItems );\n\n\t\t\t_.each( itemsIdsFromWhichSelectedClassNeedsToBeRemoved, function( thisItemId ) {\n\t\t\t\tthis._getContainerEl().find( \"[data-model-cid=\" + thisItemId + \"]\" ).removeClass( \"selected\" );\n\n\t\t\t\tif( this._isRenderedAsList() ) {\n\t\t\t\t\tthis._getContainerEl().find( \"li[data-model-cid=\" + thisItemId + \"] > *\" ).removeClass( \"selected\" );\n\t\t\t\t}\n\t\t\t}, this );\n\n\t\t\tvar itemsIdsFromWhichSelectedClassNeedsToBeAdded = this.selectedItems;\n\t\t\titemsIdsFromWhichSelectedClassNeedsToBeAdded = _.without( itemsIdsFromWhichSelectedClassNeedsToBeAdded, oldItemsIdsWithSelectedClass );\n\n\t\t\t_.each( itemsIdsFromWhichSelectedClassNeedsToBeAdded, function( thisItemId ) {\n\t\t\t\tthis._getContainerEl().find( \"[data-model-cid=\" + thisItemId + \"]\" ).addClass( \"selected\" );\n\n\t\t\t\tif( this._isRenderedAsList() ) {\n\t\t\t\t\tthis._getContainerEl().find( \"li[data-model-cid=\" + thisItemId + \"] > *\" ).addClass( \"selected\" );\n\t\t\t\t}\n\t\t\t}, this );\n\t\t},\n\n\t\t_reorderCollectionBasedOnHTML : function() {\n\n\t\t\tvar _this = this;\n\n\t\t\tthis._getContainerEl().children().each( function() {\n\t\t\t\tvar thisModelCid = $( this ).attr( \"data-model-cid\" );\n\n\t\t\t\tif( thisModelCid )\n\t\t\t\t{\n\t\t\t\t\t// remove the current model and then add it back (at the end of the collection).\n\t\t\t\t\t// When we are done looping through all models, they will be in the correct order.\n\t\t\t\t\tvar thisModel = _this.collection.get( thisModelCid );\n\t\t\t\t\tif( thisModel )\n\t\t\t\t\t{\n\t\t\t\t\t\t_this.collection.remove( thisModel, { silent : true } );\n\t\t\t\t\t\t_this.collection.add( thisModel, { silent : true, sort : ! _this.collection.comparator } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tif( this._isBackboneCourierAvailable() ) this.spawn( \"reorder\" );\n\t\t\telse this.collection.trigger( \"reorder\" );\n\n\t\t\tif( this.collection.comparator ) this.collection.sort();\n\n\t\t},\n\n\t\t_getModelViewConstructor : function( thisModel ) {\n\t\t\treturn this.modelView || mDefaultModelViewConstructor;\n\t\t},\n\n\t\t_getModelViewOptions : function( thisModel ) {\n\t\t\tvar modelViewOptions = this.modelViewOptions;\n\t\t\tif( _.isFunction( modelViewOptions ) ) modelViewOptions = modelViewOptions( thisModel );\n\n\t\t\treturn _.extend( { model : thisModel }, modelViewOptions );\n\t\t},\n\n\t\t_createNewModelView : function( model, modelViewOptions ) {\n\t\t\tvar modelViewConstructor = this._getModelViewConstructor( model );\n\t\t\tif( _.isUndefined( modelViewConstructor ) ) throw \"Could not find modelView constructor for model\";\n\n\t\t\tvar newModelView = new( modelViewConstructor )( modelViewOptions );\n\t\t\tnewModelView.collectionListView = newModelView.collectionView = this; // collectionListView for legacy\n\n\t\t\treturn newModelView;\n\t\t},\n\n\t\t_wrapModelView : function( modelView ) {\n\t\t\tvar _this = this;\n\n\t\t\t// we use items client ids as opposed to real ids, since we may not have a representation\n\t\t\t// of these models on the server\n\t\t\tvar modelViewWrapperEl;\n\n\t\t\tif( this._isRenderedAsTable() ) {\n\t\t\t\t// if we are rendering the collection in a table, the template $el is a tr so we just need to set the data-model-cid\n\t\t\t\tmodelViewWrapperEl = modelView.$el;\n\t\t\t\tmodelView.$el.attr( \"data-model-cid\", modelView.model.cid );\n\t\t\t}\n\t\t\telse if( this._isRenderedAsList() ) {\n\t\t\t\t// if we are rendering the collection in a list, we need wrap each item in an <li></li> (if its not already an <li>)\n\t\t\t\t// and set the data-model-cid\n\t\t\t\tif( modelView.$el.is( \"li\" ) ) {\n\t\t\t\t\tmodelViewWrapperEl = modelView.$el;\n\t\t\t\t\tmodelView.$el.attr( \"data-model-cid\", modelView.model.cid );\n\t\t\t\t} else {\n\t\t\t\t\tmodelViewWrapperEl = modelView.$el.wrapAll( \"<li data-model-cid='\" + modelView.model.cid + \"'></li>\" ).parent();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif( _.isFunction( this.sortableModelsFilter ) )\n\t\t\t\tif( ! this.sortableModelsFilter.call( _this, modelView.model ) ) {\n\t\t\t\t\tmodelViewWrapperEl.addClass( \"not-sortable\" );\n\t\t\t\t\tmodelView.$el.addClass( \"not-selectable\" );\n\t\t\t\t}\n\n\t\t\tif( _.isFunction( this.selectableModelsFilter ) )\n\t\t\t\tif( ! this.selectableModelsFilter.call( _this, modelView.model ) ) {\n\t\t\t\t\tmodelViewWrapperEl.addClass( \"not-selectable\" );\n\t\t\t\t\tmodelView.$el.addClass( \"not-selectable\" );\n\t\t\t\t}\n\n\t\t\treturn modelViewWrapperEl;\n\t\t},\n\n\t\t_convertStringsToInts : function( theArray ) {\n\t\t\treturn _.map( theArray, function( thisEl ) {\n\t\t\t\tif( ! _.isString( thisEl ) ) return thisEl;\n\t\t\t\tvar thisElAsNumber = parseInt( thisEl, 10 );\n\t\t\t\treturn( thisElAsNumber == thisEl ? thisElAsNumber : thisEl );\n\t\t\t} );\n\t\t},\n\n\t\t_containSameElements : function( arrayA, arrayB ) {\n\t\t\tif( arrayA.length != arrayB.length ) return false;\n\t\t\tvar intersectionSize = _.intersection( arrayA, arrayB ).length;\n\t\t\treturn intersectionSize == arrayA.length; // and must also equal arrayB.length, since arrayA.length == arrayB.length\n\t\t},\n\n\t\t_isRenderedAsTable : function() {\n\t\t\treturn this.$el.prop( \"tagName\" ).toLowerCase() === \"table\";\n\t\t},\n\n\t\t_isRenderedAsList : function() {\n\t\t\treturn ! this._isRenderedAsTable();\n\t\t},\n\n\t\t_modelViewHasWrapperLI : function( modelView ) {\n\t\t\treturn this._isRenderedAsList() && ! modelView.$el.is( \"li\" );\n\t\t},\n\n\t\t// Returns the wrapper HTML element for each visible modelView.\n\t\t// When rendering in a table context, the returned elements are the $el of each modelView.\n\t\t// When rendering in a list context,\n\t\t// If the $el of the modelView is an <li>, the returned elements are the $el of each modelView.\n\t\t// Otherwise, the returned elements are the <li>'s the collectionView wrapped around each modelView $el.\n\t\t_getVisibleItemEls : function() {\n\t\t\tvar itemElements = [];\n\t\t\titemElements = this._getContainerEl().find( \"> [data-model-cid]:not(.not-visible)\" );\n\n\t\t\treturn itemElements;\n\t\t},\n\n\t\t_charCodes : {\n\t\t\tupArrow : 38,\n\t\t\tdownArrow : 40\n\t\t},\n\n\t\t_isBackboneCourierAvailable : function() {\n\t\t\treturn !_.isUndefined( Backbone.Courier );\n\t\t},\n\n\t\t_setupSortable : function() {\n\t\t\tvar sortableOptions = _.extend( {\n\t\t\t\taxis : \"y\",\n\t\t\t\tdistance : 10,\n\t\t\t\tforcePlaceholderSize : true,\n\t\t\t\titems : this._isRenderedAsTable() ? \"> tbody > tr:not(.not-sortable)\" : \"> li:not(.not-sortable)\",\n\t\t\t\tstart : _.bind( this._sortStart, this ),\n\t\t\t\tchange : _.bind( this._sortChange, this ),\n\t\t\t\tstop : _.bind( this._sortStop, this ),\n\t\t\t\treceive : _.bind( this._receive, this ),\n\t\t\t\tover : _.bind( this._over, this )\n\t\t\t}, _.result( this, \"sortableOptions\" ) );\n\n\t\t\tthis.$el = this.$el.sortable( sortableOptions );\n\t\t\t//this.$el.sortable( \"enable\" ); // in case it was disabled previously\n\t\t},\n\n\t\t_sortStart : function( event, ui ) {\n\t\t\tvar modelBeingSorted = this.collection.get( ui.item.attr( \"data-model-cid\" ) );\n\t\t\tif( this._isBackboneCourierAvailable() )\n\t\t\t\tthis.spawn( \"sortStart\", { modelBeingSorted : modelBeingSorted } );\n\t\t\telse this.trigger( \"sortStart\", modelBeingSorted );\n\t\t},\n\n\t\t_sortChange : function( event, ui ) {\n\t\t\tvar modelBeingSorted = this.collection.get( ui.item.attr( \"data-model-cid\" ) );\n\n\t\t\tif( this._isBackboneCourierAvailable() )\n\t\t\t\tthis.spawn( \"sortChange\", { modelBeingSorted : modelBeingSorted } );\n\t\t\telse this.trigger( \"sortChange\", modelBeingSorted );\n\t\t},\n\n\t\t_sortStop : function( event, ui ) {\n\t\t\tvar modelBeingSorted = this.collection.get( ui.item.attr( \"data-model-cid\" ) );\n\t\t\tvar modelViewContainerEl = this._getContainerEl();\n\t\t\tvar newIndex = modelViewContainerEl.children().index( ui.item );\n\n\t\t\tif( newIndex == -1 && modelBeingSorted ) {\n\t\t\t\t// the element was removed from this list. can happen if this sortable is connected\n\t\t\t\t// to another sortable, and the item was dropped into the other sortable.\n\t\t\t\tthis.collection.remove( modelBeingSorted );\n\t\t\t}\n\n\t\t\tif( ! modelBeingSorted ) return; // something is wacky. we don't mess with this case, preferring to guarantee that we can always provide a reference to the model\n\n\t\t\tthis._reorderCollectionBasedOnHTML();\n\t\t\tthis.updateDependentControls();\n\n\t\t\tif( this._isBackboneCourierAvailable() )\n\t\t\t\tthis.spawn( \"sortStop\", { modelBeingSorted : modelBeingSorted, newIndex : newIndex } );\n\t\t\telse this.trigger( \"sortStop\", modelBeingSorted, newIndex );\n\t\t},\n\n\t\t_receive : function( event, ui ) {\n\n\t\t\tvar senderListEl = ui.sender;\n\t\t\tvar senderCollectionListView = senderListEl.data( \"view\" );\n\t\t\tif( ! senderCollectionListView || ! senderCollectionListView.collection ) return;\n\n\t\t\tvar newIndex = this._getContainerEl().children().index( ui.item );\n\t\t\tvar modelReceived = senderCollectionListView.collection.get( ui.item.attr( \"data-model-cid\" ) );\n\t\t\tsenderCollectionListView.collection.remove( modelReceived );\n\t\t\tthis.collection.add( modelReceived, { at : newIndex } );\n\t\t\tmodelReceived.collection = this.collection; // otherwise will not get properly set, since modelReceived.collection might already have a value.\n\t\t\tthis.setSelectedModel( modelReceived );\n\t\t},\n\n\t\t_over : function( event, ui ) {\n\t\t\t// when an item is being dragged into the sortable,\n\t\t\t// hide the empty list caption if it exists\n\t\t\tthis._getContainerEl().find( \"> var.empty-list-caption\" ).hide();\n\t\t},\n\n\t\t_onKeydown : function( event ) {\n\t\t\tif( ! this.processKeyEvents ) return true;\n\n\t\t\tvar trap = false;\n\n\t\t\tif( this.getSelectedModels( { by : \"offset\" } ).length == 1 )\n\t\t\t{\n\t\t\t\t// need to trap down and up arrows or else the browser\n\t\t\t\t// will end up scrolling a autoscroll div.\n\n\t\t\t\tvar currentOffset = this.getSelectedModel( { by : \"offset\" } );\n\t\t\t\tif( event.which === this._charCodes.upArrow && currentOffset !== 0 )\n\t\t\t\t{\n\t\t\t\t\tthis.setSelectedModel( currentOffset - 1, { by : \"offset\" } );\n\t\t\t\t\ttrap = true;\n\t\t\t\t}\n\t\t\t\telse if( event.which === this._charCodes.downArrow && currentOffset !== this.collection.length - 1 )\n\t\t\t\t{\n\t\t\t\t\tthis.setSelectedModel( currentOffset + 1, { by : \"offset\" } );\n\t\t\t\t\ttrap = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ! trap;\n\t\t},\n\n\t\t_listItem_onMousedown : function( theEvent ) {\n\t\t\tvar clickedItemId = this._getClickedItemId( theEvent );\n\n\t\t\tif( clickedItemId ) {\n\t\t\t\tvar clickedModel = this.collection.get( clickedItemId );\n\t\t\t\tif( this._isBackboneCourierAvailable() ) {\n\t\t\t\t\tvar data = {\n\t\t\t\t\t\tclickedModel : clickedModel,\n\t\t\t\t\t\tmetaKeyPressed : theEvent.ctrlKey || theEvent.metaKey\n\t\t\t\t\t};\n\n\t\t\t\t\t_.each( [ 'preventDefault', 'stopPropagation', 'stopImmediatePropagation' ], function( thisMethod ) {\n\t\t\t\t\t\tdata[ thisMethod ] = function() {\n\t\t\t\t\t\t\ttheEvent[ thisMethod ]();\n\t\t\t\t\t\t};\n\t\t\t\t\t} );\n\n\t\t\t\t\tthis.spawn( \"click\", data );\n\t\t\t\t}\n\t\t\t\telse this.trigger( \"click\", clickedModel );\n\t\t\t}\n\n\t\t\tif( ! this.selectable || ! this.clickToSelect ) return;\n\n\t\t\tif( clickedItemId )\n\t\t\t{\n\t\t\t\t// Exit if an unselectable item was clicked\n\t\t\t\tif( _.isFunction( this.selectableModelsFilter ) &&\n\t\t\t\t\t! this.selectableModelsFilter.call( this, this.collection.get( clickedItemId ) ) )\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// a selectable list item was clicked\n\t\t\t\tif( this.selectMultiple && theEvent.shiftKey )\n\t\t\t\t{\n\t\t\t\t\tvar firstSelectedItemIndex = -1;\n\n\t\t\t\t\tif( this.selectedItems.length > 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.collection.find( function( thisItemModel ) {\n\t\t\t\t\t\t\tfirstSelectedItemIndex++;\n\n\t\t\t\t\t\t\t// exit when we find our first selected element\n\t\t\t\t\t\t\treturn _.contains( this.selectedItems, thisItemModel.cid );\n\t\t\t\t\t\t}, this );\n\t\t\t\t\t}\n\n\t\t\t\t\tvar clickedItemIndex = -1;\n\t\t\t\t\tthis.collection.find( function( thisItemModel ) {\n\t\t\t\t\t\tclickedItemIndex++;\n\n\t\t\t\t\t\t// exit when we find the clicked element\n\t\t\t\t\t\treturn thisItemModel.cid == clickedItemId;\n\t\t\t\t\t}, this );\n\n\t\t\t\t\tvar shiftKeyRootSelectedItemIndex = firstSelectedItemIndex == -1 ? clickedItemIndex : firstSelectedItemIndex;\n\t\t\t\t\tvar minSelectedItemIndex = Math.min( clickedItemIndex, shiftKeyRootSelectedItemIndex );\n\t\t\t\t\tvar maxSelectedItemIndex = Math.max( clickedItemIndex, shiftKeyRootSelectedItemIndex );\n\n\t\t\t\t\tvar newSelectedItems = [];\n\t\t\t\t\tfor( var thisIndex = minSelectedItemIndex; thisIndex <= maxSelectedItemIndex; thisIndex ++ )\n\t\t\t\t\t\tnewSelectedItems.push( this.collection.at( thisIndex ).cid );\n\t\t\t\t\tthis.setSelectedModels( newSelectedItems, { by : \"cid\" } );\n\n\t\t\t\t\t// shift clicking will usually highlight selectable text, which we do not want.\n\t\t\t\t\t// this is a cross browser (hopefully) snippet that deselects all text selection.\n\t\t\t\t\tif( document.selection && document.selection.empty )\n\t\t\t\t\t\tdocument.selection.empty();\n\t\t\t\t\telse if(window.getSelection) {\n\t\t\t\t\t\tvar sel = window.getSelection();\n\t\t\t\t\t\tif( sel && sel.removeAllRanges )\n\t\t\t\t\t\t\tsel.removeAllRanges();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( ( this.selectMultiple || _.contains( this.selectedItems, clickedItemId ) ) && ( this.clickToToggle || theEvent.metaKey || theEvent.ctrlKey ) )\n\t\t\t\t{\n\t\t\t\t\tif( _.contains( this.selectedItems, clickedItemId ) )\n\t\t\t\t\t\tthis.setSelectedModels( _.without( this.selectedItems, clickedItemId ), { by : \"cid\" } );\n\t\t\t\t\telse this.setSelectedModels( _.union( this.selectedItems, [clickedItemId] ), { by : \"cid\" } );\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tthis.setSelectedModels( [ clickedItemId ], { by : \"cid\" } );\n\t\t\t}\n\t\t\telse\n\t\t\t\t// the blank area of the list was clicked\n\t\t\t\tthis.setSelectedModels( [] );\n\n\t\t},\n\n\t\t_listItem_onDoubleClick : function( theEvent ) {\n\n\t\t\tvar clickedItemId = this._getClickedItemId( theEvent );\n\n\t\t\tif( clickedItemId )\n\t\t\t{\n\t\t\t\tvar clickedModel = this.collection.get( clickedItemId );\n\n\t\t\t\tif( this._isBackboneCourierAvailable() )\n\t\t\t\t\tthis.spawn( \"doubleClick\", { clickedModel : clickedModel, metaKeyPressed : theEvent.ctrlKey || theEvent.metaKey } );\n\t\t\t\telse this.trigger( \"doubleClick\", clickedModel );\n\t\t\t}\n\t\t},\n\n\t\t_listBackground_onClick : function( theEvent ) {\n\t\t\tif( ! this.selectable || ! this.clickToSelect ) return;\n\t\t\tif( ! $( theEvent.target ).is( \".collection-view\" ) ) return;\n\n\t\t\tthis.setSelectedModels( [] );\n\t\t}\n\n\t}, {\n\t\tsetDefaultModelViewConstructor : function( theConstructor ) {\n\t\t\tmDefaultModelViewConstructor = theConstructor;\n\t\t}\n\t});\n\n\t/*\n\t* Backbone.ViewOptions, v0.2.4\n\t* Copyright (c)2014 Rotunda Software, LLC.\n\t* Distributed under MIT license\n\t* http://github.com/rotundasoftware/backbone.viewOptions\n\t*/\n\n\tBackbone.ViewOptions = {};\n\n\tBackbone.ViewOptions.add = function( view, optionsDeclarationsProperty ) {\n\t\tif( _.isUndefined( optionsDeclarationsProperty ) ) optionsDeclarationsProperty = \"options\";\n\n\t\t// ****************** Public methods added to view ******************\n\n\t\tview.setOptions = function( options ) {\n\t\t\tvar _this = this;\n\t\t\tvar optionsThatWereChanged = {};\n\t\t\tvar optionsThatWereChangedPreviousValues = {};\n\n\t\t\tvar optionDeclarations = _.result( this, optionsDeclarationsProperty );\n\n\t\t\tif( ! _.isUndefined( optionDeclarations ) ) {\n\t\t\t\tvar normalizedOptionDeclarations = _normalizeOptionDeclarations( optionDeclarations );\n\n\t\t\t\t_.each( normalizedOptionDeclarations, function( thisOptionProperties, thisOptionName ) {\n\t\t\t\t\tvar thisOptionRequired = thisOptionProperties.required;\n\t\t\t\t\tvar thisOptionDefaultValue = thisOptionProperties.defaultValue;\n\n\t\t\t\t\tif( thisOptionRequired ) {\n\t\t\t\t\t\t// note we do not throw an error if a required option is not supplied, but it is\n\t\t\t\t\t\t// found on the object itself (due to a prior call of view.setOptions, most likely)\n\n\t\t\t\t\t\tif( ( ! options || ! _.contains( _.keys( options ), thisOptionName ) ) && _.isUndefined( _this[ thisOptionName ] ) )\n\t\t\t\t\t\t\tthrow new Error( \"Required option \\\"\" + thisOptionName + \"\\\" was not supplied.\" );\n\n\t\t\t\t\t\tif( options && _.contains( _.keys( options ), thisOptionName ) && _.isUndefined( options[ thisOptionName ] ) )\n\t\t\t\t\t\t\tthrow new Error( \"Required option \\\"\" + thisOptionName + \"\\\" can not be set to undefined.\" );\n\t\t\t\t\t}\n\n\t\t\t\t\t// attach the supplied value of this option, or the appropriate default value, to the view object\n\t\t\t\t\tif( options && thisOptionName in options && ! _.isUndefined( options[ thisOptionName ] ) ) {\n\t\t\t\t\t\tvar oldValue = _this[ thisOptionName ];\n\t\t\t\t\t\tvar newValue = options[ thisOptionName ];\n\t\t\t\t\t\t// if this option already exists on the view, and the new value is different,\n\t\t\t\t\t\t// make a note that we will be changing it\n\t\t\t\t\t\tif( ! _.isUndefined( oldValue ) && oldValue !== newValue ) {\n\t\t\t\t\t\t\toptionsThatWereChangedPreviousValues[ thisOptionName ] = oldValue;\n\t\t\t\t\t\t\toptionsThatWereChanged[ thisOptionName ] = newValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_this[ thisOptionName ] = newValue;\n\t\t\t\t\t\t// note we do NOT delete the option off the options object here so that\n\t\t\t\t\t\t// multiple views can be passed the same options object without issue.\n\t\t\t\t\t}\n\t\t\t\t\telse if( _.isUndefined( _this[ thisOptionName ] ) ) {\n\t\t\t\t\t\t// note defaults do not write over any existing properties on the view itself.\n\t\t\t\t\t\t_this[ thisOptionName ] = thisOptionDefaultValue;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tif( _.keys( optionsThatWereChanged ).length > 0 ) {\n\t\t\t\tif( _.isFunction( _this.onOptionsChanged ) )\n\t\t\t\t\t_this.onOptionsChanged( optionsThatWereChanged, optionsThatWereChangedPreviousValues );\n\t\t\t\telse if( _.isFunction( _this._onOptionsChanged ) )\n\t\t\t\t\t_this._onOptionsChanged( optionsThatWereChanged, optionsThatWereChangedPreviousValues );\n\t\t\t}\n\t\t};\n\n\t\tview.getOptions = function() {\n\t\t\tvar optionDeclarations = _.result( this, optionsDeclarationsProperty );\n\t\t\tif( _.isUndefined( optionDeclarations ) ) return {};\n\n\t\t\tvar normalizedOptionDeclarations = _normalizeOptionDeclarations( optionDeclarations );\n\t\t\tvar optionsNames = _.keys( normalizedOptionDeclarations );\n\n\t\t\treturn _.pick( this, optionsNames );\n\t\t};\n\t};\n\n\t// ****************** Private Utility Functions ******************\n\n\tfunction _normalizeOptionDeclarations( optionDeclarations ) {\n\t\t// convert our short-hand option syntax (with exclamation marks, etc.)\n\t\t// to a simple array of standard option declaration objects.\n\n\t\tvar normalizedOptionDeclarations = {};\n\n\t\tif( ! _.isArray( optionDeclarations ) ) throw new Error( \"Option declarations must be an array.\" );\n\n\t\t_.each( optionDeclarations, function( thisOptionDeclaration ) {\n\t\t\tvar thisOptionName, thisOptionRequired, thisOptionDefaultValue;\n\n\t\t\tthisOptionRequired = false;\n\t\t\tthisOptionDefaultValue = undefined;\n\n\t\t\tif( _.isString( thisOptionDeclaration ) )\n\t\t\t\tthisOptionName = thisOptionDeclaration;\n\t\t\telse if( _.isObject( thisOptionDeclaration ) ) {\n\t\t\t\tthisOptionName = _.first( _.keys( thisOptionDeclaration ) );\n\t\t\t\tif( _.isFunction( thisOptionDeclaration[ thisOptionName ] ) )\n\t\t\t\t\tthisOptionDefaultValue = thisOptionDeclaration[ thisOptionName ];\n\t\t\t\telse\n\t\t\t\t\tthisOptionDefaultValue = _.clone( thisOptionDeclaration[ thisOptionName ] );\n\t\t\t}\n\t\t\telse throw new Error( \"Each element in the option declarations array must be either a string or an object.\" );\n\n\t\t\tif( thisOptionName[ thisOptionName.length - 1 ] === \"!\" ) {\n\t\t\t\tthisOptionRequired = true;\n\t\t\t\tthisOptionName = thisOptionName.slice( 0, thisOptionName.length - 1 );\n\t\t\t}\n\n\t\t\tnormalizedOptionDeclarations[ thisOptionName ] = normalizedOptionDeclarations[ thisOptionName ] || {};\n\t\t\tnormalizedOptionDeclarations[ thisOptionName ].required = thisOptionRequired;\n\t\t\tif( ! _.isUndefined( thisOptionDefaultValue ) ) normalizedOptionDeclarations[ thisOptionName ].defaultValue = thisOptionDefaultValue;\n\t\t} );\n\n\t\treturn normalizedOptionDeclarations;\n\t}\n\n\n\t// Backbone.BabySitter\n\t// -------------------\n\t// v0.0.6\n\t//\n\t// Copyright (c)2013 Derick Bailey, Muted Solutions, LLC.\n\t// Distributed under MIT license\n\t//\n\t// http://github.com/babysitterjs/backbone.babysitter\n\n\t// Backbone.ChildViewContainer\n\t// ---------------------------\n\t//\n\t// Provide a container to store, retrieve and\n\t// shut down child views.\n\n\tChildViewContainer = (function(Backbone, _){\n\n\t\t// Container Constructor\n\t\t// ---------------------\n\n\t\tvar Container = function(views){\n\t\t\tthis._views = {};\n\t\t\tthis._indexByModel = {};\n\t\t\tthis._indexByCustom = {};\n\t\t\tthis._updateLength();\n\n\t\t\t_.each(views, this.add, this);\n\t\t};\n\n\t\t// Container Methods\n\t\t// -----------------\n\n\t\t_.extend(Container.prototype, {\n\n\t\t\t// Add a view to this container. Stores the view\n\t\t\t// by `cid` and makes it searchable by the model\n\t\t\t// cid (and model itself). Optionally specify\n\t\t\t// a custom key to store an retrieve the view.\n\t\t\tadd: function(view, customIndex){\n\t\t\t\tvar viewCid = view.cid;\n\n\t\t\t\t// store the view\n\t\t\t\tthis._views[viewCid] = view;\n\n\t\t\t\t// index it by model\n\t\t\t\tif (view.model){\n\t\t\t\t\tthis._indexByModel[view.model.cid] = viewCid;\n\t\t\t\t}\n\n\t\t\t\t// index by custom\n\t\t\t\tif (customIndex){\n\t\t\t\t\tthis._indexByCustom[customIndex] = viewCid;\n\t\t\t\t}\n\n\t\t\t\tthis._updateLength();\n\t\t\t},\n\n\t\t\t// Find a view by the model that was attached to\n\t\t\t// it. Uses the model's `cid` to find it.\n\t\t\tfindByModel: function(model){\n\t\t\t\treturn this.findByModelCid(model.cid);\n\t\t\t},\n\n\t\t\t// Find a view by the `cid` of the model that was attached to\n\t\t\t// it. Uses the model's `cid` to find the view `cid` and\n\t\t\t// retrieve the view using it.\n\t\t\tfindByModelCid: function(modelCid){\n\t\t\t\tvar viewCid = this._indexByModel[modelCid];\n\t\t\t\treturn this.findByCid(viewCid);\n\t\t\t},\n\n\t\t\t// Find a view by a custom indexer.\n\t\t\tfindByCustom: function(index){\n\t\t\t\tvar viewCid = this._indexByCustom[index];\n\t\t\t\treturn this.findByCid(viewCid);\n\t\t\t},\n\n\t\t\t// Find by index. This is not guaranteed to be a\n\t\t\t// stable index.\n\t\t\tfindByIndex: function(index){\n\t\t\t\treturn _.values(this._views)[index];\n\t\t\t},\n\n\t\t\t// retrieve a view by it's `cid` directly\n\t\t\tfindByCid: function(cid){\n\t\t\t\treturn this._views[cid];\n\t\t\t},\n\n\t\t\tfindIndexByCid : function( cid ) {\n\t\t\t\tvar index = -1;\n\t\t\t\tvar view = _.find( this._views, function ( view ) {\n\t\t\t\t\tindex++;\n\t\t\t\t\tif( view.model.cid == cid )\n\t\t\t\t\t\treturn view;\n\t\t\t\t} );\n\t\t\t\treturn ( view ) ? index : -1;\n\t\t\t},\n\n\t\t\t// Remove a view\n\t\t\tremove: function(view){\n\t\t\t\tvar viewCid = view.cid;\n\n\t\t\t\t// delete model index\n\t\t\t\tif (view.model){\n\t\t\t\t\tdelete this._indexByModel[view.model.cid];\n\t\t\t\t}\n\n\t\t\t\t// delete custom index\n\t\t\t\t_.any(this._indexByCustom, function(cid, key) {\n\t\t\t\t\tif (cid === viewCid) {\n\t\t\t\t\t\tdelete this._indexByCustom[key];\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}, this);\n\n\t\t\t\t// remove the view from the container\n\t\t\t\tdelete this._views[viewCid];\n\n\t\t\t\t// update the length\n\t\t\t\tthis._updateLength();\n\t\t\t},\n\n\t\t\t// Call a method on every view in the container,\n\t\t\t// passing parameters to the call method one at a\n\t\t\t// time, like `function.call`.\n\t\t\tcall: function(method){\n\t\t\t\tthis.apply(method, _.tail(arguments));\n\t\t\t},\n\n\t\t\t// Apply a method on every view in the container,\n\t\t\t// passing parameters to the call method one at a\n\t\t\t// time, like `function.apply`.\n\t\t\tapply: function(method, args){\n\t\t\t\t_.each(this._views, function(view){\n\t\t\t\t\tif (_.isFunction(view[method])){\n\t\t\t\t\t\tview[method].apply(view, args || []);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\n\t\t\t// Update the `.length` attribute on this container\n\t\t\t_updateLength: function(){\n\t\t\t\tthis.length = _.size(this._views);\n\t\t\t}\n\t\t});\n\n\t\t// Borrowing this code from Backbone.Collection:\n\t\t// http://backbonejs.org/docs/backbone.html#section-106\n\t\t//\n\t\t// Mix in methods from Underscore, for iteration, and other\n\t\t// collection related features.\n\t\tvar methods = ['forEach', 'each', 'map', 'find', 'detect', 'filter',\n\t\t\t 'select', 'reject', 'every', 'all', 'some', 'any', 'include',\n\t\t\t 'contains', 'invoke', 'toArray', 'first', 'initial', 'rest',\n\t\t\t 'last', 'without', 'isEmpty', 'pluck'];\n\n\t\t_.each(methods, function(method) {\n\t\t\tContainer.prototype[method] = function() {\n\t\t\t\tvar views = _.values(this._views);\n\t\t\t\tvar args = [views].concat(_.toArray(arguments));\n\t\t\t\treturn _[method].apply(_, args);\n\t\t\t};\n\t\t});\n\n\t\t// return the public API\n\t\treturn Container;\n\t})(Backbone, _);\n\n\treturn Backbone.CollectionView;\n} ) );\n\n","//\n// backbone.trackit - 0.1.0\n// The MIT License\n// Copyright (c) 2013 The New York Times, CMS Group, Matthew DeLambo <delambo@gmail.com>\n//\n(function() {\n\n\t// Unsaved Record Keeping\n\t// ----------------------\n\n\t// Collection of all models in an app that have unsaved changes.\n\tvar unsavedModels = [];\n\n\t// If the given model has unsaved changes then add it to\n\t// the `unsavedModels` collection, otherwise remove it.\n\tvar updateUnsavedModels = function(model) {\n\t\tif (!_.isEmpty(model._unsavedChanges)) {\n\t\t\tif (!_.findWhere(unsavedModels, {cid:model.cid})) unsavedModels.push(model);\n\t\t} else {\n\t\t\tunsavedModels = _.filter(unsavedModels, function(m) { return model.cid != m.cid; });\n\t\t}\n\t};\n\n\t// Unload Handlers\n\t// ---------------\n\n\t// Helper which returns a prompt message for an unload handler.\n\t// Uses the given function name (one of the callback names\n\t// from the `model.unsaved` configuration hash) to evaluate\n\t// whether a prompt is needed/returned.\n\tvar getPrompt = function(fnName) {\n\t\tvar prompt, args = _.rest(arguments);\n\t\t// Evaluate and return a boolean result. The given `fn` may be a\n\t\t// boolean value, a function, or the name of a function on the model.\n\t\tvar evaluateModelFn = function(model, fn) {\n\t\t\tif (_.isBoolean(fn)) return fn;\n\t\t\treturn (_.isString(fn) ? model[fn] : fn).apply(model, args);\n\t\t};\n\t\t_.each(unsavedModels, function(model) {\n\t\t\tif (!prompt && evaluateModelFn(model, model._unsavedConfig[fnName]))\n\t\t\t\tprompt = model._unsavedConfig.prompt;\n\t\t});\n\t\treturn prompt;\n\t};\n\n\t// Wrap Backbone.History.navigate so that in-app routing\n\t// (`router.navigate('/path')`) can be intercepted with a\n\t// confirmation if there are any unsaved models.\n\tBackbone.History.prototype.navigate = _.wrap(Backbone.History.prototype.navigate, function(oldNav, fragment, options) {\n\t\tvar prompt = getPrompt('unloadRouterPrompt', fragment, options);\n\t\tif (prompt) {\n\t\t\tif (confirm(prompt + ' \\n\\nAre you sure you want to leave this page?')) {\n\t\t\t\toldNav.call(this, fragment, options);\n\t\t\t}\n\t\t} else {\n\t\t\toldNav.call(this, fragment, options);\n\t\t}\n\t});\n\n\t// Create a browser unload handler which is triggered\n\t// on the refresh, back, or forward button.\n\twindow.onbeforeunload = function(e) {\n\t\treturn getPrompt('unloadWindowPrompt', e);\n\t};\n\n\t// Backbone.Model API\n\t// ------------------\n\n\t_.extend(Backbone.Model.prototype, {\n\n\t\tunsaved: {},\n\t\t_trackingChanges: false,\n\t\t_originalAttrs: {},\n\t\t_unsavedChanges: {},\n\n\t\t// Opt in to tracking attribute changes\n\t\t// between saves.\n\t\tstartTracking: function() {\n\t\t\tthis._unsavedConfig = _.extend({}, {\n\t\t\t\tprompt: 'You have unsaved changes!',\n\t\t\t\tunloadRouterPrompt: false,\n\t\t\t\tunloadWindowPrompt: false\n\t\t\t}, this.unsaved || {});\n\t\t\tthis._trackingChanges = true;\n\t\t\tthis._resetTracking();\n\t\t\tthis._triggerUnsavedChanges();\n\t\t\treturn this;\n\t\t},\n\n\t\t// Resets the default tracking values\n\t\t// and stops tracking attribute changes.\n\t\tstopTracking: function() {\n\t\t\tthis._trackingChanges = false;\n\t\t\tthis._originalAttrs = {};\n\t\t\tthis._unsavedChanges = {};\n\t\t\tthis._triggerUnsavedChanges();\n\t\t\treturn this;\n\t\t},\n\n\t\t// Gets rid of accrued changes and\n\t\t// resets state.\n\t\trestartTracking: function() {\n\t\t\tthis._resetTracking();\n\t\t\tthis._triggerUnsavedChanges();\n\t\t\treturn this;\n\t\t},\n\n\t\t// Restores this model's attributes to\n\t\t// their original values since tracking\n\t\t// started, the last save, or last restart.\n\t\tresetAttributes: function() {\n\t\t\tif (!this._trackingChanges) return;\n\t\t\tthis.attributes = this._originalAttrs;\n\t\t\tthis._resetTracking();\n\t\t\tthis._triggerUnsavedChanges();\n\t\t\treturn this;\n\t\t},\n\n\t\t// Symmetric to Backbone's `model.changedAttributes()`,\n\t\t// except that this returns a hash of the model's attributes that\n\t\t// have changed since the last save, or `false` if there are none.\n\t\t// Like `changedAttributes`, an external attributes hash can be\n\t\t// passed in, returning the attributes in that hash which differ\n\t\t// from the model.\n\t\tunsavedAttributes: function(attrs) {\n\t\t\tif (!attrs) return _.isEmpty(this._unsavedChanges) ? false : _.clone(this._unsavedChanges);\n\t\t\tvar val, changed = false, old = this._unsavedChanges;\n\t\t\tfor (var attr in attrs) {\n\t\t\t\tif (_.isEqual(old[attr], (val = attrs[attr]))) continue;\n\t\t\t\t(changed || (changed = {}))[attr] = val;\n\t\t\t}\n\t\t\treturn changed;\n\t\t},\n\n\t\t_resetTracking: function() {\n\t\t\tthis._originalAttrs = _.clone(this.attributes);\n\t\t\tthis._unsavedChanges = {};\n\t\t},\n\n\t\t// Trigger an `unsavedChanges` event on this model,\n\t\t// supplying the result of whether there are unsaved\n\t\t// changes and a changed attributes hash.\n\t\t_triggerUnsavedChanges: function() {\n\t\t\tthis.trigger('unsavedChanges', !_.isEmpty(this._unsavedChanges), _.clone(this._unsavedChanges));\n\t\t\tif (this.unsaved) updateUnsavedModels(this);\n\t\t}\n\t});\n\n\t// Wrap `model.set()` and update the internal\n\t// unsaved changes record keeping.\n\tBackbone.Model.prototype.set = _.wrap(Backbone.Model.prototype.set, function(oldSet, key, val, options) {\n\t\tvar attrs, ret;\n\t\tif (key == null) return this;\n\t\t// Handle both `\"key\", value` and `{key: value}` -style arguments.\n\t\tif (typeof key === 'object') {\n\t\t\tattrs = key;\n\t\t\toptions = val;\n\t\t} else {\n\t\t\t(attrs = {})[key] = val;\n\t\t}\n\t\toptions || (options = {});\n\n\t\t// Delegate to Backbone's set.\n\t\tret = oldSet.call(this, attrs, options);\n\n\t\tif (this._trackingChanges && !options.silent) {\n\t\t\t_.each(attrs, _.bind(function(val, key) {\n\t\t\t\tif (_.isEqual(this._originalAttrs[key], val))\n\t\t\t\t\tdelete this._unsavedChanges[key];\n\t\t\t\telse\n\t\t\t\t\tthis._unsavedChanges[key] = val;\n\t\t\t}, this));\n\t\t\tthis._triggerUnsavedChanges();\n\t\t}\n\t\treturn ret;\n\t});\n\n\t// Intercept `model.save()` and reset tracking/unsaved\n\t// changes if it was successful.\n\tBackbone.sync = _.wrap(Backbone.sync, function(oldSync, method, model, options) {\n\t\toptions || (options = {});\n\n\t\tif (method == 'update') {\n\t\t\toptions.success = _.wrap(options.success, _.bind(function(oldSuccess, data, textStatus, jqXHR) {\n\t\t\t\tvar ret;\n\t\t\t\tif (oldSuccess) ret = oldSuccess.call(this, data, textStatus, jqXHR);\n\t\t\t\tif (model._trackingChanges) {\n\t\t\t\t\tmodel._resetTracking();\n\t\t\t\t\tmodel._triggerUnsavedChanges();\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t}, this));\n\t\t}\n\t\treturn oldSync(method, model, options);\n\t});\n\n})();\ndefine(\"vendor/backbone.trackit\", function(){});\n\n","/**\n * Image object model for use in various models for the 'image' attribute\n *\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'Models/Image',[], function() {\n\n\treturn Backbone.Model.extend( {\n\n\t\tdefaults: {\n\t\t\tenabled: 'no',\n\t\t\tid: '',\n\t\t\tsize: 'full',\n\t\t\tsrc: '',\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.startTracking();\n\t\t},\n\n\t} );\n} );\n\n","/**\n * Model relationships mixin\n *\n * @since 3.16.0\n * @version 3.16.11\n */\ndefine( 'Models/_Relationships',[], function() {\n\n\treturn {\n\n\t\t/**\n\t\t * Default relationship settings object\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\trelationship_defaults: {\n\t\t\tparent: {},\n\t\t\tchildren: {},\n\t\t},\n\n\t\t/**\n\t\t * Relationship settings object\n\t\t * Should be overridden in the model\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\trelationships: {},\n\n\t\t/**\n\t\t * Initialize all parent and child relationships\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tinit_relationships: function( options ) {\n\n\t\t\tvar rels = this.get_relationships();\n\n\t\t\t// initialize parent relationships\n\t\t\t// useful when adding a model to ensure parent is initialized\n\t\t\tif ( rels.parent && options && options.parent ) {\n\t\t\t\tthis.set_parent( options.parent );\n\t\t\t}\n\n\t\t\t// initialize all children relationships\n\t\t\t_.each( rels.children, function( child_data, child_key ) {\n\n\t\t\t\tif ( ! child_data.conditional || true === child_data.conditional( this ) ) {\n\n\t\t\t\t\tvar child_val = this.get( child_key ),\n\t\t\t\t\t\tchild;\n\n\t\t\t\t\tif ( child_data.lookup ) {\n\t\t\t\t\t\tchild = child_data.lookup( child_val );\n\t\t\t\t\t} else if ( 'model' === child_data.type ) {\n\t\t\t\t\t\tchild = window.llms_builder.construct.get_model( child_data.class, child_val );\n\t\t\t\t\t} else if ( 'collection' === child_data.type ) {\n\t\t\t\t\t\tchild = window.llms_builder.construct.get_collection( child_data.class, child_val );\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.set( child_key, child );\n\n\t\t\t\t\t// if the child defines a parent, save a reference to the parent on the child\n\t\t\t\t\tif ( 'model' === child_data.type ) {\n\t\t\t\t\t\tthis._maybe_set_parent_reference( child );\n\n\t\t\t\t\t\t// save directly to each model in the collection\n\t\t\t\t\t} else if ( 'collection' === child_data.type ) {\n\n\t\t\t\t\t\tchild.parent = this;\n\t\t\t\t\t\tchild.each( function( child_model ) {\n\n\t\t\t\t\t\t\tthis._maybe_set_parent_reference( child_model );\n\n\t\t\t\t\t\t}, this );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}, this );\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve the property names for all children of the model\n\t\t *\n\t\t * @return array\n\t\t * @since 3.16.11\n\t\t * @version 3.16.11\n\t\t */\n\t\tget_child_props: function() {\n\n\t\t\tvar props = [];\n\n\t\t\t_.each( this.get_relationships().children, function( data, key ) {\n\n\t\t\t\tif ( ! data.conditional || true === data.conditional( this ) ) {\n\t\t\t\t\tprops.push( key );\n\t\t\t\t}\n\n\t\t\t}, this );\n\n\t\t\treturn props;\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve the model's parent (if set)\n\t\t *\n\t\t * @return obj|false\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tget_parent: function() {\n\n\t\t\tvar rels = this.get_relationships();\n\n\t\t\tif ( rels.parent ) {\n\t\t\t\treturn rels.parent.reference;\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve relationships for the model\n\t\t * Extends with defaults\n\t\t *\n\t\t * @return obj\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tget_relationships: function() {\n\n\t\t\treturn $.extend( true, this.relationships, this.relationship_defaults );\n\n\t\t},\n\n\t\t/**\n\t\t * Set the parent reference for the given model\n\t\t *\n\t\t * @param obj obj parent model obj\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tset_parent: function( obj ) {\n\t\t\tthis.relationships.parent.reference = obj;\n\t\t},\n\n\t\t/**\n\t\t * Set up the parent relationships for qualifying children during relationship initialization\n\t\t *\n\t\t * @param obj model child model\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\t_maybe_set_parent_reference: function( model ) {\n\n\t\t\tif ( ! model || ! model.get_relationships ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar rels = model.get_relationships();\n\t\t\tif ( rels.parent && rels.parent.model === this.get( 'type' ) ) {\n\t\t\t\tmodel.set_parent( this );\n\t\t\t}\n\n\t\t},\n\n\t};\n\n} );\n\n","/**\n * Quiz Question Choice\n *\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'Models/QuestionChoice',[ 'Models/Image', 'Models/_Relationships' ], function( Image, Relationships ) {\n\n\treturn Backbone.Model.extend( _.defaults( {\n\n\t\t/**\n\t\t * Model relationships\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\trelationships: {\n\t\t\tparent: {\n\t\t\t\tmodel: 'llms_question',\n\t\t\t\ttype: 'model',\n\t\t\t},\n\t\t\tchildren: {\n\t\t\t\tchoice: {\n\t\t\t\t\tconditional: function( model ) {\n\t\t\t\t\t\treturn ( 'image' === model.get( 'choice_type' ) );\n\t\t\t\t\t},\n\t\t\t\t\tclass: 'Image',\n\t\t\t\t\tmodel: 'image',\n\t\t\t\t\ttype: 'model',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\n\t\t/**\n\t\t * Model defaults\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tdefaults: function() {\n\t\t\treturn {\n\t\t\t\tid: _.uniqueId( 'temp_' ),\n\t\t\t\tchoice: '',\n\t\t\t\tchoice_type: 'text',\n\t\t\t\tcorrect: false,\n\t\t\t\tmarker: 'A',\n\t\t\t\tquestion_id: '',\n\t\t\t\ttype: 'choice',\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Initializer\n\t\t *\n\t\t * @param obj data object of model attributes\n\t\t * @param obj options additional options\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tinitialize: function( data, options ) {\n\n\t\t\tthis.startTracking();\n\t\t\tthis.init_relationships( options );\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve the choice's parent question\n\t\t *\n\t\t * @return obj\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tget_parent: function() {\n\t\t\treturn this.collection.parent;\n\t\t},\n\n\t\t/**\n\t\t * Retrieve the ID used when trashing the model\n\t\t *\n\t\t * @return string\n\t\t * @since 3.17.1\n\t\t * @version 3.17.1\n\t\t */\n\t\tget_trash_id: function() {\n\t\t\treturn this.get( 'question_id' ) + ':' + this.get( 'id' );\n\t\t},\n\n\t\t/**\n\t\t * Determine if \"selection\" is enabled for the question type\n\t\t * Choice type questions are selectable by reorder type questions are not but still use choices\n\t\t *\n\t\t * @return {Boolean}\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tis_selectable: function() {\n\t\t\treturn this.get_parent().get( 'question_type' ).get_choice_selectable();\n\t\t},\n\n\t}, Relationships ) );\n\n} );\n\n","/**\n * Question Choice Collection\n *\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'Collections/QuestionChoices',[ 'Models/QuestionChoice' ], function( model ) {\n\n\treturn Backbone.Collection.extend( {\n\n\t\t/**\n\t\t * Model for collection items\n\t\t *\n\t\t * @type obj\n\t\t */\n\t\tmodel: model,\n\n\t\tinitialize: function() {\n\n\t\t\t// reorder called by QuestionList view when sortable drops occur\n\t\t\tthis.on( 'reorder', this.update_order );\n\n\t\t\t// when a choice is added or removed, update order\n\t\t\tthis.on( 'add', this.update_order );\n\t\t\tthis.on( 'remove', this.update_order );\n\n\t\t\t// when a choice is added or remove, ensure min/max correct answers exist\n\t\t\tthis.on( 'add', this.update_correct );\n\t\t\tthis.on( 'remove', this.update_correct );\n\n\t\t\t// when a choice is toggled, ensure min/max correct exist\n\t\t\tthis.on( 'correct-update', this.update_correct );\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve the number of correct choices in the collection\n\t\t *\n\t\t * @return int\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tcount_correct: function() {\n\n\t\t\treturn _.size( this.get_correct() );\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve the collection reduced to only correct choices\n\t\t *\n\t\t * @return obj\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tget_correct: function() {\n\t\t\treturn this.filter( function( choice ) {\n\t\t\t\treturn choice.get( 'correct' );\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Ensure min/max correct choices exist in the collection based on the question's settings\n\t\t *\n\t\t * @param obj choice model of the choice that was toggled\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tupdate_correct: function( choice ) {\n\n\t\t\tif ( ! this.parent.get( 'question_type' ).get_choice_selectable() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar siblings = this.without( choice ), // exclude the toggled choice from loops\n\t\t\t\tquestion = this.parent;\n\n\t\t\t// if multiple choices aren't enabled turn all other choices to incorrect\n\t\t\tif ( 'no' === question.get( 'multi_choices' ) ) {\n\t\t\t\t_.each( siblings, function( model ) {\n\t\t\t\t\tmodel.set( 'correct', false );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// if we don't have a single correct answer & the question has points, set one\n\t\t\t// allows users to create quizzes / questions with no points and therefore no correct answers are allowed\n\t\t\tif ( 0 === this.count_correct() && question.get( 'points' ) > 0 ) {\n\t\t\t\tvar models = 1 === this.size() ? this.models : siblings;\n\t\t\t\t_.first( models ).set( 'correct', true );\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Update the marker attr of each choice in the list to reflect the order of the collection\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tupdate_order: function() {\n\n\t\t\tvar self = this,\n\t\t\t\tquestion = this.parent;\n\n\t\t\tthis.each( function( choice ) {\n\t\t\t\tchoice.set( 'marker', question.get( 'question_type' ).get_choice_markers()[ self.indexOf( choice ) ] );\n\t\t\t} );\n\n\t\t},\n\n\t} );\n\n} );\n\n","/**\n * Quiz Question Type\n *\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'Models/QuestionType',[], function() {\n\n\treturn Backbone.Model.extend( {\n\n\t\t/**\n\t\t * Get model default attributes\n\t\t *\n\t\t * @return obj\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tdefaults: function() {\n\t\t\treturn {\n\t\t\t\tchoices: false,\n\t\t\t\tclarifications: true,\n\t\t\t\tdefault_choices: [],\n\t\t\t\tdescription: true,\n\t\t\t\ticon: 'question',\n\t\t\t\tid: 'generic',\n\t\t\t\timage: true,\n\t\t\t\tkeywords: [],\n\t\t\t\tname: 'Generic',\n\t\t\t\tplaceholder: '',\n\t\t\t\tpoints: true,\n\t\t\t\tvideo: true,\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Retrieve an array of keywords for the question type\n\t\t * Used for filtering questions by search term in the quiz builder\n\t\t *\n\t\t * @return array\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tget_keywords: function() {\n\n\t\t\tvar name = this.get( 'name' ),\n\t\t\t\twords = [ name ];\n\n\t\t\treturn words.concat( this.get( 'keywords' ) ).concat( name.split( ' ' ) );\n\n\t\t},\n\n\t\t/**\n\t\t * Get marker array for the question choices\n\t\t *\n\t\t * @return array\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tget_choice_markers: function() {\n\n\t\t\treturn this._get_choice_option( 'markers' );\n\n\t\t},\n\n\t\t/**\n\t\t * Determine if the question's choices are selectable\n\t\t *\n\t\t * @return bool\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tget_choice_selectable: function() {\n\n\t\t\treturn this._get_choice_option( 'selectable' );\n\n\t\t},\n\n\t\t/**\n\t\t * Get the choice type (text,image)\n\t\t *\n\t\t * @return string\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tget_choice_type: function() {\n\n\t\t\treturn this._get_choice_option( 'type' );\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve defined min. choices\n\t\t *\n\t\t * @return int\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tget_min_choices: function() {\n\n\t\t\treturn this._get_choice_option( 'min' );\n\n\t\t},\n\n\t\t/**\n\t\t * Get type-defined max choices\n\t\t *\n\t\t * @return string\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tget_max_choices: function() {\n\n\t\t\treturn this._get_choice_option( 'max' );\n\n\t\t},\n\n\t\t/**\n\t\t * Determine if multi-choice selection is enabled\n\t\t *\n\t\t * @return bool\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tget_multi_choices: function() {\n\n\t\t\tvar choices = this.get( 'choices' );\n\n\t\t\tif ( ! choices ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn this._get_choice_option( 'multi' );\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve data from the type's \"choices\" attribute\n\t\t * Allows quick handling of types with no choice definitions w/o additional checks\n\t\t *\n\t\t * @param string option name of the choice option to retrieve\n\t\t * @return mixed\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\t_get_choice_option: function( option ) {\n\n\t\t\tvar choices = this.get( 'choices' );\n\n\t\t\tif ( ! choices || ! choices[ option ] ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn choices[ option ];\n\n\t\t},\n\n\t} );\n\n} );\n\n","/**\n * Utility functions for Models\n *\n * @since 3.16.0\n * @version 3.17.1\n */\ndefine( 'Models/_Utilities',[], function() {\n\n\treturn {\n\n\t\tfields: [],\n\n\t\t/**\n\t\t * Retrieve the edit post link for the current model\n\t\t *\n\t\t * @return string\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tget_edit_post_link: function() {\n\n\t\t\tif ( this.has_temp_id() ) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\treturn window.llms_builder.admin_url + 'post.php?post=' + this.get( 'id' ) + '&action=edit';\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve schema fields defined for the model\n\t\t *\n\t\t * @return object\n\t\t * @since 3.17.0\n\t\t * @version 3.17.1\n\t\t */\n\t\tget_settings_fields: function() {\n\n\t\t\tvar schema = this.schema || {};\n\t\t\treturn window.llms_builder.schemas.get( schema, this.get( 'type' ).replace( 'llms_', '' ), this );\n\n\t\t},\n\n\t\t/**\n\t\t * Determine if the model has a temporary ID\n\t\t *\n\t\t * @return {Boolean}\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\thas_temp_id: function() {\n\n\t\t\treturn ( ! _.isNumber( this.get( 'id' ) ) && 0 === this.get( 'id' ).indexOf( 'temp_' ) );\n\n\t\t},\n\n\t\t/**\n\t\t * Initializes 3rd party custom schema (field) data for a model\n\t\t *\n\t\t * @return void\n\t\t * @since 3.17.0\n\t\t * @version 3.17.0\n\t\t */\n\t\tinit_custom_schema: function() {\n\n\t\t\tvar groups = _.filter( this.get_settings_fields(), function( group ) {\n\t\t\t\treturn ( group.custom );\n\t\t\t} );\n\n\t\t\t_.each( groups, function( group ) {\n\t\t\t\t_.each( _.flatten( group.fields ), function( field ) {\n\n\t\t\t\t\tvar keys = [ field.attribute ],\n\t\t\t\t\t\tcustoms = this.get( 'custom' );\n\n\t\t\t\t\tif ( field.switch_attribute ) {\n\t\t\t\t\t\tkeys.push( field.switch_attribute );\n\t\t\t\t\t}\n\n\t\t\t\t\t_.each( keys, function( key ) {\n\t\t\t\t\t\tvar attr = field.attribute_prefix ? field.attribute_prefix + key : key;\n\t\t\t\t\t\tif ( customs && customs[ attr ] ) {\n\t\t\t\t\t\t\tthis.set( key, customs[ attr ][0] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}, this );\n\n\t\t\t\t}, this );\n\t\t\t}, this );\n\n\t\t},\n\n\t};\n\n} );\n\n","/**\n * Quiz Question\n *\n * @since 3.16.0\n * @version 3.27.0\n */\ndefine( 'Models/Question',[\n\t\t'Models/Image',\n\t\t'Collections/Questions',\n\t\t'Collections/QuestionChoices',\n\t\t'Models/QuestionType',\n\t\t'Models/_Relationships',\n\t\t'Models/_Utilities'\n\t], function(\n\t\tImage,\n\t\tQuestions,\n\t\tQuestionChoices,\n\t\tQuestionType,\n\t\tRelationships,\n\t\tUtilities\n\t) {\n\n\t\treturn Backbone.Model.extend( _.defaults( {\n\n\t\t\t/**\n\t\t\t * Model relationships\n\t\t\t *\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\trelationships: {\n\t\t\t\tparent: {\n\t\t\t\t\tmodel: 'llms_quiz',\n\t\t\t\t\ttype: 'model',\n\t\t\t\t},\n\t\t\t\tchildren: {\n\t\t\t\t\tchoices: {\n\t\t\t\t\t\tclass: 'QuestionChoices',\n\t\t\t\t\t\tmodel: 'choice',\n\t\t\t\t\t\ttype: 'collection',\n\t\t\t\t\t},\n\t\t\t\t\timage: {\n\t\t\t\t\t\tclass: 'Image',\n\t\t\t\t\t\tmodel: 'image',\n\t\t\t\t\t\ttype: 'model',\n\t\t\t\t\t},\n\t\t\t\t\tquestions: {\n\t\t\t\t\t\tclass: 'Questions',\n\t\t\t\t\t\tconditional: function( model ) {\n\t\t\t\t\t\t\tvar type = model.get( 'question_type' ),\n\t\t\t\t\t\t\ttype_id = _.isString( type ) ? type : type.get( 'id' );\n\t\t\t\t\t\t\treturn ( 'group' === type_id );\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmodel: 'llms_question',\n\t\t\t\t\t\ttype: 'collection',\n\t\t\t\t\t},\n\t\t\t\t\tquestion_type: {\n\t\t\t\t\t\tclass: 'QuestionType',\n\t\t\t\t\t\tlookup: function( val ) {\n\t\t\t\t\t\t\tif ( _.isString( val ) ) {\n\t\t\t\t\t\t\t\treturn window.llms_builder.questions.get( val );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn val;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmodel: 'question_type',\n\t\t\t\t\t\ttype: 'model',\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Model defaults\n\t\t\t *\n\t\t\t * @return obj\n\t\t\t * @since 3.16.0\n\t\t\t * @version 3.16.0\n\t\t\t */\n\t\t\tdefaults: function() {\n\t\t\t\treturn {\n\t\t\t\t\tid: _.uniqueId( 'temp_' ),\n\t\t\t\t\tchoices: [],\n\t\t\t\t\tcontent: '',\n\t\t\t\t\tdescription_enabled: 'no',\n\t\t\t\t\timage: {},\n\t\t\t\t\tmulti_choices: 'no',\n\t\t\t\t\tmenu_order: 1,\n\t\t\t\t\tpoints: 1,\n\t\t\t\t\tquestion_type: 'generic',\n\t\t\t\t\tquestions: [], // for question groups\n\t\t\t\t\tparent_id: '',\n\t\t\t\t\ttitle: '',\n\t\t\t\t\ttype: 'llms_question',\n\t\t\t\t\tvideo_enabled: 'no',\n\t\t\t\t\tvideo_src: '',\n\n\t\t\t\t\t_expanded: false,\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Initializer\n\t\t\t *\n\t\t\t * @param obj data object of data for the model\n\t\t\t * @param obj options additional options\n\t\t\t * @return void\n\t\t\t * @since 3.16.0\n\t\t\t * @version 3.16.0\n\t\t\t */\n\t\t\tinitialize: function( data, options ) {\n\n\t\t\t\tvar self = this;\n\n\t\t\t\tthis.startTracking();\n\t\t\t\tthis.init_relationships( options );\n\n\t\t\t\tif ( false !== this.get( 'question_type' ).choices ) {\n\n\t\t\t\t\tthis._ensure_min_choices();\n\n\t\t\t\t\t// when a choice is removed, maybe add back some defaults so we always have the minimum\n\t\t\t\t\tthis.listenTo( this.get( 'choices' ), 'remove', function() {\n\t\t\t\t\t\t// new items are added at index 0 when there's only 1 item in the collection, not sure why exactly...\n\t\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\t\tself._ensure_min_choices();\n\t\t\t\t\t\t}, 0 );\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\t// ensure question types that don't support points don't record default 1 point in database\n\t\t\t\tif ( ! this.get( 'question_type' ).get( 'points' ) ) {\n\t\t\t\t\tthis.set( 'points', 0 );\n\t\t\t\t}\n\n\t\t\t\t_.delay( function( self ) {\n\t\t\t\t\tself.on( 'change:points', self.get_parent().update_points, self.get_parent() );\n\t\t\t\t}, 1, this );\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Add a new question choice\n\t\t\t *\n\t\t\t * @param obj data object of choice data\n\t\t\t * @param obj options additional options\n\t\t\t * @since 3.16.0\n\t\t\t * @version 3.16.0\n\t\t\t */\n\t\t\tadd_choice: function( data, options ) {\n\n\t\t\t\tvar max = this.get( 'question_type' ).get_max_choices();\n\t\t\t\tif ( this.get( 'choices' ).size() >= max ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdata = data || {};\n\t\t\t\toptions = options || {};\n\n\t\t\t\tdata.choice_type = this.get( 'question_type' ).get_choice_type();\n\t\t\t\tdata.question_id = this.get( 'id' );\n\t\t\t\toptions.parent = this;\n\n\t\t\t\tvar choice = this.get( 'choices' ).add( data, options );\n\n\t\t\t\tBackbone.pubSub.trigger( 'question-add-choice', choice, this );\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Collapse question_type attribute during full syncs to save to database\n\t\t\t * Not needed because question types cannot be adjusted after question creation\n\t\t\t * Called from sync controller\n\t\t\t *\n\t\t\t * @param obj atts flat object of attributes to be saved to db\n\t\t\t * @param string sync_type full or partial\n\t\t\t * full indicates a force resync or that the model isn't persisted yet\n\t\t\t * @return obj\n\t\t\t * @since 3.16.0\n\t\t\t * @version 3.16.0\n\t\t\t */\n\t\t\tbefore_save: function( atts, sync_type ) {\n\t\t\t\tif ( 'full' === sync_type ) {\n\t\t\t\t\tatts.question_type = this.get( 'question_type' ).get( 'id' );\n\t\t\t\t}\n\t\t\t\treturn atts;\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Retrieve the model's parent (if set)\n\t\t\t *\n\t\t\t * @return obj|false\n\t\t\t * @since 3.16.0\n\t\t\t * @version 3.16.0\n\t\t\t */\n\t\t\tget_parent: function() {\n\n\t\t\t\tvar rels = this.get_relationships();\n\n\t\t\t\tif ( rels.parent ) {\n\t\t\t\t\tif ( this.collection && this.collection.parent ) {\n\t\t\t\t\t\treturn this.collection.parent;\n\t\t\t\t\t} else if ( rels.parent.reference ) {\n\t\t\t\t\t\treturn rels.parent.reference;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Retrieve the translated post type name for the model's type\n\t\t\t *\n\t\t\t * @param bool plural if true, returns the plural, otherwise returns singular\n\t\t\t * @return string\n\t\t\t * @since 3.27.0\n\t\t\t * @version 3.27.0\n\t\t\t */\n\t\t\tget_l10n_type: function( plural ) {\n\n\t\t\t\tif ( plural ) {\n\t\t\t\t\treturn LLMS.l10n.translate( 'questions' );\n\t\t\t\t}\n\n\t\t\t\treturn LLMS.l10n.translate( 'question' );\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Gets the index of the question within it's parent\n\t\t\t * Question numbers skip content elements\n\t\t\t * & content elements skip questions\n\t\t\t *\n\t\t\t * @return int\n\t\t\t * @since 3.16.0\n\t\t\t * @version 3.16.0\n\t\t\t */\n\t\t\tget_type_index: function() {\n\n\t\t\t\t// current models type, used to check the predicate in the filter function below\n\t\t\t\tvar curr_type = this.get( 'question_type' ).get( 'id' ),\n\t\t\t\tquestions;\n\n\t\t\t\tquestions = this.collection.filter( function( question ) {\n\n\t\t\t\t\tvar type = question.get( 'question_type' ).get( 'id' );\n\n\t\t\t\t\t// if current model is not content, return all non-content questions\n\t\t\t\t\tif ( curr_type !== 'content' ) {\n\t\t\t\t\t\treturn ( 'content' !== type );\n\t\t\t\t\t}\n\n\t\t\t\t\t// current model is content, return only content questions\n\t\t\t\t\treturn 'content' === type;\n\n\t\t\t\t} );\n\n\t\t\t\treturn questions.indexOf( this );\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Gets iterator for the given type\n\t\t\t * Questions use numbers and content uses alphabet\n\t\t\t *\n\t\t\t * @return mixed\n\t\t\t * @since 3.16.0\n\t\t\t * @version 3.16.0\n\t\t\t */\n\t\t\tget_type_iterator: function() {\n\n\t\t\t\tvar index = this.get_type_index();\n\n\t\t\t\tif ( -1 === index ) {\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\n\t\t\t\tif ( 'content' === this.get( 'question_type' ).get( 'id' ) ) {\n\t\t\t\t\tvar alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split( '' );\n\t\t\t\t\treturn alphabet[ index ];\n\t\t\t\t}\n\n\t\t\t\treturn index + 1;\n\n\t\t\t},\n\n\t\t\tget_qid: function() {\n\n\t\t\t\tvar parent = this.get_parent_question(),\n\t\t\t\tprefix = '';\n\n\t\t\t\tif ( parent ) {\n\n\t\t\t\t\tprefix = parent.get_qid() + '.';\n\n\t\t\t\t}\n\n\t\t\t\t// return short_id + this.get_type_iterator();\n\t\t\t\treturn prefix + this.get_type_iterator();\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Retrieve the parent question (if the question is in a question group)\n\t\t\t *\n\t\t\t * @return obj|false\n\t\t\t * @since 3.16.0\n\t\t\t * @version 3.16.0\n\t\t\t */\n\t\t\tget_parent_question: function() {\n\n\t\t\t\tif ( this.is_in_group() ) {\n\n\t\t\t\t\treturn this.collection.parent;\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Retrieve the parent quiz\n\t\t\t *\n\t\t\t * @return obj\n\t\t\t * @since 3.16.0\n\t\t\t * @version 3.16.0\n\t\t\t */\n\t\t\tget_parent_quiz: function() {\n\t\t\t\treturn this.get_parent();\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Points getter\n\t\t\t * ensures that 0 is always returned if the question type doesn't support points\n\t\t\t *\n\t\t\t * @return int\n\t\t\t * @since 3.16.0\n\t\t\t * @version 3.16.0\n\t\t\t */\n\t\t\tget_points: function() {\n\n\t\t\t\tif ( ! this.get( 'question_type' ).get( 'points' ) ) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn this.get( 'points' );\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Retrieve the questions percentage value within the quiz\n\t\t\t *\n\t\t\t * @return string\n\t\t\t * @since 3.16.0\n\t\t\t * @version 3.16.0\n\t\t\t */\n\t\t\tget_points_percentage: function() {\n\n\t\t\t\tvar total = this.get_parent().get( '_points' ),\n\t\t\t\tpoints = this.get( 'points' );\n\n\t\t\t\tif ( 0 === total ) {\n\t\t\t\t\treturn '0%';\n\t\t\t\t}\n\n\t\t\t\treturn ( ( points / total ) * 100 ).toFixed( 2 ) + '%';\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Determine if the question belongs to a question group\n\t\t\t *\n\t\t\t * @return {Boolean}\n\t\t\t * @since 3.16.0\n\t\t\t * @version 3.16.0\n\t\t\t */\n\t\t\tis_in_group: function() {\n\n\t\t\t\treturn ( 'question' === this.collection.parent.get( 'type' ) );\n\n\t\t\t},\n\n\t\t\t_ensure_min_choices: function() {\n\n\t\t\t\tvar choices = this.get( 'choices' );\n\t\t\t\twhile ( choices.size() < this.get( 'question_type' ).get_min_choices() ) {\n\t\t\t\t\tthis.add_choice();\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t}, Relationships, Utilities ) );\n\n} );\n\n","/**\n * Questions Collection\n *\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'Collections/Questions',[ 'Models/Question' ], function( model ) {\n\n\treturn Backbone.Collection.extend( {\n\n\t\t/**\n\t\t * Model for collection items\n\t\t *\n\t\t * @type obj\n\t\t */\n\t\tmodel: model,\n\n\t\t/**\n\t\t * Initialize\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tinitialize: function() {\n\n\t\t\t// reorder called by QuestionList view when sortable drops occur\n\t\t\tthis.on( 'reorder', this.update_order );\n\n\t\t\t// when a question is added or removed, update order\n\t\t\tthis.on( 'add', this.update_order );\n\t\t\tthis.on( 'remove', this.update_order );\n\n\t\t\tthis.on( 'add', this.update_parent );\n\n\t\t},\n\n\t\t/**\n\t\t * Update the order attr of each question in the list to reflect the order of the collection\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tupdate_order: function() {\n\n\t\t\tvar self = this;\n\n\t\t\tthis.each( function( question ) {\n\n\t\t\t\tquestion.set( 'menu_order', self.indexOf( question ) + 1 );\n\n\t\t\t} );\n\n\t\t},\n\n\t\t/**\n\t\t * When adding a question to a question list, update the question's parent\n\t\t * Will ensure that questions moved into and out of groups always have the correct parent_id\n\t\t *\n\t\t * @param obj model instance of the question model\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tupdate_parent: function( model ) {\n\n\t\t\tmodel.set( 'parent_id', this.parent.get( 'id' ) );\n\n\t\t},\n\n\t} );\n\n} );\n\n","/**\n * Quiz Schema\n *\n * @since 3.17.6\n * @version 3.24.0\n */\ndefine( 'Schemas/Quiz',[], function() {\n\n\treturn window.llms.hooks.applyFilters( 'llms_define_quiz_schema', {\n\n\t\tdefault: {\n\t\t\ttitle: LLMS.l10n.translate( 'General Settings' ),\n\t\t\ttoggleable: true,\n\t\t\tfields: [\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'permalink',\n\t\t\t\t\t\tid: 'permalink',\n\t\t\t\t\t\ttype: 'permalink',\n\t\t\t},\n\t\t\t\t], [\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'content',\n\t\t\t\t\t\tid: 'description',\n\t\t\t\t\t\tlabel: LLMS.l10n.translate( 'Description' ),\n\t\t\t\t\t\ttype: 'editor',\n\t\t\t},\n\t\t\t\t], [\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'passing_percent',\n\t\t\t\t\t\tid: 'passing-percent',\n\t\t\t\t\t\tlabel: LLMS.l10n.translate( 'Passing Percentage' ),\n\t\t\t\t\t\tmin: 0,\n\t\t\t\t\t\tmax: 100,\n\t\t\t\t\t\ttip: LLMS.l10n.translate( 'Minimum percentage of total points required to pass the quiz' ),\n\t\t\t\t\t\ttype: 'number',\n\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'allowed_attempts',\n\t\t\t\t\t\tid: 'allowed-attempts',\n\t\t\t\t\t\tlabel: LLMS.l10n.translate( 'Limit Attempts' ),\n\t\t\t\t\t\tswitch_attribute: 'limit_attempts',\n\t\t\t\t\t\ttip: LLMS.l10n.translate( 'Limit the maximum number of times a student can take this quiz' ),\n\t\t\t\t\t\ttype: 'switch-number',\n\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'time_limit',\n\t\t\t\t\t\tid: 'time-limit',\n\t\t\t\t\t\tlabel: LLMS.l10n.translate( 'Time Limit' ),\n\t\t\t\t\t\tmin: 1,\n\t\t\t\t\t\tmax: 360,\n\t\t\t\t\t\tswitch_attribute: 'limit_time',\n\t\t\t\t\t\ttip: LLMS.l10n.translate( 'Enforce a maximum number of minutes a student can spend on each attempt' ),\n\t\t\t\t\t\ttype: 'switch-number',\n\t\t\t},\n\t\t\t\t], [\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'show_correct_answer',\n\t\t\t\t\t\tid: 'show-correct-answer',\n\t\t\t\t\t\tlabel: LLMS.l10n.translate( 'Show Correct Answers' ),\n\t\t\t\t\t\ttip: LLMS.l10n.translate( 'When enabled, students will be shown the correct answer to any question they answered incorrectly.' ),\n\t\t\t\t\t\ttype: 'switch',\n\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'random_questions',\n\t\t\t\t\t\tid: 'random-questions',\n\t\t\t\t\t\tlabel: LLMS.l10n.translate( 'Randomize Question Order' ),\n\t\t\t\t\t\ttip: LLMS.l10n.translate( 'Display questions in a random order for each attempt. Content questions are locked into their defined positions.' ),\n\t\t\t\t\t\ttype: 'switch',\n\t\t\t},\n\t\t\t\t],\n\n\t\t\t],\n\t\t},\n\n\t} );\n\n} );\n\n","/**\n * Quiz Model\n * @since 3.16.0\n * @version 3.24.0\n */\ndefine( 'Models/Quiz',[\n\t\t'Collections/Questions',\n\t\t'Models/Lesson',\n\t\t'Models/Question',\n\t\t'Models/_Relationships',\n\t\t'Models/_Utilities',\n\t\t'Schemas/Quiz',\n\t], function(\n\t\tQuestions,\n\t\tLesson,\n\t\tQuestion,\n\t\tRelationships,\n\t\tUtilities,\n\t\tQuizSchema\n\t) {\n\n\treturn Backbone.Model.extend( _.defaults( {\n\n\t\t/**\n\t\t * model relationships\n\t\t * @type {Object}\n\t\t */\n\t\trelationships: {\n\t\t\tparent: {\n\t\t\t\tmodel: 'lesson',\n\t\t\t\ttype: 'model',\n\t\t\t},\n\t\t\tchildren: {\n\t\t\t\tquestions: {\n\t\t\t\t\tclass: 'Questions',\n\t\t\t\t\tmodel: 'llms_question',\n\t\t\t\t\ttype: 'collection',\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Lesson Settings Schema\n\t\t * @type {Object}\n\t\t */\n\t\tschema: QuizSchema,\n\n\t\t/**\n\t\t * New lesson defaults\n\t\t * @return obj\n\t\t * @since 3.16.0\n\t\t * @version 3.16.6\n\t\t */\n\t\tdefaults: function() {\n\n\t\t\treturn {\n\t\t\t\tid: _.uniqueId( 'temp_' ),\n\t\t\t\ttitle: LLMS.l10n.translate( 'New Quiz' ),\n\t\t\t\ttype: 'llms_quiz',\n\t\t\t\tlesson_id: '',\n\n\t\t\t\tstatus: 'draft',\n\n\t\t\t\t// editable fields\n\t\t\t\tcontent: '',\n\t\t\t\tallowed_attempts: 5,\n\t\t\t\tlimit_attempts: 'no',\n\t\t\t\tlimit_time: 'no',\n\t\t\t\tpassing_percent: 65,\n\t\t\t\tname: '',\n\t\t\t\trandom_answers: 'no',\n\t\t\t\ttime_limit: 30,\n\t\t\t\tshow_correct_answer: 'no',\n\n\t\t\t\tquestions: [],\n\n\t\t\t\t// calculated\n\t\t\t\t_points: 0,\n\n\t\t\t\t// display\n\t\t\t\tpermalink: '',\n\t\t\t\t_show_settings: false,\n\t\t\t\t_questions_loaded: false,\n\t\t\t};\n\n\t\t},\n\n\t\t/**\n\t\t * Initializer\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.24.0\n\t\t */\n\t\tinitialize: function() {\n\n\t\t\tthis.init_custom_schema();\n\t\t\tthis.startTracking();\n\t\t\tthis.init_relationships();\n\n\t\t\tthis.listenTo( this.get( 'questions' ), 'add', this.update_points );\n\t\t\tthis.listenTo( this.get( 'questions' ), 'remove', this.update_points );\n\n\t\t\tthis.set( '_points', this.get_total_points() );\n\n\t\t\t// when a quiz is published, ensure the parent lesson is marked as \"Enabled\" for quizzing\n\t\t\tthis.on( 'change:status', function() {\n\t\t\t\tif ( 'publish' === this.get( 'status' ) ) {\n\t\t\t\t\tthis.get_parent().set( 'quiz_enabled', 'yes' );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\twindow.llms.hooks.doAction( 'llms_quiz_model_init', this );\n\n\t\t},\n\n\t\t/**\n\t\t * Add a new question to the quiz\n\t\t * @param obj data question data\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tadd_question: function( data ) {\n\n\t\t\tdata.parent_id = this.get( 'id' );\n\t\t\tvar question = this.get( 'questions' ).add( data, {\n\t\t\t\tparent: this,\n\t\t\t} );\n\t\t\tBackbone.pubSub.trigger( 'quiz-add-question', question, this );\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve the translated post type name for the model's type\n\t\t * @param bool plural if true, returns the plural, otherwise returns singular\n\t\t * @return string\n\t\t * @since 3.16.12\n\t\t * @version 3.16.12\n\t\t */\n\t\tget_l10n_type: function( plural ) {\n\n\t\t\tif ( plural ) {\n\t\t\t\treturn LLMS.l10n.translate( 'quizzes' );\n\t\t\t}\n\n\t\t\treturn LLMS.l10n.translate( 'quiz' );\n\t\t},\n\n\t\t/**\n\t\t * Retrieve the quiz's total points\n\t\t * @return int\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tget_total_points: function() {\n\n\t\t\tvar points = 0;\n\n\t\t\tthis.get( 'questions' ).each( function( question ) {\n\t\t\t\tpoints += question.get_points();\n\t\t\t} );\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t/**\n\t\t * Lazy load questions via AJAX\n\t\t * @param {Function} cb callback function\n\t\t * @return void\n\t\t * @since 3.19.2\n\t\t * @version 3.19.2\n\t\t */\n\t\tload_questions: function( cb ) {\n\n\t\t\tif ( this.get( '_questions_loaded' ) ) {\n\n\t\t\t\tcb();\n\n\t\t\t} else {\n\n\t\t\t\tvar self = this;\n\n\t\t\t\tLLMS.Ajax.call( {\n\t\t\t\t\tdata: {\n\t\t\t\t\t\taction: 'llms_builder',\n\t\t\t\t\t\taction_type: 'lazy_load',\n\t\t\t\t\t\tcourse_id: window.llms_builder.CourseModel.get( 'id' ),\n\t\t\t\t\t\tload_id: this.get( 'id' ),\n\t\t\t\t\t},\n\t\t\t\t\terror: function( xhr, status, error ) {\n\n\t\t\t\t\t\tconsole.log( xhr, status, error );\n\t\t\t\t\t\twindow.llms_builder.debug.log( '==== start load_questions error ====', xhr, status, error, '==== finish load_questions error ====' );\n\t\t\t\t\t\tcb( true );\n\n\t\t\t\t\t},\n\t\t\t\t\tsuccess: function( res ) {\n\t\t\t\t\t\tif ( res && res.questions ) {\n\t\t\t\t\t\t\tself.set( '_questions_loaded', true );\n\t\t\t\t\t\t\tif ( res.questions ) {\n\t\t\t\t\t\t\t\t_.each( res.questions, self.add_question, self );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcb();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcb( true );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\n\t\t},\n\n\t\t/**\n\t\t * Update total number of points calculated property\n\t\t * @return int\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tupdate_points: function() {\n\n\t\t\tthis.set( '_points', this.get_total_points() );\n\n\t\t},\n\n\t}, Relationships, Utilities ) );\n\n} );\n\n","/**\n * Lesson Schemas\n *\n * @since 3.17.0\n * @version 3.25.4\n */\ndefine( 'Schemas/Lesson',[], function() {\n\n\treturn window.llms.hooks.applyFilters( 'llms_define_lesson_schema', {\n\n\t\tdefault: {\n\t\t\ttitle: LLMS.l10n.translate( 'General Settings' ),\n\t\t\ttoggleable: true,\n\t\t\tfields: [\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'permalink',\n\t\t\t\t\t\tid: 'permalink',\n\t\t\t\t\t\ttype: 'permalink',\n\t\t\t},\n\t\t\t\t], [\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'video_embed',\n\t\t\t\t\t\tid: 'video-embed',\n\t\t\t\t\t\tlabel: LLMS.l10n.translate( 'Video Embed URL' ),\n\t\t\t\t\t\ttype: 'video_embed',\n\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'audio_embed',\n\t\t\t\t\t\tid: 'audio-embed',\n\t\t\t\t\t\tlabel: LLMS.l10n.translate( 'Audio Embed URL' ),\n\t\t\t\t\t\ttype: 'audio_embed',\n\t\t\t},\n\t\t\t\t], [\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'free_lesson',\n\t\t\t\t\t\tid: 'free-lesson',\n\t\t\t\t\t\tlabel: LLMS.l10n.translate( 'Free Lesson' ),\n\t\t\t\t\t\ttip: LLMS.l10n.translate( \"Free lessons can be accessed without enrollment.\" ),\n\t\t\t\t\t\ttype: 'switch',\n\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'require_passing_grade',\n\t\t\t\t\t\tid: 'require-passing-grade',\n\t\t\t\t\t\tlabel: LLMS.l10n.translate( 'Require Passing Grade on Quiz' ),\n\t\t\t\t\t\ttip: LLMS.l10n.translate( \"When enabled, students must pass this lesson's quiz before the lesson can be completed.\" ),\n\t\t\t\t\t\ttype: 'switch',\n\t\t\t\t\t\tcondition: function() {\n\t\t\t\t\t\t\treturn ( 'yes' === this.get( 'quiz_enabled' ) );\n\t\t\t\t\t\t},\n\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'require_assignment_passing_grade',\n\t\t\t\t\t\tid: 'require-assignment-passing-grade',\n\t\t\t\t\t\tlabel: LLMS.l10n.translate( 'Require Passing Grade on Assignment' ),\n\t\t\t\t\t\ttip: LLMS.l10n.translate( \"When enabled, students must pass this lesson's assignment before the lesson can be completed.\" ),\n\t\t\t\t\t\ttype: 'switch',\n\t\t\t\t\t\tcondition: function() {\n\t\t\t\t\t\t\treturn ( 'undefined' !== window.llms_builder.assignments && 'yes' === this.get( 'assignment_enabled' ) );\n\t\t\t\t\t\t},\n\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'points',\n\t\t\t\t\t\tid: 'points',\n\t\t\t\t\t\tlabel: LLMS.l10n.translate( 'Lesson Weight' ),\n\t\t\t\t\t\tlabel_after: LLMS.l10n.translate( 'POINTS' ),\n\t\t\t\t\t\tmin: 0,\n\t\t\t\t\t\tmax: 99,\n\t\t\t\t\t\ttip: LLMS.l10n.translate( 'Determines the weight of the lesson when calculating the overall grade of the course.' ),\n\t\t\t\t\t\ttip_position: 'top-left',\n\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\tcondition: function() {\n\t\t\t\t\t\t\treturn ( ( 'yes' === this.get( 'quiz_enabled' ) ) || ( 'undefined' !== window.llms_builder.assignments && 'yes' === this.get( 'assignment_enabled' ) ) );\n\t\t\t\t\t\t},\n\t\t\t},\n\t\t\t\t], [\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'prerequisite',\n\t\t\t\t\t\tcondition: function() {\n\t\t\t\t\t\t\treturn ( false === this.is_first_in_course() );\n\t\t\t\t\t\t},\n\t\t\t\t\t\tid: 'prerequisite',\n\t\t\t\t\t\tlabel: LLMS.l10n.translate( 'Prerequisite' ),\n\t\t\t\t\t\tswitch_attribute: 'has_prerequisite',\n\t\t\t\t\t\ttype: 'switch-select',\n\t\t\t\t\t\toptions: function() {\n\t\t\t\t\t\t\treturn this.get_available_prereq_options();\n\t\t\t\t\t\t},\n\t\t\t},\n\t\t\t\t], [\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'drip_method',\n\t\t\t\t\t\tid: 'drip-method',\n\t\t\t\t\t\tlabel: LLMS.l10n.translate( 'Drip Method' ),\n\t\t\t\t\t\tswitch_attribute: 'drip_method',\n\t\t\t\t\t\ttype: 'select',\n\t\t\t\t\t\toptions: function() {\n\n\t\t\t\t\t\t\tvar options = [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tkey: '',\n\t\t\t\t\t\t\t\t\tval: LLMS.l10n.translate( 'None' ),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tkey: 'date',\n\t\t\t\t\t\t\t\t\tval: LLMS.l10n.translate( 'On a specific date' ),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tkey: 'enrollment',\n\t\t\t\t\t\t\t\t\tval: LLMS.l10n.translate( '# of days after course enrollment' ),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t];\n\n\t\t\t\t\t\t\tif ( this.get_course() && this.get_course().get( 'start_date' ) ) {\n\t\t\t\t\t\t\t\toptions.push( {\n\t\t\t\t\t\t\t\t\tkey: 'start',\n\t\t\t\t\t\t\t\t\tval: LLMS.l10n.translate( '# of days after course start date' ),\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( 'yes' === this.get( 'has_prerequisite' ) ) {\n\t\t\t\t\t\t\t\toptions.push( {\n\t\t\t\t\t\t\t\t\tkey: 'prerequisite',\n\t\t\t\t\t\t\t\t\tval: LLMS.l10n.translate( '# of days after prerequisite lesson completion' ),\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn options;\n\n\t\t\t\t\t\t},\n\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'days_before_available',\n\t\t\t\t\t\tcondition: function() {\n\t\t\t\t\t\t\treturn ( -1 !== [ 'enrollment', 'start', 'prerequisite' ].indexOf( this.get( 'drip_method' ) ) );\n\t\t\t\t\t\t},\n\t\t\t\t\t\tid: 'days-before-available',\n\t\t\t\t\t\tlabel: LLMS.l10n.translate( '# of days' ),\n\t\t\t\t\t\tmin: 0,\n\t\t\t\t\t\ttype: 'number',\n\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'date_available',\n\t\t\t\t\t\tdate_format: 'Y-m-d',\n\t\t\t\t\t\tcondition: function() {\n\t\t\t\t\t\t\treturn ( 'date' === this.get( 'drip_method' ) );\n\t\t\t\t\t\t},\n\t\t\t\t\t\tid: 'date-available',\n\t\t\t\t\t\tlabel: LLMS.l10n.translate( 'Date' ),\n\t\t\t\t\t\ttimepicker: 'false',\n\t\t\t\t\t\ttype: 'datepicker',\n\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tattribute: 'time_available',\n\t\t\t\t\t\tcondition: function() {\n\t\t\t\t\t\t\treturn ( 'date' === this.get( 'drip_method' ) );\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdatepicker: 'false',\n\t\t\t\t\t\tdate_format: 'h:i A',\n\t\t\t\t\t\tid: 'time-available',\n\t\t\t\t\t\tlabel: LLMS.l10n.translate( 'Time' ),\n\t\t\t\t\t\ttype: 'datepicker',\n\t\t\t},\n\t\t\t\t],\n\t\t\t],\n\t\t},\n\n\t} );\n\n} );\n\n","/**\n * Lesson Model\n *\n * @since 3.13.0\n * @version 4.20.0\n */\ndefine( 'Models/Lesson',[ 'Models/Quiz', 'Models/_Relationships', 'Models/_Utilities', 'Schemas/Lesson' ], function( Quiz, Relationships, Utilities, LessonSchema ) {\n\n\treturn Backbone.Model.extend( _.defaults( {\n\n\t\t/**\n\t\t * Model relationships\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\trelationships: {\n\t\t\tparents: {\n\t\t\t\tmodel: 'section',\n\t\t\t\ttype: 'model',\n\t\t\t},\n\t\t\tchildren: {\n\t\t\t\tquiz: {\n\t\t\t\t\tclass: 'Quiz',\n\t\t\t\t\tconditional: function( model ) {\n\t\t\t\t\t\t// if quiz is enabled OR not enabled but we have some quiz data as an obj\n\t\t\t\t\t\treturn ( 'yes' === model.get( 'quiz_enabled' ) || ! _.isEmpty( model.get( 'quiz' ) ) );\n\t\t\t\t\t},\n\t\t\t\t\tmodel: 'llms_quiz',\n\t\t\t\t\ttype: 'model',\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\n\t\t/**\n\t\t * Lesson Settings Schema\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tschema: LessonSchema,\n\n\t\t/**\n\t\t * New lesson defaults\n\t\t *\n\t\t * @since 3.13.0\n\t\t * @since 3.24.0 Unknown.\n\t\t *\n\t\t * @return {Object} Default options associative array (js object).\n\t\t */\n\t\tdefaults: function() {\n\t\t\treturn {\n\t\t\t\tid: _.uniqueId( 'temp_' ),\n\t\t\t\ttitle: LLMS.l10n.translate( 'New Lesson' ),\n\t\t\t\ttype: 'lesson',\n\t\t\t\torder: this.collection ? this.collection.length + 1 : 1,\n\t\t\t\tparent_course: window.llms_builder.course.id,\n\t\t\t\tparent_section: '',\n\n\t\t\t\t// Urls.\n\t\t\t\tedit_url: '',\n\t\t\t\tview_url: '',\n\n\t\t\t\t// Editable fields.\n\t\t\t\tcontent: '',\n\t\t\t\taudio_embed: '',\n\t\t\t\thas_prerequisite: 'no',\n\t\t\t\trequire_passing_grade: 'yes',\n\t\t\t\trequire_assignment_passing_grade: 'yes',\n\t\t\t\tvideo_embed: '',\n\t\t\t\tfree_lesson: '',\n\t\t\t\tpoints: 1,\n\n\t\t\t\t// Other fields.\n\t\t\t\tassignment: {}, // Assignment model/data.\n\t\t\t\tassignment_enabled: 'no',\n\n\t\t\t\tquiz: {}, // Quiz model/data.\n\t\t\t\tquiz_enabled: 'no',\n\n\t\t\t\t_forceSync: false,\n\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Initializer\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 3.17.0 Unknown\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tinitialize: function() {\n\n\t\t\tthis.init_custom_schema();\n\t\t\tthis.startTracking();\n\t\t\tthis.maybe_init_assignments();\n\t\t\tthis.init_relationships();\n\n\t\t\t// If the lesson ID isn't set on a quiz, set it.\n\t\t\tvar quiz = this.get( 'quiz' );\n\t\t\tif ( ! _.isEmpty( quiz ) && ! quiz.get( 'lesson_id' ) ) {\n\t\t\t\tquiz.set( 'lesson_id', this.get( 'id' ) );\n\t\t\t}\n\n\t\t\twindow.llms.hooks.doAction( 'llms_lesson_model_init', this );\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve a reference to the parent course of the lesson\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 4.14.0 Use Section.get_course() in favor of Section.get_parent().\n\t\t *\n\t\t * @return {Object} The parent course model of the lesson.\n\t\t */\n\t\tget_course: function() {\n\t\t\treturn this.get_parent().get_course();\n\t\t},\n\n\t\t/**\n\t\t * Retrieve the translated post type name for the model's type\n\t\t *\n\t\t * @since 3.16.12\n\t\t *\n\t\t * @param bool plural If true, returns the plural, otherwise returns singular.\n\t\t * @return string The translated post type name.\n\t\t */\n\t\tget_l10n_type: function( plural ) {\n\n\t\t\tif ( plural ) {\n\t\t\t\treturn LLMS.l10n.translate( 'lessons' );\n\t\t\t}\n\n\t\t\treturn LLMS.l10n.translate( 'lesson' );\n\t\t},\n\n\t\t/**\n\t\t * Override default get_parent to grab from collection if models parent isn't set\n\t\t *\n\t\t * @since 3.17.0\n\t\t *\n\t\t * @return {Object}|false The parent model or false if not available.\n\t\t */\n\t\tget_parent: function() {\n\n\t\t\tvar rels = this.get_relationships();\n\t\t\tif ( rels.parent && rels.parent.reference ) {\n\t\t\t\treturn rels.parent.reference;\n\t\t\t} else if ( this.collection && this.collection.parent ) {\n\t\t\t\treturn this.collection.parent;\n\t\t\t}\n\t\t\treturn false;\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve the questions percentage value within the quiz\n\t\t *\n\t\t * @since 3.24.0\n\t\t *\n\t\t * @return {String} Questions percentage value within the quiz.\n\t\t */\n\t\tget_points_percentage: function() {\n\n\t\t\tvar total = this.get_course().get_total_points(),\n\t\t\t\tpoints = this.get( 'points' ) * 1;\n\n\t\t\tif ( ! _.isNumber( points ) ) {\n\t\t\t\tpoints = 0;\n\t\t\t}\n\n\t\t\tif ( 0 === total ) {\n\t\t\t\treturn '0%';\n\t\t\t}\n\n\t\t\treturn ( ( points / total ) * 100 ).toFixed( 2 ) + '%';\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve an array of prerequisite options available for the current lesson\n\t\t *\n\t\t * @since 3.17.0\n\t\t *\n\t\t * @return {Object} Prerequisite options.\n\t\t */\n\t\tget_available_prereq_options: function() {\n\n\t\t\tvar parent_section_index = this.get_parent().collection.indexOf( this.get_parent() ),\n\t\t\t\tlesson_index_in_section = this.collection.indexOf( this ),\n\t\t\t\toptions = [];\n\n\t\t\tthis.get_course().get( 'sections' ).each( function( section, curr_sec_index ) {\n\t\t\t\tif ( curr_sec_index <= parent_section_index ) {\n\t\t\t\t\tvar group = {\n\t\t\t\t\t\t\t// Translators: %1$d = section order number, %2$s = section title.\n\t\t\t\t\t\tlabel: LLMS.l10n.replace( 'Section %1$d: %2$s', {\n\t\t\t\t\t\t\t'%1$d': section.get( 'order' ),\n\t\t\t\t\t\t\t'%2$s': section.get( 'title' )\n\t\t\t\t\t\t} ),\n\t\t\t\t\toptions: [],\n\t\t\t\t\t};\n\n\t\t\t\t\tsection.get( 'lessons' ).each( function( lesson, curr_les_index ) {\n\t\t\t\t\t\tif ( curr_sec_index !== parent_section_index || curr_les_index < lesson_index_in_section ) {\n\t\t\t\t\t\t\t// Translators: %1$d = lesson order number, %2$s = lesson title.\n\t\t\t\t\t\t\tgroup.options.push( {\n\t\t\t\t\t\t\t\tkey: lesson.get( 'id' ),\n\t\t\t\t\t\t\t\tval: LLMS.l10n.replace( 'Lesson %1$d: %2$s', {\n\t\t\t\t\t\t\t\t\t'%1$d': lesson.get( 'order' ),\n\t\t\t\t\t\t\t\t\t'%2$s': lesson.get( 'title' )\n\t\t\t\t\t\t\t\t} ),\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}, this );\n\n\t\t\t\t\toptions.push( group );\n\t\t\t\t}\n\t\t\t}, this );\n\n\t\t\treturn options;\n\n\t\t},\n\n\t\t/**\n\t\t * Add a new quiz to the lesson\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 3.27.0 Unknown.\n\t\t *\n\t\t * @param {Object} data Object of quiz data used to construct a new quiz model.\n\t\t * @return {Object} Model for the created quiz.\n\t\t */\n\t\tadd_quiz: function( data ) {\n\n\t\t\tdata = data || {};\n\n\t\t\tdata.lesson_id = this.id;\n\t\t\tdata._questions_loaded = true;\n\n\t\t\tif ( ! data.title ) {\n\n\t\t\t\tdata.title = LLMS.l10n.replace( '%1$s Quiz', {\n\t\t\t\t\t'%1$s': this.get( 'title' ),\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tthis.set( 'quiz', data );\n\t\t\tthis.init_relationships();\n\n\t\t\tvar quiz = this.get( 'quiz' );\n\t\t\tthis.set( 'quiz_enabled', 'yes' );\n\n\t\t\twindow.llms.hooks.doAction( 'llms_lesson_add_quiz', quiz, this );\n\n\t\t\treturn quiz;\n\n\t\t},\n\n\t\t/**\n\t\t * Determine if this is the first lesson\n\t\t *\n\t\t * @since 3.17.0\n\t\t * @since 4.20.0 Use is_first_in_section() new method.\n\t\t *\n\t\t * @return {Boolean} Whether this is the first lesson of its course.\n\t\t */\n\t\tis_first_in_course: function() {\n\n\t\t\t// If it's not the first item in the section it cant be the first lesson.\n\t\t\tif ( ! this.is_first_in_section() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// If it's not the first section it cant' be first lesson.\n\t\t\tvar section = this.get_parent();\n\t\t\tif ( section.collection.indexOf( section ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// It's first lesson in first section.\n\t\t\treturn true;\n\n\t\t},\n\n\t\t/**\n\t\t * Determine if this is the last lesson of the course\n\t\t *\n\t\t * @since 4.20.0\n\t\t *\n\t\t * @return {Boolean} Whether this is the last lesson of its course.\n\t\t */\n\t\t is_last_in_course: function() {\n\n\t\t\t// If it's not last item in the section it cant be the last lesson.\n\t\t\tif ( ! this.is_last_in_section() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// If it's not the last section it cant' be last lesson.\n\t\t\tvar section = this.get_parent();\n\t\t\tif ( section.collection.indexOf( section ) < ( section.collection.size() - 1 ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// It's last lesson in last section.\n\t\t\treturn true;\n\n\t\t},\n\n\t\t/**\n\t\t * Determine if this is the first lesson within its section\n\t\t *\n\t\t * @since 4.20.0\n\t\t *\n\t\t * @return {Boolean} Whether this is the first lesson of its section.\n\t\t */\n\t\tis_first_in_section: function() {\n\t\t\treturn 0 === this.collection.indexOf( this );\n\t\t},\n\n\t\t/**\n\t\t * Determine if this is the last lesson within its section\n\t\t *\n\t\t * @since 4.20.0\n\t\t *\n\t\t * @return {Boolean} Whether this is the last lesson of its section.\n\t\t */\n\t\tis_last_in_section: function() {\n\t\t\treturn this.collection.indexOf( this ) === ( this.collection.size() - 1 );\n\t\t},\n\n\t\t/**\n\t\t * Get prev lesson in a course\n\t\t *\n\t\t * @since 4.20.0\n\t\t *\n\t\t * @param {String} status Prev lesson post status. If not specified any status will be taken into account.\n\t\t * @return {Object}|false Previous lesson model or `false` if no previous lesson could be found.\n\t\t */\n\t\tget_prev: function( status ) {\n\t\t\treturn this.get_sibling( 'prev', status );\n\t\t},\n\n\t\t/**\n\t\t * Get next lesson in a course\n\t\t *\n\t\t * @since 4.20.0\n\t\t *\n\t\t * @param {String} status Next lesson post status. If not specified any status will be taken into account.\n\t\t * @return {Object}|false Next lesson model or `false` if no next lesson could be found.\n\t\t */\n\t\tget_next: function( status ) {\n\t\t\treturn this.get_sibling( 'next', status );\n\t\t},\n\n\t\t/**\n\t\t * Get a sibling lesson\n\t\t *\n\t\t * @param {String} direction Siblings direction [next|prev]. If not specified will fall back on 'prev'.\n\t\t * @param {String} status Sibling lesson post status. If not specified any status will be taken into account.\n\t\t * @return {Object}|false Sibling lesson model, in the specified direction, or `false` if no sibling lesson could be found.\n\t\t */\n\t\tget_sibling: function( direction, status ) {\n\n\t\t\tdirection = 'next' === direction ? direction : 'prev';\n\n\t\t\t// Functions and vars to use when direction is 'prev' (default).\n\t\t\tvar is_course_limit_reached_f = 'is_first_in_course',\n\t\t\t\tis_section_limit_reached_f = 'is_first_in_section',\n\t\t\t\tsibling_index_increment = -1,\n\t\t\t\tget_sibling_lesson_in_sibling_section_f = 'last';\n\n\t\t\tif ( 'next' === direction ) {\n\t\t\t\tis_course_limit_reached_f = 'is_last_in_course';\n\t\t\t\tis_section_limit_reached_f = 'is_last_in_section';\n\t\t\t\tsibling_index_increment = 1,\n\t\t\t\tget_sibling_lesson_in_sibling_section_f = 'first';\n\t\t\t}\n\n\t\t\tif ( this[ is_course_limit_reached_f ]() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar sibling_index = this.collection.indexOf( this ) + sibling_index_increment,\n\t\t\t\tsibling_lesson = this.collection.at( sibling_index );\n\n\t\t\tif ( this[ 'next' === direction ? 'is_last_in_section' : 'is_first_in_section' ]() ) {\n\t\t\t\tvar cur_section = this.get_parent(),\n\t\t\t\t\tsibling_section = cur_section[ 'get_' + direction ]( false );\n\n\t\t\t\t// Skip sibling empty sections.\n\t\t\t\twhile ( sibling_section && ! sibling_section.get( 'lessons' ).size() ) {\n\t\t\t\t\tsibling_section = sibling_section[ 'get_' + direction ]( false );\n\t\t\t\t}\n\n\t\t\t\t// Couldn't find any suitable lesson.\n\t\t\t\tif ( ! sibling_section || ! sibling_section.get( 'lessons' ).size() ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tsibling_lesson = sibling_section.get( 'lessons' )[ get_sibling_lesson_in_sibling_section_f ]();\n\n\t\t\t}\n\n\t\t\t// If we need a specific lesson status.\n\t\t\tif ( status && status !== sibling_lesson.get( 'status' ) ) {\n\t\t\t\treturn sibling_lesson.get_sibling( direction, status );\n\t\t\t}\n\n\t\t\treturn sibling_lesson;\n\n\t\t},\n\n\t\t/**\n\t\t * Initialize lesson assignments *if* the assignments addon is available and enabled\n\t\t *\n\t\t * @since 3.17.0\n\t\t *\n\t\t * @return {Void}\n\t\t */\n\t\tmaybe_init_assignments: function() {\n\n\t\t\tif ( ! window.llms_builder.assignments ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.relationships.children.assignment = {\n\t\t\t\tclass: 'Assignment',\n\t\t\t\tconditional: function( model ) {\n\t\t\t\t\t// If assignment is enabled OR not enabled but we have some assignment data as an obj.\n\t\t\t\t\treturn ( 'yes' === model.get( 'assignment_enabled' ) || ! _.isEmpty( model.get( 'assignment' ) ) );\n\t\t\t\t},\n\t\t\t\tmodel: 'llms_assignment',\n\t\t\t\ttype: 'model',\n\t\t\t};\n\n\t\t},\n\n\t}, Relationships, Utilities ) );\n\n} );\n\n","/**\n * Lessons Collection\n *\n * @since 3.13.0\n * @version 3.17.0\n */\ndefine( 'Collections/Lessons',[ 'Models/Lesson' ], function( model ) {\n\n\treturn Backbone.Collection.extend( {\n\n\t\t/**\n\t\t * Model for collection items\n\t\t *\n\t\t * @type obj\n\t\t */\n\t\tmodel: model,\n\n\t\t/**\n\t\t * Initializer\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.17.0\n\t\t */\n\t\tinitialize: function() {\n\n\t\t\t// reorder called by LessonList view when sortable drops occur\n\t\t\tthis.on( 'reorder', this.on_reorder );\n\n\t\t\t// when a lesson is added or removed, update order\n\t\t\tthis.on( 'add', this.on_reorder );\n\t\t\tthis.on( 'remove', this.on_reorder );\n\n\t\t},\n\n\t\t/**\n\t\t * On lesson reorder callback\n\t\t *\n\t\t * Update the order attr of each lesson to reflect the new lesson order\n\t\t * Validate prerequisite (if set) and unset it if it's no longer a valid prereq\n\t\t *\n\t\t * @return void\n\t\t * @since 3.17.0\n\t\t * @version 3.17.0\n\t\t */\n\t\ton_reorder: function() {\n\t\t\tthis.update_order();\n\t\t\tthis.validate_prereqs();\n\t\t},\n\n\t\t/**\n\t\t * Update lesson order attribute of all lessons when lessons are reordered\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.17.0\n\t\t */\n\t\tupdate_order: function() {\n\n\t\t\tthis.each( function( lesson ) {\n\t\t\t\tlesson.set( 'order', this.indexOf( lesson ) + 1 );\n\t\t\t}, this );\n\n\t\t},\n\n\t\t/**\n\t\t * Validate prerequisite (if set) and unset it if it's no longer a valid prereq\n\t\t *\n\t\t * @return void\n\t\t * @since 3.17.0\n\t\t * @version 3.17.0\n\t\t */\n\t\tvalidate_prereqs: function() {\n\n\t\t\tthis.each( function( lesson ) {\n\n\t\t\t\t// validate prereqs\n\t\t\t\tif ( 'yes' === lesson.get( 'has_prerequisite' ) ) {\n\t\t\t\t\tvar valid = _.pluck( _.flatten( _.pluck( lesson.get_available_prereq_options(), 'options' ) ), 'key' );\n\t\t\t\t\tif ( -1 === valid.indexOf( lesson.get( 'prerequisite' ) * 1 ) ) {\n\t\t\t\t\t\tlesson.set( {\n\t\t\t\t\t\t\tprerequisite: 0,\n\t\t\t\t\t\t\thas_prerequisite: 'no',\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}, this );\n\n\t\t},\n\n\t} );\n\n} );\n\n","/**\n * Quiz Question Type Collection\n *\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'Collections/QuestionTypes',[ 'Models/QuestionType' ], function( model ) {\n\n\treturn Backbone.Collection.extend( {\n\n\t\t/**\n\t\t * Model for collection items\n\t\t *\n\t\t * @type obj\n\t\t */\n\t\tmodel: model,\n\n\t\t/**\n\t\t * Initializer\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tinitialize: function() {\n\n\t\t\tthis.on( 'add', this.comparator );\n\t\t\tthis.on( 'remove', this.comparator );\n\n\t\t},\n\n\t\t/**\n\t\t * Comparator (sorts collection)\n\t\t *\n\t\t * @param obj model QuestionType model\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tcomparator: function( model ) {\n\n\t\t\treturn model.get( 'group' ).order;\n\n\t\t},\n\n\t} );\n\n} );\n\n","/**\n * Section Model\n *\n * @since 3.16.0\n * @version 4.20.0\n */\ndefine( 'Models/Section',[ 'Collections/Lessons', 'Models/_Relationships' ], function( Lessons, Relationships ) {\n\n\treturn Backbone.Model.extend( _.defaults( {\n\n\t\trelationships: {\n\t\t\tparent: {\n\t\t\t\tmodel: 'course',\n\t\t\t\ttype: 'model',\n\t\t\t},\n\t\t\tchildren: {\n\t\t\t\tlessons: {\n\t\t\t\t\tclass: 'Lessons',\n\t\t\t\t\tmodel: 'lesson',\n\t\t\t\t\ttype: 'collection',\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * New section defaults\n\t\t *\n\t\t * @since 3.16.0\n\t\t *\n\t\t * @return {Object}\n\t\t */\n\t\tdefaults: function() {\n\t\t\treturn {\n\t\t\t\tid: _.uniqueId( 'temp_' ),\n\t\t\t\tlessons: [],\n\t\t\t\torder: this.collection ? this.collection.length + 1 : 1,\n\t\t\t\tparent_course: window.llms_builder.course.id,\n\t\t\t\ttitle: LLMS.l10n.translate( 'New Section' ),\n\t\t\t\ttype: 'section',\n\n\t\t\t\t_expanded: false,\n\t\t\t\t_selected: false,\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Initialize\n\t\t *\n\t\t * @since 3.16.0\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tinitialize: function() {\n\n\t\t\tthis.startTracking();\n\t\t\tthis.init_relationships();\n\n\t\t},\n\n\t\t/**\n\t\t * Add a lesson to the section\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 3.16.11 Unknown.\n\t\t *\n\t\t * @param {Object} data Hash of lesson data (creates new lesson)\n\t\t * or existing lesson as a Backbone.Model.\n\t\t * @param {Object} options Hash of options.\n\t\t * @return {Object} Backbone.Model of the new/updated lesson.\n\t\t */\n\t\tadd_lesson: function( data, options ) {\n\n\t\t\tdata = data || {};\n\t\t\toptions = options || {};\n\n\t\t\tif ( data instanceof Backbone.Model ) {\n\t\t\t\tdata.set( 'parent_section', this.get( 'id' ) );\n\t\t\t\tdata.set_parent( this );\n\t\t\t} else {\n\t\t\t\tdata.parent_section = this.get( 'id' );\n\t\t\t}\n\n\t\t\treturn this.get( 'lessons' ).add( data, options );\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve the translated post type name for the model's type\n\t\t *\n\t\t * @since 3.16.12\n\t\t *\n\t\t * @param {Boolean} plural If true, returns the plural, otherwise returns singular.\n\t\t * @return {String}\n\t\t */\n\t\tget_l10n_type: function( plural ) {\n\n\t\t\tif ( plural ) {\n\t\t\t\treturn LLMS.l10n.translate( 'sections' );\n\t\t\t}\n\n\t\t\treturn LLMS.l10n.translate( 'section' );\n\t\t},\n\n\t\t/**\n\t\t * Get next section in the collection\n\t\t *\n\t\t * @since 3.16.11\n\t\t *\n\t\t * @param {boolean} circular If true handles the collection in a circle.\n\t\t * If current is the last section, returns the first section.\n\t\t * @return {Object}|false\n\t\t */\n\t\tget_next: function( circular ) {\n\t\t\treturn this._get_sibling( 'next', circular );\n\t\t},\n\n\t\t/**\n\t\t * Retrieve a reference to the parent course of the section\n\t\t *\n\t\t * @since 4.14.0\n\t\t *\n\t\t * @return {Object}\n\t\t */\n\t\tget_course: function() {\n\n\t\t\t// When working with an unsaved draft course the parent isn't properly set on the creation of a section.\n\t\t\tif ( ! this.get_parent() ) {\n\t\t\t\tthis.set_parent( window.llms_builder.CourseModel );\n\t\t\t}\n\n\t\t\treturn this.get_parent();\n\n\t\t},\n\n\t\t/**\n\t\t * Get prev section in the collection\n\t\t *\n\t\t * @since 3.16.11\n\t\t *\n\t\t * @param {Boolean} circular If true handles the collection in a circle.\n\t\t * If current is the first section, returns the last section.\n\t\t * @return {Object}|false\n\t\t */\n\t\tget_prev: function( circular ) {\n\t\t\treturn this._get_sibling( 'prev', circular );\n\t\t},\n\n\t\t/**\n\t\t * Get a sibling section\n\t\t *\n\t\t * @since 3.16.11\n\t\t * @since 4.20.0 Fix case when the last section was returned when looking for the prev of the first section and not `circular`.\n\t\t *\n\t\t * @param {String} direction Siblings direction [next|prev].\n\t\t * @param {Boolean} circular If true handles the collection in a circle.\n\t\t * If current is the last section, returns the first section.\n\t\t * If current is the first section, returns the last section.\n\t\t * @return {Object}|false\n\t\t */\n\t\t_get_sibling: function( direction, circular ) {\n\n\t\t\tcircular = ( 'undefined' === circular ) ? true : circular;\n\n\t\t\tvar max = this.collection.size() - 1,\n\t\t\t\tindex = this.collection.indexOf( this ),\n\t\t\t\tsibling_index;\n\n\t\t\tif ( 'next' === direction ) {\n\t\t\t\tsibling_index = index + 1;\n\t\t\t} else if ( 'prev' === direction ) {\n\t\t\t\tsibling_index = index - 1;\n\t\t\t}\n\n\t\t\t// Don't retrieve greater than max or less than min.\n\t\t\tif ( sibling_index <= max || sibling_index >= 0 ) {\n\n\t\t\t\treturn this.collection.at( sibling_index );\n\n\t\t\t} else if ( circular ) {\n\n\t\t\t\tif ( 'next' === direction ) {\n\t\t\t\t\treturn this.collection.first();\n\t\t\t\t} else if ( 'prev' === direction ) {\n\t\t\t\t\treturn this.collection.last();\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t}, Relationships ) );\n\n} );\n\n","/**\n * Sections Collection\n *\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'Collections/Sections',[ 'Models/Section' ], function( model ) {\n\n\treturn Backbone.Collection.extend( {\n\n\t\t/**\n\t\t * Model for collection items\n\t\t *\n\t\t * @type obj\n\t\t */\n\t\tmodel: model,\n\n\t\t/**\n\t\t * Initialize\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tinitialize: function() {\n\n\t\t\tvar self = this;\n\n\t\t\t// reorder called by SectionList view when sortable drops occur\n\t\t\tthis.on( 'reorder', this.update_order );\n\n\t\t\t// when a section is added or removed, update order\n\t\t\tthis.on( 'add', this.update_order );\n\t\t\tthis.on( 'remove', this.update_order );\n\n\t\t},\n\n\t\t/**\n\t\t * Update the order attr of each section in the list to reflect the order of the collection\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tupdate_order: function() {\n\n\t\t\tvar self = this;\n\n\t\t\tthis.each( function( section ) {\n\n\t\t\t\tsection.set( 'order', self.indexOf( section ) + 1 );\n\n\t\t\t} );\n\n\t\t},\n\n\t} );\n\n} );\n\n","/**\n * Lessons Collection\n *\n * @since 3.13.0\n * @version 3.16.0\n */\ndefine( 'Collections/loader',[\n\t\t'Collections/Lessons',\n\t\t'Collections/QuestionChoices',\n\t\t'Collections/Questions',\n\t\t'Collections/QuestionTypes',\n\t\t'Collections/Sections'\n\t], function(\n\t\tLessons,\n\t\tQuestionChoices,\n\t\tQuestions,\n\t\tQuestionTypes,\n\t\tSections\n\t) {\n\n\t\treturn {\n\t\t\tLessons: Lessons,\n\t\t\tQuestionChoices: QuestionChoices,\n\t\t\tQuestions: Questions,\n\t\t\tQuestionTypes: QuestionTypes,\n\t\t\tSections: Sections,\n\t\t};\n\n} );\n\n","/**\n * Abstract LifterLMS Model\n *\n * @since 3.17.0\n * @version 3.17.0\n */\ndefine( 'Models/Abstract',[ 'Models/_Relationships', 'Models/_Utilities' ], function( Relationships, Utilities ) {\n\n\treturn Backbone.Model.extend( _.defaults( {}, Relationships, Utilities ) );\n\n} );\n\n","/**\n * Course Model.\n *\n * @since 3.16.0\n * @since 3.24.0 Added `get_total_points()` method.\n * @since 3.37.11 Use lesson author ID instead of author object when adding existing lessons to a course.\n * @version 5.4.0\n */\ndefine( 'Models/Course',[ 'Collections/Sections', 'Models/_Relationships', 'Models/_Utilities' ], function( Sections, Relationships, Utilities ) {\n\n\treturn Backbone.Model.extend( _.defaults( {\n\n\t\trelationships: {\n\t\t\tchildren: {\n\t\t\t\tsections: {\n\t\t\t\t\tclass: 'Sections',\n\t\t\t\t\tmodel: 'section',\n\t\t\t\t\ttype: 'collection',\n\t\t\t\t},\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * New Course Defaults.\n\t\t *\n\t\t * @since 3.16.0\n\t\t *\n\t\t * @return {Object}\n\t\t */\n\t\tdefaults: function() {\n\t\t\treturn {\n\t\t\t\tedit_url: '',\n\t\t\t\tsections: [],\n\t\t\t\ttitle: 'New Course',\n\t\t\t\ttype: 'course',\n\t\t\t\tview_url: '',\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Init.\n\t\t *\n\t\t * @since 3.16.0\n\t\t *\n\t\t * @return {Void}\n\t\t */\n\t\tinitialize: function() {\n\n\t\t\tthis.startTracking();\n\t\t\tthis.init_relationships();\n\n\t\t\t// Sidebar \"New Section\" button broadcast.\n\t\t\tBackbone.pubSub.on( 'add-new-section', this.add_section, this );\n\n\t\t\t// Sidebar \"New Lesson\" button broadcast.\n\t\t\tBackbone.pubSub.on( 'add-new-lesson', this.add_lesson, this );\n\n\t\t\tBackbone.pubSub.on( 'lesson-search-select', this.add_existing_lesson, this );\n\n\t\t},\n\n\t\t/**\n\t\t * Add an existing lesson to the course.\n\t\t *\n\t\t * Duplicate a lesson from this or another course or attach an orphaned lesson.\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 3.24.0 Unknown.\n\t\t * @since 3.37.11 Use the author id instead of the author object.\n\t\t * @since 5.4.0 Added filter hook 'llms_adding_existing_lesson_data'.\n\t\t * On cloning, duplicate assignments too, if assignment add-on active and assignment attached.\n\t\t *\n\t\t * @param {Object} lesson Lesson data obj.\n\t\t * @return {Void}\n\t\t */\n\t\tadd_existing_lesson: function( lesson ) {\n\n\t\t\tvar data = lesson.data;\n\n\t\t\tif ( 'clone' === lesson.action ) {\n\n\t\t\t\tdelete data.id;\n\n\t\t\t\t// If a quiz is attached, duplicate the quiz also.\n\t\t\t\tif ( data.quiz ) {\n\t\t\t\t\tdata.quiz = _.prepareQuizObjectForCloning( data.quiz );\n\t\t\t\t\tdata.quiz._questions_loaded = true;\n\t\t\t\t}\n\n\t\t\t\t// If assignment add-on active and assignment attached, duplicate the assignment too.\n\t\t\t\tif ( window.llms_builder.assignments && data.assignment ) {\n\t\t\t\t\tdata.assignment = _.prepareAssignmentObjectForCloning( data.assignment );\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdata._forceSync = true;\n\n\t\t\t}\n\n\t\t\tdelete data.order;\n\t\t\tdelete data.parent_course;\n\t\t\tdelete data.parent_section;\n\n\t\t\t// Use author id instead of the lesson author object.\n\t\t\tdata = _.prepareExistingPostObjectDataForAddingOrCloning( data );\n\n\t\t\t/**\n\t\t\t * Filters the data of the existing lesson being added.\n\t\t\t *\n\t\t\t * @since 5.4.0\n\t\t\t *\n\t\t\t * @param {Object} data Lesson data.\n\t\t\t * @param {String} action Action being performed. [clone|attach].\n\t\t\t * @param {Object} course The lesson's course parent model.\n\t\t\t */\n\t\t\tdata = window.llms.hooks.applyFilters( 'llms_adding_existing_lesson_data', data, lesson.action, this );\n\n\t\t\tthis.add_lesson( data );\n\n\t\t},\n\n\t\t/**\n\t\t * Add a new lesson to the course.\n\t\t *\n\t\t * @since 3.16.0\n\t\t *\n\t\t * @param {Object} data Lesson data.\n\t\t * @return {Object} Backbone.Model of the lesson.\n\t\t */\n\t\tadd_lesson: function( data ) {\n\n\t\t\tdata = data || {};\n\t\t\tvar options = {},\n\t\t\t\tsection;\n\n\t\t\tif ( ! data.parent_section ) {\n\t\t\t\tsection = this.get_selected_section();\n\t\t\t\tif ( ! section ) {\n\t\t\t\t\tsection = this.get( 'sections' ).last();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsection = this.get( 'sections' ).get( data.parent_section );\n\t\t\t}\n\n\t\t\tdata._selected = true;\n\n\t\t\tdata.parent_course = this.get( 'id' );\n\n\t\t\tvar lesson = section.add_lesson( data, options );\n\t\t\tBackbone.pubSub.trigger( 'new-lesson-added', lesson );\n\n\t\t\t// Expand the section.\n\t\t\tsection.set( '_expanded', true );\n\n\t\t\treturn lesson;\n\n\t\t},\n\n\t\t/**\n\t\t * Add a new section to the course.\n\t\t *\n\t\t * @since 3.16.0\n\t\t *\n\t\t * @param {Object} data Section data.\n\t\t * @return {Void}\n\t\t */\n\t\tadd_section: function( data ) {\n\n\t\t\tdata = data || {};\n\t\t\tvar sections = this.get( 'sections' ),\n\t\t\t\toptions = {},\n\t\t\t\tselected = this.get_selected_section();\n\n\t\t\t// If a section is selected, add the new section after the currently selected one.\n\t\t\tif ( selected ) {\n\t\t\t\toptions.at = sections.indexOf( selected ) + 1;\n\t\t\t}\n\n\t\t\tsections.add( data, options );\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve the currently selected section in the course.\n\t\t *\n\t\t * @since 3.16.0\n\t\t *\n\t\t * @return {Object|undefined}\n\t\t */\n\t\tget_selected_section: function() {\n\n\t\t\treturn this.get( 'sections' ).find( function( model ) {\n\t\t\t\treturn model.get( '_selected' );\n\t\t\t} );\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve the total number of points in the course.\n\t\t *\n\t\t * @since 3.24.0\n\t\t *\n\t\t * @return {Integer}\n\t\t */\n\t\tget_total_points: function() {\n\n\t\t\tvar points = 0;\n\n\t\t\tthis.get( 'sections' ).each( function( section ) {\n\t\t\t\tsection.get( 'lessons' ).each( function( lesson ) {\n\t\t\t\t\tvar lesson_points = lesson.get( 'points' );\n\t\t\t\t\tif ( ! _.isNumber( lesson_points ) ) {\n\t\t\t\t\t\tlesson_points = 0;\n\t\t\t\t\t}\n\t\t\t\t\tpoints += lesson_points * 1;\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\treturn points;\n\n\t\t},\n\n\t}, Relationships, Utilities ) );\n\n} );\n\n","/**\n * Load all models\n *\n * @return obj\n * @since 3.16.0\n * @version 3.17.0\n */\ndefine( 'Models/loader',[\n\t\t'Models/Abstract',\n\t\t'Models/Course',\n\t\t'Models/Image',\n\t\t'Models/Lesson',\n\t\t'Models/Question',\n\t\t'Models/QuestionChoice',\n\t\t'Models/QuestionType',\n\t\t'Models/Quiz',\n\t\t'Models/Section'\n\t],\n\tfunction(\n\t\tAbstract,\n\t\tCourse,\n\t\tImage,\n\t\tLesson,\n\t\tQuestion,\n\t\tQuestionChoice,\n\t\tQuestionType,\n\t\tQuiz,\n\t\tSection\n\t) {\n\n\t\treturn {\n\t\t\tAbstract: Abstract,\n\t\t\tCourse: Course,\n\t\t\tImage: Image,\n\t\t\tLesson: Lesson,\n\t\t\tQuestion: Question,\n\t\t\tQuestionChoice: QuestionChoice,\n\t\t\tQuestionType: QuestionType,\n\t\t\tQuiz: Quiz,\n\t\t\tSection: Section,\n\t\t};\n\n} );\n\n","/**\n * Detachable model\n *\n * @package LifterLMS/Scripts\n *\n * @since 3.16.12\n * @version 3.16.12\n */\n\ndefine( 'Views/_Detachable',[], function() {\n\n\treturn {\n\n\t\t/**\n\t\t * DOM Events\n\t\t *\n\t\t * @type {Object}\n\t\t * @since 3.16.12\n\t\t * @version 3.16.12\n\t\t */\n\t\tevents: {\n\t\t\t'click a[href=\"#llms-detach-model\"]': 'detach_model',\n\t\t},\n\n\t\t/**\n\t\t * Detaches a model from it's parent (doesn't delete)\n\t\t *\n\t\t * @param obj event js event object\n\t\t * @return void\n\t\t * @since 3.16.12\n\t\t * @version 3.16.12\n\t\t */\n\t\tdetach_model: function( event ) {\n\n\t\t\tif ( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\n\t\t\tvar msg = LLMS.l10n.replace( 'Are you sure you want to detach this %s?', {\n\t\t\t\t'%s': this.model.get_l10n_type(),\n\t\t\t} );\n\n\t\t\tif ( window.confirm( msg ) ) {\n\n\t\t\t\tif ( this.model.collection ) {\n\t\t\t\t\tthis.model.collection.remove( this.model );\n\t\t\t\t}\n\n\t\t\t\t// publish global event\n\t\t\t\tBackbone.pubSub.trigger( 'model-detached', this.model );\n\n\t\t\t\t// trigger local event so extending views can run other actions where necessary\n\t\t\t\tthis.trigger( 'model-trashed', this.model );\n\n\t\t\t}\n\n\t\t},\n\n\t}\n\n} );\n\n","/**\n * Handles UX and Events for inline editing of views\n *\n * Use with a Model's View\n * Allows editing model.title field via .llms-editable-title elements\n *\n * @package LifterLMS/Scripts\n *\n * @since 3.16.0\n * @since 3.25.4 Unknown\n * @since 3.37.11 Replace reference to `wp.editor` with `_.getEditor()` helper.\n * @version 3.37.11\n */\ndefine( 'Views/_Editable',[], function() {\n\n\treturn {\n\n\t\tmedia_lib: null,\n\n\t\t/**\n\t\t * DOM Events\n\t\t *\n\t\t * @type {Object}\n\t\t * @since 3.16.0\n\t\t * @version 3.17.8\n\t\t */\n\t\tevents: {\n\t\t\t'click .llms-add-image': 'open_media_lib',\n\t\t\t'click a[href=\"#llms-edit-slug\"]': 'make_slug_editable',\n\t\t\t'click a[href=\"#llms-remove-image\"]': 'remove_image',\n\t\t\t'change .llms-editable-select select': 'on_select',\n\t\t\t'change .llms-switch input[type=\"checkbox\"]': 'toggle_switch',\n\t\t\t'change .llms-editable-radio input': 'on_radio_select',\n\t\t\t'focusin .llms-input': 'on_focus',\n\t\t\t'focusout .llms-input': 'on_blur',\n\t\t\t'keydown .llms-input': 'on_keydown',\n\t\t\t'input .llms-input[type=\"number\"]': 'on_blur',\n\t\t\t'paste .llms-input[data-formatting]': 'on_paste',\n\t\t},\n\n\t\t/**\n\t\t * Retrieve a list of allowed tags for a given element\n\t\t *\n\t\t * @param obj $el jQuery selector for the element\n\t\t * @return array\n\t\t * @since 3.16.0\n\t\t * @version 3.17.8\n\t\t */\n\t\tget_allowed_tags: function( $el ) {\n\n\t\t\tif ( $el.attr( 'data-formatting' ) ) {\n\t\t\t\treturn _.map( $el.attr( 'data-formatting' ).split( ',' ), function( tag ) {\n\t\t\t\t\treturn tag.trim();\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn [ 'b', 'i', 'u', 'strong', 'em' ];\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve the content of an element\n\t\t *\n\t\t * @param obj $el jQuery object of the element\n\t\t * @return string\n\t\t * @since 3.16.0\n\t\t * @version 3.17.8\n\t\t */\n\t\tget_content: function( $el ) {\n\n\t\t\tif ( 'INPUT' === $el[0].tagName ) {\n\t\t\t\treturn $el.val();\n\t\t\t}\n\n\t\t\tif ( ! $el.attr( 'data-formatting' ) && ! $el.hasClass( 'ql-editor' ) ) {\n\t\t\t\treturn $el.text();\n\t\t\t}\n\n\t\t\treturn _.stripFormatting( $el.html(), this.get_allowed_tags( $el ) );\n\n\t\t},\n\n\t\t/**\n\t\t * Determine if changes have been made to the element\n\t\t *\n\t\t * @param {[obj]} event js event object\n\t\t * @return {Boolean} true when changes have been made, false otherwise\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\thas_changed: function( event ) {\n\t\t\tvar $el = $( event.target );\n\t\t\treturn ( $el.attr( 'data-original-content' ) !== this.get_content( $el ) );\n\t\t},\n\n\t\t/**\n\t\t * Ensure that new content is at least 1 character long\n\t\t *\n\t\t * @param obj event js event object\n\t\t * @return boolean\n\t\t * @since 3.16.0\n\t\t * @version 3.17.2\n\t\t */\n\t\tis_valid: function( event ) {\n\n\t\t\tvar self = this,\n\t\t\t\t$el = $( event.target ),\n\t\t\t\tcontent = this.get_content( $el ),\n\t\t\t\ttype = $el.attr( 'data-type' );\n\n\t\t\tif ( ( $el.attr( 'required' ) || $el.attr( 'data-required' ) ) && content.length < 1 ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( 'url' === type || 'video' === type ) {\n\t\t\t\tif ( ! this._validate_url( this.get_content( $el ) ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t} else if ( 'permalink' === type ) {\n\n\t\t\t\tLLMS.Ajax.call( {\n\t\t\t\t\tdata: {\n\t\t\t\t\t\taction: 'llms_builder',\n\t\t\t\t\t\taction_type: 'get_permalink',\n\t\t\t\t\t\tcourse_id: window.llms_builder.CourseModel.get( 'id' ),\n\t\t\t\t\t\tid: self.model.get( 'id' ),\n\t\t\t\t\t\ttitle: self.model.get( 'title' ),\n\t\t\t\t\t\tslug: content,\n\t\t\t\t\t},\n\t\t\t\t\tbeforeSend: function() {\n\t\t\t\t\t\tLLMS.Spinner.start( $el.closest( '.llms-editable-toggle-group' ), 'small' );\n\t\t\t\t\t},\n\t\t\t\t\tsuccess: function( r ) {\n\n\t\t\t\t\t\tif ( r.permalink && r.slug ) {\n\t\t\t\t\t\t\tself.model.set( 'permalink', r.permalink );\n\t\t\t\t\t\t\tself.model.set( 'name', r.slug );\n\t\t\t\t\t\t\tself.render();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\t/**\n\t\t * Initialize datepicker elements\n\t\t *\n\t\t * @return void\n\t\t * @since 3.17.0\n\t\t * @version 3.17.0\n\t\t */\n\t\tinit_datepickers: function() {\n\n\t\t\tthis.$el.find( '.llms-editable-date input' ).each( function() {\n\n\t\t\t\t$( this ).datetimepicker( {\n\t\t\t\t\tformat: $( this ).attr( 'data-date-format' ) || 'Y-m-d h:i A',\n\t\t\t\t\tdatepicker: ( undefined === $( this ).attr( 'data-date-datepicker' ) ) ? true : ( 'true' == $( this ).attr( 'data-date-datepicker' ) ),\n\t\t\t\t\ttimepicker: ( undefined === $( this ).attr( 'data-date-timepicker' ) ) ? true : ( 'true' == $( this ).attr( 'data-date-timepicker' ) ),\n\t\t\t\t\tonClose: function( current_time, $input ) {\n\t\t\t\t\t\t$input.blur();\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t},\n\n\t\t/**\n\t\t * Initialize elements that allow inline formatting\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tinit_formatting_els: function() {\n\n\t\t\tvar self = this;\n\n\t\t\tthis.$el.find( '.llms-input-formatting[data-formatting]' ).each( function() {\n\n\t\t\t\tvar formatting = $( this ).attr( 'data-formatting' ).split( ',' ),\n\t\t\t\t\tattr = $( this ).attr( 'data-attribute' );\n\n\t\t\t\tvar ed = new Quill( this, {\n\t\t\t\t\tmodules: {\n\t\t\t\t\t\ttoolbar: [ formatting ],\n\t\t\t\t\t\tkeyboard: {\n\t\t\t\t\t\t\tbindings: {\n\t\t\t\t\t\t\t\ttab: {\n\t\t\t\t\t\t\t\t\tkey: 9,\n\t\t\t\t\t\t\t\t\thandler: function( range, context ) {\n\t\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t13: {\n\t\t\t\t\t\t\t\t\tkey: 13,\n\t\t\t\t\t\t\t\t\thandler: function( range, context ) {\n\t\t\t\t\t\t\t\t\t\ted.root.blur();\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tplaceholder: $( this ).attr( 'data-placeholder' ),\n\t\t\t\t\ttheme: 'bubble',\n\t\t\t\t} );\n\n\t\t\t\ted.on( 'text-change', function( delta, oldDelta, source ) {\n\t\t\t\t\tself.model.set( attr, self.get_content( $( ed.root ) ) );\n\t\t\t\t} );\n\n\t\t\t\tBackbone.pubSub.trigger( 'formatting-ed-init', ed, $( this ), self );\n\n\t\t\t} );\n\n\t\t},\n\n\t\t/**\n\t\t * Initialize editable select elements\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.25.4\n\t\t */\n\t\tinit_selects: function() {\n\n\t\t\tthis.$el.find( '.llms-editable-select select' ).llmsSelect2( {\n\t\t\t\twidth: '100%',\n\t\t\t} ).trigger( 'change' );\n\n\t\t},\n\n\t\t/**\n\t\t * Blur/focusout function for .llms-editable-title elements\n\t\t * Automatically saves changes if changes have been made\n\t\t *\n\t\t * @param obj event js event object\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.6\n\t\t */\n\t\ton_blur: function( event ) {\n\n\t\t\tevent.stopPropagation();\n\n\t\t\tthis.model.set( '_has_focus', false, { silent: true } );\n\n\t\t\tvar self = this,\n\t\t\t\t$el = $( event.target ),\n\t\t\t\tchanged = this.has_changed( event );\n\n\t\t\tif ( changed ) {\n\n\t\t\t\tif ( ! self.is_valid( event ) ) {\n\t\t\t\t\tself.revert_edits( event );\n\t\t\t\t} else {\n\t\t\t\t\tthis.save_edits( event );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Focus event for editable inputs\n\t\t *\n\t\t * @param obj event js event object\n\t\t * @return void\n\t\t * @since 3.16.6\n\t\t * @version 3.16.6\n\t\t */\n\t\ton_focus: function( event ) {\n\n\t\t\tevent.stopPropagation();\n\t\t\tthis.model.set( '_has_focus', true, { silent: true } );\n\n\t\t},\n\n\t\t/**\n\t\t * Handle content pasted into contenteditable fields\n\t\t * This will ensure that HTML from RTF editors isn't pasted into the dom\n\t\t *\n\t\t * @param obj event js event obj\n\t\t * @return void\n\t\t * @since 3.17.8\n\t\t * @version 3.17.8\n\t\t */\n\t\ton_paste: function( event ) {\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tvar text = ( event.originalEvent || event ).clipboardData.getData( 'text/plain' );\n\t\t\twindow.document.execCommand( 'insertText', false, text );\n\n\t\t},\n\n\t\t/**\n\t\t * Change event for selectables\n\t\t *\n\t\t * @param obj event js event object\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\ton_select: function( event ) {\n\n\t\t\tvar $el = $( event.target ),\n\t\t\t\tmulti = ( $el.attr( 'multiple' ) ),\n\t\t\t\tattr = $el.attr( 'name' ),\n\t\t\t\t$selected = $el.find( 'option:selected' ),\n\t\t\t\tval;\n\n\t\t\tif ( multi ) {\n\t\t\t\tval = [];\n\t\t\t\tval = $selected.map( function() {\n\t\t\t\t\treturn this.value;\n\t\t\t\t} ).get();\n\t\t\t} else {\n\t\t\t\tval = $selected[0].value;\n\t\t\t}\n\n\t\t\tthis.model.set( attr, val );\n\n\t\t},\n\n\t\t/**\n\t\t * Change event for radio element groups\n\t\t *\n\t\t * @param obj event js event object\n\t\t * @return void\n\t\t * @since 3.17.6\n\t\t * @version 3.17.6\n\t\t */\n\t\ton_radio_select: function( event ) {\n\n\t\t\tvar $el = $( event.target ),\n\t\t\t\tattr = $el.attr( 'name' ),\n\t\t\t\tval = $el.val();\n\n\t\t\tthis.model.set( attr, val );\n\n\t\t},\n\n\t\t/**\n\t\t * Keydown function for .llms-editable-title elements\n\t\t * Blurs\n\t\t *\n\t\t * @param {obj} event js event object\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.17.8\n\t\t */\n\t\ton_keydown: function( event ) {\n\n\t\t\tevent.stopPropagation();\n\n\t\t\tvar self = this,\n\t\t\t\tkey = event.which || event.keyCode,\n\t\t\t\tshift = event.shiftKey;\n\t\t\t\t// ctrl = event.metaKey || event.ctrlKey;\n\n\t\t\tswitch ( key ) {\n\n\t\t\t\tcase 13: // enter\n\t\t\t\t\t// shift + enter should add a return\n\t\t\t\t\tif ( ! shift ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tevent.target.blur();\n\t\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\t\tcase 27: // escape\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tthis.revert_edits( event );\n\t\t\t\t\tevent.target.blur();\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Open the WP media lib\n\t\t *\n\t\t * @param obj event js event object\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.6\n\t\t */\n\t\topen_media_lib: function( event ) {\n\n\t\t\tevent.stopPropagation();\n\n\t\t\tvar self = this,\n\t\t\t\t$el = $( event.currentTarget );\n\n\t\t\tif ( self.media_lib ) {\n\n\t\t\t\tself.media_lib.uploader.uploader.param( 'post_id' );\n\n\t\t\t} else {\n\n\t\t\t\tself.media_lib = wp.media.frames.file_frame = wp.media( {\n\t\t\t\t\ttitle: LLMS.l10n.translate( 'Select an image' ),\n\t\t\t\t\tbutton: {\n\t\t\t\t\t\ttext: LLMS.l10n.translate( 'Use this image' ),\n\t\t\t\t\t},\n\t\t\t\t\tmultiple: false\t// Set to true to allow multiple files to be selected\n\t\t\t\t} );\n\n\t\t\t\tself.media_lib.on( 'select', function() {\n\n\t\t\t\t\tvar size = $el.attr( 'data-image-size' ),\n\t\t\t\t\t\tattachment = self.media_lib.state().get( 'selection' ).first().toJSON(),\n\t\t\t\t\t\timage = self.model.get( $el.attr( 'data-attribute' ) ),\n\t\t\t\t\t\turl;\n\n\t\t\t\t\tif ( size && attachment.sizes[ size ] ) {\n\t\t\t\t\t\turl = attachment.sizes[ size ].url;\n\t\t\t\t\t} else {\n\t\t\t\t\t\turl = attachment.url;\n\t\t\t\t\t}\n\n\t\t\t\t\timage.set( {\n\t\t\t\t\t\tid: attachment.id,\n\t\t\t\t\t\tsrc: url,\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tself.media_lib.open();\n\n\t\t},\n\n\t\t/**\n\t\t * Click event to remove an image\n\t\t *\n\t\t * @param obj event js event obj\n\t\t * @return voids\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tremove_image: function( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.model.get( $( event.currentTarget ).attr( 'data-attribute' ) ).set( {\n\t\t\t\tid: '',\n\t\t\t\tsrc: '',\n\t\t\t} );\n\n\t\t},\n\n\t\t/**\n\t\t * Helper to undo changes\n\t\t * Bound to \"escape\" key via on_keydown function\n\t\t *\n\t\t * @param obj event js event object\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\trevert_edits: function( event ) {\n\t\t\tvar $el = $( event.target ),\n\t\t\t\tval = $el.attr( 'data-original-content' );\n\t\t\t$el.html( val );\n\t\t},\n\n\t\t/**\n\t\t * Sync changes to the model and DB\n\t\t *\n\t\t * @param {obj} event js event object\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tsave_edits: function( event ) {\n\n\t\t\tvar $el = $( event.target ),\n\t\t\t\tval = this.get_content( $el );\n\n\t\t\tthis.model.set( $el.attr( 'data-attribute' ), val );\n\n\t\t},\n\n\t\t/**\n\t\t * Change event for a switch element\n\t\t *\n\t\t * @param obj event js event object\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.17.0\n\t\t */\n\t\ttoggle_switch: function( event ) {\n\n\t\t\tevent.stopPropagation();\n\t\t\tvar $el = $( event.target ),\n\t\t\t\tattr = $el.attr( 'name' ),\n\t\t\t\trerender = $el.attr( 'data-rerender' ),\n\t\t\t\tval;\n\n\t\t\tif ( $el.is( ':checked' ) ) {\n\t\t\t\tval = $el.attr( 'data-on' ) ? $el.attr( 'data-on' ) : 'yes';\n\t\t\t} else {\n\t\t\t\tval = $el.attr( 'data-off' ) ? $el.attr( 'data-off' ) : 'no';\n\t\t\t}\n\n\t\t\tif ( -1 !== attr.indexOf( '.' ) ) {\n\n\t\t\t\tvar split = attr.split( '.' );\n\n\t\t\t\tif ( 'parent' === split[0] ) {\n\t\t\t\t\tthis.model.get_parent().set( split[1], val );\n\t\t\t\t} else {\n\t\t\t\t\tthis.model.get( split[0] ).set( split[1], val );\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.model.set( attr, val );\n\n\t\t\t}\n\n\t\t\tthis.trigger( attr.replace( '.', '-' ) + '_toggle', val );\n\n\t\t\tif ( ! rerender || 'yes' === rerender ) {\n\t\t\t\tvar self = this;\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\tself.render();\n\t\t\t\t}, 100 );\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Initializes a WP Editor on a textarea\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 3.37.11 Replace reference to `wp.editor` with `_.getEditor()` helper.\n\t\t *\n\t\t * @param {String} id CSS ID of the editor (don't include #).\n\t\t * @param {Object} settings Optional object of settings to pass to wp.oldEditor.initialize().\n\t\t * @return {Void}\n\t\t */\n\t\tinit_editor: function( id, settings ) {\n\n\t\t\tsettings = settings || {};\n\n\t\t\tvar editor = _.getEditor();\n\n\t\t\teditor.remove( id );\n\n\t\t\teditor.initialize( id, $.extend( true, editor.getDefaultSettings(), {\n\t\t\t\tmediaButtons: true,\n\t\t\t\ttinymce: {\n\t\t\t\t\ttoolbar1: 'bold,italic,strikethrough,bullist,numlist,blockquote,hr,alignleft,aligncenter,alignright,link,unlink,wp_adv',\n\t\t\t\t\ttoolbar2: 'formatselect,underline,alignjustify,forecolor,pastetext,removeformat,charmap,outdent,indent,undo,redo,wp_help',\n\t\t\t\t\tsetup: _.bind( this.on_editor_ready, this ),\n\t\t\t\t}\n\t\t\t}, settings ) );\n\n\t\t},\n\n\t\t/**\n\t\t * Setup a permalink editor to allow editing of a permalink\n\t\t *\n\t\t * @param obj event js event object\n\t\t * @return void\n\t\t * @since 3.16.6\n\t\t * @version 3.16.6\n\t\t */\n\t\tmake_slug_editable: function( event ) {\n\n\t\t\tvar self = this,\n\t\t\t\t$btn = $( event.currentTarget ),\n\t\t\t\t$link = $btn.prevAll( 'a' ),\n\t\t\t\t$input = $btn.prev( 'input.permalink' ),\n\t\t\t\tfull_url = $link.attr( 'href' ),\n\t\t\t\tslug = $input.val(),\n\t\t\t\tshort_url = full_url.replace( slug, '' );\n\n\t\t\t// hide the button\n\t\t\t$btn.hide();\n\n\t\t\t// make the link not clickable\n\t\t\t$link.css( {\n\t\t\t\tcolor: '#999',\n\t\t\t\t'pointer-events': 'none',\n\t\t\t\t'text-decoration': 'none',\n\t\t\t} );\n\n\t\t\t// remove the current slug & trailing slash from the URL\n\t\t\t$link.text( short_url.substring( 0, short_url.length - 1 ) );\n\n\t\t\t// focus in on the field\n\t\t\t$input.show().focus();\n\n\t\t},\n\n\t\t/**\n\t\t * Callback function called after initialization of an editor\n\t\t *\n\t\t * Updates UI if a label is present.\n\t\t *\n\t\t * Binds a change event to ensure editor changes are saved to the model.\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 3.17.1 Uknown.\n\t\t * @since 3.37.11 Replace references to `wp.editor` with `_.getEditor()` helper.\n\t\t *\n\t\t * @param {Object} editor TinyMCE Editor instance.\n\t\t * @return {Void}\n\t\t */\n\t\ton_editor_ready: function( editor ) {\n\n\t\t\tvar self = this,\n\t\t\t\t$ed = $( '#' + editor.id ),\n\t\t\t\t$parent = $ed.closest( '.llms-editable-editor' ),\n\t\t\t\t$label = $parent.find( '.llms-label' ),\n\t\t\t\tprop = $ed.attr( 'data-attribute' )\n\n\t\t\tif ( $label.length ) {\n\t\t\t\t$label.prependTo( $parent.find( '.wp-editor-tools' ) );\n\t\t\t}\n\n\t\t\t// save changes to the model via Visual ed\n\t\t\teditor.on( 'change', function( event ) {\n\t\t\t\tself.model.set( prop, _.getEditor().getContent( editor.id ) );\n\t\t\t} );\n\n\t\t\t// save changes via Text ed\n\t\t\t$ed.on( 'input', function( event ) {\n\t\t\t\tself.model.set( prop, $ed.val() );\n\t\t\t} );\n\n\t\t\t// trigger an input on the Text ed when quicktags buttons are clicked\n\t\t\t$parent.on( 'click', '.quicktags-toolbar .ed_button', function() {\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t$ed.trigger( 'input' );\n\t\t\t\t}, 10 );\n\t\t\t} );\n\n\t\t},\n\n\t\t_validate_url: function( str ) {\n\n\t\t\tvar a = document.createElement( 'a' );\n\t\t\ta.href = str;\n\t\t\treturn ( a.host && a.host !== window.location.host );\n\n\t\t}\n\n\t};\n\n} );\n\n","/**\n * _receive override for Backbone.CollectionView core\n * enables connection with jQuery UI draggable buttons\n *\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'Views/_Receivable',[], function() {\n\n\treturn {\n\n\t\t/**\n\t\t * Overloads the function from Backbone.CollectionView core because it doesn't properly handle\n\t\t * receives from a jQuery UI draggable object\n\t\t *\n\t\t * @param obj event js event object\n\t\t * @param obj ui jQuery UI object\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\t_receive : function( event, ui ) {\n\n\t\t\t// came from sidebar drag\n\t\t\tif ( ui.sender.hasClass( 'ui-draggable' ) ) {\n\t\t\t\tvar index = this._getContainerEl().children().index( ui.helper );\n\t\t\t\tui.helper.remove(); // remove the helper\n\t\t\t\tthis.collection.add( {}, { at: index } );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar senderListEl = ui.sender;\n\t\t\tvar senderCollectionListView = senderListEl.data( 'view' );\n\t\t\tif ( ! senderCollectionListView || ! senderCollectionListView.collection ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar newIndex = this._getContainerEl().children().index( ui.item );\n\t\t\tvar modelReceived = senderCollectionListView.collection.get( ui.item.attr( 'data-model-cid' ) );\n\t\t\tsenderCollectionListView.collection.remove( modelReceived );\n\t\t\tthis.collection.add( modelReceived, { at : newIndex } );\n\t\t\tmodelReceived.collection = this.collection; // otherwise will not get properly set, since modelReceived.collection might already have a value.\n\t\t\tthis.setSelectedModel( modelReceived );\n\t\t},\n\n\t}\n\n} );\n\n","/**\n * Shiftable view mixin function\n *\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'Views/_Shiftable',[], function() {\n\n\treturn {\n\n\t\t/**\n\t\t * Conditionally hide action buttons based on section position in collection\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tmaybe_hide_shiftable_buttons: function() {\n\n\t\t\tif ( ! this.model.collection ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar type = this.model.get( 'type' );\n\n\t\t\tif ( this.model.collection.first() === this.model ) {\n\t\t\t\tthis.$el.find( '.shift-up--' + type ).hide();\n\t\t\t} else if ( this.model.collection.last() === this.model ) {\n\t\t\t\tthis.$el.find( '.shift-down--' + type ).hide();\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Move an item in a collection from one position to another\n\t\t *\n\t\t * @param int old_index current (old) index within the collection\n\t\t * @param int new_index desired (new) index within the collection\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tshift: function( old_index, new_index ) {\n\n\t\t\tvar collection = this.model.collection;\n\n\t\t\tcollection.remove( this.model );\n\t\t\tcollection.add( this.model, { at: new_index } );\n\t\t\tcollection.trigger( 'reorder' );\n\n\t\t},\n\n\t\t/**\n\t\t * Move an item down the tree one position\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tshift_down: function( e ) {\n\n\t\t\te.preventDefault();\n\t\t\tvar index = this.model.collection.indexOf( this.model );\n\t\t\tthis.shift( index, index + 1 );\n\n\t\t},\n\n\t\t/**\n\t\t * Move an item up the tree one position\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tshift_up: function( e ) {\n\n\t\t\te.preventDefault();\n\t\t\tvar index = this.model.collection.indexOf( this.model );\n\t\t\tthis.shift( index, index - 1 );\n\n\t\t},\n\n\t};\n\n} );\n\n","/**\n * Subview utility mixin\n *\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'Views/_Subview',[], function() {\n\n\treturn {\n\n\t\tsubscriptions: {},\n\n\t\t/**\n\t\t * Name of the current subview\n\t\t *\n\t\t * @type {String}\n\t\t */\n\t\tstate: '',\n\n\t\t/**\n\t\t * Object of subview data\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tviews: {},\n\n\t\t/**\n\t\t * Retrieve a subview by name from this.views\n\t\t *\n\t\t * @param string name name of the subview\n\t\t * @return obl|false\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tget_subview: function( name ) {\n\n\t\t\tif ( this.views[ name ] ) {\n\t\t\t\treturn this.views[ name ];\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tevents_subscribe: function( events ) {\n\n\t\t\t_.each( events, function( func, event ) {\n\n\t\t\t\tthis.subscriptions[ event ] = func;\n\t\t\t\tBackbone.pubSub.on( event, func, this );\n\n\t\t\t}, this );\n\n\t\t},\n\n\t\tevents_unsubscribe: function() {\n\n\t\t\t_.each( this.subscriptions, function( func, event ) {\n\n\t\t\t\tBackbone.pubSub.off( event, func, this );\n\t\t\t\tdelete this.subscriptions[ event ];\n\n\t\t\t}, this );\n\n\t\t},\n\n\t\t/**\n\t\t * Remove a single subview (and all it's subviews) by name\n\t\t *\n\t\t * @param string name name of the subview\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tremove_subview: function( name ) {\n\n\t\t\tvar view = this.get_subview( name );\n\n\t\t\tif ( ! view ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( view.instance ) {\n\n\t\t\t\t// remove the subviews if the view has subviews\n\t\t\t\tif ( ! _.isEmpty( view.instance.views ) ) {\n\t\t\t\t\tview.instance.events_unsubscribe();\n\t\t\t\t\tview.instance.remove_subviews();\n\t\t\t\t}\n\n\t\t\t\tview.instance.off();\n\t\t\t\tview.instance.off( null, null, null );\n\t\t\t\tview.instance.remove();\n\t\t\t\tview.instance.undelegateEvents();\n\n\t\t\t\t// _.each( view.instance, function( val, key ) {\n\t\t\t\t// delete view.instance[ key ];\n\t\t\t\t// } );\n\n\t\t\t\tview.instance = null;\n\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Remove all subviews (and all the subviews of those subviews)\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tremove_subviews: function() {\n\n\t\t\t_.each( this.views, function( data, name ) {\n\n\t\t\t\tthis.remove_subview( name );\n\n\t\t\t}, this );\n\n\t\t},\n\n\t\t/**\n\t\t * Render subviews based on current state\n\t\t *\n\t\t * @param obj view_data additional data to pass to the subviews\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\trender_subviews: function( view_data ) {\n\n\t\t\tview_data = view_data || {};\n\n\t\t\t_.each( this.views, function( data, name ) {\n\n\t\t\t\tif ( this.state === data.state ) {\n\n\t\t\t\t\tthis.render_subview( name, view_data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.remove_subview( name );\n\n\t\t\t\t}\n\n\t\t\t}, this );\n\n\t\t},\n\n\t\t/**\n\t\t * Render a single subview by name\n\t\t *\n\t\t * @param string name name of the subview\n\t\t * @param obj view_data additional data to pass to the subview initializer\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\trender_subview: function( name, view_data ) {\n\n\t\t\tvar view = this.get_subview( name );\n\n\t\t\tif ( ! view ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.remove_subview( name );\n\n\t\t\tif ( ! view.instance ) {\n\t\t\t\tview.instance = new view.class( view_data );\n\t\t\t}\n\n\t\t\tview.instance.render();\n\n\t\t},\n\n\t\t/**\n\t\t * Set the current subview\n\t\t * Must call render after!\n\t\t *\n\t\t * @param string state name of the state [builder|editor]\n\t\t * @return obj this for chaining\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tset_state: function ( state ) {\n\n\t\t\tthis.state = state;\n\t\t\treturn this;\n\n\t\t},\n\n\t}\n\n} );\n\n","/**\n * Trashable model\n *\n * @type {Object}\n * @since 3.16.12\n * @version 3.16.12\n */\ndefine( 'Views/_Trashable',[], function() {\n\n\treturn {\n\n\t\t/**\n\t\t * DOM Events\n\t\t *\n\t\t * @type {Object}\n\t\t * @since 3.16.12\n\t\t * @version 3.16.12\n\t\t */\n\t\tevents: {\n\t\t\t'click a[href=\"#llms-trash-model\"]': 'trash_model',\n\t\t},\n\n\t\t/**\n\t\t * Remove a model from it's parent and delete it\n\t\t *\n\t\t * @param obj event js event object\n\t\t * @return void\n\t\t * @since 3.16.12\n\t\t * @version 3.16.12\n\t\t */\n\t\ttrash_model: function( event ) {\n\n\t\t\tif ( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\n\t\t\tvar msg = LLMS.l10n.replace( 'Are you sure you want to move this %s to the trash?', {\n\t\t\t\t'%s': this.model.get_l10n_type(),\n\t\t\t} );\n\n\t\t\tif ( window.confirm( msg ) ) {\n\n\t\t\t\tif ( this.model.collection ) {\n\t\t\t\t\tthis.model.collection.remove( this.model );\n\t\t\t\t}\n\n\t\t\t\t// publish event\n\t\t\t\tBackbone.pubSub.trigger( 'model-trashed', this.model );\n\n\t\t\t\t// trigger local event so extending views can run other actions where necessary\n\t\t\t\tthis.trigger( 'model-trashed', this.model );\n\n\t\t\t}\n\n\t\t},\n\n\t}\n\n} );\n\n","/**\n * Load view mixins\n *\n * @package LifterLMS/Scripts\n *\n * @since 3.17.1\n * @version 3.17.1\n */\n\ndefine( 'Views/_loader',[\n\t\t'Views/_Detachable',\n\t\t'Views/_Editable',\n\t\t'Views/_Receivable',\n\t\t'Views/_Shiftable',\n\t\t'Views/_Subview',\n\t\t'Views/_Trashable'\n\t],\n\tfunction(\n\t\tDetachable,\n\t\tEditable,\n\t\tReceivable,\n\t\tShiftable,\n\t\tSubview,\n\t\tTrashable\n\t) {\n\n\t\treturn {\n\t\t\tDetachable: Detachable,\n\t\t\tEditable: Editable,\n\t\t\tReceivable: Receivable,\n\t\t\tShiftable: Shiftable,\n\t\t\tSubview: Subview,\n\t\t\tTrashable: Trashable,\n\t\t};\n\n} );\n\n","/**\n * Constructor functions for constructing models, views, and collections\n *\n * @since 3.16.0\n * @version 3.17.1\n */\ndefine( 'Controllers/Construct',[\n\t\t'Collections/loader',\n\t\t'Models/loader',\n\t\t'Views/_loader'\n\t], function(\n\t\tCollections,\n\t\tModels,\n\t\tViews\n\t) {\n\n\t\treturn function() {\n\n\t\t\t/**\n\t\t\t * Internal getter\n\t\t\t * Constructs new Collections, Models, and Views\n\t\t\t *\n\t\t\t * @param obj type type of object to construct [Collection,Model,View]\n\t\t\t * @param string name name of the object to construct\n\t\t\t * @param obj data object data to pass into the object's constructor\n\t\t\t * @param obj options object options to pass into the constructor\n\t\t\t * @return obj\n\t\t\t * @since 3.16.0\n\t\t\t * @version 3.16.0\n\t\t\t */\n\t\t\tfunction get( type, name, data, options ) {\n\n\t\t\t\tif ( ! type[ name ] ) {\n\t\t\t\t\tconsole.log( '\"' + name + '\" not found.' );\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn new type[ name ]( data, options );\n\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Instantiate a collection\n\t\t *\n\t\t\t * @param string name Collection class name (EG: \"Sections\")\n\t\t\t * @param array data Array of model objects to pass to the constructor\n\t\t\t * @param obj options Object of options to pass to the constructor\n\t\t\t * @return obj\n\t\t\t * @since 3.17.0\n\t\t\t * @version 3.17.0\n\t\t\t */\n\t\t\tthis.get_collection = function( name, data, options ) {\n\n\t\t\t\treturn get( Collections, name, data, options );\n\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Instantiate a model\n\t\t\t *\n\t\t\t * @param string name Model class name (EG: \"Section\")\n\t\t\t * @param obj data Object of model attributes to pass to the constructor\n\t\t\t * @param obj options Object of options to pass to the constructor\n\t\t\t * @return obj\n\t\t\t * @since 3.17.0\n\t\t\t * @version 3.17.0\n\t\t\t */\n\t\t\tthis.get_model = function( name, data, options ) {\n\n\t\t\t\treturn get( Models, name, data, options );\n\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Let 3rd parties extend a view using any of the mixin (_) views\n\t\t\t *\n\t\t\t * @param {obj} view base object used for the view\n\t\t\t * @param... {string} extends any number of strings that should be mixed into the view\n\t\t\t * @return obj\n\t\t\t * @since 3.17.1\n\t\t\t * @version 3.17.1\n\t\t\t */\n\t\t\tthis.extend_view = function() {\n\n\t\t\t\tvar view = arguments[0],\n\t\t\t\ti = 1;\n\n\t\t\t\twhile ( arguments[ i ] ) {\n\n\t\t\t\t\tvar classname = arguments[ i ];\n\t\t\t\t\tif ( Views[ classname ] ) {\n\n\t\t\t\t\t\tif ( view.events && Views[ classname ].events ) {\n\t\t\t\t\t\t\tview.events = _.defaults( view.events, Views[ classname ].events );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tview = _.defaults( view, Views[ classname ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ti++;\n\t\t\t\t}\n\n\t\t\t\treturn Backbone.View.extend( view );\n\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Allows custom collection registration by extending the default BackBone collection\n\t\t\t *\n\t\t\t * @param string name model name\n\t\t\t * @param obj props properties to extend the collection with\n\t\t\t * @return void\n\t\t\t * @since 3.17.1\n\t\t\t * @version 3.17.1\n\t\t\t */\n\t\t\tthis.register_collection = function( name, props ) {\n\n\t\t\t\tCollections[ name ] = Backbone.Collection.extend( props );\n\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Allows custom model registration by extending the default abstract model\n\t\t\t *\n\t\t\t * @param string name model name\n\t\t\t * @param obj props properties to extend the abstract model with\n\t\t\t * @return void\n\t\t\t * @since 3.17.0\n\t\t\t * @version 3.17.0\n\t\t\t */\n\t\t\tthis.register_model = function( name, props ) {\n\n\t\t\t\tModels[ name ] = Models['Abstract'].extend( props );\n\n\t\t\t};\n\n\t\t\treturn this;\n\n\t\t};\n\n} );\n\n","/**\n * LifterLMS Builder Debugging suite\n *\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'Controllers/Debug',[], function() {\n\n\treturn function( settings ) {\n\n\t\tvar self = this,\n\t\t\tenabled = settings.enabled || false;\n\n\t\t/**\n\t\t * Disable debugging\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tthis.disable = function() {\n\n\t\t\tself.log( 'LifterLMS Builder debugging disabled' );\n\t\t\tenabled = false;\n\n\t\t};\n\n\t\t/**\n\t\t * Enable debugging\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tthis.enable = function() {\n\n\t\t\tenabled = true;\n\t\t\tself.log( 'LifterLMS Builder debugging enabled' );\n\n\t\t};\n\n\t\t/**\n\t\t * General logging function\n\t\t * Logs to the js console only if logging is enabled\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tthis.log = function() {\n\n\t\t\tif ( ! enabled ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_.each( arguments, function( data ) {\n\t\t\t\tconsole.log( data );\n\t\t\t} );\n\n\t\t};\n\n\t\t/**\n\t\t * Toggles current state of the logger on or off\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tthis.toggle = function() {\n\n\t\t\tif ( enabled ) {\n\t\t\t\tself.disable();\n\t\t\t} else {\n\t\t\t\tself.enable();\n\t\t\t}\n\n\t\t};\n\n\t\t// on startup, log a message if logging is enabled\n\t\tif ( enabled ) {\n\t\t\tself.enable();\n\t\t}\n\n\t}\n\n} );\n\n","/**\n * Model schema functions\n *\n * @since 3.17.0\n * @version 3.17.0\n */\ndefine( 'Controllers/Schemas',[], function() {\n\n\t/**\n\t * Main Schemas class\n\t *\n\t * @param obj schemas schemas definitions initialized via PHP filters\n\t * @return obj\n\t * @since 3.17.0\n\t * @version 3.17.0\n\t */\n\treturn function( schemas ) {\n\n\t\t// initialize any custom schemas defined via PHP\n\t\tvar custom_schemas = schemas;\n\t\t_.each( custom_schemas, function( type ) {\n\t\t\t_.each( type, function( schema ) {\n\t\t\t\tschema.custom = true;\n\t\t\t} );\n\t\t} );\n\n\t\t/**\n\t\t * Retrieve a schema for a given model by type\n\t\t * Extends default schemas definitions with custom 3rd party definitions\n\t\t *\n\t\t * @param obj schema default schema definition from the model (or empty object if none defined)\n\t\t * @param string model_type the model type ('lesson', 'quiz', etc)\n\t\t * @param obj model Instance of the Backbone.Model for the given model\n\t\t * @return obj\n\t\t * @since 3.17.0\n\t\t * @version 3.17.0\n\t\t */\n\t\tthis.get = function( schema, model_type, model ) {\n\n\t\t\t// extend the default schema with custom php schemas for the type if they exist\n\t\t\tif ( custom_schemas[ model_type ] ) {\n\t\t\t\tschema = _.extend( schema, custom_schemas[ model_type ] );\n\t\t\t}\n\n\t\t\treturn schema;\n\n\t\t};\n\n\t\treturn this;\n\n\t};\n\n} );\n\n","/**\n * Sync builder data to the server\n *\n * @since 3.16.0\n * @version 4.17.0\n */\ndefine( 'Controllers/Sync',[], function() {\n\n\treturn function( Course, settings ) {\n\n\t\tthis.saving = false;\n\n\t\tvar self = this,\n\t\t\tautosave = ( 'yes' === window.llms_builder.autosave ),\n\t\t\tcheck_interval = null,\n\t\t\tcheck_interval_ms = settings.check_interval_ms || 10000,\n\t\t\tdetached = new Backbone.Collection(),\n\t\t\ttrashed = new Backbone.Collection();\n\n\t\t/**\n\t\t * init\n\t\t *\n\t\t * @since 3.16.7\n\t\t *\n\t\t * @return {Void}\n\t\t */\n\t\tfunction init() {\n\n\t\t\t// determine if autosaving is possible\n\t\t\tif ( 'undefined' === typeof wp.heartbeat ) {\n\n\t\t\t\twindow.llms_builder.debug.log( 'WordPress Heartbeat disabled. Autosaving is disabled!' );\n\t\t\t\tautosave = false;\n\n\t\t\t}\n\n\t\t\t// setup the check interval\n\t\t\tif ( check_interval_ms ) {\n\t\t\t\tself.set_check_interval( check_interval_ms );\n\t\t\t}\n\n\t\t\t// warn when users attempt to leave the page\n\t\t\t$( window ).on( 'beforeunload', function() {\n\n\t\t\t\tif ( self.has_unsaved_changes() ) {\n\t\t\t\t\tcheck_for_changes();\n\t\t\t\t\treturn 'Are you sure you want to abandon your changes?';\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\t/*\n\t\t\t /$$ /$$ /$$ /$$\n\t\t\t |__/ | $$ | $$ |__/\n\t\t\t /$$ /$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$ | $$ /$$$$$$ /$$$$$$ /$$\n\t\t\t | $$| $$__ $$|_ $$_/ /$$__ $$ /$$__ $$| $$__ $$ |____ $$| $$ |____ $$ /$$__ $$| $$\n\t\t\t | $$| $$ \\ $$ | $$ | $$$$$$$$| $$ \\__/| $$ \\ $$ /$$$$$$$| $$ /$$$$$$$| $$ \\ $$| $$\n\t\t\t | $$| $$ | $$ | $$ /$$| $$_____/| $$ | $$ | $$ /$$__ $$| $$ /$$__ $$| $$ | $$| $$\n\t\t\t | $$| $$ | $$ | $$$$/| $$$$$$$| $$ | $$ | $$| $$$$$$$| $$ | $$$$$$$| $$$$$$$/| $$\n\t\t\t |__/|__/ |__/ \\___/ \\_______/|__/ |__/ |__/ \\_______/|__/ \\_______/| $$____/ |__/\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t | $$\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t | $$\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t |__/\n\t\t */\n\n\t\t/**\n\t\t * Adds error message(s) to the data object returned by heartbeat-tick\n\t\t *\n\t\t * @param obj data llms_builder data object from heartbeat-tick\n\t\t * @param string|array err error messages array or string\n\t\t * @return obj\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tfunction add_error_msg( data, err ) {\n\n\t\t\tif ( 'success' === data.status ) {\n\t\t\t\tdata.message = [];\n\t\t\t}\n\n\t\t\tdata.status = 'error';\n\t\t\tif ( 'string' === typeof err ) {\n\t\t\t\terr = [ err ];\n\t\t\t}\n\t\t\tdata.message = data.message.concat( err );\n\n\t\t\treturn data;\n\n\t\t};\n\n\t\t/**\n\t\t * Publish sync status so other areas of the application can see what's happening here\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tfunction check_for_changes() {\n\n\t\t\tvar data = {};\n\t\t\tdata.changes = self.get_unsaved_changes();\n\t\t\tdata.has_unsaved_changes = self.has_unsaved_changes( data.changes );\n\t\t\tdata.saving = self.saving;\n\n\t\t\twindow.llms_builder.debug.log( '==== start changes check ====', data, '==== finish changes check ====' );\n\n\t\t\tBackbone.pubSub.trigger( 'current-save-status', data );\n\n\t\t};\n\n\t\t/**\n\t\t * Manually Save data via Admin AJAX when the heartbeat API has been disabled\n\t\t *\n\t\t * @since 3.16.7\n\t\t * @since 4.17.0 Fixed undefined variable error when logging an error response.\n\t\t *\n\t\t * @return void\n\t\t */\n\t\tfunction do_ajax_save() {\n\n\t\t\t// prevent simultaneous saves\n\t\t\tif ( self.saving ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar changes = self.get_unsaved_changes();\n\n\t\t\t// only send data if we have data to send\n\t\t\tif ( self.has_unsaved_changes( changes ) ) {\n\n\t\t\t\tchanges.id = Course.get( 'id' );\n\n\t\t\t\tLLMS.Ajax.call( {\n\t\t\t\t\tdata: {\n\t\t\t\t\t\taction: 'llms_builder',\n\t\t\t\t\t\taction_type: 'ajax_save',\n\t\t\t\t\t\tcourse_id: changes.id,\n\t\t\t\t\t\tllms_builder: JSON.stringify( changes ),\n\t\t\t\t\t},\n\t\t\t\t\tbeforeSend: function() {\n\n\t\t\t\t\t\twindow.llms_builder.debug.log( '==== start do_ajax_save before ====', changes, '==== finish do_ajax_save before ====' );\n\n\t\t\t\t\t\tself.saving = true;\n\n\t\t\t\t\t\tBackbone.pubSub.trigger( 'heartbeat-send', self );\n\n\t\t\t\t\t},\n\t\t\t\t\terror: function( xhr, status, error ) {\n\n\t\t\t\t\t\twindow.llms_builder.debug.log( '==== start do_ajax_save error ====', xhr, '==== finish do_ajax_save error ====' );\n\n\t\t\t\t\t\tself.saving = false;\n\n\t\t\t\t\t\tBackbone.pubSub.trigger( 'heartbeat-tick', self, {\n\t\t\t\t\t\t\tstatus: 'error',\n\t\t\t\t\t\t\tmessage: xhr.responseText + ' (' + error + ' ' + status + ')',\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t},\n\t\t\t\t\tsuccess: function( res ) {\n\n\t\t\t\t\t\tif ( ! res.llms_builder ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\twindow.llms_builder.debug.log( '==== start do_ajax_save success ====', res, '==== finish do_ajax_save success ====' );\n\n\t\t\t\t\t\tres.llms_builder = process_removals( res.llms_builder );\n\t\t\t\t\t\tres.llms_builder = process_updates( res.llms_builder );\n\n\t\t\t\t\t\tself.saving = false;\n\n\t\t\t\t\t\tBackbone.pubSub.trigger( 'heartbeat-tick', self, res.llms_builder );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Retrieve all the attributes changed on a model since the last sync\n\t\t *\n\t\t * For a new model (a model with a temp ID) or a model where _forceSync has been defined ALL atts will be returned\n\t\t * For an existing model (without a temp ID) only retrieves changed attributes as tracked by Backbone.TrackIt\n\t\t *\n\t\t * This function excludes any attributes defined as child attributes via the models relationship settings\n\t\t *\n\t\t * @param obj model instance of a Backbone.Model\n\t\t * @return obj\n\t\t * @since 3.16.0\n\t\t * @version 3.16.6\n\t\t */\n\t\tfunction get_changed_attributes( model ) {\n\n\t\t\tvar atts = {},\n\t\t\t\tsync_type;\n\n\t\t\t// don't save mid editing\n\t\t\tif ( model.get( '_has_focus' ) ) {\n\t\t\t\treturn atts;\n\t\t\t}\n\n\t\t\t// model hasn't been persisted to the database to get a real ID yet\n\t\t\t// send *all* of it's atts\n\t\t\tif ( has_temp_id( model ) || true === model.get( '_forceSync' ) ) {\n\n\t\t\t\tatts = _.clone( model.attributes );\n\t\t\t\tsync_type = 'full';\n\n\t\t\t\t// only send the changed atts\n\t\t\t} else {\n\n\t\t\t\tatts = model.unsavedAttributes();\n\t\t\t\tsync_type = 'partial';\n\n\t\t\t}\n\n\t\t\tvar exclude = ( model.get_relationships ) ? model.get_child_props() : [];\n\t\t\tatts = _.omit( atts, function( val, key ) {\n\n\t\t\t\t// exclude keys that start with an underscore which are used by the\n\t\t\t\t// application but don't need to be stored in the database\n\t\t\t\tif ( 0 === key.indexOf( '_' ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t} else if ( -1 !== exclude.indexOf( key ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\n\t\t\t} );\n\n\t\t\tif ( model.before_save ) {\n\t\t\t\tatts = model.before_save( atts, sync_type );\n\t\t\t}\n\n\t\t\treturn atts;\n\n\t\t};\n\n\t\t/**\n\t\t * Get all the changes to an object (either a Model or a Collection of models)\n\t\t * Returns only changes to models and the IDs of that model (should changes exist)\n\t\t * Uses get_changed_attributes() to determine if all atts or only changed atts are needed\n\t\t * Processes children intelligently to only return changed children rather than the entire collection of children\n\t\t *\n\t\t * @param obj object instance of a Backbone.Model or Backbone.Collection\n\t\t * @return obj|array\t \t\tif object is a model, returns an object\n\t\t * \tif object is a collection, returns an array of objects\n\t\t * @since 3.16.0\n\t\t * @version 3.16.11\n\t\t */\n\t\tfunction get_changes_to_object( object ) {\n\n\t\t\tvar changed_atts;\n\n\t\t\tif ( object instanceof Backbone.Model ) {\n\n\t\t\t\tchanged_atts = get_changed_attributes( object );\n\n\t\t\t\tif ( object.get_relationships ) {\n\n\t\t\t\t\t_.each( object.get_child_props(), function( prop ) {\n\n\t\t\t\t\t\tvar children = get_changes_to_object( object.get( prop ) );\n\t\t\t\t\t\tif ( ! _.isEmpty( children ) ) {\n\t\t\t\t\t\t\tchanged_atts[ prop ] = children;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\t// if we have any data, add the id to the model\n\t\t\t\tif ( ! _.isEmpty( changed_atts ) ) {\n\t\t\t\t\tchanged_atts.id = object.get( 'id' );\n\t\t\t\t}\n\n\t\t\t} else if ( object instanceof Backbone.Collection ) {\n\n\t\t\t\tchanged_atts = [];\n\t\t\t\tobject.each( function( model ) {\n\t\t\t\t\tvar model_changes = get_changes_to_object( model );\n\t\t\t\t\tif ( ! _.isEmpty( model_changes ) ) {\n\t\t\t\t\t\tchanged_atts.push( model_changes );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn changed_atts;\n\n\t\t};\n\n\t\t/**\n\t\t * Determines if a model has a temporary ID or a real persisted ID\n\t\t *\n\t\t * @param obj model instance of a model\n\t\t * @return boolean\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tfunction has_temp_id( model ) {\n\n\t\t\treturn ( ! _.isNumber( model.id ) && 0 === model.id.indexOf( 'temp_' ) );\n\n\t\t};\n\n\t\t/**\n\t\t * Compares changes synced to the server against current model and restarts\n\t\t * tracking on elements that haven't changed since the last sync\n\t\t *\n\t\t * @param obj model instance of a Backbone.Model\n\t\t * @param obj data data set that was processed by the server\n\t\t * @return void\n\t\t * @since 3.16.11\n\t\t * @version 3.19.4\n\t\t */\n\t\tfunction maybe_restart_tracking( model, data ) {\n\n\t\t\tBackbone.pubSub.trigger( model.get( 'type' ) + '-maybe-restart-tracking', model, data );\n\n\t\t\tvar omit = [ 'id', 'orig_id' ];\n\n\t\t\tif ( model.get_relationships ) {\n\t\t\t\tomit.concat( model.get_child_props() );\n\t\t\t}\n\n\t\t\t_.each( _.omit( data, omit ), function( val, prop ) {\n\n\t\t\t\tif ( _.isEqual( model.get( prop ), val ) ) {\n\t\t\t\t\tdelete model._unsavedChanges[ prop ];\n\t\t\t\t\tmodel._originalAttrs[ prop ] = val;\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\t// if syncing was forced, allow tracking to move forward as normal moving forward\n\t\t\tmodel.unset( '_forceSync' );\n\n\t\t};\n\n\t\t/**\n\t\t * Processes response data from heartbeat-tick related to trashing & detaching models\n\t\t * On success, removes from local removal collection\n\t\t * On error, appends error messages to the data object returned to UI for on-screen feedback\n\t\t *\n\t\t * @param obj data data.llms_builder object from heartbeat-tick response\n\t\t * @return obj\n\t\t * @since 3.16.0\n\t\t * @version 3.17.1\n\t\t */\n\t\tfunction process_removals( data ) {\n\n\t\t\t// check removals for errors\n\t\t\tvar removals = {\n\t\t\t\tdetach: detached,\n\t\t\t\ttrash: trashed,\n\t\t\t};\n\n\t\t\t_.each( removals, function( coll, key ) {\n\n\t\t\t\tif ( data[ key ] ) {\n\n\t\t\t\t\tvar errors = [];\n\n\t\t\t\t\t_.each( data[ key ] , function( info ) {\n\n\t\t\t\t\t\t// successfully detached, remove it from the detached collection\n\t\t\t\t\t\tif ( ! info.error ) {\n\n\t\t\t\t\t\t\tcoll.remove( info.id );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\terrors.push( info.error );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( errors.length ) {\n\t\t\t\t\t\t_.extend( data, add_error_msg( data, errors ) );\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\treturn data;\n\t\t}\n\n\t\t/**\n\t\t * Processes response data from heartbeat-tick related to creating / updating a single object\n\t\t * Handles both collections and models as a recursive function\n\t\t *\n\t\t * @param {[type]} data [description]\n\t\t * @param {[type]} type [description]\n\t\t * @param {[type]} parent [description]\n\t\t * @param {[type]} main_data [description]\n\t\t * @return {[type]}\n\t\t * @since 3.16.0\n\t\t * @version 3.16.11\n\t\t */\n\t\tfunction process_object_updates( data, type, parent, main_data ) {\n\n\t\t\tif ( ! data[ type ] ) {\n\t\t\t\treturn data;\n\t\t\t}\n\n\t\t\tif ( parent.get( type ) instanceof Backbone.Model ) {\n\n\t\t\t\tvar info = data[ type ];\n\n\t\t\t\tif ( info.error ) {\n\n\t\t\t\t\t_.extend( main_data, add_error_msg( main_data, info.error ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar model = parent.get( type );\n\n\t\t\t\t\t// update temp ids with the real id\n\t\t\t\t\tif ( info.id != info.orig_id ) {\n\t\t\t\t\t\tmodel.set( 'id', info.id );\n\t\t\t\t\t\tdelete model._unsavedChanges.id;\n\t\t\t\t\t}\n\t\t\t\t\tmaybe_restart_tracking( model, info );\n\n\t\t\t\t\t// check children\n\t\t\t\t\tif ( model.get_relationships ) {\n\n\t\t\t\t\t\t_.each( model.get_child_props(), function( child_key ) {\n\t\t\t\t\t\t\t_.extend( data[ type ], process_object_updates( data[ type ], child_key, model, main_data ) );\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( parent.get( type ) instanceof Backbone.Collection ) {\n\n\t\t\t\t_.each( data[ type ], function( info, index ) {\n\n\t\t\t\t\tif ( info.error ) {\n\n\t\t\t\t\t\t_.extend( main_data, add_error_msg( main_data, info.error ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar model = parent.get( type ).get( info.orig_id );\n\n\t\t\t\t\t\t// update temp ids with the real id\n\t\t\t\t\t\tif ( info.id != info.orig_id ) {\n\t\t\t\t\t\t\tmodel.set( 'id', info.id );\n\t\t\t\t\t\t\tdelete model._unsavedChanges.id;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmaybe_restart_tracking( model, info );\n\n\t\t\t\t\t\t// check children\n\t\t\t\t\t\tif ( model.get_relationships ) {\n\n\t\t\t\t\t\t\t_.each( model.get_child_props(), function( child_key ) {\n\t\t\t\t\t\t\t\t_.extend( data[ type ], process_object_updates( data[ type ][ index ], child_key, model, main_data ) );\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn main_data;\n\n\t\t};\n\n\t\t/**\n\t\t * Processes response data from heartbeat-tick related to updating & creating new models\n\t\t * On success, removes from local removal collection\n\t\t * On error, appends error messages to the data object returned to UI for on-screen feedback\n\t\t *\n\t\t * @param obj data data.llms_builder object from heartbeat-tick response\n\t\t * @return obj\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tfunction process_updates( data ) {\n\n\t\t\t// only mess with updates data\n\t\t\tif ( ! data.updates ) {\n\t\t\t\treturn data;\n\t\t\t}\n\n\t\t\tif ( data.updates ) {\n\t\t\t\tdata = process_object_updates( data.updates, 'sections', Course, data );\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t};\n\n\t\t/*\n\t\t\t\t\t\t\t\t /$$ /$$ /$$ /$$\n\t\t\t\t\t\t\t\t| $$ | $$|__/ |__/\n\t\t\t /$$$$$$ /$$ /$$| $$$$$$$ | $$ /$$ /$$$$$$$ /$$$$$$ /$$$$$$ /$$\n\t\t\t /$$__ $$| $$ | $$| $$__ $$| $$| $$ /$$_____/ |____ $$ /$$__ $$| $$\n\t\t\t| $$ \\ $$| $$ | $$| $$ \\ $$| $$| $$| $$ /$$$$$$$| $$ \\ $$| $$\n\t\t\t| $$ | $$| $$ | $$| $$ | $$| $$| $$| $$ /$$__ $$| $$ | $$| $$\n\t\t\t| $$$$$$$/| $$$$$$/| $$$$$$$/| $$| $$| $$$$$$$ | $$$$$$$| $$$$$$$/| $$\n\t\t\t| $$____/ \\______/ |_______/ |__/|__/ \\_______/ \\_______/| $$____/ |__/\n\t\t\t| $$ | $$\n\t\t\t| $$ | $$\n\t\t\t|__/ |__/\n\t\t*/\n\n\t\t/**\n\t\t * Retrieve all unsaved changes for the builder instance\n\t\t *\n\t\t * @return obj\n\t\t * @since 3.16.0\n\t\t * @version 3.17.1\n\t\t */\n\t\tthis.get_unsaved_changes = function() {\n\n\t\t\treturn {\n\t\t\t\tdetach: detached.pluck( 'id' ),\n\t\t\t\ttrash: trashed.pluck( 'id' ),\n\t\t\t\tupdates: get_changes_to_object( Course ),\n\n\t\t\t}\n\t\t};\n\n\t\t/**\n\t\t * Check if the builder instance has unsaved changes\n\t\t *\n\t\t * @param obj changes optionally pass in an object from the return of this.get_unsaved_changes()\n\t\t * save some resources by not running the check twice during heartbeats\n\t\t * @return boolean\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tthis.has_unsaved_changes = function( changes ) {\n\n\t\t\tif ( 'undefined' === typeof changes ) {\n\t\t\t\tchanges = self.get_unsaved_changes();\n\t\t\t}\n\n\t\t\t// check all possible keys, once we find one with content we have some changes to persist\n\t\t\tvar found = _.find( changes, function( data ) {\n\n\t\t\t\treturn ( false === _.isEmpty( data ) );\n\n\t\t\t} );\n\n\t\t\treturn found ? true : false;\n\n\t\t};\n\n\t\t/**\n\t\t * Save changes right now.\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.7\n\t\t */\n\t\tthis.save_now = function() {\n\t\t\tif ( autosave ) {\n\t\t\t\twp.heartbeat.connectNow();\n\t\t\t} else {\n\t\t\t\tdo_ajax_save();\n\t\t\t}\n\t\t};\n\n\t\t/**\n\t\t * Update the interval that checks for changes to the builder instance\n\t\t *\n\t\t * @param int ms time (in milliseconds) to run the check on\n\t\t * pass 0 to disable the check\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tthis.set_check_interval = function( ms ) {\n\t\t\tcheck_interval_ms = ms;\n\t\t\tif ( check_interval ) {\n\t\t\t\tclearInterval( check_interval );\n\t\t\t}\n\t\t\tif ( check_interval_ms ) {\n\t\t\t\tcheck_interval = setInterval( check_for_changes, check_interval_ms );\n\t\t\t}\n\t\t};\n\n\t\t/*\n\t\t\t /$$ /$$ /$$\n\t\t\t| $$|__/ | $$\n\t\t\t| $$ /$$ /$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$\n\t\t\t| $$| $$ /$$_____/|_ $$_/ /$$__ $$| $$__ $$ /$$__ $$ /$$__ $$ /$$_____/\n\t\t\t| $$| $$| $$$$$$ | $$ | $$$$$$$$| $$ \\ $$| $$$$$$$$| $$ \\__/| $$$$$$\n\t\t\t| $$| $$ \\____ $$ | $$ /$$| $$_____/| $$ | $$| $$_____/| $$ \\____ $$\n\t\t\t| $$| $$ /$$$$$$$/ | $$$$/| $$$$$$$| $$ | $$| $$$$$$$| $$ /$$$$$$$/\n\t\t\t|__/|__/|_______/ \\___/ \\_______/|__/ |__/ \\_______/|__/ |_______/\n\t\t*/\n\n\t\t/**\n\t\t * Listen for detached models and send them to the server for persistence\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tBackbone.pubSub.on( 'model-detached', function( model ) {\n\n\t\t\t// detached models with temp ids haven't been persisted so we don't care\n\t\t\tif ( has_temp_id( model ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdetached.add( _.clone( model.attributes ) );\n\n\t\t} );\n\n\t\t/**\n\t\t * Listen for trashed models and send them to the server for deletion\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @version 3.17.1\n\t\t */\n\t\tBackbone.pubSub.on( 'model-trashed', function( model ) {\n\n\t\t\t// if the model has a temp ID we don't have to persist the deletion\n\t\t\tif ( has_temp_id( model ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar data = _.clone( model.attributes );\n\n\t\t\tif ( model.get_trash_id ) {\n\t\t\t\tdata.id = model.get_trash_id();\n\t\t\t}\n\n\t\t\ttrashed.add( data );\n\n\t\t} );\n\n\t\t/*\n\t\t\t /$$ /$$ /$$ /$$\n\t\t\t| $$ | $$ | $$ | $$\n\t\t\t| $$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ | $$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$\n\t\t\t| $$__ $$ /$$__ $$ |____ $$ /$$__ $$|_ $$_/ | $$__ $$ /$$__ $$ |____ $$|_ $$_/\n\t\t\t| $$ \\ $$| $$$$$$$$ /$$$$$$$| $$ \\__/ | $$ | $$ \\ $$| $$$$$$$$ /$$$$$$$ | $$\n\t\t\t| $$ | $$| $$_____/ /$$__ $$| $$ | $$ /$$| $$ | $$| $$_____/ /$$__ $$ | $$ /$$\n\t\t\t| $$ | $$| $$$$$$$| $$$$$$$| $$ | $$$$/| $$$$$$$/| $$$$$$$| $$$$$$$ | $$$$/\n\t\t\t|__/ |__/ \\_______/ \\_______/|__/ \\___/ |_______/ \\_______/ \\_______/ \\___/\n\t\t*/\n\n\n\t\t/**\n\t\t * Add data to the WP heartbeat to persist new models, changes, and deletions to the DB\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 3.16.7 Unknown\n\t\t * @since 4.14.0 Return early when autosaving is disabled.\n\t\t */\n\t\t$( document ).on( 'heartbeat-send', function( event, data ) {\n\n\t\t\t// Autosaving is disabled.\n\t\t\tif ( ! autosave ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// prevent simultaneous saves\n\t\t\tif ( self.saving ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar changes = self.get_unsaved_changes();\n\n\t\t\t// only send data if we have data to send\n\t\t\tif ( self.has_unsaved_changes( changes ) ) {\n\n\t\t\t\tchanges.id = Course.get( 'id' );\n\t\t\t\tself.saving = true;\n\t\t\t\tdata.llms_builder = JSON.stringify( changes );\n\n\t\t\t}\n\n\t\t\twindow.llms_builder.debug.log( '==== start heartbeat-send ====', data, '==== finish heartbeat-send ====' );\n\n\t\t\tBackbone.pubSub.trigger( 'heartbeat-send', self );\n\n\t\t} );\n\n\t\t/**\n\t\t * Confirm detachments & deletions and replace temp IDs with new persisted IDs\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 4.14.0 Return early when autosaving is disabled.\n\t\t */\n\t\t$( document ).on( 'heartbeat-tick', function( event, data ) {\n\n\t\t\t// Autosaving is disabled.\n\t\t\tif ( ! autosave ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! data.llms_builder ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twindow.llms_builder.debug.log( '==== start heartbeat-tick ====', data, '==== finish heartbeat-tick ====' );\n\n\t\t\tdata.llms_builder = process_removals( data.llms_builder );\n\t\t\tdata.llms_builder = process_updates( data.llms_builder );\n\n\t\t\tself.saving = false;\n\n\t\t\tBackbone.pubSub.trigger( 'heartbeat-tick', self, data.llms_builder );\n\n\t\t} );\n\n\t\t/**\n\t\t * On heartbeat errors publish an error to the main builder application\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 4.14.0 Return early when autosaving is disabled.\n\t\t */\n\t\t$( document ).on( 'heartbeat-error', function( event, data ) {\n\n\t\t\t// Autosaving is disabled.\n\t\t\tif ( ! autosave ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twindow.llms_builder.debug.log( '==== start heartbeat-error ====', data, '==== finish heartbeat-error ====' );\n\n\t\t\tself.saving = false;\n\n\t\t\tBackbone.pubSub.trigger( 'heartbeat-tick', self, {\n\t\t\t\tstatus: 'error',\n\t\t\t\tmessage: data.responseText + ' (' + data.status + ' ' + data.statusText + ')',\n\t\t\t} );\n\n\t\t} );\n\n\t\t/*\n\t\t\t /$$ /$$ /$$\n\t\t\t|__/ |__/ | $$\n\t\t\t /$$ /$$$$$$$ /$$ /$$$$$$\n\t\t\t| $$| $$__ $$| $$|_ $$_/\n\t\t\t| $$| $$ \\ $$| $$ | $$\n\t\t\t| $$| $$ | $$| $$ | $$ /$$\n\t\t\t| $$| $$ | $$| $$ | $$$$/\n\t\t\t|__/|__/ |__/|__/ \\___/\n\t\t*/\n\t\tinit();\n\n\t\treturn this;\n\n\t};\n\n} );\n\n","/**\n * Single Lesson View\n * @since 3.16.0\n * @version 3.27.0\n */\ndefine( 'Views/Lesson',[\n\t\t'Views/_Detachable',\n\t\t'Views/_Editable',\n\t\t'Views/_Shiftable',\n\t\t'Views/_Trashable'\n\t], function(\n\t\tDetachable,\n\t\tEditable,\n\t\tShiftable,\n\t\tTrashable\n\t) {\n\n\treturn Backbone.View.extend( _.defaults( {\n\n\t\t/**\n\t\t * Get default attributes for the html wrapper element\n\t\t * @return obj\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tattributes: function() {\n\t\t\treturn {\n\t\t\t\t'data-id': this.model.id,\n\t\t\t\t'data-section-id': this.model.get( 'parent_section' ),\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * HTML class names\n\t\t * @type {String}\n\t\t */\n\t\tclassName: 'llms-builder-item llms-lesson',\n\n\t\t/**\n\t\t * Events\n\t\t * @type {Object}\n\t\t * @since 3.16.0\n\t\t * @version 3.16.12\n\t\t */\n\t\tevents: _.defaults( {\n\t\t\t'click .edit-lesson': 'open_lesson_editor',\n\t\t\t'click .edit-quiz': 'open_quiz_editor',\n\t\t\t'click .edit-assignment': 'open_assignment_editor',\n\t\t\t'click .section-prev': 'section_prev',\n\t\t\t'click .section-next': 'section_next',\n\t\t\t'click .shift-up--lesson': 'shift_up',\n\t\t\t'click .shift-down--lesson': 'shift_down',\n\t\t}, Detachable.events, Editable.events, Trashable.events ),\n\n\t\t/**\n\t\t * HTML element wrapper ID attribute\n\t\t * @return string\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tid: function() {\n\t\t\treturn 'llms-lesson-' + this.model.id;\n\t\t},\n\n\t\t/**\n\t\t * Wrapper Tag name\n\t\t * @type {String}\n\t\t */\n\t\ttagName: 'li',\n\n\t\t/**\n\t\t * Get the underscore template\n\t\t * @type {[type]}\n\t\t */\n\t\ttemplate: wp.template( 'llms-lesson-template' ),\n\n\t\t/**\n\t\t * Initialization callback func (renders the element on screen)\n\t\t * @return void\n\t\t * @since 3.14.1\n\t\t * @version 3.14.1\n\t\t */\n\t\tinitialize: function() {\n\n\t\t\tthis.render();\n\n\t\t\tthis.listenTo( this.model, 'change', this.render );\n\n\t\t\tBackbone.pubSub.on( 'lesson-selected', this.on_select, this );\n\t\t\tBackbone.pubSub.on( 'new-lesson-added', this.on_select, this );\n\n\t\t},\n\n\t\t/**\n\t\t * Compiles the template and renders the view\n\t\t * @return self (for chaining)\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\trender: function() {\n\n\t\t\tthis.$el.html( this.template( this.model ) );\n\t\t\tthis.maybe_hide_shiftable_buttons();\n\t\t\tif ( this.model.get( '_selected' ) ) {\n\t\t\t\tthis.$el.addClass( 'selected' );\n\t\t\t} else {\n\t\t\t\tthis.$el.removeClass( 'selected' );\n\t\t\t}\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Click event for the assignment editor action icon\n\t\t * Opens sidebar to the assignment editor tab\n\t\t * @param obj event JS Event obj.\n\t\t * @return void\n\t\t * @since 3.17.0\n\t\t * @version 3.27.0\n\t\t */\n\t\topen_assignment_editor: function( event ) {\n\n\t\t\tif ( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\tBackbone.pubSub.trigger( 'lesson-selected', this.model, 'assignment' );\n\t\t\tthis.model.set( '_selected', true );\n\t\t\tthis.set_hash( 'assignment' );\n\n\t\t},\n\n\t\t/**\n\t\t * Click event for lesson settings action icon\n\t\t * Opens sidebar to the lesson editor tab\n\t\t * @param obj event JS Event obj.\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.27.0\n\t\t */\n\t\topen_lesson_editor: function( event ) {\n\n\t\t\tif ( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\tBackbone.pubSub.trigger( 'lesson-selected', this.model, 'lesson' );\n\t\t\tthis.model.set( '_selected', true );\n\t\t\tthis.set_hash( false );\n\n\t\t},\n\n\t\t/**\n\t\t * Click event for the quiz editor action icon\n\t\t * Opens sidebar to the quiz editor tab\n\t\t * @param obj event JS Event obj.\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.27.0\n\t\t */\n\t\topen_quiz_editor: function( event ) {\n\n\t\t\tif ( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\tBackbone.pubSub.trigger( 'lesson-selected', this.model, 'quiz' );\n\t\t\tthis.model.set( '_selected', true );\n\t\t\tthis.set_hash( 'quiz' );\n\n\t\t},\n\n\t\t/**\n\t\t * When a lesson is selected mark it as selected in the hidden prop\n\t\t * Allows views to re-render and reflect current state properly\n\t\t * @param obj model lesson model that's been selected\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\ton_select: function( model ) {\n\n\t\t\tif ( this.model.id !== model.id ) {\n\t\t\t\tthis.model.set( '_selected', false );\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Click event for the \"Next Section\" button\n\t\t * @param obj event js event obj\n\t\t * @return void\n\t\t * @since 3.16.11\n\t\t * @version 3.16.11\n\t\t */\n\t\tsection_next: function( event ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis._move_to_section( 'next' );\n\t\t},\n\n\t\t/**\n\t\t * Click event for the \"Previous Section\" button\n\t\t * @param obj event js event obj\n\t\t * @return void\n\t\t * @since 3.16.11\n\t\t * @version 3.16.11\n\t\t */\n\t\tsection_prev: function( event ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis._move_to_section( 'prev' );\n\t\t},\n\n\t\t/**\n\t\t * Adds a hash for deep linking to a specific lesson tab\n\t\t * @param string subtab subtab [quiz|assignment]\n\t\t * @return void\n\t\t * @since 3.27.0\n\t\t * @version 3.27.0\n\t\t */\n\t\tset_hash: function( subtab ) {\n\n\t\t\tvar hash = 'lesson:' + this.model.get( 'id' );\n\n\t\t\tif ( subtab ) {\n\t\t\t\thash += ':' + subtab;\n\t\t\t}\n\n\t\t\twindow.location.hash = hash;\n\n\t\t},\n\n\t\t/**\n\t\t * Move the lesson into a new section\n\t\t * @param string direction direction [prev|next]\n\t\t * @return void\n\t\t * @since 3.16.11\n\t\t * @version 3.16.11\n\t\t */\n\t\t_move_to_section: function( direction ) {\n\n\t\t\tvar from_coll = this.model.collection,\n\t\t\t\tto_section;\n\n\t\t\tif ( 'next' === direction ) {\n\t\t\t\tto_section = from_coll.parent.get_next();\n\t\t\t} else if ( 'prev' === direction ) {\n\t\t\t\tto_section = from_coll.parent.get_prev();\n\t\t\t}\n\n\t\t\tif ( to_section ) {\n\n\t\t\t\tfrom_coll.remove( this.model );\n\t\t\t\tto_section.add_lesson( this.model );\n\t\t\t\tto_section.set( '_expanded', true );\n\n\t\t\t}\n\n\t\t},\n\n\t}, Detachable, Editable, Shiftable, Trashable ) );\n\n} );\n\n","/**\n * Single Section View\n *\n * @since 3.13.0\n * @version 3.16.0\n */\ndefine( 'Views/LessonList',[ 'Views/Lesson', 'Views/_Receivable' ], function( LessonView, Receivable ) {\n\n\treturn Backbone.CollectionView.extend( _.defaults( {\n\n\t\tclassName: 'llms-lessons',\n\n\t\t/**\n\t\t * Section model\n\t\t *\n\t\t * @type {[type]}\n\t\t */\n\t\tmodelView: LessonView,\n\n\t\t/**\n\t\t * Are sections selectable?\n\t\t *\n\t\t * @type {Bool}\n\t\t */\n\t\tselectable: false,\n\n\t\t/**\n\t\t * Are sections sortable?\n\t\t *\n\t\t * @type {Bool}\n\t\t */\n\t\tsortable: true,\n\n\t\tsortableOptions: {\n\t\t\taxis: false,\n\t\t\tconnectWith: '.llms-lessons',\n\t\t\tcursor: 'move',\n\t\t\thandle: '.drag-lesson',\n\t\t\titems: '.llms-lesson',\n\t\t\tplaceholder: 'llms-lesson llms-sortable-placeholder',\n\t\t},\n\n\t\tsortable_start: function( collection ) {\n\t\t\t$( '.llms-lessons' ).addClass( 'dragging' );\n\t\t},\n\n\t\tsortable_stop: function( collection ) {\n\t\t\t$( '.llms-lessons' ).removeClass( 'dragging' );\n\t\t},\n\n\t\t/**\n\t\t * Overloads the function from Backbone.CollectionView core because it doesn't send stop events\n\t\t * if moving from one sortable to another... :-(\n\t\t *\n\t\t * @param obj event js event object\n\t\t * @param obj ui jQuery UI object\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\t_sortStop : function( event, ui ) {\n\n\t\t\tvar modelBeingSorted = this.collection.get( ui.item.attr( 'data-model-cid' ) ),\n\t\t\t\tmodelViewContainerEl = this._getContainerEl(),\n\t\t\t\tnewIndex = modelViewContainerEl.children().index( ui.item );\n\n\t\t\tif ( newIndex == -1 && modelBeingSorted ) {\n\t\t\t\tthis.collection.remove( modelBeingSorted );\n\t\t\t}\n\n\t\t\tthis._reorderCollectionBasedOnHTML();\n\t\t\tthis.updateDependentControls();\n\n\t\t\tif ( this._isBackboneCourierAvailable() ) {\n\t\t\t\tthis.spawn( 'sortStop', { modelBeingSorted : modelBeingSorted, newIndex : newIndex } );\n\t\t\t} else {\n\t\t\t\tthis.trigger( 'sortStop', modelBeingSorted, newIndex );\n\t\t\t}\n\n\t\t},\n\n\t}, Receivable ) );\n\n} );\n\n","/**\n * Single Section View\n * @since 3.13.0\n * @version 3.16.12\n */\ndefine( 'Views/Section',[\n\t\t'Views/LessonList',\n\t\t'Views/_Editable',\n\t\t'Views/_Shiftable',\n\t\t'Views/_Trashable'\n\t], function(\n\t\tLessonListView,\n\t\tEditable,\n\t\tShiftable,\n\t\tTrashable\n\t) {\n\n\treturn Backbone.View.extend( _.defaults( {\n\n\t\t/**\n\t\t * Get default attributes for the html wrapper element\n\t\t * @return obj\n\t\t * @since 3.13.0\n\t\t * @version 3.13.0\n\t\t */\n\t\tattributes: function() {\n\t\t\treturn {\n\t\t\t\t'data-id': this.model.id,\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Element class names\n\t\t * @type {String}\n\t\t */\n\t\tclassName: 'llms-builder-item llms-section',\n\n\t\t/**\n\t\t * Events\n\t\t * @type {Object}\n\t\t * @since 3.16.0\n\t\t * @version 3.16.12\n\t\t */\n\t\tevents: _.defaults( {\n\n\t\t\t'click': 'select',\n\t\t\t'click .expand': 'expand',\n\t\t\t'click .collapse': 'collapse',\n\t\t\t'click .shift-up--section': 'shift_up',\n\t\t\t'click .shift-down--section': 'shift_down',\n\n\t\t\t'mouseenter .llms-lessons': 'on_mouseenter',\n\n\t\t}, Editable.events, Trashable.events ),\n\n\t\t/**\n\t\t * HTML element wrapper ID attribute\n\t\t * @return string\n\t\t * @since 3.13.0\n\t\t * @version 3.13.0\n\t\t */\n\t\tid: function() {\n\t\t\treturn 'llms-section-' + this.model.id;\n\t\t},\n\n\t\t/**\n\t\t * Wrapper Tag name\n\t\t * @type {String}\n\t\t */\n\t\ttagName: 'li',\n\n\t\t/**\n\t\t * Get the underscore template\n\t\t * @type {[type]}\n\t\t */\n\t\ttemplate: wp.template( 'llms-section-template' ),\n\n\t\t/**\n\t\t * Initialization callback func (renders the element on screen)\n\t\t * @return void\n\t\t * @since 3.13.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tinitialize: function() {\n\n\t\t\tthis.render();\n\t\t\tthis.listenTo( this.model, 'change', this.render );\n\t\t\tthis.listenTo( this.model, 'change:_expanded', this.toggle_expanded );\n\t\t\tthis.lessonListView.collection.on( 'add', this.on_lesson_add, this );\n\n\t\t\tthis.dragTimeout = null;\n\n\t\t\tBackbone.pubSub.on( 'expand-all', this.expand, this );\n\t\t\tBackbone.pubSub.on( 'collapse-all', this.collapse, this );\n\n\t\t},\n\n\t\t/**\n\t\t * Render the section\n\t\t * Initializes a new collection and views for all lessons in the section\n\t\t * @return void\n\t\t * @since 3.13.0\n\t\t * @version 3.16.0\n\t\t */\n\t\trender: function() {\n\n\t\t\tthis.$el.html( this.template( this.model.toJSON() ) );\n\n\t\t\tthis.maybe_hide_shiftable_buttons();\n\n\t\t\tthis.lessonListView = new LessonListView( {\n\t\t\t\tel: this.$el.find( '.llms-lessons' ),\n\t\t\t\tcollection: this.model.get( 'lessons' ),\n\t\t\t} );\n\t\t\tthis.lessonListView.render();\n\t\t\tthis.lessonListView.on( 'sortStart', this.lessonListView.sortable_start );\n\t\t\tthis.lessonListView.on( 'sortStop', this.lessonListView.sortable_stop );\n\n\t\t\t// selection changes\n\t\t\tthis.lessonListView.on( 'selectionChanged', this.active_lesson_change, this );\n\n\t\t\tthis.maybe_hide_trash_button();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tactive_lesson_change: function( current, previous ) {\n\n\t\t\tBackbone.pubSub.trigger( 'active-lesson-change', {\n\t\t\t\tcurrent: current,\n\t\t\t\tprevious: previous,\n\t\t\t} );\n\n\t\t},\n\n\t\t/**\n\t\t * Collapse lessons within the section\n\t\t * @param obj event js event object\n\t\t * @param bool update if true, updates the model to reflect the new state\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tcollapse: function( event, update ) {\n\n\t\t\tif ( 'undefined' === typeof update ) {\n\t\t\t\tupdate = true;\n\t\t\t}\n\n\t\t\tif ( event ) {\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\tthis.$el.removeClass( 'expanded' ).find( '.drag-expanded' ).removeClass( 'drag-expanded' );\n\t\t\tif ( update ) {\n\t\t\t\tthis.model.set( '_expanded', false );\n\t\t\t}\n\t\t\tBackbone.pubSub.trigger( 'section-toggle', this.model );\n\n\t\t},\n\n\t\t/**\n\t\t * Expand lessons within the section\n\t\t * @param obj event js event object\n\t\t * @param bool update if true, updates the model to reflect the new state\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\texpand: function( event, update ) {\n\n\t\t\tif ( 'undefined' === typeof update ) {\n\t\t\t\tupdate = true;\n\t\t\t}\n\n\t\t\tif ( event ) {\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\tthis.$el.addClass( 'expanded' );\n\t\t\tif ( update ) {\n\t\t\t\tthis.model.set( '_expanded', true );\n\t\t\t}\n\t\t\tBackbone.pubSub.trigger( 'section-toggle', this.model );\n\n\t\t},\n\n\t\tmaybe_hide_trash_button: function() {\n\n\t\t\tvar $btn = this.$el.find( '.trash--section' );\n\n\t\t\tif ( this.model.get( 'lessons' ).isEmpty() ) {\n\n\t\t\t\t$btn.show();\n\n\t\t\t} else {\n\n\t\t\t\t$btn.hide()\n\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * When a lesson is added to the section trigger a collection reorder & update the lesson's id\n\t\t * @param obj model Lesson model\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\ton_lesson_add: function( model ) {\n\n\t\t\tthis.lessonListView.collection.trigger( 'reorder' );\n\t\t\tmodel.set( 'parent_section', this.model.get( 'id' ) );\n\t\t\tthis.expand();\n\n\t\t},\n\n\t\ton_mouseenter: function( event ) {\n\n\n\t\t\tif ( $( event.target ).hasClass( 'dragging' ) ) {\n\n\t\t\t\t$( '.drag-expanded' ).removeClass( 'drag-expanded' );\n\t\t\t\t$( event.target ).addClass( 'drag-expanded' );\n\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Expand\n\t\t * @param {[type]} model [description]\n\t\t * @param {[type]} value [description]\n\t\t * @return {[type]}\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\ttoggle_expanded: function( model, value ) {\n\n\t\t\tif ( value ) {\n\t\t\t\tthis.expand( null, false );\n\t\t\t} else {\n\t\t\t\tthis.collapse( null, false );\n\t\t\t}\n\n\t\t},\n\n\t}, Editable, Shiftable, Trashable ) );\n\n} );\n\n","/**\n * Single Section View\n *\n * @since 3.13.0\n * @version 3.16.0\n */\ndefine( 'Views/SectionList',[ 'Views/Section', 'Views/_Receivable' ], function( SectionView, Receivable ) {\n\n\treturn Backbone.CollectionView.extend( _.defaults( {\n\n\t\t/**\n\t\t * Parent element\n\t\t *\n\t\t * @type {String}\n\t\t */\n\t\tel: '#llms-sections',\n\n\t\tevents : {\n\t\t\t'mousedown > li.llms-section > .llms-builder-header .llms-headline' : '_listItem_onMousedown',\n\t\t\t// 'dblclick > li, tbody > tr > td' : '_listItem_onDoubleClick',\n\t\t\t'click' : '_listBackground_onClick',\n\t\t\t'click ul.collection-view' : '_listBackground_onClick',\n\t\t\t'keydown' : '_onKeydown'\n\t\t},\n\n\t\t/**\n\t\t * Section model\n\t\t *\n\t\t * @type {[type]}\n\t\t */\n\t\tmodelView: SectionView,\n\n\t\t/**\n\t\t * Enable keyboard events\n\t\t *\n\t\t * @type {Bool}\n\t\t */\n\t\tprocessKeyEvents: false,\n\n\t\t/**\n\t\t * Are sections selectable?\n\t\t *\n\t\t * @type {Bool}\n\t\t */\n\t\tselectable: true,\n\n\t\t/**\n\t\t * Are sections sortable?\n\t\t *\n\t\t * @type {Bool}\n\t\t */\n\t\tsortable: true,\n\n\t\tsortableOptions: {\n\t\t\taxis: false,\n\t\t\tcursor: 'move',\n\t\t\thandle: '.drag-section',\n\t\t\titems: '.llms-section',\n\t\t\tplaceholder: 'llms-section llms-sortable-placeholder',\n\t\t},\n\n\t\tsortable_start: function( collection ) {\n\t\t\tthis.$el.addClass( 'dragging' );\n\t\t},\n\n\t\tsortable_stop: function( collection ) {\n\t\t\tthis.$el.removeClass( 'dragging' );\n\t\t},\n\n\t}, Receivable ) );\n\n} );\n\n","/**\n * Single Course View\n *\n * @since 3.13.0\n * @version 3.16.0\n */\ndefine( 'Views/Course',[ 'Views/SectionList', 'Views/_Editable' ], function( SectionListView, Editable ) {\n\n\treturn Backbone.View.extend( _.defaults( {\n\n\t\t/**\n\t\t * Get default attributes for the html wrapper element\n\t\t *\n\t\t * @return obj\n\t\t * @since 3.13.0\n\t\t * @version 3.13.0\n\t\t */\n\t\tattributes: function() {\n\t\t\treturn {\n\t\t\t\t'data-id': this.model.id,\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * HTML element selector\n\t\t *\n\t\t * @type {String}\n\t\t */\n\t\tel: '#llms-builder-main',\n\n\t\t/**\n\t\t * Wrapper Tag name\n\t\t *\n\t\t * @type {String}\n\t\t */\n\t\ttagName: 'div',\n\n\t\t/**\n\t\t * Get the underscore template\n\t\t *\n\t\t * @type {[type]}\n\t\t */\n\t\ttemplate: wp.template( 'llms-course-template' ),\n\n\t\t/**\n\t\t * Initialization callback func (renders the element on screen)\n\t\t *\n\t\t * @return void\n\t\t * @since 3.13.0\n\t\t * @version 3.13.0\n\t\t */\n\t\tinitialize: function() {\n\n\t\t\tvar self = this;\n\n\t\t\t// this.listenTo( this.model, 'sync', this.render );\n\t\t\tthis.render();\n\n\t\t\tthis.sectionListView = new SectionListView( {\n\t\t\t\tcollection: this.model.get( 'sections' ),\n\t\t\t} );\n\t\t\tthis.sectionListView.render();\n\t\t\t// drag and drop start\n\t\t\tthis.sectionListView.on( 'sortStart', this.sectionListView.sortable_start );\n\t\t\t// drag and drop stop\n\t\t\tthis.sectionListView.on( 'sortStop', this.sectionListView.sortable_stop );\n\t\t\t// selection changes\n\t\t\tthis.sectionListView.on( 'selectionChanged', this.active_section_change );\n\t\t\t// \"select\" a section when it's added to the course\n\t\t\tthis.listenTo( this.model.get( 'sections' ), 'add', this.on_section_add );\n\n\t\t\tBackbone.pubSub.on( 'section-toggle', this.on_section_toggle, this );\n\n\t\t\tBackbone.pubSub.on( 'expand-section', this.expand_section, this );\n\n\t\t\tBackbone.pubSub.on( 'lesson-selected', this.active_lesson_change, this );\n\n\t\t},\n\n\t\t/**\n\t\t * Compiles the template and renders the view\n\t\t *\n\t\t * @return self (for chaining)\n\t\t * @since 3.13.0\n\t\t * @version 3.13.0\n\t\t */\n\t\trender: function() {\n\t\t\tthis.$el.html( this.template( this.model ) );\n\t\t\treturn this;\n\t\t},\n\n\t\tactive_lesson_change: function( model ) {\n\n\t\t\t// set parent section to be active\n\t\t\tvar section = this.model.get( 'sections' ).get( model.get( 'parent_section' ) );\n\t\t\tthis.sectionListView.setSelectedModel( section );\n\n\t\t},\n\n\t\t/**\n\t\t * When a section \"selection\" changes in the list\n\t\t * Update each section model so we can figure out which one is selected from other views\n\t\t *\n\t\t * @param array current array of selected models\n\t\t * @param array previous array of previously selected models\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tactive_section_change: function( current, previous ) {\n\n\t\t\t_.each( current, function( model ) {\n\t\t\t\tmodel.set( '_selected', true );\n\t\t\t} );\n\n\t\t\t_.each( previous, function( model ) {\n\t\t\t\tmodel.set( '_selected', false );\n\t\t\t} );\n\n\t\t},\n\n\t\t/**\n\t\t * \"Selects\" the new section when it's added to the course\n\t\t *\n\t\t * @param obj model Section model that's just been added\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\ton_section_add: function( model ) {\n\n\t\t\tthis.sectionListView.setSelectedModel( model );\n\n\t\t},\n\n\t\t/**\n\t\t * When expanding/collapsing sections\n\t\t * if collapsing, unselect, if expanding, select\n\t\t *\n\t\t * @param obj model toggled section\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\ton_section_toggle: function( model ) {\n\n\t\t\tvar selected = model.get( '_expanded' ) ? [ model ] : [];\n\t\t\tthis.sectionListView.setSelectedModels( selected );\n\n\t\t}\n\n\t}, Editable ) );\n\n} );\n\n","/**\n * Model settings fields view\n *\n * @since 3.17.0\n * @version 4.7.0\n */\ndefine( 'Views/SettingsFields',[], function() {\n\n\treturn Backbone.View.extend( _.defaults( {\n\n\t\t/**\n\t\t * DOM events\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tevents: {\n\t\t\t'click .llms-settings-group-toggle': 'toggle_group',\n\t\t},\n\n\t\t/**\n\t\t * Processed fields data\n\t\t * Allows access by ID without traversing the schema\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tfields: {},\n\n\t\t/**\n\t\t * Wrapper Tag name\n\t\t *\n\t\t * @type {String}\n\t\t */\n\t\ttagName: 'div',\n\n\t\t/**\n\t\t * Get the underscore template\n\t\t *\n\t\t * @type {[type]}\n\t\t */\n\t\ttemplate: wp.template( 'llms-settings-fields-template' ),\n\n\t\t/**\n\t\t * Initialization callback func (renders the element on screen)\n\t\t *\n\t\t * @return void\n\t\t * @since 3.17.0\n\t\t * @version 3.17.0\n\t\t */\n\t\t// initialize: function() {},\n\n\t\t/**\n\t\t * Retrieve an array of all editor fields in all groups\n\t\t *\n\t\t * @return array\n\t\t * @since 3.17.1\n\t\t * @version 3.17.1\n\t\t */\n\t\tget_editor_fields: function() {\n\t\t\treturn _.filter( this.fields, function( field ) {\n\t\t\t\treturn this.is_editor_field( field.type );\n\t\t\t}, this );\n\t\t},\n\n\t\t/**\n\t\t * Get settings group data from a model\n\t\t *\n\t\t * @return {[type]}\n\t\t * @since 3.17.0\n\t\t * @version 3.17.0\n\t\t */\n\t\tget_groups: function() {\n\n\t\t\treturn this.model.get_settings_fields();\n\n\t\t},\n\n\t\t/**\n\t\t * Determine if a settings group is hidden in localStorage\n\t\t *\n\t\t * @param string group_id id of the group\n\t\t * @return {Boolean}\n\t\t * @since 3.17.0\n\t\t * @version 3.17.0\n\t\t */\n\t\tis_group_hidden: function( group_id ) {\n\n\t\t\tvar id = 'llms-' + this.model.get( 'type' ) + '-settings-group--' + group_id;\n\n\t\t\tif ( 'undefined' !== window.localStorage ) {\n\t\t\t\treturn ( 'hidden' === window.localStorage.getItem( id ) );\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\t/**\n\t\t * Get the switch attribute for a field with switches\n\t\t *\n\t\t * @param obj field field data obj\n\t\t * @return string\n\t\t * @since 3.17.0\n\t\t * @version 3.17.0\n\t\t */\n\t\tget_switch_attribute: function( field ) {\n\n\t\t\treturn field.switch_attribute ? field.switch_attribute : field.attribute;\n\n\t\t},\n\n\t\t/**\n\t\t * Determine if a field has a switch\n\t\t *\n\t\t * @param string type field type string\n\t\t * @return {Boolean}\n\t\t * @since 3.17.0\n\t\t * @version 3.17.0\n\t\t */\n\t\thas_switch: function( type ) {\n\t\t\treturn ( -1 !== type.indexOf( 'switch' ) );\n\t\t},\n\n\t\t/**\n\t\t * Determine if a field is a default (text) field\n\t\t *\n\t\t * @param string type field type string\n\t\t * @return {Boolean}\n\t\t * @since 3.17.0\n\t\t * @version 3.17.0\n\t\t */\n\t\tis_default_field: function( type ) {\n\n\t\t\tvar types = [ 'audio_embed', 'datepicker', 'number', 'text', 'video_embed' ];\n\t\t\treturn ( -1 !== types.indexOf( type.replace( 'switch-', '' ) ) );\n\n\t\t},\n\n\t\t/**\n\t\t * Determine if a field is a WYSIWYG editor field\n\t\t *\n\t\t * @param string type field type string\n\t\t * @return {Boolean}\n\t\t * @since 3.17.1\n\t\t * @version 3.17.1\n\t\t */\n\t\tis_editor_field: function( type ) {\n\n\t\t\tvar types = [ 'editor', 'switch-editor' ];\n\t\t\treturn ( -1 !== types.indexOf( type.replace( 'switch-', '' ) ) );\n\n\t\t},\n\n\t\t/**\n\t\t * Determine if a switch is enabled for a field\n\t\t *\n\t\t * @param obj field field data object\n\t\t * @return {Boolean}\n\t\t * @since 3.17.0\n\t\t * @version 3.17.6\n\t\t */\n\t\tis_switch_condition_met: function( field ) {\n\n\t\t\treturn ( field.switch_on === this.model.get( field.switch_attribute ) );\n\n\t\t},\n\n\t\t/**\n\t\t * Compiles the template and renders the view\n\t\t *\n\t\t * @return self (for chaining)\n\t\t * @since 3.17.0\n\t\t * @version 3.17.1\n\t\t */\n\t\trender: function() {\n\n\t\t\tthis.$el.html( this.template( this ) );\n\n\t\t\t// if editors exist, render them\n\t\t\t_.each( this.get_editor_fields(), function( field ) {\n\t\t\t\tthis.render_editor( field );\n\t\t\t}, this );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Renders an editor field\n\t\t *\n\t\t * @since 3.17.1\n\t\t * @since 3.37.11 Replace references to `wp.editor` with `_.getEditor()` helper.\n\t\t *\n\t\t * @param {Object} field Field data object.\n\t\t * @return {Void}\n\t\t */\n\t\trender_editor: function( field ) {\n\n\t\t\tvar self = this,\n\t\t\t\twpEditor = _.getEditor();\n\n\t\t\t// Exit early if there's no editor to work with.\n\t\t\tif ( undefined === wpEditor ) {\n\t\t\t\tconsole.error( 'Unable to access `wp.oldEditor` or `wp.editor`.' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twpEditor.remove( field.id );\n\t\t\tfield.settings.tinymce.setup = function( editor ) {\n\n\t\t\t\tvar $ed = $( '#' + editor.id ),\n\t\t\t\t\t$parent = $ed.closest( '.llms-editable-editor' ),\n\t\t\t\t\t$label = $parent.find( '.llms-label' ),\n\t\t\t\t\tprop = $ed.attr( 'data-attribute' )\n\n\t\t\t\tif ( $label.length ) {\n\t\t\t\t\t$label.prependTo( $parent.find( '.wp-editor-tools' ) );\n\t\t\t\t}\n\n\t\t\t\t// save changes to the model via Visual ed\n\t\t\t\teditor.on( 'change', function( event ) {\n\t\t\t\t\tself.model.set( prop, wpEditor.getContent( editor.id ) );\n\t\t\t\t} );\n\n\t\t\t\t// save changes via Text ed\n\t\t\t\t$ed.on( 'input', function( event ) {\n\t\t\t\t\tself.model.set( prop, $ed.val() );\n\t\t\t\t} );\n\n\t\t\t\t// trigger an input on the Text ed when quicktags buttons are clicked\n\t\t\t\t$parent.on( 'click', '.quicktags-toolbar .ed_button', function() {\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\t$ed.trigger( 'input' );\n\t\t\t\t\t}, 10 );\n\t\t\t\t} );\n\t\t\t};\n\n\t\t\twpEditor.initialize( field.id, field.settings );\n\n\t\t},\n\n\t\t/**\n\t\t * Get the HTML for a select field\n\t\t *\n\t\t * @param obj options flat or multi-dimensional options object\n\t\t * @param string attribute name of the select field's attribute\n\t\t * @return string\n\t\t * @since 3.17.0\n\t\t * @version 3.17.2\n\t\t */\n\t\trender_select_options: function( options, attribute ) {\n\n\t\t\tvar html = '',\n\t\t\t\tselected = this.model.get( attribute );\n\n\t\t\tfunction option_html( label, val ) {\n\n\t\t\t\treturn '<option value=\"' + val + '\"' + _.selected( val, selected ) + '>' + label + '</option>';\n\n\t\t\t}\n\n\t\t\t_.each( options, function( option, index ) {\n\n\t\t\t\t// this will be an key:val object\n\t\t\t\tif ( 'string' === typeof option ) {\n\t\t\t\t\thtml += option_html( option, index );\n\t\t\t\t\t// either option group or array of key,val objects\n\t\t\t\t} else if ( 'object' === typeof option ) {\n\t\t\t\t\t// option group\n\t\t\t\t\tif ( option.label && option.options ) {\n\t\t\t\t\t\thtml += '<optgroup label=\"' + option.label + '\">';\n\t\t\t\t\t\thtml += this.render_select_options( option.options, attribute );\n\t\t\t\t\t} else {\n\t\t\t\t\t\thtml += option_html( option.val, option.key );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}, this );\n\n\t\t\treturn html;\n\n\t\t},\n\n\t\t/**\n\t\t * Setup and fill fields with default data based on field type\n\t\t *\n\t\t * @since 3.17.0\n\t\t * @since 3.24.0 Unknown.\n\t\t * @since 3.37.11 Replace reference to `wp.editor` with `_.getEditor()` helper.\n\t\t * @since 4.7.0 Ensure `switch-number` fields are set with the `number` type attribute.\n\t\t *\n\t\t * @param {Object} orig_field Original field as defined in the settings.\n\t\t * @param {Integer} field_index Index of the field in the current row.\n\t\t * @return {Object}\n\t\t */\n\t\tsetup_field: function( orig_field, field_index ) {\n\n\t\t\tvar defaults = {\n\t\t\t\tclasses: [],\n\t\t\t\tid: _.uniqueId( orig_field.attribute + '_' ),\n\t\t\t\tinput_type: 'text',\n\t\t\t\tlabel: '',\n\t\t\t\toptions: {},\n\t\t\t\tplaceholder: '',\n\t\t\t\ttip: '',\n\t\t\t\ttip_position: 'top-right',\n\t\t\t\tsettings: {},\n\t\t\t};\n\n\t\t\t// check the field condition if set\n\t\t\tif ( orig_field.condition && false === _.bind( orig_field.condition, this.model )() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tswitch ( orig_field.type ) {\n\n\t\t\t\tcase 'audio_embed':\n\t\t\t\t\tdefaults.classes.push( 'llms-editable-audio' );\n\t\t\t\t\tdefaults.placeholder = 'https://';\n\t\t\t\t\tdefaults.tip = LLMS.l10n.translate( 'Use SoundCloud or Spotify audio URLS.' );\n\t\t\t\t\tdefaults.input_type = 'url';\n\t\t\t\tbreak;\n\n\t\t\t\tcase 'datepicker':\n\t\t\t\t\tdefaults.classes.push( 'llms-editable-date' );\n\t\t\t\tbreak;\n\n\t\t\t\tcase 'editor':\n\t\t\t\tcase 'switch-editor':\n\t\t\t\t\tvar orig_settings = orig_field.settings || {};\n\t\t\t\t\tdefaults.settings = $.extend( true, _.getEditor().getDefaultSettings(), {\n\t\t\t\t\t\tmediaButtons: true,\n\t\t\t\t\t\ttinymce: {\n\t\t\t\t\t\t\ttoolbar1: 'bold,italic,strikethrough,bullist,numlist,blockquote,hr,alignleft,aligncenter,alignright,link,unlink,wp_adv',\n\t\t\t\t\t\t\ttoolbar2: 'formatselect,underline,alignjustify,forecolor,pastetext,removeformat,charmap,outdent,indent,undo,redo,wp_help',\n\t\t\t\t\t\t}\n\t\t\t\t\t}, orig_settings );\n\t\t\t\tbreak;\n\n\t\t\t\tcase 'number':\n\t\t\t\tcase 'switch-number':\n\t\t\t\t\tdefaults.input_type = 'number';\n\t\t\t\tbreak;\n\n\t\t\t\tcase 'permalink':\n\t\t\t\t\tdefaults.label = LLMS.l10n.translate( 'Permalink' );\n\t\t\t\tbreak;\n\n\t\t\t\tcase 'video_embed':\n\t\t\t\t\tdefaults.classes.push( 'llms-editable-video' );\n\t\t\t\t\tdefaults.placeholder = 'https://';\n\t\t\t\t\tdefaults.tip = LLMS.l10n.translate( 'Use YouTube, Vimeo, or Wistia video URLS.' );\n\t\t\t\t\tdefaults.input_type = 'url';\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( this.has_switch( orig_field.type ) ) {\n\t\t\t\tdefaults.switch_on = 'yes';\n\t\t\t\tdefaults.switch_off = 'no';\n\t\t\t}\n\n\t\t\tvar field = _.defaults( _.deepClone( orig_field ), defaults );\n\n\t\t\t// if options is a function run it\n\t\t\tif ( _.isFunction( field.options ) ) {\n\t\t\t\tfield.options = _.bind( field.options, this.model )();\n\t\t\t}\n\n\t\t\t// if it's a radio field options values can be submitted as images\n\t\t\t// this will transform those images into <img> html\n\t\t\tif ( -1 !== [ 'radio', 'switch-radio' ].indexOf( orig_field.type ) ) {\n\n\t\t\t\tvar has_images = false;\n\t\t\t\t_.each( orig_field.options, function( val, key ) {\n\t\t\t\t\tif ( -1 !== val.indexOf( '.png' ) || -1 !== val.indexOf( '.jpg' ) ) {\n\t\t\t\t\t\tfield.options[key] = '<span><img src=\"' + val + '\"></span>';\n\t\t\t\t\t\thas_images = true;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tif ( has_images ) {\n\t\t\t\t\tfield.classes.push( 'has-images' );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// transform classes array to a css class string\n\t\t\tif ( field.classes.length ) {\n\t\t\t\tfield.classes = ' ' + field.classes.join( ' ' );\n\t\t\t}\n\n\t\t\tthis.fields[ field.id ] = field;\n\n\t\t\treturn field;\n\n\t\t},\n\n\t\t/**\n\t\t * Determine if toggling a switch select should rerender the view\n\t\t *\n\t\t * @param string field_type field type string\n\t\t * @return boolean\n\t\t * @since 3.17.0\n\t\t * @version 3.17.0\n\t\t */\n\t\tshould_rerender_on_toggle: function( field_type ) {\n\n\t\t\treturn ( -1 !== field_type.indexOf( 'switch-' ) ) ? 'yes' : 'no';\n\n\t\t},\n\n\t\t/**\n\t\t * Click event for toggling visibility of settings groups\n\t\t * If localStorage is available, persist state\n\t\t *\n\t\t * @param obj event js event object\n\t\t * @return void\n\t\t * @since 3.17.0\n\t\t * @version 3.17.0\n\t\t */\n\t\ttoggle_group: function( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tvar $el = $( event.currentTarget ),\n\t\t\t\t$group = $el.closest( '.llms-model-settings' );\n\n\t\t\t$group.toggleClass( 'hidden' );\n\n\t\t\tif ( 'undefined' !== window.localStorage ) {\n\n\t\t\t\tvar id = $group.attr( 'id' );\n\t\t\t\tif ( $group.hasClass( 'hidden' ) ) {\n\t\t\t\t\twindow.localStorage.setItem( id, 'hidden' );\n\t\t\t\t} else {\n\t\t\t\t\twindow.localStorage.removeItem( id );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t} ) );\n\n} );\n\n","/**\n * Lesson Editor (Sidebar) View\n *\n * @package LifterLMS/Scripts/Builder\n *\n * @since 3.17.0\n * @since 3.35.2 Added filter `llms_lesson_rerender_change_events` to view re-render change events.\n * @version 3.35.2\n */\ndefine( 'Views/LessonEditor',[\n\t\t'Views/_Detachable',\n\t\t'Views/_Editable',\n\t\t'Views/_Trashable',\n\t\t'Views/_Subview',\n\t\t'Views/SettingsFields'\n\t], function(\n\t\tDetachable,\n\t\tEditable,\n\t\tTrashable,\n\t\tSubview,\n\t\tSettingsFields\n\t) {\n\n\t\treturn Backbone.View.extend( _.defaults( {\n\n\t\t\t/**\n\t\t\t * Current view state\n\t\t\t *\n\t\t\t * @type {String}\n\t\t\t */\n\t\t\tstate: 'default',\n\n\t\t\t/**\n\t\t\t * Current Subviews\n\t\t\t *\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\tviews: {\n\t\t\t\tsettings: {\n\t\t\t\t\tclass: SettingsFields,\n\t\t\t\t\tinstance: null,\n\t\t\t\t\tstate: 'default',\n\t\t\t\t},\n\t\t\t},\n\n\t\t\tel: '#llms-editor-lesson',\n\n\t\t\t/**\n\t\t\t * Events\n\t\t\t *\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\tevents: _.defaults( {}, Detachable.events, Editable.events, Trashable.events ),\n\n\t\t\t/**\n\t\t\t * Template function\n\t\t\t *\n\t\t\t * @type {[type]}\n\t\t\t */\n\t\t\ttemplate: wp.template( 'llms-lesson-settings-template' ),\n\n\t\t\t/**\n\t\t\t * Init\n\t\t\t *\n\t\t\t * @since 3.17.0\n\t\t\t * @since 3.24.0 Unknown\n\t\t\t * @since 3.35.2 Added filter to change events.\n\t\t\t *\n\t\t\t * @param {obj} data Parent template data.\n\t\t\t * @return {void}\n\t\t\t */\n\t\t\tinitialize: function( data ) {\n\n\t\t\t\tthis.model = data.lesson;\n\n\t\t\t\tvar change_events = window.llms.hooks.applyFilters( 'llms_lesson_rerender_change_events', [\n\t\t\t\t\t'change:date_available',\n\t\t\t\t\t'change:drip_method',\n\t\t\t\t\t'change:time_available',\n\t\t\t\t] );\n\t\t\t\t_.each( change_events, function( event ) {\n\t\t\t\t\tthis.listenTo( this.model, event, this.render );\n\t\t\t\t}, this );\n\n\t\t\t\t// render only the tooltip for points percentage when points change\n\t\t\t\tthis.listenTo( this.model, 'change:points', this.render_points_percentage );\n\n\t\t\t\t// when the \"has_prerequisite\" attr is toggled ON\n\t\t\t\t// trigger the prereq select object to set the default (first available) prereq for the lesson\n\t\t\t\tthis.listenTo( this.model, 'change:has_prerequisite', function( lesson, val ) {\n\t\t\t\t\tif ( 'yes' === val ) {\n\t\t\t\t\t\tthis.$el.find( 'select[name=\"prerequisite\"]' ).trigger( 'change' );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Render the view\n\t\t\t *\n\t\t\t * @return obj\n\t\t\t * @since 3.17.0\n\t\t\t * @version 3.24.0\n\t\t\t */\n\t\t\trender: function() {\n\n\t\t\t\tthis.$el.html( this.template( this.model ) );\n\n\t\t\t\tthis.remove_subview( 'settings' );\n\n\t\t\t\tthis.render_subview( 'settings', {\n\t\t\t\t\tel: '#llms-lesson-settings-fields',\n\t\t\t\t\tmodel: this.model,\n\t\t\t\t} );\n\n\t\t\t\tthis.init_datepickers();\n\t\t\t\tthis.init_selects();\n\n\t\t\t\tthis.render_points_percentage();\n\n\t\t\t\treturn this;\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Render the portion of the template which displays the points percentage\n\t\t\t *\n\t\t\t * @return void\n\t\t\t * @since 3.24.0\n\t\t\t * @version 3.24.0\n\t\t\t */\n\t\t\trender_points_percentage: function() {\n\t\t\t\tthis.$el.find( '#llms-model-settings-field--points .llms-editable-input' )\n\t\t\t\t.addClass( 'tip--top-left' )\n\t\t\t\t.attr( 'data-tip', this.model.get_points_percentage() );\n\t\t\t}\n\n\t\t}, Detachable, Editable, Trashable, Subview, SettingsFields ) );\n\n} );\n\n","/**\n * Popover View\n *\n * @since 3.16.0\n * @version 4.0.0\n */\ndefine( 'Views/Popover',[], function() {\n\n\treturn Backbone.View.extend( {\n\n\t\t/**\n\t\t * Default Properties\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tdefaults: {\n\t\t\tplacement: 'auto',\n\t\t\t// container: document.body,\n\t\t\twidth: 'auto',\n\t\t\ttrigger: 'manual',\n\t\t\tstyle: 'light',\n\t\t\tanimation: 'pop',\n\t\t\ttitle: '',\n\t\t\tcontent: '',\n\t\t\tcloseable: false,\n\t\t\tbackdrop: false,\n\t\t\tonShow: function( $el ) {},\n\t\t\tonHide: function( $el ) {},\n\t\t},\n\n\t\t/**\n\t\t * Wrapper Tag name\n\t\t *\n\t\t * @type {String}\n\t\t */\n\t\ttagName: 'div',\n\n\t\t/**\n\t\t * Initialization callback func (renders the element on screen)\n\t\t *\n\t\t * @since 3.14.1\n\t\t * @since 4.0.0 Add RTL support for popovers.\n\t\t *\n\t\t * @return void\n\t\t */\n\t\tinitialize: function( data ) {\n\n\t\t\tif ( this.$el.length ) {\n\t\t\t\tthis.defaults.container = this.$el.parent();\n\t\t\t}\n\n\t\t\tthis.args = _.defaults( data.args, this.defaults );\n\n\t\t\t// Reverse directions for RTL sites.\n\t\t\tif ( $( 'body' ).hasClass( 'rtl' ) ) {\n\n\t\t\t\tif ( -1 !== this.args.placement.indexOf( 'left' ) ) {\n\t\t\t\t\tthis.args.placement = this.args.placement.replace( 'left', 'right' );\n\t\t\t\t} else if ( -1 !== this.args.placement.indexOf( 'right' ) ) {\n\t\t\t\t\tthis.args.placement = this.args.placement.replace( 'right', 'left' );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.render();\n\n\t\t},\n\n\t\t/**\n\t\t * Compiles the template and renders the view\n\t\t *\n\t\t * @since 3.16.0\n\t\t *\n\t\t * @return {Object} Instance of the Backbone.view.\n\t\t */\n\t\trender: function() {\n\n\t\t\tthis.$el.webuiPopover( this.args );\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Hide the popover\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 3.16.12 Unknown.\n\t\t *\n\t\t * @return {Object} Instance of the Backbone.view.\n\t\t */\n\t\thide: function() {\n\n\t\t\tthis.$el.webuiPopover( 'hide' );\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Show the popover\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 3.16.12 Unknown.\n\t\t *\n\t\t * @return {Object} Instance of the Backbone.view.\n\t\t */\n\t\tshow: function() {\n\n\t\t\tthis.$el.webuiPopover( 'show' );\n\t\t\treturn this;\n\n\t\t},\n\n\t} );\n\n} );\n\n","/**\n * Post Popover Search content View\n *\n * @since 3.16.0\n * @version 4.4.0\n */\ndefine( 'Views/PostSearch',[], function() {\n\n\treturn Backbone.View.extend( {\n\n\t\t/**\n\t\t * DOM Events\n\t\t *\n\t\t * @type obj\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tevents: {\n\t\t\t'select2:select': 'add_post',\n\t\t},\n\n\t\t/**\n\t\t * Wrapper Tag name\n\t\t *\n\t\t * @type {String}\n\t\t */\n\t\ttagName: 'select',\n\n\t\t/**\n\t\t * Initializer\n\t\t *\n\t\t * @param obj data customize the search box with data\n\t\t * @return void\n\t\t * @since 3.16.12\n\t\t * @version 3.16.12\n\t\t */\n\t\tinitialize: function( data ) {\n\n\t\t\tthis.post_type = data.post_type;\n\t\t\tthis.searching_message = data.searching_message || LLMS.l10n.translate( 'Searching...' );\n\n\t\t},\n\n\t\t/**\n\t\t * Select event, adds the existing lesson to the course\n\t\t *\n\t\t * @param obj event select2:select event object\n\t\t * @since 3.16.0\n\t\t * @version 3.17.0\n\t\t */\n\t\tadd_post: function( event ) {\n\n\t\t\tvar type = this.$el.attr( 'data-post-type' );\n\n\t\t\tBackbone.pubSub.trigger( type.replace( 'llms_', '' ) + '-search-select', event.params.data, event );\n\t\t\tthis.$el.val( null ).trigger( 'change' );\n\n\t\t},\n\n\t\t/**\n\t\t * Render the section\n\t\t *\n\t\t * Initializes a new collection and views for all lessons in the section.\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 3.16.12 Unknown.\n\t\t * @since 4.4.0 Update ajax nonce source.\n\t\t *\n\t\t * @return void\n\t\t */\n\t\trender: function() {\n\t\t\tvar self = this;\n\t\t\tsetTimeout( function () {\n\t\t\t\tself.$el.llmsSelect2( {\n\t\t\t\t\tajax: {\n\t\t\t\t\t\tdataType: 'JSON',\n\t\t\t\t\t\tdelay: 250,\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\turl: window.ajaxurl,\n\t\t\t\t\t\tdata: function( params ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\taction: 'llms_builder',\n\t\t\t\t\t\t\t\taction_type: 'search',\n\t\t\t\t\t\t\t\tcourse_id: window.llms_builder.course.id,\n\t\t\t\t\t\t\t\tpost_type: self.post_type,\n\t\t\t\t\t\t\t\tterm: params.term,\n\t\t\t\t\t\t\t\tpage: params.page,\n\t\t\t\t\t\t\t\t_ajax_nonce: window.llms.ajax_nonce,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tdropdownParent: $( '.wrap.lifterlms.llms-builder' ),\n\t\t\t\t\t// Don't escape html from render_result.\n\t\t\t\t\tescapeMarkup: function( markup ) {\n\t\t\t\t\t\treturn markup;\n\t\t\t\t\t},\n\t\t\t\t\tplaceholder: self.searching_message,\n\t\t\t\t\ttemplateResult: self.render_result,\n\t\t\t\t\twidth: '100%',\n\t\t\t\t} );\n\t\t\t\tself.$el.attr( 'data-post-type', self.post_type );\n\t\t\t}, 0 );\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Render a nicer UI for each search result in the in the Select2 search results\n\t\t *\n\t\t * @param object res result data\n\t\t * @return string\n\t\t * @since 3.16.0\n\t\t * @version 3.16.12\n\t\t */\n\t\trender_result: function( res ) {\n\n\t\t\tvar $html = $( '<div class=\"llms-existing-lesson-result\" />' );\n\n\t\t\tif ( res.loading ) {\n\t\t\t\treturn $html.append( res.text );\n\t\t\t}\n\n\t\t\tvar $side = $( '<aside class=\"llms-existing-action\" />' ),\n\t\t\t\t$main = $( '<div class=\"llms-existing-info\" />' );\n\t\t\t\ticon = ( 'attach' === res.action ) ? 'paperclip' : 'clone',\n\t\t\t\ttext = ( 'attach' === res.action ) ? LLMS.l10n.translate( 'Attach' ) : LLMS.l10n.translate( 'Clone' );\n\n\t\t\t$side.append( '<i class=\"fa fa-' + icon + '\" aria-hidden=\"true\"></i><small>' + text + '</small>' );\n\n\t\t\t$main.append( '<h4>' + res.data.title + '</h4>' );\n\t\t\t$main.append( '<h5>' + LLMS.l10n.translate( 'ID' ) + ': <em>' + res.data.id + '</em></h5>' );\n\n\t\t\t_.each( res.parents, function( parent ) {\n\t\t\t\t$main.append( '<h5>' + parent + '</em></h5>' );\n\t\t\t} );\n\n\t\t\treturn $html.append( $side ).append( $main );\n\n\t\t},\n\n\t} );\n\n} );\n\n","/**\n * Question Type View\n *\n * @since 3.16.0\n * @since 3.30.1 Fixed issue causing multiple binds for add_existing_question events.\n * @version 5.4.0\n */\ndefine( 'Views/QuestionType',[ 'Views/Popover', 'Views/PostSearch' ], function( Popover, QuestionSearch ) {\n\n\treturn Backbone.View.extend( {\n\n\t\t/**\n\t\t * HTML class names.\n\t\t *\n\t\t * @type {String}\n\t\t */\n\t\tclassName: 'llms-question-type',\n\n\t\tevents: {\n\t\t\t'click .llms-add-question': 'add_question',\n\t\t},\n\n\t\t/**\n\t\t * HTML element wrapper ID attribute.\n\t\t *\n\t\t * @since 3.16.0\n\t\t *\n\t\t * @return {String}\n\t\t */\n\t\tid: function() {\n\t\t\treturn 'llms-question-type-' + this.model.id;\n\t\t},\n\n\t\t/**\n\t\t * Wrapper Tag name.\n\t\t *\n\t\t * @type {String}\n\t\t */\n\t\ttagName: 'li',\n\n\t\t/**\n\t\t * Get the underscore template.\n\t\t *\n\t\t * @type {[type]}\n\t\t */\n\t\ttemplate: wp.template( 'llms-question-type-template' ),\n\n\t\t/**\n\t\t * Initialization callback func (renders the element on screen).\n\t\t *\n\t\t * @since 3.16.0\n\t\t *\n\t\t * @return {Void}\n\t\t */\n\t\tinitialize: function() {\n\n\t\t\tthis.render();\n\n\t\t},\n\n\t\t/**\n\t\t * Compiles the template and renders the view.\n\t\t *\n\t\t * @since 3.16.0\n\t\t *\n\t\t * @return {Self} For chaining.\n\t\t */\n\t\trender: function() {\n\t\t\tthis.$el.html( this.template( this.model ) );\n\t\t\treturn this;\n\t\t},\n\n\t\t/**\n\t\t * Add a question of the selected type to the current quiz.\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 3.27.0 Unknown.\n\t\t *\n\t\t * @return {Void}\n\t\t */\n\t\tadd_question: function() {\n\n\t\t\tif ( 'existing' === this.model.get( 'id' ) ) {\n\t\t\t\tthis.add_existing_question_click();\n\t\t\t} else {\n\t\t\t\tthis.add_new_question();\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Add a new question to the quiz.\n\t\t *\n\t\t * @since 3.27.0\n\t\t * @since 3.30.1 Fixed issue causing multiple binds.\n\t\t *\n\t\t * @return {Void}\n\t\t */\n\t\tadd_existing_question_click: function() {\n\n\t\t\tvar pop = new Popover( {\n\t\t\t\tel: '#llms-add-question--existing',\n\t\t\t\targs: {\n\t\t\t\t\tbackdrop: true,\n\t\t\t\t\tcloseable: true,\n\t\t\t\t\tcontainer: '#llms-builder-sidebar',\n\t\t\t\t\tdismissible: true,\n\t\t\t\t\tplacement: 'top-left',\n\t\t\t\t\twidth: 'calc( 100% - 40px )',\n\t\t\t\t\toffsetLeft: 250,\n\t\t\t\t\toffsetTop: 60,\n\t\t\t\t\ttitle: LLMS.l10n.translate( 'Add Existing Question' ),\n\t\t\t\t\tcontent: new QuestionSearch( {\n\t\t\t\t\t\tpost_type: 'llms_question',\n\t\t\t\t\t\tsearching_message: LLMS.l10n.translate( 'Search for existing questions...' ),\n\t\t\t\t\t} ).render().$el,\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tpop.show();\n\t\t\tBackbone.pubSub.on( 'question-search-select', this.add_existing_question, this );\n\t\t\tBackbone.pubSub.on( 'question-search-select', function( event ) {\n\t\t\t\tpop.hide();\n\t\t\t\tBackbone.pubSub.off( 'question-search-select', this.add_existing_question, this );\n\t\t\t}, this );\n\n\t\t},\n\n\t\t/**\n\t\t * Callback event fired when a question is selected from the Add Existing Question popover interface.\n\t\t *\n\t\t * @since 3.27.0\n\t\t * @since 5.4.0 Use author id instead of the question author object.\n\t\t *\n\t\t * @param {Object} event JS event object.\n\t\t * @return {Void}\n\t\t */\n\t\tadd_existing_question: function( event ) {\n\n\t\t\tvar question = event.data;\n\n\t\t\tif ( 'clone' === event.action ) {\n\t\t\t\tquestion = _.prepareQuestionObjectForCloning( question );\n\t\t\t} else {\n\t\t\t\t// Use author id instead of the question author object.\n\t\t\t\tquestion = _.prepareExistingPostObjectDataForAddingOrCloning( question );\n\t\t\t\tquestion._forceSync = true;\n\t\t\t}\n\n\t\t\tquestion._expanded = true;\n\t\t\tthis.quiz.add_question( question );\n\n\t\t\tthis.quiz.trigger( 'new-question-added' );\n\n\t\t},\n\n\t\t/**\n\t\t * Add a new question to the quiz.\n\t\t *\n\t\t * @since 3.27.0\n\t\t *\n\t\t * @return {Void}\n\t\t */\n\t\tadd_new_question: function() {\n\n\t\t\tthis.quiz.add_question( {\n\t\t\t\t_expanded: true,\n\t\t\t\tchoices: this.model.get( 'default_choices' ) ? this.model.get( 'default_choices' ) : null,\n\t\t\t\tquestion_type: this.model,\n\t\t\t} );\n\n\t\t\tthis.quiz.trigger( 'new-question-added' );\n\n\t\t},\n\n\t\t// filter: function( term ) {\n\n\t\t// var words = this.model.get_keywords().map( function( word ) {\n\t\t// return word.toLowerCase();\n\t\t// } );\n\n\t\t// term = term.toLowerCase();\n\n\t\t// if ( -1 === words.indexOf( term ) ) {\n\t\t// this.$el.addClass( 'filtered' );\n\t\t// } else {\n\t\t// this.$el.removeClass( 'filtered' );\n\t\t// }\n\n\t\t// },\n\n\t\t// clear_filter: function() {\n\t\t// this.$el.removeClass( 'filtered' );\n\t\t// }\n\n\t} );\n\n} );\n\n","/**\n * Quiz question bank view\n *\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'Views/QuestionBank',[ 'Views/QuestionType' ], function( QuestionView ) {\n\n\treturn Backbone.CollectionView.extend( {\n\n\t\tclassName: 'llms-question',\n\n\t\t/**\n\t\t * Parent element\n\t\t *\n\t\t * @type {String}\n\t\t */\n\t\tel: '#llms-question-bank',\n\n\t\t/**\n\t\t * Section model\n\t\t *\n\t\t * @type {[type]}\n\t\t */\n\t\tmodelView: QuestionView,\n\n\t\t/**\n\t\t * Are sections selectable?\n\t\t *\n\t\t * @type {Bool}\n\t\t */\n\t\tselectable: false,\n\n\t\t/**\n\t\t * Are sections sortable?\n\t\t *\n\t\t * @type {Bool}\n\t\t */\n\t\tsortable: false,\n\n\t} );\n\n} );\n\n","/**\n * Single Question Choice View\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'Views/QuestionChoice',[ 'Views/_Editable', ], function( Editable ) {\n\n\treturn Backbone.View.extend( _.defaults( {\n\n\t\t/**\n\t\t * HTML class names\n\t\t * @type {String}\n\t\t */\n\t\tclassName: 'llms-question-choice',\n\n\t\tevents: _.defaults( {\n\t\t\t'change input[name=\"correct\"]': 'toggle_correct',\n\t\t\t'click .llms-action-icon[href=\"#llms-add-choice\"]': 'add_choice',\n\t\t\t'click .llms-action-icon[href=\"#llms-del-choice\"]': 'del_choice',\n\t\t}, Editable.events ),\n\n\t\t/**\n\t\t * HTML element wrapper ID attribute\n\t\t * @return string\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tid: function() {\n\t\t\treturn 'llms-question-choice-' + this.model.id;\n\t\t},\n\n\t\t/**\n\t\t * Wrapper Tag name\n\t\t * @type {String}\n\t\t */\n\t\ttagName: 'li',\n\n\t\t/**\n\t\t * Get the underscore template\n\t\t * @type {[type]}\n\t\t */\n\t\ttemplate: wp.template( 'llms-question-choice-template' ),\n\n\t\t/**\n\t\t * Initialization callback func (renders the element on screen)\n\t\t * @return void\n\t\t * @since 3.14.1\n\t\t * @version 3.14.1\n\t\t */\n\t\tinitialize: function() {\n\n\t\t\tthis.render();\n\n\t\t\tthis.listenTo( this.model.collection, 'add', this.maybe_disable_buttons );\n\t\t\tthis.listenTo( this.model, 'change', this.render );\n\n\t\t\tif ( 'image' === this.model.get( 'choice_type' ) ) {\n\t\t\t\tthis.listenTo( this.model.get( 'choice' ), 'change', this.render );\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Compiles the template and renders the view\n\t\t * @return self (for chaining)\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\trender: function() {\n\t\t\tthis.$el.html( this.template( this.model ) );\n\t\t\treturn this;\n\t\t},\n\n\t\t/**\n\t\t * Add a new choice to the current choice list\n\t\t * Adds *after* the clicked choice\n\t\t * @param obj event JS event object\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tadd_choice: function( event ) {\n\n\t\t\tevent.stopPropagation();\n\t\t\tevent.preventDefault();\n\n\t\t\tvar index = this.model.collection.indexOf( this.model );\n\t\t\tthis.model.collection.parent.add_choice( {}, {\n\t\t\t\tat: index + 1,\n\t\t\t} );\n\n\t\t},\n\n\t\t/**\n\t\t * Delete the choice from the choice list & ensure there's at least one correct choice\n\t\t * @param obj event js event obj\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tdel_choice: function( event ) {\n\n\t\t\tevent.preventDefault();\n\t\t\tBackbone.pubSub.trigger( 'model-trashed', this.model );\n\t\t\tthis.model.collection.remove( this.model );\n\n\t\t},\n\n\t\t/**\n\t\t * When the correct answer input changes sync status to model\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\ttoggle_correct: function() {\n\n\t\t\tvar correct = this.$el.find( 'input[name=\"correct\"]' ).is( ':checked' );\n\t\t\tthis.model.set( 'correct', correct );\n\t\t\tthis.model.collection.trigger( 'correct-update', this.model );\n\n\t\t},\n\n\t}, Editable ) );\n\n} );\n\n","/**\n * Quiz question bank view\n *\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'Views/QuestionChoiceList',[ 'Views/QuestionChoice' ], function( ChoiceView ) {\n\n\treturn Backbone.CollectionView.extend( {\n\n\t\tclassName: 'llms-quiz-questions',\n\n\t\t/**\n\t\t * Choice model view\n\t\t *\n\t\t * @type {[type]}\n\t\t */\n\t\tmodelView: ChoiceView,\n\n\t\t/**\n\t\t * Enable keyboard events\n\t\t *\n\t\t * @type {Bool}\n\t\t */\n\t\tprocessKeyEvents: false,\n\n\t\t/**\n\t\t * Are sections selectable?\n\t\t *\n\t\t * @type {Bool}\n\t\t */\n\t\tselectable: false,\n\n\t\t/**\n\t\t * Are sections sortable?\n\t\t *\n\t\t * @type {Bool}\n\t\t */\n\t\tsortable: true,\n\n\t\tsortableOptions: {\n\t\t\taxis: false,\n\t\t\t// connectWith: '.llms-lessons',\n\t\t\tcursor: 'move',\n\t\t\thandle: '.llms-choice-id',\n\t\t\titems: '.llms-question-choice',\n\t\t\tplaceholder: 'llms-question-choice llms-sortable-placeholder',\n\t\t},\n\n\t\tsortable_start: function( model ) {\n\t\t\tthis.$el.addClass( 'dragging' );\n\t\t},\n\n\t\tsortable_stop: function( model ) {\n\t\t\tthis.$el.removeClass( 'dragging' );\n\t\t},\n\n\t} );\n\n} );\n\n","/**\n * Single Question View\n * @since 3.16.0\n * @version 3.27.0\n */\ndefine( 'Views/Question',[\n\t\t'Views/_Detachable',\n\t\t'Views/_Editable',\n\t\t'Views/QuestionChoiceList'\n\t], function(\n\t\tDetachable,\n\t\tEditable,\n\t\tChoiceListView\n\t) {\n\n\treturn Backbone.View.extend( _.defaults( {\n\n\t\t/**\n\t\t * Generate CSS classes for the question\n\t\t * @return string\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tclassName: function() {\n\t\t\treturn 'llms-question qtype--' + this.model.get( 'question_type' ).get( 'id' );\n\t\t},\n\n\t\tevents: _.defaults( {\n\t\t\t'click .clone--question': 'clone',\n\t\t\t'click .delete--question': 'delete',\n\t\t\t'click .expand--question': 'expand',\n\t\t\t'click .collapse--question': 'collapse',\n\t\t\t'change input[name=\"question_points\"]': 'update_points',\n\t\t}, Detachable.events, Editable.events ),\n\n\t\t/**\n\t\t * HTML element wrapper ID attribute\n\t\t * @return string\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tid: function() {\n\t\t\treturn 'llms-question-' + this.model.id;\n\t\t},\n\n\t\t/**\n\t\t * Wrapper Tag name\n\t\t * @type {String}\n\t\t */\n\t\ttagName: 'li',\n\n\t\t/**\n\t\t * Get the underscore template\n\t\t * @type {[type]}\n\t\t */\n\t\ttemplate: wp.template( 'llms-question-template' ),\n\n\t\t/**\n\t\t * Initialization callback func (renders the element on screen)\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tinitialize: function() {\n\n\t\t\tvar change_events = [\n\t\t\t\t'change:_expanded',\n\t\t\t\t'change:menu_order',\n\t\t\t];\n\t\t\t_.each( change_events, function( event ) {\n\t\t\t\tthis.listenTo( this.model, event, this.render );\n\t\t\t}, this );\n\n\t\t\tthis.listenTo( this.model.get( 'image' ), 'change', this.render );\n\n\t\t\tthis.listenTo( this.model.get_parent(), 'change:_points', this.render_points_percentage );\n\n\t\t\tthis.on( 'multi_choices_toggle', this.multi_choices_toggle, this );\n\n\t\t\tBackbone.pubSub.on( 'del-question-choice', this.del_choice, this );\n\n\t\t},\n\n\t\t/**\n\t\t * Compiles the template and renders the view\n\t\t * @return self (for chaining)\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\trender: function() {\n\n\t\t\tthis.$el.html( this.template( this.model ) );\n\n\t\t\tif ( this.model.get( 'question_type').get( 'choices' ) ) {\n\n\t\t\t\tthis.choiceListView = new ChoiceListView( {\n\t\t\t\t\tel: this.$el.find( '.llms-question-choices' ),\n\t\t\t\t\tcollection: this.model.get( 'choices' ),\n\t\t\t\t} );\n\t\t\t\tthis.choiceListView.render();\n\t\t\t\tthis.choiceListView.on( 'sortStart', this.choiceListView.sortable_start );\n\t\t\t\tthis.choiceListView.on( 'sortStop', this.choiceListView.sortable_stop );\n\n\t\t\t}\n\n\t\t\tif ( 'group' === this.model.get( 'question_type' ).get( 'id' ) ) {\n\n\t\t\t\tvar self = this;\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\tself.questionListView = self.collectionListView.quiz.get_question_list( {\n\t\t\t\t\t\tel: self.$el.find( '.llms-quiz-questions' ),\n\t\t\t\t\t\tcollection: self.model.get( 'questions' ),\n\t\t\t\t\t} );\n\t\t\t\t\tself.questionListView.render();\n\t\t\t\t\tself.questionListView.on( 'sortStart', self.questionListView.sortable_start );\n\t\t\t\t\tself.questionListView.on( 'sortStop', self.questionListView.sortable_stop );\n\t\t\t\t}, 1 );\n\n\t\t\t}\n\n\t\t\tif ( this.model.get( 'description_enabled' ) ) {\n\t\t\t\tthis.init_editor( 'question-desc--' + this.model.get( 'id' ) );\n\t\t\t}\n\n\t\t\tif ( this.model.get( 'clarifications_enabled' ) ) {\n\t\t\t\tthis.init_editor( 'question-clarifications--' + this.model.get( 'id' ), {\n\t\t\t\t\tmediaButtons: false,\n\t\t\t\t\ttinymce: {\n\t\t\t\t\t\ttoolbar1: 'bold,italic,strikethrough,bullist,numlist,alignleft,aligncenter,alignright',\n\t\t\t\t\t\ttoolbar2: '',\n\t\t\t\t\t\tsetup: _.bind( this.on_editor_ready, this ),\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tthis.init_formatting_els();\n\t\t\tthis.init_selects();\n\n\t\t\treturn this;\n\t\t},\n\n\t\t/**\n\t\t * rerender points percentage when question points are updated\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\trender_points_percentage: function() {\n\n\t\t\tthis.$el.find( '.llms-question-points' ).attr( 'data-tip', this.model.get_points_percentage() );\n\n\t\t},\n\n\t\t/**\n\t\t * Click event to duplicate a question within a quiz\n\t\t * @param obj event js event object\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tclone: function( event ) {\n\n\t\t\tevent.stopPropagation();\n\t\t\tevent.preventDefault();\n\t\t\tthis.model.collection.add( this._get_question_clone( this.model ) );\n\n\t\t},\n\n\t\t/**\n\t\t * Recursive clone function which will correctly clone children of a question\n\t\t * @param obj question question model\n\t\t * @return obj\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\t_get_question_clone: function( question ) {\n\n\t\t\t// create a duplicate\n\t\t\tvar clone = _.clone( question.attributes );\n\n\t\t\t// remove id (we want the duplicate to have a temp id)\n\t\t\tdelete clone.id;\n\n\t\t\tclone.parent_id = question.get( 'id' );\n\n\t\t\t// set the question type ID\n\t\t\tclone.question_type = question.get( 'question_type' ).get( 'id' );\n\n\t\t\t// clone the image attributes separately\n\t\t\tclone.image = _.clone( question.get( 'image' ).attributes );\n\n\t\t\t// if it has choices clone all the choices\n\t\t\tif ( question.get( 'choices' ) ) {\n\n\t\t\t\tclone.choices = [];\n\n\t\t\t\tquestion.get( 'choices' ).each( function ( choice ) {\n\n\t\t\t\t\tvar choice_clone = _.clone( choice.attributes );\n\t\t\t\t\tdelete choice_clone.id;\n\t\t\t\t\tdelete choice_clone.question_id;\n\n\t\t\t\t\tclone.choices.push( choice_clone );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( 'group' === question.get( 'question_type' ).get( 'id' ) ) {\n\n\t\t\t\tclone.questions = [];\n\t\t\t\tquestion.get( 'questions' ).each( function( child ) {\n\t\t\t\t\tclone.questions.push( this._get_question_clone( child ) );\n\t\t\t\t}, this );\n\n\t\t\t}\n\n\t\t\treturn clone;\n\n\t\t},\n\n\t\t/**\n\t\t * Collapse a question and hide it's settings\n\t\t * @param obj event js event obj.\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.27.0\n\t\t */\n\t\tcollapse: function( event ) {\n\n\t\t\tif ( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\tthis.model.set( '_expanded', false );\n\n\t\t},\n\n\t\t/**\n\t\t * Delete the question from a quiz / question group\n\t\t * @param obj event js event object\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tdelete: function( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( window.confirm( LLMS.l10n.translate( 'Are you sure you want to delete this question?' ) ) ) {\n\n\t\t\t\tthis.model.collection.remove( this.model );\n\t\t\t\tBackbone.pubSub.trigger( 'model-trashed', this.model );\n\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Click event to reveal a question's settings & choices\n\t\t * @param obj event js event obj.\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.27.0\n\t\t */\n\t\texpand: function( event ) {\n\n\t\t\tif ( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\tthis.model.set( '_expanded', true );\n\n\t\t},\n\n\t\t/**\n\t\t * When toggling multiple correct answers *off* remove all correct choices except the first correct choice in the list\n\t\t * @param string val value of the question's `multi_choice` attr [yes|no]\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tmulti_choices_toggle: function( val ) {\n\n\t\t\tif ( 'yes' === val ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.model.get( 'choices' ).update_correct( _.first( this.model.get( 'choices' ).get_correct() ) );\n\n\t\t},\n\n\t\t/**\n\t\t * Update the model's points when the value of the points input is updated\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tupdate_points: function() {\n\n\t\t\tthis.model.set( 'points', this.$el.find( 'input[name=\"question_points\"]' ).val() * 1 );\n\n\t\t}\n\n\t}, Detachable, Editable ) );\n\n} );\n\n","/**\n * Quiz question bank view\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'Views/QuestionList',[ 'Views/Question' ], function( QuestionView ) {\n\n\treturn Backbone.CollectionView.extend( {\n\n\t\tclassName: 'llms-quiz-questions',\n\n\t\t/**\n\t\t * Parent element\n\t\t * @type {String}\n\t\t */\n\t\t// el: '#llms-quiz-questions',\n\n\t\t/**\n\t\t * Section model\n\t\t * @type {[type]}\n\t\t */\n\t\tmodelView: QuestionView,\n\n\t\t/**\n\t\t * Enable keyboard events\n\t\t * @type {Bool}\n\t\t */\n\t\tprocessKeyEvents: false,\n\n\t\t/**\n\t\t * Are sections selectable?\n\t\t * @type {Bool}\n\t\t */\n\t\tselectable: false,\n\n\t\t/**\n\t\t * Are sections sortable?\n\t\t * @type {Bool}\n\t\t */\n\t\tsortable: true,\n\n\t\tsortableOptions: {\n\t\t\taxis: false,\n\t\t\tconnectWith: '.llms-quiz-questions',\n\t\t\tcursor: 'move',\n\t\t\thandle: '.llms-data-stamp',\n\t\t\titems: '.llms-question',\n\t\t\tplaceholder: 'llms-question llms-sortable-placeholder',\n\t\t},\n\n\t\t/**\n\t\t * Highlight drop areas when dragging starts\n\t\t * @param obj model model being sorted\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tsortable_start: function( model ) {\n\t\t\tvar selector = 'group' === model.get( 'question_type' ).get( 'id' ) ? '.llms-editor-tab > .llms-quiz-questions' : '.llms-quiz-questions';\n\t\t\t$( selector ).addClass( 'dragging' );\n\t\t},\n\n\t\t/**\n\t\t * Remove highlights when dragging stops\n\t\t * @param obj model model being sorted\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tsortable_stop: function() {\n\t\t\t$( '.llms-quiz-questions' ).removeClass( 'dragging' );\n\t\t},\n\n\t\t/**\n\t\t * Overrides receive to ensure that question groups can't be moved into question groups\n\t\t * @param obj event js event object\n\t\t * @param obj ui jQuery UI Sortable ui object\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\t_receive : function( event, ui ) {\n\n\t\t\tevent.stopPropagation();\n\n\t\t\t// prevent moving a question group into a question group\n\t\t\tif ( ui.item.hasClass( 'qtype--group' ) && $( event.target ).closest( '.qtype--group' ).length ) {;\n\t\t\t\tui.sender.sortable( 'cancel' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar senderListEl = ui.sender;\n\t\t\tvar senderCollectionListView = senderListEl.data( \"view\" );\n\t\t\tif( ! senderCollectionListView || ! senderCollectionListView.collection ) return;\n\n\t\t\tvar newIndex = this._getContainerEl().children().index( ui.item );\n\t\t\tvar modelReceived = senderCollectionListView.collection.get( ui.item.attr( \"data-model-cid\" ) );\n\t\t\tsenderCollectionListView.collection.remove( modelReceived );\n\t\t\tthis.collection.add( modelReceived, { at : newIndex } );\n\t\t\tmodelReceived.collection = this.collection; // otherwise will not get properly set, since modelReceived.collection might already have a value.\n\t\t\tthis.setSelectedModel( modelReceived );\n\t\t},\n\n\t\t/**\n\t\t * Override to allow manipulation of placeholder element\n\t\t * @param {[type]} event [description]\n\t\t * @param {[type]} ui [description]\n\t\t * @return {[type]}\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\t_sortStart : function( event, ui ) {\n\n\t\t\tvar modelBeingSorted = this.collection.get( ui.item.attr( \"data-model-cid\" ) );\n\n\t\t\tui.placeholder.addClass( 'qtype--' + modelBeingSorted.get( 'question_type' ).get( 'id' ) );\n\n\t\t\tif( this._isBackboneCourierAvailable() )\n\t\t\t\tthis.spawn( \"sortStart\", { modelBeingSorted : modelBeingSorted } );\n\t\t\telse this.trigger( \"sortStart\", modelBeingSorted );\n\t\t},\n\n\t\t/**\n\t\t * Overloads the function from Backbone.CollectionView core because it doesn't send stop events\n\t\t * if moving from one sortable to another... :-(\n\t\t * @param obj event js event object\n\t\t * @param obj ui jQuery UI object\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\t_sortStop : function( event, ui ) {\n\n\t\t\tevent.stopPropagation();\n\n\t\t\tvar modelBeingSorted = this.collection.get( ui.item.attr( 'data-model-cid' ) ),\n\t\t\t\tmodelViewContainerEl = this._getContainerEl(),\n\t\t\t\tnewIndex = modelViewContainerEl.children().index( ui.item );\n\n\t\t\tif ( newIndex == -1 && modelBeingSorted ) {\n\t\t\t\tthis.collection.remove( modelBeingSorted );\n\t\t\t}\n\n\t\t\tthis._reorderCollectionBasedOnHTML();\n\t\t\tthis.updateDependentControls();\n\n\t\t\tif( this._isBackboneCourierAvailable() ) {\n\t\t\t\tthis.spawn( 'sortStop', { modelBeingSorted : modelBeingSorted, newIndex : newIndex } );\n\t\t\t} else {\n\t\t\t\tthis.trigger( 'sortStop', modelBeingSorted, newIndex );\n\t\t\t}\n\n\t\t},\n\n\t} );\n\n} );\n\n","/**\n * Single Quiz View.\n *\n * @since 3.16.0\n * @version 5.4.0\n */\ndefine( 'Views/Quiz',[\n\t\t'Models/Quiz',\n\t\t'Views/Popover',\n\t\t'Views/PostSearch',\n\t\t'Views/QuestionBank',\n\t\t'Views/QuestionList',\n\t\t'Views/SettingsFields',\n\t\t'Views/_Detachable',\n\t\t'Views/_Editable',\n\t\t'Views/_Subview',\n\t\t'Views/_Trashable'\n\t], function(\n\t\tQuizModel,\n\t\tPopover,\n\t\tPostSearch,\n\t\tQuestionBank,\n\t\tQuestionList,\n\t\tSettingsFields,\n\t\tDetachable,\n\t\tEditable,\n\t\tSubview,\n\t\tTrashable\n\t) {\n\n\treturn Backbone.View.extend( _.defaults( {\n\n\t\t/**\n\t\t * Current view state.\n\t\t *\n\t\t * @type {String}\n\t\t */\n\t\tstate: 'default',\n\n\t\t/**\n\t\t * Current Subviews.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tviews: {\n\t\t\tsettings: {\n\t\t\t\tclass: SettingsFields,\n\t\t\t\tinstance: null,\n\t\t\t\tstate: 'default',\n\t\t\t},\n\t\t\tbank: {\n\t\t\t\tclass: QuestionBank,\n\t\t\t\tinstance: null,\n\t\t\t\tstate: 'default',\n\t\t\t},\n\t\t\tlist: {\n\t\t\t\tclass: QuestionList,\n\t\t\t\tinstance: null,\n\t\t\t\tstate: 'default',\n\t\t\t},\n\t\t},\n\n\t\tel: '#llms-editor-quiz',\n\n\t\t/**\n\t\t * Events.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tevents: _.defaults( {\n\t\t\t'click #llms-existing-quiz': 'add_existing_quiz_click',\n\t\t\t'click #llms-new-quiz': 'add_new_quiz',\n\t\t\t'click #llms-show-question-bank': 'show_tools',\n\t\t\t'click .bulk-toggle': 'bulk_toggle',\n\t\t\t// 'keyup #llms-question-bank-filter': 'filter_question_types',\n\t\t\t// 'search #llms-question-bank-filter': 'filter_question_types',\n\t\t}, Detachable.events, Editable.events, Trashable.events ),\n\n\t\t/**\n\t\t * Wrapper Tag name.\n\t\t *\n\t\t * @type {String}\n\t\t */\n\t\ttagName: 'div',\n\n\t\t/**\n\t\t * Get the underscore template\n\t\t *\n\t\t * @type {[type]}\n\t\t */\n\t\ttemplate: wp.template( 'llms-quiz-template' ),\n\n\t\t/**\n\t\t * Initialization callback func (renders the element on screen).\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 3.19.2 Unknown.\n\t\t *\n\t\t * @return {Void}\n\t\t */\n\t\tinitialize: function( data ) {\n\n\t\t\tthis.lesson = data.lesson;\n\n\t\t\t// Initialize the model if the quiz is enabled or it's disabled but we still have data for a quiz.\n\t\t\tif ( 'yes' === this.lesson.get( 'quiz_enabled' ) || ! _.isEmpty( this.lesson.get( 'quiz' ) ) ) {\n\n\t\t\t\tthis.model = this.lesson.get( 'quiz' );\n\n\t\t\t\t/**\n\t\t\t\t * @todo this is a terrible terrible patch\n\t\t\t\t * I've spent nearly 3 days trying to figure out how to not use this line of code\n\t\t\t\t * ISSUE REPRODUCTION:\n\t\t\t\t * Open course builder\n\t\t\t\t * Open a lesson (A) and add a quiz\n\t\t\t\t * Switch to a new lesson (B)\n\t\t\t\t * Add a new quiz\n\t\t\t\t * Return to lesson A and the quizzes parent will be set to LESSON B\n\t\t\t\t * This will happen for *every* quiz in the builder...\n\t\t\t\t * Adding this set_parent on init guarantees that the quizzes correct parent is set\n\t\t\t\t * after adding new quizzes to other lessons\n\t\t\t\t * it's awful and it's gross...\n\t\t\t\t * I'm confused and tired and going to miss release dates again because of it\n\t\t\t\t */\n\t\t\t\tthis.model.set_parent( this.lesson );\n\n\t\t\t\tthis.listenTo( this.model, 'change:_points', this.render_points );\n\n\t\t\t}\n\n\t\t\tthis.on( 'model-trashed', this.on_trashed );\n\n\t\t},\n\n\t\t/**\n\t\t * Compiles the template and renders the view.\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 3.19.2 Unknown.\n\t\t *\n\t\t * @return {Self} For chaining.\n\t\t */\n\t\trender: function() {\n\n\t\t\tthis.$el.html( this.template( this.model ) );\n\n\t\t\t// Render the quiz builder.\n\t\t\tif ( this.model ) {\n\n\t\t\t\t// Don't allow interaction until questions are lazy loaded.\n\t\t\t\tLLMS.Spinner.start( this.$el );\n\n\t\t\t\tthis.render_subview( 'settings', {\n\t\t\t\t\tel: '#llms-quiz-settings-fields',\n\t\t\t\t\tmodel: this.model,\n\t\t\t\t} );\n\n\t\t\t\tthis.init_datepickers();\n\t\t\t\tthis.init_selects();\n\n\t\t\t\tthis.render_subview( 'bank', {\n\t\t\t\t\tcollection: window.llms_builder.questions,\n\t\t\t\t} );\n\n\t\t\t\tvar last_group = null,\n\t\t\t\t\tgroup = null;\n\t\t\t\t// Let all the question types reference the quiz for adding questions quickly.\n\t\t\t\tthis.get_subview( 'bank' ).instance.viewManager.each( function( view ) {\n\n\t\t\t\t\tview.quiz = this.model;\n\n\t\t\t\t\tgroup = view.model.get( 'group' ).name;\n\n\t\t\t\t\tif ( last_group !== group ) {\n\t\t\t\t\t\tlast_group = group;\n\t\t\t\t\t\tview.$el.before( '<li class=\"llms-question-bank-header\"><h4>' + group + '</h4></li>' );\n\t\t\t\t\t}\n\n\t\t\t\t}, this );\n\n\t\t\t\tthis.model.load_questions( _.bind( function( err ) {\n\n\t\t\t\t\tif ( err ) {\n\t\t\t\t\t\talert( LLMS.l10n.translate( 'An error occurred while trying to load the questions. Please refresh the page and try again.' ) );\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\tLLMS.Spinner.stop( this.$el );\n\t\t\t\t\tthis.render_subview( 'list', {\n\t\t\t\t\t\tel: '#llms-quiz-questions',\n\t\t\t\t\t\tcollection: this.model.get( 'questions' ),\n\t\t\t\t\t} );\n\t\t\t\t\tvar list = this.get_subview( 'list' ).instance;\n\t\t\t\t\tlist.quiz = this;\n\t\t\t\t\tlist.collection.on( 'add', function() {\n\t\t\t\t\t\tlist.collection.trigger( 'reorder' );\n\t\t\t\t\t}, this );\n\t\t\t\t\tlist.on( 'sortStart', list.sortable_start );\n\t\t\t\t\tlist.on( 'sortStop', list.sortable_stop );\n\n\t\t\t\t}, this ) );\n\n\t\t\t\tthis.model.on( 'new-question-added', function() {\n\t\t\t\t\tvar $questions = this.$el.find( '#llms-quiz-questions' );\n\t\t\t\t\t$questions.animate( { scrollTop: $questions.prop( 'scrollHeight' ) }, 200 );\n\t\t\t\t}, this );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * On quiz points update, update the value of the Total Points area in the header.\n\t\t *\n\t\t * @since 3.17.6\n\t\t *\n\t\t * @param {Object} quiz Instance of the quiz model.\n\t\t * @param {Int} points Updated number of points.\n\t\t * @return {Void}\n\t\t */\n\t\trender_points: function( quiz, points ) {\n\n\t\t\tthis.$el.find( '#llms-quiz-total-points' ).text( points );\n\n\t\t},\n\n\t\t/**\n\t\t * Bulk expand / collapse question buttons.\n\t\t *\n\t\t * @since 3.16.0\n\t\t *\n\t\t * @param {Object} Event JS event object.\n\t\t * @return {Void}\n\t\t */\n\t\tbulk_toggle: function( event ) {\n\n\t\t\tvar expanded = ( 'expand' === $( event.target ).attr( 'data-action' ) );\n\n\t\t\tthis.model.get( 'questions' ).each( function( question ) {\n\t\t\t\tquestion.set( '_expanded', expanded );\n\t\t\t} );\n\n\t\t},\n\n\t\t/**\n\t\t * Adds a new quiz to a lesson which currently has no quiz associated with it.\n\t\t *\n\t\t * @since 3.16.0\n\t\t *\n\t\t * @return {Void}\n\t\t */\n\t\tadd_new_quiz: function() {\n\n\t\t\tvar quiz = this.lesson.get( 'quiz' );\n\t\t\tif ( _.isEmpty( quiz ) ) {\n\t\t\t\tquiz = this.lesson.add_quiz();\n\t\t\t} else {\n\t\t\t\tthis.lesson.set( 'quiz_enabled', 'yes' );\n\t\t\t}\n\n\t\t\tthis.model = quiz;\n\t\t\tthis.render();\n\n\t\t},\n\n\n\t\t/**\n\t\t * Add an existing quiz to a lesson.\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 3.24.0 Unknown.\n\t\t * @since 5.4.0 Use author id instead of the quiz author object.\n\t\t *\n\t\t * @param {Object} event JS event object.\n\t\t * @return {Void}\n\t\t */\n\t\tadd_existing_quiz: function( event ) {\n\n\t\t\tthis.post_search_popover.hide();\n\n\t\t\tvar quiz = event.data;\n\n\t\t\tif ( 'clone' === event.action ) {\n\n\t\t\t\tquiz = _.prepareQuizObjectForCloning( quiz );\n\n\t\t\t} else {\n\n\t\t\t\t// Use author id instead of the quiz author object.\n\t\t\t\tquiz = _.prepareExistingPostObjectDataForAddingOrCloning( quiz );\n\t\t\t\tquiz._forceSync = true;\n\n\t\t\t}\n\n\t\t\tdelete quiz.lesson_id;\n\n\t\t\tthis.lesson.add_quiz( quiz );\n\t\t\tthis.model = this.lesson.get( 'quiz' );\n\t\t\tthis.render();\n\n\t\t},\n\n\t\t/**\n\t\t * Open add existing quiz popover.\n\t\t *\n\t\t * @since 3.16.12\n\t\t *\n\t\t * @param {Object} event JS event object.\n\t\t * @return {Void}\n\t\t */\n\t\tadd_existing_quiz_click: function( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.post_search_popover = new Popover( {\n\t\t\t\tel: '#llms-existing-quiz',\n\t\t\t\targs: {\n\t\t\t\t\tbackdrop: true,\n\t\t\t\t\tcloseable: true,\n\t\t\t\t\tcontainer: '.wrap.lifterlms.llms-builder',\n\t\t\t\t\tdismissible: true,\n\t\t\t\t\tplacement: 'left',\n\t\t\t\t\twidth: 480,\n\t\t\t\t\ttitle: LLMS.l10n.translate( 'Add Existing Quiz' ),\n\t\t\t\t\tcontent: new PostSearch( {\n\t\t\t\t\t\tpost_type: 'llms_quiz',\n\t\t\t\t\t\tsearching_message: LLMS.l10n.translate( 'Search for existing quizzes...' ),\n\t\t\t\t\t} ).render().$el,\n\t\t\t\t\tonHide: function() {\n\t\t\t\t\t\tBackbone.pubSub.off( 'quiz-search-select' );\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tthis.post_search_popover.show();\n\t\t\tBackbone.pubSub.once( 'quiz-search-select', this.add_existing_quiz, this );\n\n\t\t},\n\n\t\t// filter_question_types: _.debounce( function( event ) {\n\n\t\t// \tvar term = $( event.target ).val();\n\n\t\t// \tthis.QuestionBankView.viewManager.each( function( view ) {\n\t\t// \t\tif ( ! term ) {\n\t\t// \t\t\tview.clear_filter();\n\t\t// \t\t} else {\n\t\t// \t\t\tview.filter( term );\n\t\t// \t\t}\n\t\t// \t} );\n\n\n\t\t// }, 300 ),\n\n\t\t/**\n\t\t * Callback function when the quiz has been deleted.\n\t\t *\n\t\t * @since 3.16.6\n\t\t *\n\t\t * @param {Oject} quiz Quiz Model.\n\t\t * @return {Void}\n\t\t */\n\t\ton_trashed: function( quiz ) {\n\n\t\t\tthis.lesson.set( 'quiz_enabled', 'no' );\n\t\t\tthis.lesson.set( 'quiz', '' );\n\n\t\t\tdelete this.model;\n\n\t\t\tthis.render();\n\n\t\t},\n\n\t\t/**\n\t\t * \"Add Question\" button click event.\n\t\t *\n\t\t * @since 3.16.0\n\t\t *\n\t\t * Creates a popover with question type list interface.\n\t\t *\n\t\t * @return {Void}\n\t\t */\n\t\tshow_tools: function() {\n\n\t\t\t// Create popover,\n\t\t\tvar pop = new Popover( {\n\t\t\t\tel: '#llms-show-question-bank',\n\t\t\t\targs: {\n\t\t\t\t\tbackdrop: true,\n\t\t\t\t\tcloseable: true,\n\t\t\t\t\tcontainer: '#llms-builder-sidebar',\n\t\t\t\t\tdismissible: true,\n\t\t\t\t\tplacement: 'top-left',\n\t\t\t\t\twidth: 'calc( 100% - 40px )',\n\t\t\t\t\ttitle: LLMS.l10n.translate( 'Add a Question' ),\n\t\t\t\t\turl: '#llms-quiz-tools',\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Show it.\n\t\t\tpop.show();\n\n\t\t\t// If a question is added, hide the popover.\n\t\t\tthis.model.on( 'new-question-added', function() {\n\t\t\t\tpop.hide();\n\t\t\t} );\n\n\t\t},\n\n\t\tget_question_list: function( options ) {\n\t\t\treturn new QuestionList( options );\n\t\t}\n\n\t}, Detachable, Editable, Subview, Trashable, SettingsFields ) );\n\n} );\n\n","/**\n * Single Assignment View.\n *\n * @package LifterLMS/Scripts\n *\n * @since 3.17.0\n * @version 5.4.0\n */\n\ndefine( 'Views/Assignment',[\n\t\t'Views/Popover',\n\t\t'Views/PostSearch',\n\t\t'Views/_Detachable',\n\t\t'Views/_Editable',\n\t\t'Views/_Trashable',\n\t\t'Views/_Subview',\n\t\t'Views/SettingsFields'\n\t], function(\n\t\tPopover,\n\t\tPostSearch,\n\t\tDetachable,\n\t\tEditable,\n\t\tTrashable,\n\t\tSubview,\n\t\tSettingsFields\n\t) {\n\n\t\treturn Backbone.View.extend( _.defaults( {\n\n\t\t\t/**\n\t\t\t * Current view state.\n\t\t\t *\n\t\t\t * @type {String}\n\t\t\t */\n\t\t\tstate: 'default',\n\n\t\t\t/**\n\t\t\t * Current Subviews.\n\t\t\t *\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\tviews: {\n\t\t\t\tsettings: {\n\t\t\t\t\tclass: SettingsFields,\n\t\t\t\t\tinstance: null,\n\t\t\t\t\tstate: 'default',\n\t\t\t\t},\n\t\t\t},\n\n\t\t\tel: '#llms-editor-assignment',\n\n\t\t\t/**\n\t\t\t * DOM Events.\n\t\t\t *\n\t\t\t * @since 3.17.1\n\t\t\t *\n\t\t\t * @return {Object}\n\t\t\t */\n\t\t\tevents: function() {\n\t\t\t\tvar addon_events = this.is_addon_available() ? window.llms_builder.assignments.get_view_events() : {};\n\t\t\t\treturn _.defaults( {\n\t\t\t\t\t'click #llms-existing-assignment': 'add_existing_assignment_click',\n\t\t\t\t\t'click #llms-new-assignment': 'add_new_assignment',\n\t\t\t\t}, Detachable.events, Editable.events, Trashable.events, addon_events );\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Wrapper Tag name.\n\t\t\t *\n\t\t\t * @type {String}\n\t\t\t */\n\t\t\ttagName: 'div',\n\n\t\t\t/**\n\t\t\t * Get the underscore template.\n\t\t\t *\n\t\t\t * @type {[type]}\n\t\t\t */\n\t\t\ttemplate: wp.template( 'llms-assignment-template' ),\n\n\t\t\t/**\n\t\t\t * Initialization callback func (renders the element on screen).\n\t\t\t *\n\t\t\t * @since 3.17.0\n\t\t\t * @since 3.17.2 Unknown.\n\t\t\t *\n\t\t\t * @return {Void}\n\t\t\t */\n\t\t\tinitialize: function( data ) {\n\n\t\t\t\tthis.lesson = data.lesson;\n\n\t\t\t\t// initialize the model if the assignment is enabled or it's disabled but we still have data for a assignment\n\t\t\t\tif ( 'yes' === this.lesson.get( 'assignment_enabled' ) || ! _.isEmpty( this.lesson.get( 'assignment' ) ) ) {\n\n\t\t\t\t\tthis.model = this.lesson.get( 'assignment' );\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Todo Item.\n\t\t\t\t\t *\n\t\t\t\t\t * @todo this is a terrible terrible patch\n\t\t\t\t\t * I've spent nearly 3 days trying to figure out how to not use this line of code\n\t\t\t\t\t * ISSUE REPRODUCTION:\n\t\t\t\t\t * Open course builder\n\t\t\t\t\t * Open a lesson (A) and add a assignment\n\t\t\t\t\t * Switch to a new lesson (B)\n\t\t\t\t\t * Add a new assignment\n\t\t\t\t\t * Return to lesson A and the assignment's parent will be set to LESSON B\n\t\t\t\t\t * This will happen for *every* assignment in the builder...\n\t\t\t\t\t * Adding this set_parent on init guarantees that the assignment's correct parent is set\n\t\t\t\t\t * after adding new assignment's to other lessons\n\t\t\t\t\t * it's awful and it's gross...\n\t\t\t\t\t * I'm confused and tired and going to miss release dates again because of it\n\t\t\t\t\t */\n\t\t\t\t\tthis.model.set_parent( this.lesson );\n\n\t\t\t\t}\n\n\t\t\t\tthis.on( 'model-trashed', this.on_trashed );\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Compiles the template and renders the view.\n\t\t\t *\n\t\t\t * @since 3.17.0\n\t\t\t * @since 3.17.7 Unknown.\n\t\t\t *\n\t\t\t * @return {Self} For chaining.\n\t\t\t */\n\t\t\trender: function() {\n\n\t\t\t\tthis.$el.html( this.template( this.model ) );\n\n\t\t\t\tif ( this.model && this.is_addon_available() ) {\n\n\t\t\t\t\tthis.stopListening( this.model, 'change:assignment_type', this.render );\n\n\t\t\t\t\tthis.render_subview( 'settings', {\n\t\t\t\t\t\tel: '#llms-assignment-settings-fields',\n\t\t\t\t\t\tmodel: this.model,\n\t\t\t\t\t} );\n\n\t\t\t\t\t// this.init_datepickers();\n\t\t\t\t\tthis.init_selects();\n\n\t\t\t\t\twindow.llms_builder.assignments.render_editor( this );\n\n\t\t\t\t\tthis.listenTo( this.model, 'change:assignment_type', this.render );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Adds a new assignment to a lesson which currently has no assignment associated with it.\n\t\t\t *\n\t\t\t * @since 3.17.0\n\t\t\t *\n\t\t\t * @return {Void}\n\t\t\t */\n\t\t\tadd_new_assignment: function() {\n\n\t\t\t\tif ( this.is_addon_available() ) {\n\n\t\t\t\t\tthis.model = window.llms_builder.assignments.get_assignment( {\n\t\t\t\t\t\t/* Translators: %1$s = associated lesson title */\n\t\t\t\t\t\ttitle: LLMS.l10n.replace( '%1$s Assignment', {\n\t\t\t\t\t\t\t'%1$s': this.lesson.get( 'title' ),\n\t\t\t\t\t\t} ),\n lesson_id: this.lesson.get( 'id' ),\n\t\t\t\t\t} );\n\n\t\t\t\t\tthis.lesson.set( 'assignment_enabled', 'yes' );\n\t\t\t\t\tthis.lesson.set( 'assignment', this.model );\n\n\t\t\t\t\tthis.render();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.show_ad_popover( '#llms-new-assignment' );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * When an assignment is selected from the post select popover\n\t\t\t * instantiate it and add it to the current lesson.\n\t\t\t *\n\t\t\t * @param {Object} event Data from the select2 select event.\n\t\t\t *\n\t\t\t * @since 3.17.0\n\t\t\t * @since 5.4.0 Prepare assignment object for cloning and use author id instead of the quiz author object.\n\t\t\t */\n\t\t\tadd_existing_assignment: function( event ) {\n\n\t\t\t\tthis.post_search_popover.hide();\n\n\t\t\t\tvar assignment = event.data;\n\n\t\t\t\tif ( 'clone' === event.action ) {\n\n\t\t\t\t\tassignment = _.prepareAssignmentObjectForCloning( assignment );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Use author id instead of the assignment author object.\n\t\t\t\t\tassignment = _.prepareExistingPostObjectDataForAddingOrCloning( assignment );\n\t\t\t\t\tassignment._forceSync = true;\n\n\t\t\t\t}\n\n\t\t\t\tassignment.lesson_id = this.lesson.get( 'id' )\n\n\t\t\t\tassignment = window.llms_builder.construct.get_model( 'Assignment', assignment );\n\n\t\t\t\tthis.lesson.set( 'assignment_enabled', 'yes' );\n\t\t\t\tthis.lesson.set( 'assignment', assignment );\n\t\t\t\tthis.model = assignment;\n\n\t\t\t\tthis.render();\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Open add existing assignment popover.\n\t\t\t *\n\t\t\t * @since 3.17.0\n\t\t\t *\n\t\t\t * @param {Object} event JS event object.\n\t\t\t * @return {Void}\n\t\t\t */\n\t\t\tadd_existing_assignment_click: function( event ) {\n\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif ( this.is_addon_available() ) {\n\n\t\t\t\t\tthis.post_search_popover = new Popover( {\n\t\t\t\t\t\tel: '#llms-existing-assignment',\n\t\t\t\t\t\targs: {\n\t\t\t\t\t\t\tbackdrop: true,\n\t\t\t\t\t\t\tcloseable: true,\n\t\t\t\t\t\t\tcontainer: '.wrap.lifterlms.llms-builder',\n\t\t\t\t\t\t\tdismissible: true,\n\t\t\t\t\t\t\tplacement: 'left',\n\t\t\t\t\t\t\twidth: 480,\n\t\t\t\t\t\t\ttitle: LLMS.l10n.translate( 'Add Existing Assignment' ),\n\t\t\t\t\t\t\tcontent: new PostSearch( {\n\t\t\t\t\t\t\t\tpost_type: 'llms_assignment',\n\t\t\t\t\t\t\t\tsearching_message: LLMS.l10n.translate( 'Search for existing assignments...' ),\n\t\t\t\t\t\t\t} ).render().$el,\n\t\t\t\t\t\tonHide: function() {\n\t\t\t\t\t\t\tBackbone.pubSub.off( 'assignment-search-select' );\n\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\tthis.post_search_popover.show();\n\t\t\t\t\tBackbone.pubSub.once( 'assignment-search-select', this.add_existing_assignment, this );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.show_ad_popover( '#llms-existing-assignment' );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Determine if Assignments addon is available to use.\n\t\t\t *\n\t\t\t * @since 3.17.0\n\t\t\t *\n\t\t\t * @return {Boolean}\n\t\t\t */\n\t\t\tis_addon_available: function() {\n\n\t\t\t\treturn ( window.llms_builder.assignments );\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Called when assignment is trashed.\n\t\t\t *\n\t\t\t * @since 3.17.0\n\t\t\t *\n\t\t\t * @param {Oject} assignment Assignment Model.\n\t\t\t * @return {Void}\n\t\t\t */\n\t\t\ton_trashed: function( assignment ) {\n\n\t\t\t\tthis.lesson.set( 'assignment_enabled', 'no' );\n\t\t\t\tthis.lesson.set( 'assignment', '' );\n\n\t\t\t\tdelete this.model;\n\n\t\t\t\tthis.render();\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Shows a dirty dirty ad popover for advanced assignments.\n\t\t\t *\n\t\t\t * @since 3.17.0\n\t\t\t *\n\t\t\t * @param {Sring} el The jQuery selector string.\n\t\t\t * @return {Void}\n\t\t\t */\n\t\t\tshow_ad_popover: function( el ) {\n\n\t\t\t\tvar h3 = LLMS.l10n.translate( 'Get Your Students Taking Action' ),\n\t\t\t\tp = 'Great learning content is only half of teaching online. When your learners fully engage, they will take your content and move into action. Remove barriers for your learners by telling them what to do to apply what they just learned. Create graded assignments or simply give them a checklist of action items to complete before moving on.',\n\t\t\t\tbtn = LLMS.l10n.translate( 'Get Assignments Now!' ),\n\t\t\t\turl = 'https://lifterlms.com/product/lifterlms-assignments?utm_source=LifterLMS%20Plugin&utm_medium=Assignment%20Builder%20Button&utm_campaign=Assignment%20Addon%20Upsell&utm_content=3.17.0';\n\n\t\t\t\tthis.ad_popover = new Popover( {\n\t\t\t\t\tel: el,\n\t\t\t\t\targs: {\n\t\t\t\t\t\tbackdrop: true,\n\t\t\t\t\t\tcloseable: true,\n\t\t\t\t\t\tcontainer: '.wrap.lifterlms.llms-builder',\n\t\t\t\t\t\tdismissible: true,\n\t\t\t\t\t\t// placement: 'left',\n\t\t\t\t\t\twidth: 380,\n\t\t\t\t\t\ttitle: LLMS.l10n.translate( 'Unlock LifterLMS Assignments' ),\n\t\t\t\t\t\tcontent: '<h3>' + h3 + '</h3><p>' + p + '</p><br><p><a class=\"llms-button-primary\" href=\"' + url + '\" target=\"_blank\">' + btn + '</a></p>'\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tthis.ad_popover.show();\n\n\t\t\t},\n\n\t\t}, Detachable, Editable, Trashable, Subview, SettingsFields ) );\n\n\t} );\n\n","/**\n * Sidebar Editor View\n *\n * @since 3.16.0\n * @version 3.27.0\n */\ndefine( 'Views/Editor',[\n\t\t'Views/LessonEditor',\n\t\t'Views/Quiz',\n\t\t'Views/Assignment',\n\t\t'Views/_Subview'\n\t], function(\n\t\tLessonEditor,\n\t\tQuiz,\n\t\tAssignment,\n\t\tSubview\n\t) {\n\n\t\treturn Backbone.View.extend( _.defaults( {\n\n\t\t\t/**\n\t\t\t * Current view state\n\t\t\t *\n\t\t\t * @type {String}\n\t\t\t */\n\t\t\tstate: 'lesson', // [lesson|quiz]\n\n\t\t\t/**\n\t\t\t * Current Subviews\n\t\t\t *\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\tviews: {\n\t\t\t\tlesson: {\n\t\t\t\t\tclass: LessonEditor,\n\t\t\t\t\tinstance: null,\n\t\t\t\t\tstate: 'lesson',\n\t\t\t\t},\n\t\t\t\tassignment: {\n\t\t\t\t\tclass: Assignment,\n\t\t\t\t\tinstance: null,\n\t\t\t\t\tstate: 'assignment',\n\t\t\t\t},\n\t\t\t\tquiz: {\n\t\t\t\t\tclass: Quiz,\n\t\t\t\t\tinstance: null,\n\t\t\t\t\tstate: 'quiz',\n\t\t\t\t},\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * HTML element selector\n\t\t\t *\n\t\t\t * @type {String}\n\t\t\t */\n\t\t\tel: '#llms-editor',\n\n\t\t\tevents: {\n\t\t\t\t'click .llms-editor-nav a[href=\"#llms-editor-close\"]': 'close_editor',\n\t\t\t\t'click .llms-editor-nav a:not([href=\"#llms-editor-close\"])': 'switch_tab',\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Wrapper Tag name\n\t\t\t *\n\t\t\t * @type {String}\n\t\t\t */\n\t\t\ttagName: 'div',\n\n\t\t\t/**\n\t\t\t * Get the underscore template\n\t\t\t *\n\t\t\t * @type {[type]}\n\t\t\t */\n\t\t\ttemplate: wp.template( 'llms-editor-template' ),\n\n\t\t\t/**\n\t\t\t * Initialization callback func (renders the element on screen)\n\t\t\t *\n\t\t\t * @return void\n\t\t\t * @since 3.16.0\n\t\t\t * @version 3.16.0\n\t\t\t */\n\t\t\tinitialize: function( data ) {\n\n\t\t\t\tthis.SidebarView = data.SidebarView;\n\t\t\t\tif ( data.tab ) {\n\t\t\t\t\tthis.state = data.tab;\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Compiles the template and renders the view\n\t\t\t *\n\t\t\t * @return self (for chaining)\n\t\t\t * @since 3.16.0\n\t\t\t * @version 3.16.0\n\t\t\t */\n\t\t\trender: function( view_data ) {\n\n\t\t\t\tview_data = view_data || {};\n\n\t\t\t\tthis.$el.html( this.template( this ) );\n\n\t\t\t\tthis.render_subviews( _.extend( view_data, {\n\t\t\t\t\tlesson: this.model,\n\t\t\t\t} ) );\n\n\t\t\t\treturn this;\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Click event for close sidebar editor button\n\t\t\t * Sends event to main SidebarView to trigger editor closing events\n\t\t\t *\n\t\t\t * @param obj event js event obj\n\t\t\t * @return void\n\t\t\t * @since 3.16.0\n\t\t\t * @version 3.27.0\n\t\t\t */\n\t\t\tclose_editor: function( event ) {\n\n\t\t\t\tevent.preventDefault();\n\t\t\t\tBackbone.pubSub.trigger( 'sidebar-editor-close' );\n\t\t\t\twindow.location.hash = '';\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Click event for switching tabs in the editor navigation\n\t\t\t *\n\t\t\t * @param object event js event object\n\t\t\t * @return void\n\t\t\t * @since 3.16.0\n\t\t\t * @version 3.27.0\n\t\t\t */\n\t\t\tswitch_tab: function( event ) {\n\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tvar $btn = $( event.target ),\n\t\t\t\tview = $btn.attr( 'data-view' ),\n\t\t\t\t$tab = this.$el.find( $btn.attr( 'href' ) );\n\n\t\t\t\tthis.set_state( view ).render();\n\t\t\t\tthis.set_hash( view );\n\n\t\t\t\t// Backbone.pubSub.trigger( 'editor-tab-activated', $btn.attr( 'href' ).substring( 1 ) );\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Adds a hash for deep linking to a specific lesson tab\n\t\t\t *\n\t\t\t * @param string subtab subtab [quiz|assignment]\n\t\t\t * @return void\n\t\t\t * @since 3.27.0\n\t\t\t * @version 3.27.0\n\t\t\t */\n\t\t\tset_hash: function( subtab ) {\n\n\t\t\t\tvar hash = 'lesson:' + this.model.get( 'id' );\n\n\t\t\t\tif ( 'lesson' !== subtab ) {\n\t\t\t\t\thash += ':' + subtab;\n\t\t\t\t}\n\n\t\t\t\twindow.location.hash = hash;\n\n\t\t\t},\n\n\t\t}, Subview ) );\n\n} );\n\n","/**\n * Sidebar Elements View\n *\n * @since 3.16.0\n * @version 3.16.12\n */\ndefine( 'Views/Elements',[ 'Models/Section', 'Views/Section', 'Models/Lesson', 'Views/Lesson', 'Views/Popover', 'Views/PostSearch' ], function( Section, SectionView, Lesson, LessonView, Popover, LessonSearch ) {\n\n\treturn Backbone.View.extend( {\n\n\t\t/**\n\t\t * HTML element selector\n\t\t *\n\t\t * @type {String}\n\t\t */\n\t\tel: '#llms-elements',\n\n\t\tevents: {\n\t\t\t'click #llms-new-section': 'add_new_section',\n\t\t\t'click #llms-new-lesson': 'add_new_lesson',\n\t\t\t'click #llms-existing-lesson': 'add_existing_lesson',\n\t\t},\n\n\t\t/**\n\t\t * Wrapper Tag name\n\t\t *\n\t\t * @type {String}\n\t\t */\n\t\ttagName: 'div',\n\n\t\t/**\n\t\t * Get the underscore template\n\t\t *\n\t\t * @type {[type]}\n\t\t */\n\t\ttemplate: wp.template( 'llms-elements-template' ),\n\n\t\t/**\n\t\t * Initialization callback func (renders the element on screen)\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tinitialize: function( data ) {\n\n\t\t\t// save a reference to the main Course view\n\t\t\tthis.SidebarView = data.SidebarView;\n\n\t\t\t// watch course sections and enable/disable lesson buttons conditionally\n\t\t\tthis.listenTo( this.SidebarView.CourseView.model.get( 'sections' ), 'add', this.maybe_disable_buttons );\n\t\t\tthis.listenTo( this.SidebarView.CourseView.model.get( 'sections' ), 'remove', this.maybe_disable_buttons );\n\n\t\t},\n\n\t\t/**\n\t\t * Compiles the template and renders the view\n\t\t *\n\t\t * @return self (for chaining)\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\trender: function() {\n\n\t\t\tthis.$el.html( this.template() );\n\t\t\tthis.draggable();\n\t\t\tthis.maybe_disable_buttons();\n\n\t\t\treturn this;\n\t\t},\n\n\t\tdraggable: function() {\n\n\t\t\t$( '#llms-new-section' ).draggable( {\n\t\t\t\tappendTo: '#llms-sections',\n\t\t\t\tcancel: false,\n\t\t\t\tconnectToSortable: '.llms-sections',\n\t\t\t\thelper: function() {\n\t\t\t\t\treturn new SectionView( { model: new Section() } ).render().$el;\n\t\t\t\t},\n\t\t\t\tstart: function() {\n\t\t\t\t\t$( '.llms-sections' ).addClass( 'dragging' );\n\t\t\t\t},\n\t\t\t\tstop: function() {\n\t\t\t\t\t$( '.llms-sections' ).removeClass( 'dragging' );\n\t\t\t\t},\n\t\t\t} );\n\n\t\t\t$( '#llms-new-lesson' ).draggable( {\n\t\t\t\t// appendTo: '#llms-sections .llms-section:first-child .llms-lessons',\n\t\t\t\tappendTo: '#llms-sections',\n\t\t\t\tcancel: false,\n\t\t\t\tconnectToSortable: '.llms-lessons',\n\t\t\t\thelper: function() {\n\t\t\t\t\treturn new LessonView( { model: new Lesson() } ).render().$el;\n\t\t\t\t},\n\t\t\t\tstart: function() {\n\n\t\t\t\t\t$( '.llms-lessons' ).addClass( 'dragging' );\n\n\t\t\t\t},\n\t\t\t\tstop: function() {\n\t\t\t\t\t$( '.llms-lessons' ).removeClass( 'dragging' );\n\t\t\t\t\t$( '.drag-expanded' ).removeClass( '.drag-expanded' );\n\t\t\t\t},\n\t\t\t} );\n\n\t\t},\n\n\t\tadd_new_section: function( event ) {\n\n\t\t\tevent.preventDefault();\n\t\t\tBackbone.pubSub.trigger( 'add-new-section' );\n\t\t},\n\n\t\tadd_new_lesson: function( event ) {\n\t\t\tevent.preventDefault();\n\t\t\tBackbone.pubSub.trigger( 'add-new-lesson' );\n\t\t},\n\n\t\t/**\n\t\t * Show the popover to add an existing lessons\n\t\t *\n\t\t * @param object event JS Event Object\n\t\t * @return void\n\t\t * @since 3.16.12\n\t\t * @version 3.16.12\n\t\t */\n\t\tadd_existing_lesson: function( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tvar pop = new Popover( {\n\t\t\t\tel: '#llms-existing-lesson',\n\t\t\t\targs: {\n\t\t\t\t\tbackdrop: true,\n\t\t\t\t\tcloseable: true,\n\t\t\t\t\tcontainer: '.wrap.lifterlms.llms-builder',\n\t\t\t\t\tdismissible: true,\n\t\t\t\t\tplacement: 'left',\n\t\t\t\t\twidth: 480,\n\t\t\t\t\ttitle: LLMS.l10n.translate( 'Add Existing Lesson' ),\n\t\t\t\t\tcontent: new LessonSearch( {\n\t\t\t\t\t\tpost_type: 'lesson',\n\t\t\t\t\t\tsearching_message: LLMS.l10n.translate( 'Search for existing lessons...' ),\n\t\t\t\t\t} ).render().$el,\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tpop.show();\n\t\t\tBackbone.pubSub.on( 'lesson-search-select', function() {\n\t\t\t\tpop.hide()\n\t\t\t} );\n\n\t\t},\n\n\t\t/**\n\t\t * Disables lesson add buttons if no sections are available to add a lesson to\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tmaybe_disable_buttons: function() {\n\n\t\t\tvar $els = $( '#llms-new-lesson, #llms-existing-lesson' );\n\n\t\t\tif ( ! this.SidebarView.CourseView.model.get( 'sections' ).length ) {\n\t\t\t\t$els.attr( 'disabled', 'disabled' );\n\t\t\t} else {\n\t\t\t\t$els.removeAttr( 'disabled' );\n\t\t\t}\n\n\t\t},\n\n\t} );\n\n} );\n\n","/**\n * Sidebar Utilities View\n *\n * @since 3.16.0\n * @version 3.16.0\n */\ndefine( 'Views/Utilities',[], function() {\n\n\treturn Backbone.View.extend( {\n\n\t\t/**\n\t\t * HTML element selector\n\t\t *\n\t\t * @type {String}\n\t\t */\n\t\tel: '#llms-utilities',\n\n\t\tevents: {\n\t\t\t'click #llms-collapse-all': 'collapse_all',\n\t\t\t'click #llms-expand-all': 'expand_all'\n\t\t},\n\n\t\t/**\n\t\t * Wrapper Tag name\n\t\t *\n\t\t * @type {String}\n\t\t */\n\t\ttagName: 'div',\n\n\t\t/**\n\t\t * Get the underscore template\n\t\t *\n\t\t * @type {[type]}\n\t\t */\n\t\ttemplate: wp.template( 'llms-utilities-template' ),\n\n\t\t/**\n\t\t * Initialization callback func (renders the element on screen)\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tinitialize: function() {\n\n\t\t\t// this.render();\n\t\t},\n\n\t\t/**\n\t\t * Compiles the template and renders the view\n\t\t *\n\t\t * @return self (for chaining)\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\trender: function() {\n\t\t\tthis.$el.html( this.template() );\n\t\t\treturn this;\n\t\t},\n\n\t\t/**\n\t\t * Collapse all sections\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tcollapse_all: function( event ) {\n\t\t\tevent.preventDefault();\n\t\t\tBackbone.pubSub.trigger( 'collapse-all' );\n\t\t},\n\n\t\t/**\n\t\t * Expand all sections\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\texpand_all: function( event ) {\n\t\t\tevent.preventDefault();\n\t\t\tBackbone.pubSub.trigger( 'expand-all' );\n\t\t},\n\n\t} );\n\n} );\n\n","/**\n * Main sidebar view\n * @since 3.16.0\n * @version 3.16.7\n */\ndefine( 'Views/Sidebar',[\n\t\t'Views/Editor',\n\t\t'Views/Elements',\n\t\t'Views/Utilities',\n\t\t'Views/_Subview'\n\t], function(\n\t\tEditor,\n\t\tElements,\n\t\tUtilities,\n\t\tSubview\n\t) {\n\n\treturn Backbone.View.extend( _.defaults( {\n\n\t\t/**\n\t\t * Current builder state\n\t\t * @type {String}\n\t\t */\n\t\tstate: 'builder', // [builder|editor]\n\n\t\t/**\n\t\t * Current Subviews\n\t\t * @type {Object}\n\t\t */\n\t\tviews: {\n\t\t\telements: {\n\t\t\t\tclass: Elements,\n\t\t\t\tinstance: null,\n\t\t\t\tstate: 'builder',\n\t\t\t},\n\t\t\tutilities: {\n\t\t\t\tclass: Utilities,\n\t\t\t\tinstance: null,\n\t\t\t\tstate: 'builder',\n\t\t\t},\n\t\t\teditor: {\n\t\t\t\tclass: Editor,\n\t\t\t\tinstance: null,\n\t\t\t\tstate: 'editor',\n\t\t\t},\n\t\t},\n\n\t\t/**\n\t\t * HTML element selector\n\t\t * @type {String}\n\t\t */\n\t\tel: '#llms-builder-sidebar',\n\n\t\t/**\n\t\t * DOM events\n\t\t * @type {Object}\n\t\t */\n\t\tevents: {\n\t\t\t'click #llms-save-button': 'save_now',\n\t\t\t'click #llms-exit-button': 'exit_now',\n\t\t\t'click .llms-builder-error': 'clear_errors',\n\t\t},\n\n\t\t/**\n\t\t * Wrapper Tag name\n\t\t * @type {String}\n\t\t */\n\t\ttagName: 'aside',\n\n\t\t/**\n\t\t * Get the underscore template\n\t\t * @type {[type]}\n\t\t */\n\t\ttemplate: wp.template( 'llms-sidebar-template' ),\n\n\t\t/**\n\t\t * Initialization callback func (renders the element on screen)\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tinitialize: function( data ) {\n\n\t\t\t// save a reference to the main Course view\n\t\t\tthis.CourseView = data.CourseView;\n\n\t\t\tthis.render();\n\n\t\t\tBackbone.pubSub.on( 'current-save-status', this.changes_made, this );\n\n\t\t\tBackbone.pubSub.on( 'heartbeat-send', this.heartbeat_send, this );\n\t\t\tBackbone.pubSub.on( 'heartbeat-tick', this.heartbeat_tick, this );\n\n\t\t\tBackbone.pubSub.on( 'lesson-selected', this.on_lesson_select, this );\n\t\t\tBackbone.pubSub.on( 'sidebar-editor-close', this.on_editor_close, this );\n\n\t\t\tthis.$saveButton = $( '#llms-save-button' );\n\n\t\t},\n\n\t\t/**\n\t\t * Compiles the template and renders the view\n\t\t * @return self (for chaining)\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\trender: function( view_data ) {\n\n\t\t\tview_data = view_data || {};\n\n\t\t\tthis.$el.html( this.template() );\n\n\t\t\tthis.render_subviews( _.extend( view_data, {\n\t\t\t\tSidebarView: this,\n\t\t\t} ) );\n\n\t\t\tvar $el = $( '.wrap.lifterlms.llms-builder' );\n\t\t\tif ( 'builder' === this.state ) {\n\t\t\t\t$el.removeClass( 'editor-active' );\n\t\t\t} else {\n\t\t\t\t$el.addClass( 'editor-active' );\n\t\t\t}\n\n\t\t\tthis.$saveButton = this.$el.find( '#llms-save-button' );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Adds error message element\n\t\t * @param {[type]} $err [description]\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tadd_error: function( $err ) {\n\n\t\t\tthis.$el.find( '.llms-builder-save' ).prepend( $err );\n\n\t\t},\n\n\t\t/**\n\t\t * Clear any existing error message elements\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tclear_errors: function() {\n\n\t\t\tthis.$el.find( '.llms-builder-save .llms-builder-error' ).remove();\n\n\t\t},\n\n\t\t/**\n\t\t * Update save status button when changes are detected\n\t\t * runs on an interval to check status of course regularly for unsaved changes\n\t\t * @param obj sync instance of the sync controller\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tchanges_made: function( sync ) {\n\n\t\t\t// if a save is currently running, don't do anything\n\t\t\tif ( sync.saving ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( sync.has_unsaved_changes ) {\n\n\t\t\t\tthis.$saveButton.attr( 'data-status', 'unsaved' );\n\t\t\t\tthis.$saveButton.removeAttr( 'disabled' );\n\n\t\t\t} else {\n\n\t\t\t\tthis.$saveButton.attr( 'data-status', 'saved' );\n\t\t\t\tthis.$saveButton.attr( 'disabled', 'disabled' );\n\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Exit the builder and return to the WP Course Editor\n\t\t * @return void\n\t\t * @since 3.16.7\n\t\t * @version 3.16.7\n\t\t */\n\t\texit_now: function() {\n\n\t\t\twindow.location.href = window.llms_builder.CourseModel.get_edit_post_link();\n\n\t\t},\n\n\t\t/**\n\t\t * Triggered when a heartbeat send event starts containing builder information\n\t\t * @param obj sync instance of the sync controller\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\theartbeat_send: function( sync ) {\n\n\t\t\tif ( sync.saving ) {\n\t\t\t\tLLMS.Spinner.start( this.$saveButton.find( 'i' ), 'small' );\n\t\t\t\tthis.$saveButton.attr( {\n\t\t\t\t\t'data-status': 'saving',\n\t\t\t\t\tdisabled: 'disabled',\n\t\t\t\t} );\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Triggered when a heartbeat tick completes and updates save status or appends errors\n\t\t * @param obj sync instance of the sync controller\n\t\t * @param obj data updated data\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\theartbeat_tick: function( sync, data ) {\n\n\t\t\tif ( ! sync.saving ) {\n\n\t\t\t\tvar status = 'saved';\n\n\t\t\t\tthis.clear_errors();\n\n\t\t\t\tif ( 'error' === data.status ) {\n\n\t\t\t\t\tstatus = 'error';\n\n\t\t\t\t\tvar msg = data.message,\n\t\t\t\t\t\t$err = $( '<ol class=\"llms-builder-error\" />' );\n\n\t\t\t\t\tif ( 'object' === typeof msg ) {\n\t\t\t\t\t\t_.each( msg, function( txt ) {\n\t\t\t\t\t\t\t$err.append( '<li>' + txt + '</li>' );\n\t\t\t\t\t\t} );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$err = $err.append( '<li>' + msg + '</li>' );;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.add_error( $err );\n\n\t\t\t\t}\n\n\t\t\t\tthis.$saveButton.find( '.llms-spinning' ).remove();\n\t\t\t\tthis.$saveButton.attr( {\n\t\t\t\t\t'data-status': status,\n\t\t\t\t\tdisabled: 'disabled',\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Determine if the editor is the currently active state\n\t\t * @return boolean\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tis_editor_active: function() {\n\n\t\t\treturn ( 'editor' === this.state );\n\n\t\t},\n\n\t\t/**\n\t\t * Triggered when the editor closes, updates state to be the course builder view\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\ton_editor_close: function() {\n\n\t\t\tthis.set_state( 'builder' ).render();\n\n\t\t},\n\n\t\t/**\n\t\t * When a lesson is selected, opens the sidebar to the editor view\n\t\t * @param obj lesson_model instance of the lesson model which was selected\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\ton_lesson_select: function( lesson_model, tab ) {\n\n\t\t\tif ( 'editor' !== this.state ) {\n\t\t\t\tthis.set_state( 'editor' );\n\t\t\t} else {\n\t\t\t\tthis.remove_subview( 'editor' );\n\t\t\t}\n\n\t\t\tthis.render( {\n\t\t\t\tmodel: lesson_model,\n\t\t\t\ttab: tab,\n\t\t\t} );\n\n\t\t},\n\n\t\t/**\n\t\t * Save button click event\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tsave_now: function() {\n\n\t\t\twindow.llms_builder.sync.save_now();\n\n\t\t},\n\n\t}, Subview ) );\n\n} );\n\n","/**\n * LifterLMS JS Builder App Bootstrap\n *\n * @since 3.16.0\n * @since 3.37.11 Added `_.getEditor()` helper.\n * @version 5.4.0\n */\nrequire( [\n\t'vendor/wp-hooks',\n\t'vendor/backbone.collectionView',\n\t'vendor/backbone.trackit',\n\t'Controllers/Construct',\n\t'Controllers/Debug',\n\t'Controllers/Schemas',\n\t'Controllers/Sync',\n\t'Models/loader',\n\t'Views/Course',\n\t'Views/Sidebar'\n\t], function(\n\tHooks,\n\tCV,\n\tTrackIt,\n\tConstruct,\n\tDebug,\n\tSchemas,\n\tSync,\n\tModels,\n\tCourseView,\n\tSidebarView\n\t) {\n\n\t\twindow.llms_builder.debug = new Debug( window.llms_builder.debug );\n\t\twindow.llms_builder.construct = new Construct();\n\t\twindow.llms_builder.schemas = new Schemas( window.llms_builder.schemas );\n\n\t\t/**\n\t\t * Compare values, used by _.checked & _.selected mixins.\n\t\t *\n\t\t * @since 3.17.2\n\t\t *\n\t\t * @param {Mixed} expected expected Value, probably a string (the value of a select option or checkbox element).\n\t\t * @param {Mixed} mixed actual Actual value, probably a string (the return of model.get( 'something' ) )\n\t\t * but could be an array like a multiselect.\n\t\t * @return {Bool}\n\t\t */\n\t\tfunction value_compare( expected, actual ) {\n\t\t\treturn ( ( _.isArray( actual ) && -1 !== actual.indexOf( expected ) ) || expected == actual );\n\t\t};\n\n\t\t/**\n\t\t * Underscores templating utilities\n\t\t *\n\t\t * @since 3.17.0\n\t\t * @version 3.27.0\n\t\t */\n\t\t_.mixin( {\n\n\t\t\t/**\n\t\t\t * Determine if two values are equal and output checked attribute if they are.\n\t\t\t *\n\t\t\t * Useful for templating checkboxes & radio elements\n\t\t\t * like WP Core PHP checked() but in JS.\n\t\t\t *\n\t\t\t * @since 3.17.0\n\t\t\t * @since 3.17.2 Unknown.\n\t\t\t *\n\t\t\t * @param {Mixed} expected Expected element value.\n\t\t\t * @param {Mixed} actual Actual element value.\n\t\t\t * @return {String}\n\t\t\t */\n\t\t\tchecked: function( expected, actual ) {\n\t\t\t\tif ( value_compare( expected, actual ) ) {\n\t\t\t\t\treturn ' checked=\"checked\"';\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Recursively clone an object via _.clone().\n\t\t\t *\n\t\t\t * @since 3.17.7\n\t\t\t *\n\t\t\t * @param {Object} obj Object to clone.\n\t\t\t * @return {Object}\n\t\t\t */\n\t\t\tdeepClone: function( obj ) {\n\n\t\t\t\tvar clone = _.clone( obj );\n\n\t\t\t\t_.each( clone, function( val, key ) {\n\t\t\t\t\tif ( ! _.isFunction( val ) && _.isObject( val ) ) {\n\t\t\t\t\t\tclone[ key ] = _.deepClone( val );\n\t\t\t\t\t};\n\t\t\t\t} );\n\n\t\t\t\treturn clone;\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Retrieve the wp.editor instance.\n\t\t\t *\n\t\t\t * Uses `wp.oldEditor` (when available) which was added in WordPress 5.0.\n\t\t\t *\n\t\t\t * Falls back to `wp.editor()` which will usually be the same as `wp.oldEditor` unless\n\t\t\t * the `@wordpress/editor` module has been loaded by another plugin or a theme.\n\t\t\t *\n\t\t\t * @since 3.37.11\n\t\t\t *\n\t\t\t * @return {Object}\n\t\t\t */\n\t\t\tgetEditor: function() {\n\n\t\t\t\tif ( undefined !== wp.oldEditor ) {\n\n\t\t\t\t\tvar ed = wp.oldEditor;\n\n\t\t\t\t\t// Inline scripts added by WordPress are not ported to `wp.oldEditor`, see https://github.com/WordPress/WordPress/blob/641c632b0c9fde4e094b217f50749984ca43a2fa/wp-includes/class-wp-editor.php#L977.\n\t\t\t\t\tif ( undefined !== wp.editor && undefined !== wp.editor.getDefaultSettings ) {\n\t\t\t\t\t\ted.getDefaultSettings = wp.editor.getDefaultSettings;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ed;\n\n\t\t\t\t} else if ( undefined !== wp.editor && undefined !== wp.editor.autop ){\n\n\t\t\t\t\treturn wp.editor;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Strips IDs & Parent References from quizzes and all quiz questions.\n\t\t\t *\n\t\t\t * @since 3.24.0\n\t\t\t * @since 3.27.0 Unknown.\n\t\t\t * @since 5.4.0 Use author id instead of the question author object.\n\t\t\t *\n\t\t\t * @param {Object} quiz Raw quiz object (not a model).\n\t\t\t * @return {Object}\n\t\t\t */\n\t\t\tprepareQuizObjectForCloning: function( quiz ) {\n\n\t\t\t\tdelete quiz.id;\n\t\t\t\tdelete quiz.lesson_id;\n\n\t\t\t\t_.each( quiz.questions, function( question ) {\n\n\t\t\t\t\tquestion = _.prepareQuestionObjectForCloning( question );\n\n\t\t\t\t} );\n\n\t\t\t\t// Use author id instead of the quiz author object.\n\t\t\t\tquiz = _.prepareExistingPostObjectDataForAddingOrCloning( quiz );\n\n\t\t\t\treturn quiz;\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Strips IDs & Parent References from a question.\n\t\t\t *\n\t\t\t * @since 3.27.0\n\t\t\t * @since 5.4.0 Use author id instead of the question author object.\n\t\t\t *\n\t\t\t * @param {Object} question Raw question object (not a model).\n\t\t\t * @return {Object}\n\t\t\t */\n\t\t\tprepareQuestionObjectForCloning: function( question ) {\n\n\t\t\t\tdelete question.id;\n\t\t\t\tdelete question.parent_id;\n\n\t\t\t\tif ( question.image && _.isObject( question.image ) ) {\n\t\t\t\t\tquestion.image._forceSync = true;\n\t\t\t\t}\n\n\t\t\t\tif ( question.choices ) {\n\n\t\t\t\t\t_.each( question.choices, function( choice ) {\n\n\t\t\t\t\t\tdelete choice.question_id;\n\t\t\t\t\t\tdelete choice.id;\n\t\t\t\t\t\tif ( 'image' === choice.choice_type && _.isObject( choice.choice ) ) {\n\t\t\t\t\t\t\tchoice.choice._forceSync = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\t// Use author id instead of the question author object.\n\t\t\t\tquestion = _.prepareExistingPostObjectDataForAddingOrCloning( question );\n\n\t\t\t\treturn question;\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Strips IDs & Parent References from assignments and all assignment tasks.\n\t\t\t *\n\t\t\t * @since 5.4.0\n\t\t\t *\n\t\t\t * @param {Object} assignment Raw assignment object (not a model).\n\t\t\t * @return {Object}\n\t\t\t */\n\t\t\t prepareAssignmentObjectForCloning: function( assignment ) {\n\n\t\t\t\tdelete assignment.id;\n\t\t\t\tdelete assignment.lesson_id;\n\n\t\t\t\t// Clone tasks.\n\t\t\t\tif ( 'tasklist' === assignment.assignment_type ) {\n\t\t\t\t\t_.each( assignment.tasks, function( task ) {\n\t\t\t\t\t\tdelete task.id;\n\t\t\t\t\t\tdelete task.assignment_id;\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// Use author id instead of the quiz author object.\n\t\t\t\tassignment = _.prepareExistingPostObjectDataForAddingOrCloning( assignment );\n\n\t\t\t\treturn assignment;\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Prepare post object data for adding or cloning.\n\t\t\t *\n\t\t\t * Use author id instead of the post type author object.\n\t\t\t *\n\t\t\t * @since 5.4.0\n\t\t\t *\n\t\t\t * @param {Object} quiz Raw post object (not a model).\n\t\t\t * @return {Object}\n\t\t\t */\n\t\t\tprepareExistingPostObjectDataForAddingOrCloning: function( post_data ) {\n\n\t\t\t\tif ( post_data.author && _.isObject( post_data.author ) && post_data.author.id ) {\n\t\t\t\t\tpost_data.author = post_data.author.id;\n\t\t\t\t}\n\n\t\t\t\treturn post_data;\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Determine if two values are equal and output selected attribute if they are.\n\t\t\t *\n\t\t\t * Useful for templating select elements\n\t\t\t * like WP Core PHP selected() but in JS.\n\t\t\t *\n\t\t\t *\n\t\t\t * @since 3.17.0\n\t\t\t * @since 3.17.2 Unknown.\n\t\t\t *\n\t\t\t * @param {Mixed} expected Expected element value.\n\t\t\t * @param {Mixed} actual Actual element value.\n\t\t\t * @return {String}\n\t\t\t */\n\t\t\tselected: function( expected, actual ) {\n\t\t\t\tif ( value_compare( expected, actual ) ) {\n\t\t\t\t\treturn ' selected=\"selected\"';\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Generic function for stripping HTML tags from a string.\n\t\t\t *\n\t\t\t * @since 3.17.8\n\t\t\t *\n\t\t\t * @param {String} content Raw string.\n\t\t\t * @param {Array} allowed_tags Array of allowed HTML tags.\n\t\t\t * @return {String}\n\t\t\t */\n\t\t\tstripFormatting: function( content, allowed_tags ) {\n\n\t\t\t\tif ( ! allowed_tags ) {\n\t\t\t\t\tallowed_tags = [ 'b', 'i', 'u', 'strong', 'em' ];\n\t\t\t\t}\n\n\t\t\t\tvar $html = $( '<div>' + content + '</div>' );\n\n\t\t\t\t$html.find( '*' ).not( allowed_tags.join( ',' ) ).each( function( ) {\n\n\t\t\t\t\t$( this ).replaceWith( this.innerHTML );\n\n\t\t\t\t} );\n\n\t\t\t\treturn $html.html();\n\n\t\t\t},\n\n\t\t} );\n\n\t\tBackbone.pubSub = _.extend( {}, Backbone.Events );\n\n\t\t$( document ).trigger( 'llms-builder-pre-init' );\n\n\t\twindow.llms_builder.questions = window.llms_builder.construct.get_collection( 'QuestionTypes', window.llms_builder.questions );\n\n\t\tvar CourseModel = window.llms_builder.construct.get_model( 'Course', window.llms_builder.course );\n\t\twindow.llms_builder.CourseModel = CourseModel;\n\n\t\twindow.llms_builder.sync = new Sync( CourseModel, window.llms_builder.sync );\n\n\t\tvar Course = new CourseView( {\n\t\t\tmodel: CourseModel,\n\t\t} );\n\n\t\tvar Sidebar = new SidebarView( {\n\t\t\tCourseView: Course\n\t\t} );\n\n\t\t$( document ).trigger( 'llms-builder-init', {\n\t\t\tcourse: Course,\n\t\t\tsidebar: Sidebar,\n\t\t} );\n\n\t\t/**\n\t\t * Do deep linking to Lesson / Quiz / Assignments.\n\t\t *\n\t\t * Hash should be in the form of #lesson:{lesson_id}:{subtab}\n\t\t * subtab can be either \"quiz\" or \"assignment\". If none found assumes the \"lesson\" tab.\n\t\t *\n\t\t * @since 3.27.0\n\t\t * @since 3.30.1 Wait for wp.editor & window.tinymce to load before opening deep link tabs.\n\t\t * @since 3.37.11 Use `_.getEditor()` helper when checking for the presence of `wp.editor`.\n\t\t */\n\t\tif ( window.location.hash ) {\n\n\t\t\tvar hash = window.location.hash;\n\t\t\tif ( -1 === hash.indexOf( '#lesson:' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar parts = hash.replace( '#lesson:', '' ).split( ':' ),\n\t\t\t$lesson = $( '#llms-lesson-' + parts[0] );\n\n\t\t\tif ( $lesson.length ) {\n\n\t\t\t\tLLMS.wait_for( function() {\n\t\t\t\t\treturn ( undefined !== _.getEditor() && undefined !== window.tinymce );\n }, function() {\n\t\t\t\t\t$lesson.closest( '.llms-builder-item.llms-section' ).find( 'a.llms-action-icon.expand' ).trigger( 'click' );\n\t\t\t\t\tvar subtab = parts[1] ? parts[1] : 'lesson';\n\t\t\t\t\t$( '#llms-lesson-' + parts[0] ).find( 'a.llms-action-icon.edit-' + subtab ).trigger( 'click' );\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\ndefine(\"main\", function(){});\n\n"],"sourceRoot":"../../.."}