{"version":3,"file":"js/behavior.min.js","mappings":"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","sources":["webpack://nha.app.behavior.web/./Scripts/angular-translate.js","webpack://nha.app.behavior.web/./Scripts/highcharts-ng.js","webpack://nha.app.behavior.web/./Scripts/ngdropover.js","webpack://nha.app.behavior.web/./app/app.config.js","webpack://nha.app.behavior.web/./app/app.js","webpack://nha.app.behavior.web/./app/app.route.config.js","webpack://nha.app.behavior.web/./app/components/course-list/course-list.controller.js","webpack://nha.app.behavior.web/./app/components/incident/level-five-six/level-five-six.controller.js","webpack://nha.app.behavior.web/./app/components/incident/level-four/level-four.controller.js","webpack://nha.app.behavior.web/./app/components/incident/level-four/upload-file-modal.controller.js","webpack://nha.app.behavior.web/./app/components/incident/level-two-three/level-two-three-desktop.controller.js","webpack://nha.app.behavior.web/./app/components/incident/level-two-three/level-two-three-mobile.controller.js","webpack://nha.app.behavior.web/./app/components/incident/level-two-three/level-two-three.controller.js","webpack://nha.app.behavior.web/./app/components/manager/end-level-four-modal.controller.js","webpack://nha.app.behavior.web/./app/components/manager/manager.controller.js","webpack://nha.app.behavior.web/./app/components/positive-behavior-add-multiple/positive-behavior-add-multiple-modal.controller.js","webpack://nha.app.behavior.web/./app/components/positive-behavior-add/desktop/positive-behavior-add-modal.controller.js","webpack://nha.app.behavior.web/./app/components/positive-behavior-add/mobile/behavior-incident-positive.controller.js","webpack://nha.app.behavior.web/./app/components/shared/behavior-sidebar.controller.js","webpack://nha.app.behavior.web/./app/components/student-list/studentlist.controller.js","webpack://nha.app.behavior.web/./app/directives/studentPositiveBehaviorCount/student-positive-behavior-count.directive.js","webpack://nha.app.behavior.web/./app/directives/suspExpDurationParser.directive.js","webpack://nha.app.behavior.web/./app/filters/firstLastDisplayName.fitler.js","webpack://nha.app.behavior.web/./app/main/main.controller.js","webpack://nha.app.behavior.web/./app/main/main.js","webpack://nha.app.behavior.web/./app/services/behavior-action.repository.js","webpack://nha.app.behavior.web/./app/services/behavior-alert.service.js","webpack://nha.app.behavior.web/./app/services/behavior-attendance.repository.js","webpack://nha.app.behavior.web/./app/services/behavior-attribute.repository.js","webpack://nha.app.behavior.web/./app/services/behavior-behaviorlist.service.js","webpack://nha.app.behavior.web/./app/services/behavior-blue-red-incident-common.service.js","webpack://nha.app.behavior.web/./app/services/behavior-dirty-check.service.js","webpack://nha.app.behavior.web/./app/services/behavior-document.repository.js","webpack://nha.app.behavior.web/./app/services/behavior-event-incident.repository.js","webpack://nha.app.behavior.web/./app/services/behavior-event-multiple-participant-incident.repository.js","webpack://nha.app.behavior.web/./app/services/behavior-event-repository.js","webpack://nha.app.behavior.web/./app/services/behavior-intervention.repository.js","webpack://nha.app.behavior.web/./app/services/behavior-level.repository.js","webpack://nha.app.behavior.web/./app/services/behavior-location.repository.js","webpack://nha.app.behavior.web/./app/services/behavior-motivation.repository.js","webpack://nha.app.behavior.web/./app/services/behavior-observation.repository.js","webpack://nha.app.behavior.web/./app/services/behavior-overview.service.js","webpack://nha.app.behavior.web/./app/services/behavior-participant-type.repository.js","webpack://nha.app.behavior.web/./app/services/behavior-role.repository.js","webpack://nha.app.behavior.web/./app/services/behavior-user-role.service.js","webpack://nha.app.behavior.web/./app/services/behaviorCache.service.js","webpack://nha.app.behavior.web/./app/services/behaviorLocalCache.service.js","webpack://nha.app.behavior.web/./app/services/behaviorSessionCache.service.js","webpack://nha.app.behavior.web/./app/services/course-summary-filter-counts.repository.js","webpack://nha.app.behavior.web/./app/services/course-summary.repository.js","webpack://nha.app.behavior.web/./app/services/course.service.js","webpack://nha.app.behavior.web/./app/services/get-data-for-behavior-teacher-view.repository.js","webpack://nha.app.behavior.web/./app/services/manager-list-filter-counts.repository.js","webpack://nha.app.behavior.web/./app/services/mime-types.repository.js","webpack://nha.app.behavior.web/./app/services/person-search.service.js","webpack://nha.app.behavior.web/./app/services/positive-behavior.repository.js","webpack://nha.app.behavior.web/./app/services/rules.service.js","webpack://nha.app.behavior.web/./app/services/state-behavior-question-answer.service.js","webpack://nha.app.behavior.web/./app/services/state-management.service.js","webpack://nha.app.behavior.web/./app/services/student-list.service.js","webpack://nha.app.behavior.web/./app/studentRecord/directives/behaviorHistory/calendar-directive.js","webpack://nha.app.behavior.web/./app/studentRecord/directives/behaviorHistory/historyTimeline.js","webpack://nha.app.behavior.web/./app/studentRecord/directives/level-five-six-participant/add-participant-directive.js","webpack://nha.app.behavior.web/webpack/bootstrap","webpack://nha.app.behavior.web/webpack/startup"],"sourcesContent":["/*!\n * angular-translate - v2.7.2 - 2015-06-01\n * http://github.com/angular-translate/angular-translate\n * Copyright (c) 2015 ; Licensed MIT\n */\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module unless amdModuleId is set\n define([], function () {\n return (factory());\n });\n } else if (typeof exports === 'object') {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory();\n } else {\n factory();\n }\n}(this, function () {\n\n/**\n * @ngdoc overview\n * @name pascalprecht.translate\n *\n * @description\n * The main module which holds everything together.\n */\nangular.module('pascalprecht.translate', ['ng'])\n .run(runTranslate);\n\nfunction runTranslate($translate) {\n\n 'use strict';\n\n var key = $translate.storageKey(),\n storage = $translate.storage();\n\n var fallbackFromIncorrectStorageValue = function () {\n var preferred = $translate.preferredLanguage();\n if (angular.isString(preferred)) {\n $translate.use(preferred);\n // $translate.use() will also remember the language.\n // So, we don't need to call storage.put() here.\n } else {\n storage.put(key, $translate.use());\n }\n };\n\n fallbackFromIncorrectStorageValue.displayName = 'fallbackFromIncorrectStorageValue';\n\n if (storage) {\n if (!storage.get(key)) {\n fallbackFromIncorrectStorageValue();\n } else {\n $translate.use(storage.get(key))['catch'](fallbackFromIncorrectStorageValue);\n }\n } else if (angular.isString($translate.preferredLanguage())) {\n $translate.use($translate.preferredLanguage());\n }\n}\nrunTranslate.$inject = ['$translate'];\n\nrunTranslate.displayName = 'runTranslate';\n\n/**\n * @ngdoc object\n * @name pascalprecht.translate.$translateSanitizationProvider\n *\n * @description\n *\n * Configurations for $translateSanitization\n */\nangular.module('pascalprecht.translate').provider('$translateSanitization', $translateSanitizationProvider);\n\nfunction $translateSanitizationProvider () {\n\n 'use strict';\n\n var $sanitize,\n currentStrategy = null, // TODO change to either 'sanitize', 'escape' or ['sanitize', 'escapeParameters'] in 3.0.\n hasConfiguredStrategy = false,\n hasShownNoStrategyConfiguredWarning = false,\n strategies;\n\n /**\n * Definition of a sanitization strategy function\n * @callback StrategyFunction\n * @param {string|object} value - value to be sanitized (either a string or an interpolated value map)\n * @param {string} mode - either 'text' for a string (translation) or 'params' for the interpolated params\n * @return {string|object}\n */\n\n /**\n * @ngdoc property\n * @name strategies\n * @propertyOf pascalprecht.translate.$translateSanitizationProvider\n *\n * @description\n * Following strategies are built-in:\n *
\n *
sanitize
\n *
Sanitizes HTML in the translation text using $sanitize
\n *
escape
\n *
Escapes HTML in the translation
\n *
sanitizeParameters
\n *
Sanitizes HTML in the values of the interpolation parameters using $sanitize
\n *
escapeParameters
\n *
Escapes HTML in the values of the interpolation parameters
\n *
escaped
\n *
Support legacy strategy name 'escaped' for backwards compatibility (will be removed in 3.0)
\n *
\n *\n */\n\n strategies = {\n sanitize: function (value, mode) {\n if (mode === 'text') {\n value = htmlSanitizeValue(value);\n }\n return value;\n },\n escape: function (value, mode) {\n if (mode === 'text') {\n value = htmlEscapeValue(value);\n }\n return value;\n },\n sanitizeParameters: function (value, mode) {\n if (mode === 'params') {\n value = mapInterpolationParameters(value, htmlSanitizeValue);\n }\n return value;\n },\n escapeParameters: function (value, mode) {\n if (mode === 'params') {\n value = mapInterpolationParameters(value, htmlEscapeValue);\n }\n return value;\n }\n };\n // Support legacy strategy name 'escaped' for backwards compatibility.\n // TODO should be removed in 3.0\n strategies.escaped = strategies.escapeParameters;\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateSanitizationProvider#addStrategy\n * @methodOf pascalprecht.translate.$translateSanitizationProvider\n *\n * @description\n * Adds a sanitization strategy to the list of known strategies.\n *\n * @param {string} strategyName - unique key for a strategy\n * @param {StrategyFunction} strategyFunction - strategy function\n * @returns {object} this\n */\n this.addStrategy = function (strategyName, strategyFunction) {\n strategies[strategyName] = strategyFunction;\n return this;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateSanitizationProvider#removeStrategy\n * @methodOf pascalprecht.translate.$translateSanitizationProvider\n *\n * @description\n * Removes a sanitization strategy from the list of known strategies.\n *\n * @param {string} strategyName - unique key for a strategy\n * @returns {object} this\n */\n this.removeStrategy = function (strategyName) {\n delete strategies[strategyName];\n return this;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateSanitizationProvider#useStrategy\n * @methodOf pascalprecht.translate.$translateSanitizationProvider\n *\n * @description\n * Selects a sanitization strategy. When an array is provided the strategies will be executed in order.\n *\n * @param {string|StrategyFunction|array} strategy The sanitization strategy / strategies which should be used. Either a name of an existing strategy, a custom strategy function, or an array consisting of multiple names and / or custom functions.\n * @returns {object} this\n */\n this.useStrategy = function (strategy) {\n hasConfiguredStrategy = true;\n currentStrategy = strategy;\n return this;\n };\n\n /**\n * @ngdoc object\n * @name pascalprecht.translate.$translateSanitization\n * @requires $injector\n * @requires $log\n *\n * @description\n * Sanitizes interpolation parameters and translated texts.\n *\n */\n this.$get = ['$injector', '$log', function ($injector, $log) {\n\n var applyStrategies = function (value, mode, selectedStrategies) {\n angular.forEach(selectedStrategies, function (selectedStrategy) {\n if (angular.isFunction(selectedStrategy)) {\n value = selectedStrategy(value, mode);\n } else if (angular.isFunction(strategies[selectedStrategy])) {\n value = strategies[selectedStrategy](value, mode);\n } else {\n throw new Error('pascalprecht.translate.$translateSanitization: Unknown sanitization strategy: \\'' + selectedStrategy + '\\'');\n }\n });\n return value;\n };\n\n // TODO: should be removed in 3.0\n var showNoStrategyConfiguredWarning = function () {\n if (!hasConfiguredStrategy && !hasShownNoStrategyConfiguredWarning) {\n $log.warn('pascalprecht.translate.$translateSanitization: No sanitization strategy has been configured. This can have serious security implications. See http://angular-translate.github.io/docs/#/guide/19_security for details.');\n hasShownNoStrategyConfiguredWarning = true;\n }\n };\n\n if ($injector.has('$sanitize')) {\n $sanitize = $injector.get('$sanitize');\n }\n\n return {\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateSanitization#useStrategy\n * @methodOf pascalprecht.translate.$translateSanitization\n *\n * @description\n * Selects a sanitization strategy. When an array is provided the strategies will be executed in order.\n *\n * @param {string|StrategyFunction|array} strategy The sanitization strategy / strategies which should be used. Either a name of an existing strategy, a custom strategy function, or an array consisting of multiple names and / or custom functions.\n */\n useStrategy: (function (self) {\n return function (strategy) {\n self.useStrategy(strategy);\n };\n })(this),\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateSanitization#sanitize\n * @methodOf pascalprecht.translate.$translateSanitization\n *\n * @description\n * Sanitizes a value.\n *\n * @param {string|object} value The value which should be sanitized.\n * @param {string} mode The current sanitization mode, either 'params' or 'text'.\n * @param {string|StrategyFunction|array} [strategy] Optional custom strategy which should be used instead of the currently selected strategy.\n * @returns {string|object} sanitized value\n */\n sanitize: function (value, mode, strategy) {\n if (!currentStrategy) {\n showNoStrategyConfiguredWarning();\n }\n\n if (arguments.length < 3) {\n strategy = currentStrategy;\n }\n\n if (!strategy) {\n return value;\n }\n\n var selectedStrategies = angular.isArray(strategy) ? strategy : [strategy];\n return applyStrategies(value, mode, selectedStrategies);\n }\n };\n }];\n\n var htmlEscapeValue = function (value) {\n var element = angular.element('
');\n element.text(value); // not chainable, see #1044\n return element.html();\n };\n\n var htmlSanitizeValue = function (value) {\n if (!$sanitize) {\n throw new Error('pascalprecht.translate.$translateSanitization: Error cannot find $sanitize service. Either include the ngSanitize module (https://docs.angularjs.org/api/ngSanitize) or use a sanitization strategy which does not depend on $sanitize, such as \\'escape\\'.');\n }\n return $sanitize(value);\n };\n\n var mapInterpolationParameters = function (value, iteratee) {\n if (angular.isObject(value)) {\n var result = angular.isArray(value) ? [] : {};\n\n angular.forEach(value, function (propertyValue, propertyKey) {\n result[propertyKey] = mapInterpolationParameters(propertyValue, iteratee);\n });\n\n return result;\n } else if (angular.isNumber(value)) {\n return value;\n } else {\n return iteratee(value);\n }\n };\n}\n\n/**\n * @ngdoc object\n * @name pascalprecht.translate.$translateProvider\n * @description\n *\n * $translateProvider allows developers to register translation-tables, asynchronous loaders\n * and similar to configure translation behavior directly inside of a module.\n *\n */\nangular.module('pascalprecht.translate')\n.constant('pascalprechtTranslateOverrider', {})\n.provider('$translate', $translate);\n\nfunction $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvider, pascalprechtTranslateOverrider) {\n\n 'use strict';\n\n var $translationTable = {},\n $preferredLanguage,\n $availableLanguageKeys = [],\n $languageKeyAliases,\n $fallbackLanguage,\n $fallbackWasString,\n $uses,\n $nextLang,\n $storageFactory,\n $storageKey = $STORAGE_KEY,\n $storagePrefix,\n $missingTranslationHandlerFactory,\n $interpolationFactory,\n $interpolatorFactories = [],\n $loaderFactory,\n $cloakClassName = 'translate-cloak',\n $loaderOptions,\n $notFoundIndicatorLeft,\n $notFoundIndicatorRight,\n $postCompilingEnabled = false,\n $forceAsyncReloadEnabled = false,\n NESTED_OBJECT_DELIMITER = '.',\n loaderCache,\n directivePriority = 0,\n statefulFilter = true,\n uniformLanguageTagResolver = 'default',\n languageTagResolver = {\n 'default': function (tag) {\n return (tag || '').split('-').join('_');\n },\n java: function (tag) {\n var temp = (tag || '').split('-').join('_');\n var parts = temp.split('_');\n return parts.length > 1 ? (parts[0].toLowerCase() + '_' + parts[1].toUpperCase()) : temp;\n },\n bcp47: function (tag) {\n var temp = (tag || '').split('_').join('-');\n var parts = temp.split('-');\n return parts.length > 1 ? (parts[0].toLowerCase() + '-' + parts[1].toUpperCase()) : temp;\n }\n };\n\n var version = '2.7.2';\n\n // tries to determine the browsers language\n var getFirstBrowserLanguage = function () {\n\n // internal purpose only\n if (angular.isFunction(pascalprechtTranslateOverrider.getLocale)) {\n return pascalprechtTranslateOverrider.getLocale();\n }\n\n var nav = $windowProvider.$get().navigator,\n browserLanguagePropertyKeys = ['language', 'browserLanguage', 'systemLanguage', 'userLanguage'],\n i,\n language;\n\n // support for HTML 5.1 \"navigator.languages\"\n if (angular.isArray(nav.languages)) {\n for (i = 0; i < nav.languages.length; i++) {\n language = nav.languages[i];\n if (language && language.length) {\n return language;\n }\n }\n }\n\n // support for other well known properties in browsers\n for (i = 0; i < browserLanguagePropertyKeys.length; i++) {\n language = nav[browserLanguagePropertyKeys[i]];\n if (language && language.length) {\n return language;\n }\n }\n\n return null;\n };\n getFirstBrowserLanguage.displayName = 'angular-translate/service: getFirstBrowserLanguage';\n\n // tries to determine the browsers locale\n var getLocale = function () {\n var locale = getFirstBrowserLanguage() || '';\n if (languageTagResolver[uniformLanguageTagResolver]) {\n locale = languageTagResolver[uniformLanguageTagResolver](locale);\n }\n return locale;\n };\n getLocale.displayName = 'angular-translate/service: getLocale';\n\n /**\n * @name indexOf\n * @private\n *\n * @description\n * indexOf polyfill. Kinda sorta.\n *\n * @param {array} array Array to search in.\n * @param {string} searchElement Element to search for.\n *\n * @returns {int} Index of search element.\n */\n var indexOf = function(array, searchElement) {\n for (var i = 0, len = array.length; i < len; i++) {\n if (array[i] === searchElement) {\n return i;\n }\n }\n return -1;\n };\n\n /**\n * @name trim\n * @private\n *\n * @description\n * trim polyfill\n *\n * @returns {string} The string stripped of whitespace from both ends\n */\n var trim = function() {\n return this.toString().replace(/^\\s+|\\s+$/g, '');\n };\n\n var negotiateLocale = function (preferred) {\n\n var avail = [],\n locale = angular.lowercase(preferred),\n i = 0,\n n = $availableLanguageKeys.length;\n\n for (; i < n; i++) {\n avail.push(angular.lowercase($availableLanguageKeys[i]));\n }\n\n if (indexOf(avail, locale) > -1) {\n return preferred;\n }\n\n if ($languageKeyAliases) {\n var alias;\n for (var langKeyAlias in $languageKeyAliases) {\n var hasWildcardKey = false;\n var hasExactKey = Object.prototype.hasOwnProperty.call($languageKeyAliases, langKeyAlias) &&\n angular.lowercase(langKeyAlias) === angular.lowercase(preferred);\n\n if (langKeyAlias.slice(-1) === '*') {\n hasWildcardKey = langKeyAlias.slice(0, -1) === preferred.slice(0, langKeyAlias.length-1);\n }\n if (hasExactKey || hasWildcardKey) {\n alias = $languageKeyAliases[langKeyAlias];\n if (indexOf(avail, angular.lowercase(alias)) > -1) {\n return alias;\n }\n }\n }\n }\n\n if (preferred) {\n var parts = preferred.split('_');\n\n if (parts.length > 1 && indexOf(avail, angular.lowercase(parts[0])) > -1) {\n return parts[0];\n }\n }\n\n // If everything fails, just return the preferred, unchanged.\n return preferred;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#translations\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Registers a new translation table for specific language key.\n *\n * To register a translation table for specific language, pass a defined language\n * key as first parameter.\n *\n *
\n   *  // register translation table for language: 'de_DE'\n   *  $translateProvider.translations('de_DE', {\n   *    'GREETING': 'Hallo Welt!'\n   *  });\n   *\n   *  // register another one\n   *  $translateProvider.translations('en_US', {\n   *    'GREETING': 'Hello world!'\n   *  });\n   * 
\n *\n * When registering multiple translation tables for for the same language key,\n * the actual translation table gets extended. This allows you to define module\n * specific translation which only get added, once a specific module is loaded in\n * your app.\n *\n * Invoking this method with no arguments returns the translation table which was\n * registered with no language key. Invoking it with a language key returns the\n * related translation table.\n *\n * @param {string} key A language key.\n * @param {object} translationTable A plain old JavaScript object that represents a translation table.\n *\n */\n var translations = function (langKey, translationTable) {\n\n if (!langKey && !translationTable) {\n return $translationTable;\n }\n\n if (langKey && !translationTable) {\n if (angular.isString(langKey)) {\n return $translationTable[langKey];\n }\n } else {\n if (!angular.isObject($translationTable[langKey])) {\n $translationTable[langKey] = {};\n }\n angular.extend($translationTable[langKey], flatObject(translationTable));\n }\n return this;\n };\n\n this.translations = translations;\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#cloakClassName\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n *\n * Let's you change the class name for `translate-cloak` directive.\n * Default class name is `translate-cloak`.\n *\n * @param {string} name translate-cloak class name\n */\n this.cloakClassName = function (name) {\n if (!name) {\n return $cloakClassName;\n }\n $cloakClassName = name;\n return this;\n };\n\n /**\n * @name flatObject\n * @private\n *\n * @description\n * Flats an object. This function is used to flatten given translation data with\n * namespaces, so they are later accessible via dot notation.\n */\n var flatObject = function (data, path, result, prevKey) {\n var key, keyWithPath, keyWithShortPath, val;\n\n if (!path) {\n path = [];\n }\n if (!result) {\n result = {};\n }\n for (key in data) {\n if (!Object.prototype.hasOwnProperty.call(data, key)) {\n continue;\n }\n val = data[key];\n if (angular.isObject(val)) {\n flatObject(val, path.concat(key), result, key);\n } else {\n keyWithPath = path.length ? ('' + path.join(NESTED_OBJECT_DELIMITER) + NESTED_OBJECT_DELIMITER + key) : key;\n if(path.length && key === prevKey){\n // Create shortcut path (foo.bar == foo.bar.bar)\n keyWithShortPath = '' + path.join(NESTED_OBJECT_DELIMITER);\n // Link it to original path\n result[keyWithShortPath] = '@:' + keyWithPath;\n }\n result[keyWithPath] = val;\n }\n }\n return result;\n };\n flatObject.displayName = 'flatObject';\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#addInterpolation\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Adds interpolation services to angular-translate, so it can manage them.\n *\n * @param {object} factory Interpolation service factory\n */\n this.addInterpolation = function (factory) {\n $interpolatorFactories.push(factory);\n return this;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#useMessageFormatInterpolation\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Tells angular-translate to use interpolation functionality of messageformat.js.\n * This is useful when having high level pluralization and gender selection.\n */\n this.useMessageFormatInterpolation = function () {\n return this.useInterpolation('$translateMessageFormatInterpolation');\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#useInterpolation\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Tells angular-translate which interpolation style to use as default, application-wide.\n * Simply pass a factory/service name. The interpolation service has to implement\n * the correct interface.\n *\n * @param {string} factory Interpolation service name.\n */\n this.useInterpolation = function (factory) {\n $interpolationFactory = factory;\n return this;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#useSanitizeStrategy\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Simply sets a sanitation strategy type.\n *\n * @param {string} value Strategy type.\n */\n this.useSanitizeValueStrategy = function (value) {\n $translateSanitizationProvider.useStrategy(value);\n return this;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#preferredLanguage\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Tells the module which of the registered translation tables to use for translation\n * at initial startup by passing a language key. Similar to `$translateProvider#use`\n * only that it says which language to **prefer**.\n *\n * @param {string} langKey A language key.\n *\n */\n this.preferredLanguage = function(langKey) {\n setupPreferredLanguage(langKey);\n return this;\n\n };\n var setupPreferredLanguage = function (langKey) {\n if (langKey) {\n $preferredLanguage = langKey;\n }\n return $preferredLanguage;\n };\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#translationNotFoundIndicator\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Sets an indicator which is used when a translation isn't found. E.g. when\n * setting the indicator as 'X' and one tries to translate a translation id\n * called `NOT_FOUND`, this will result in `X NOT_FOUND X`.\n *\n * Internally this methods sets a left indicator and a right indicator using\n * `$translateProvider.translationNotFoundIndicatorLeft()` and\n * `$translateProvider.translationNotFoundIndicatorRight()`.\n *\n * **Note**: These methods automatically add a whitespace between the indicators\n * and the translation id.\n *\n * @param {string} indicator An indicator, could be any string.\n */\n this.translationNotFoundIndicator = function (indicator) {\n this.translationNotFoundIndicatorLeft(indicator);\n this.translationNotFoundIndicatorRight(indicator);\n return this;\n };\n\n /**\n * ngdoc function\n * @name pascalprecht.translate.$translateProvider#translationNotFoundIndicatorLeft\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Sets an indicator which is used when a translation isn't found left to the\n * translation id.\n *\n * @param {string} indicator An indicator.\n */\n this.translationNotFoundIndicatorLeft = function (indicator) {\n if (!indicator) {\n return $notFoundIndicatorLeft;\n }\n $notFoundIndicatorLeft = indicator;\n return this;\n };\n\n /**\n * ngdoc function\n * @name pascalprecht.translate.$translateProvider#translationNotFoundIndicatorLeft\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Sets an indicator which is used when a translation isn't found right to the\n * translation id.\n *\n * @param {string} indicator An indicator.\n */\n this.translationNotFoundIndicatorRight = function (indicator) {\n if (!indicator) {\n return $notFoundIndicatorRight;\n }\n $notFoundIndicatorRight = indicator;\n return this;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#fallbackLanguage\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Tells the module which of the registered translation tables to use when missing translations\n * at initial startup by passing a language key. Similar to `$translateProvider#use`\n * only that it says which language to **fallback**.\n *\n * @param {string||array} langKey A language key.\n *\n */\n this.fallbackLanguage = function (langKey) {\n fallbackStack(langKey);\n return this;\n };\n\n var fallbackStack = function (langKey) {\n if (langKey) {\n if (angular.isString(langKey)) {\n $fallbackWasString = true;\n $fallbackLanguage = [ langKey ];\n } else if (angular.isArray(langKey)) {\n $fallbackWasString = false;\n $fallbackLanguage = langKey;\n }\n if (angular.isString($preferredLanguage) && indexOf($fallbackLanguage, $preferredLanguage) < 0) {\n $fallbackLanguage.push($preferredLanguage);\n }\n\n return this;\n } else {\n if ($fallbackWasString) {\n return $fallbackLanguage[0];\n } else {\n return $fallbackLanguage;\n }\n }\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#use\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Set which translation table to use for translation by given language key. When\n * trying to 'use' a language which isn't provided, it'll throw an error.\n *\n * You actually don't have to use this method since `$translateProvider#preferredLanguage`\n * does the job too.\n *\n * @param {string} langKey A language key.\n */\n this.use = function (langKey) {\n if (langKey) {\n if (!$translationTable[langKey] && (!$loaderFactory)) {\n // only throw an error, when not loading translation data asynchronously\n throw new Error('$translateProvider couldn\\'t find translationTable for langKey: \\'' + langKey + '\\'');\n }\n $uses = langKey;\n return this;\n }\n return $uses;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#storageKey\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Tells the module which key must represent the choosed language by a user in the storage.\n *\n * @param {string} key A key for the storage.\n */\n var storageKey = function(key) {\n if (!key) {\n if ($storagePrefix) {\n return $storagePrefix + $storageKey;\n }\n return $storageKey;\n }\n $storageKey = key;\n return this;\n };\n\n this.storageKey = storageKey;\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#useUrlLoader\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Tells angular-translate to use `$translateUrlLoader` extension service as loader.\n *\n * @param {string} url Url\n * @param {Object=} options Optional configuration object\n */\n this.useUrlLoader = function (url, options) {\n return this.useLoader('$translateUrlLoader', angular.extend({ url: url }, options));\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#useStaticFilesLoader\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Tells angular-translate to use `$translateStaticFilesLoader` extension service as loader.\n *\n * @param {Object=} options Optional configuration object\n */\n this.useStaticFilesLoader = function (options) {\n return this.useLoader('$translateStaticFilesLoader', options);\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#useLoader\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Tells angular-translate to use any other service as loader.\n *\n * @param {string} loaderFactory Factory name to use\n * @param {Object=} options Optional configuration object\n */\n this.useLoader = function (loaderFactory, options) {\n $loaderFactory = loaderFactory;\n $loaderOptions = options || {};\n return this;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#useLocalStorage\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Tells angular-translate to use `$translateLocalStorage` service as storage layer.\n *\n */\n this.useLocalStorage = function () {\n return this.useStorage('$translateLocalStorage');\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#useCookieStorage\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Tells angular-translate to use `$translateCookieStorage` service as storage layer.\n */\n this.useCookieStorage = function () {\n return this.useStorage('$translateCookieStorage');\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#useStorage\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Tells angular-translate to use custom service as storage layer.\n */\n this.useStorage = function (storageFactory) {\n $storageFactory = storageFactory;\n return this;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#storagePrefix\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Sets prefix for storage key.\n *\n * @param {string} prefix Storage key prefix\n */\n this.storagePrefix = function (prefix) {\n if (!prefix) {\n return prefix;\n }\n $storagePrefix = prefix;\n return this;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#useMissingTranslationHandlerLog\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Tells angular-translate to use built-in log handler when trying to translate\n * a translation Id which doesn't exist.\n *\n * This is actually a shortcut method for `useMissingTranslationHandler()`.\n *\n */\n this.useMissingTranslationHandlerLog = function () {\n return this.useMissingTranslationHandler('$translateMissingTranslationHandlerLog');\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#useMissingTranslationHandler\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Expects a factory name which later gets instantiated with `$injector`.\n * This method can be used to tell angular-translate to use a custom\n * missingTranslationHandler. Just build a factory which returns a function\n * and expects a translation id as argument.\n *\n * Example:\n *
\n   *  app.config(function ($translateProvider) {\n   *    $translateProvider.useMissingTranslationHandler('customHandler');\n   *  });\n   *\n   *  app.factory('customHandler', function (dep1, dep2) {\n   *    return function (translationId) {\n   *      // something with translationId and dep1 and dep2\n   *    };\n   *  });\n   * 
\n *\n * @param {string} factory Factory name\n */\n this.useMissingTranslationHandler = function (factory) {\n $missingTranslationHandlerFactory = factory;\n return this;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#usePostCompiling\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * If post compiling is enabled, all translated values will be processed\n * again with AngularJS' $compile.\n *\n * Example:\n *
\n   *  app.config(function ($translateProvider) {\n   *    $translateProvider.usePostCompiling(true);\n   *  });\n   * 
\n *\n * @param {string} factory Factory name\n */\n this.usePostCompiling = function (value) {\n $postCompilingEnabled = !(!value);\n return this;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#forceAsyncReload\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * If force async reload is enabled, async loader will always be called\n * even if $translationTable already contains the language key, adding\n * possible new entries to the $translationTable.\n *\n * Example:\n *
\n   *  app.config(function ($translateProvider) {\n   *    $translateProvider.forceAsyncReload(true);\n   *  });\n   * 
\n *\n * @param {boolean} value - valid values are true or false\n */\n this.forceAsyncReload = function (value) {\n $forceAsyncReloadEnabled = !(!value);\n return this;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#uniformLanguageTag\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Tells angular-translate which language tag should be used as a result when determining\n * the current browser language.\n *\n * This setting must be set before invoking {@link pascalprecht.translate.$translateProvider#methods_determinePreferredLanguage determinePreferredLanguage()}.\n *\n *
\n   * $translateProvider\n   *   .uniformLanguageTag('bcp47')\n   *   .determinePreferredLanguage()\n   * 
\n *\n * The resolver currently supports:\n * * default\n * (traditionally: hyphens will be converted into underscores, i.e. en-US => en_US)\n * en-US => en_US\n * en_US => en_US\n * en-us => en_us\n * * java\n * like default, but the second part will be always in uppercase\n * en-US => en_US\n * en_US => en_US\n * en-us => en_US\n * * BCP 47 (RFC 4646 & 4647)\n * en-US => en-US\n * en_US => en-US\n * en-us => en-US\n *\n * See also:\n * * http://en.wikipedia.org/wiki/IETF_language_tag\n * * http://www.w3.org/International/core/langtags/\n * * http://tools.ietf.org/html/bcp47\n *\n * @param {string|object} options - options (or standard)\n * @param {string} options.standard - valid values are 'default', 'bcp47', 'java'\n */\n this.uniformLanguageTag = function (options) {\n\n if (!options) {\n options = {};\n } else if (angular.isString(options)) {\n options = {\n standard: options\n };\n }\n\n uniformLanguageTagResolver = options.standard;\n\n return this;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#determinePreferredLanguage\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Tells angular-translate to try to determine on its own which language key\n * to set as preferred language. When `fn` is given, angular-translate uses it\n * to determine a language key, otherwise it uses the built-in `getLocale()`\n * method.\n *\n * The `getLocale()` returns a language key in the format `[lang]_[country]` or\n * `[lang]` depending on what the browser provides.\n *\n * Use this method at your own risk, since not all browsers return a valid\n * locale (see {@link pascalprecht.translate.$translateProvider#methods_uniformLanguageTag uniformLanguageTag()}).\n *\n * @param {Function=} fn Function to determine a browser's locale\n */\n this.determinePreferredLanguage = function (fn) {\n\n var locale = (fn && angular.isFunction(fn)) ? fn() : getLocale();\n\n if (!$availableLanguageKeys.length) {\n $preferredLanguage = locale;\n } else {\n $preferredLanguage = negotiateLocale(locale);\n }\n\n return this;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#registerAvailableLanguageKeys\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Registers a set of language keys the app will work with. Use this method in\n * combination with\n * {@link pascalprecht.translate.$translateProvider#determinePreferredLanguage determinePreferredLanguage}.\n * When available languages keys are registered, angular-translate\n * tries to find the best fitting language key depending on the browsers locale,\n * considering your language key convention.\n *\n * @param {object} languageKeys Array of language keys the your app will use\n * @param {object=} aliases Alias map.\n */\n this.registerAvailableLanguageKeys = function (languageKeys, aliases) {\n if (languageKeys) {\n $availableLanguageKeys = languageKeys;\n if (aliases) {\n $languageKeyAliases = aliases;\n }\n return this;\n }\n return $availableLanguageKeys;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#useLoaderCache\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Registers a cache for internal $http based loaders.\n * {@link pascalprecht.translate.$translateProvider#determinePreferredLanguage determinePreferredLanguage}.\n * When false the cache will be disabled (default). When true or undefined\n * the cache will be a default (see $cacheFactory). When an object it will\n * be treat as a cache object itself: the usage is $http({cache: cache})\n *\n * @param {object} cache boolean, string or cache-object\n */\n this.useLoaderCache = function (cache) {\n if (cache === false) {\n // disable cache\n loaderCache = undefined;\n } else if (cache === true) {\n // enable cache using AJS defaults\n loaderCache = true;\n } else if (typeof(cache) === 'undefined') {\n // enable cache using default\n loaderCache = '$translationCache';\n } else if (cache) {\n // enable cache using given one (see $cacheFactory)\n loaderCache = cache;\n }\n return this;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#directivePriority\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Sets the default priority of the translate directive. The standard value is `0`.\n * Calling this function without an argument will return the current value.\n *\n * @param {number} priority for the translate-directive\n */\n this.directivePriority = function (priority) {\n if (priority === undefined) {\n // getter\n return directivePriority;\n } else {\n // setter with chaining\n directivePriority = priority;\n return this;\n }\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateProvider#statefulFilter\n * @methodOf pascalprecht.translate.$translateProvider\n *\n * @description\n * Since AngularJS 1.3, filters which are not stateless (depending at the scope)\n * have to explicit define this behavior.\n * Sets whether the translate filter should be stateful or stateless. The standard value is `true`\n * meaning being stateful.\n * Calling this function without an argument will return the current value.\n *\n * @param {boolean} state - defines the state of the filter\n */\n this.statefulFilter = function (state) {\n if (state === undefined) {\n // getter\n return statefulFilter;\n } else {\n // setter with chaining\n statefulFilter = state;\n return this;\n }\n };\n\n /**\n * @ngdoc object\n * @name pascalprecht.translate.$translate\n * @requires $interpolate\n * @requires $log\n * @requires $rootScope\n * @requires $q\n *\n * @description\n * The `$translate` service is the actual core of angular-translate. It expects a translation id\n * and optional interpolate parameters to translate contents.\n *\n *
\n   *  $translate('HEADLINE_TEXT').then(function (translation) {\n   *    $scope.translatedText = translation;\n   *  });\n   * 
\n *\n * @param {string|array} translationId A token which represents a translation id\n * This can be optionally an array of translation ids which\n * results that the function returns an object where each key\n * is the translation id and the value the translation.\n * @param {object=} interpolateParams An object hash for dynamic values\n * @param {string} interpolationId The id of the interpolation to use\n * @returns {object} promise\n */\n this.$get = [\n '$log',\n '$injector',\n '$rootScope',\n '$q',\n function ($log, $injector, $rootScope, $q) {\n\n var Storage,\n defaultInterpolator = $injector.get($interpolationFactory || '$translateDefaultInterpolation'),\n pendingLoader = false,\n interpolatorHashMap = {},\n langPromises = {},\n fallbackIndex,\n startFallbackIteration;\n\n var $translate = function (translationId, interpolateParams, interpolationId, defaultTranslationText) {\n\n // Duck detection: If the first argument is an array, a bunch of translations was requested.\n // The result is an object.\n if (angular.isArray(translationId)) {\n // Inspired by Q.allSettled by Kris Kowal\n // https://github.com/kriskowal/q/blob/b0fa72980717dc202ffc3cbf03b936e10ebbb9d7/q.js#L1553-1563\n // This transforms all promises regardless resolved or rejected\n var translateAll = function (translationIds) {\n var results = {}; // storing the actual results\n var promises = []; // promises to wait for\n // Wraps the promise a) being always resolved and b) storing the link id->value\n var translate = function (translationId) {\n var deferred = $q.defer();\n var regardless = function (value) {\n results[translationId] = value;\n deferred.resolve([translationId, value]);\n };\n // we don't care whether the promise was resolved or rejected; just store the values\n $translate(translationId, interpolateParams, interpolationId, defaultTranslationText).then(regardless, regardless);\n return deferred.promise;\n };\n for (var i = 0, c = translationIds.length; i < c; i++) {\n promises.push(translate(translationIds[i]));\n }\n // wait for all (including storing to results)\n return $q.all(promises).then(function () {\n // return the results\n return results;\n });\n };\n return translateAll(translationId);\n }\n\n var deferred = $q.defer();\n\n // trim off any whitespace\n if (translationId) {\n translationId = trim.apply(translationId);\n }\n\n var promiseToWaitFor = (function () {\n var promise = $preferredLanguage ?\n langPromises[$preferredLanguage] :\n langPromises[$uses];\n\n fallbackIndex = 0;\n\n if ($storageFactory && !promise) {\n // looks like there's no pending promise for $preferredLanguage or\n // $uses. Maybe there's one pending for a language that comes from\n // storage.\n var langKey = Storage.get($storageKey);\n promise = langPromises[langKey];\n\n if ($fallbackLanguage && $fallbackLanguage.length) {\n var index = indexOf($fallbackLanguage, langKey);\n // maybe the language from storage is also defined as fallback language\n // we increase the fallback language index to not search in that language\n // as fallback, since it's probably the first used language\n // in that case the index starts after the first element\n fallbackIndex = (index === 0) ? 1 : 0;\n\n // but we can make sure to ALWAYS fallback to preferred language at least\n if (indexOf($fallbackLanguage, $preferredLanguage) < 0) {\n $fallbackLanguage.push($preferredLanguage);\n }\n }\n }\n return promise;\n }());\n\n if (!promiseToWaitFor) {\n // no promise to wait for? okay. Then there's no loader registered\n // nor is a one pending for language that comes from storage.\n // We can just translate.\n determineTranslation(translationId, interpolateParams, interpolationId, defaultTranslationText).then(deferred.resolve, deferred.reject);\n } else {\n var promiseResolved = function () {\n determineTranslation(translationId, interpolateParams, interpolationId, defaultTranslationText).then(deferred.resolve, deferred.reject);\n };\n promiseResolved.displayName = 'promiseResolved';\n\n promiseToWaitFor['finally'](promiseResolved, deferred.reject);\n }\n return deferred.promise;\n };\n\n /**\n * @name applyNotFoundIndicators\n * @private\n *\n * @description\n * Applies not fount indicators to given translation id, if needed.\n * This function gets only executed, if a translation id doesn't exist,\n * which is why a translation id is expected as argument.\n *\n * @param {string} translationId Translation id.\n * @returns {string} Same as given translation id but applied with not found\n * indicators.\n */\n var applyNotFoundIndicators = function (translationId) {\n // applying notFoundIndicators\n if ($notFoundIndicatorLeft) {\n translationId = [$notFoundIndicatorLeft, translationId].join(' ');\n }\n if ($notFoundIndicatorRight) {\n translationId = [translationId, $notFoundIndicatorRight].join(' ');\n }\n return translationId;\n };\n\n /**\n * @name useLanguage\n * @private\n *\n * @description\n * Makes actual use of a language by setting a given language key as used\n * language and informs registered interpolators to also use the given\n * key as locale.\n *\n * @param {key} Locale key.\n */\n var useLanguage = function (key) {\n $uses = key;\n $rootScope.$emit('$translateChangeSuccess', {language: key});\n\n if ($storageFactory) {\n Storage.put($translate.storageKey(), $uses);\n }\n // inform default interpolator\n defaultInterpolator.setLocale($uses);\n\n var eachInterpolator = function (interpolator, id) {\n interpolatorHashMap[id].setLocale($uses);\n };\n eachInterpolator.displayName = 'eachInterpolatorLocaleSetter';\n\n // inform all others too!\n angular.forEach(interpolatorHashMap, eachInterpolator);\n $rootScope.$emit('$translateChangeEnd', {language: key});\n };\n\n /**\n * @name loadAsync\n * @private\n *\n * @description\n * Kicks of registered async loader using `$injector` and applies existing\n * loader options. When resolved, it updates translation tables accordingly\n * or rejects with given language key.\n *\n * @param {string} key Language key.\n * @return {Promise} A promise.\n */\n var loadAsync = function (key) {\n if (!key) {\n throw 'No language key specified for loading.';\n }\n\n var deferred = $q.defer();\n\n $rootScope.$emit('$translateLoadingStart', {language: key});\n pendingLoader = true;\n\n var cache = loaderCache;\n if (typeof(cache) === 'string') {\n // getting on-demand instance of loader\n cache = $injector.get(cache);\n }\n\n var loaderOptions = angular.extend({}, $loaderOptions, {\n key: key,\n $http: angular.extend({}, {\n cache: cache\n }, $loaderOptions.$http)\n });\n\n var onLoaderSuccess = function (data) {\n var translationTable = {};\n $rootScope.$emit('$translateLoadingSuccess', {language: key});\n\n if (angular.isArray(data)) {\n angular.forEach(data, function (table) {\n angular.extend(translationTable, flatObject(table));\n });\n } else {\n angular.extend(translationTable, flatObject(data));\n }\n pendingLoader = false;\n deferred.resolve({\n key: key,\n table: translationTable\n });\n $rootScope.$emit('$translateLoadingEnd', {language: key});\n };\n onLoaderSuccess.displayName = 'onLoaderSuccess';\n\n var onLoaderError = function (key) {\n $rootScope.$emit('$translateLoadingError', {language: key});\n deferred.reject(key);\n $rootScope.$emit('$translateLoadingEnd', {language: key});\n };\n onLoaderError.displayName = 'onLoaderError';\n\n $injector.get($loaderFactory)(loaderOptions)\n .then(onLoaderSuccess, onLoaderError);\n\n return deferred.promise;\n };\n\n if ($storageFactory) {\n Storage = $injector.get($storageFactory);\n\n if (!Storage.get || !Storage.put) {\n throw new Error('Couldn\\'t use storage \\'' + $storageFactory + '\\', missing get() or put() method!');\n }\n }\n\n // if we have additional interpolations that were added via\n // $translateProvider.addInterpolation(), we have to map'em\n if ($interpolatorFactories.length) {\n var eachInterpolationFactory = function (interpolatorFactory) {\n var interpolator = $injector.get(interpolatorFactory);\n // setting initial locale for each interpolation service\n interpolator.setLocale($preferredLanguage || $uses);\n // make'em recognizable through id\n interpolatorHashMap[interpolator.getInterpolationIdentifier()] = interpolator;\n };\n eachInterpolationFactory.displayName = 'interpolationFactoryAdder';\n\n angular.forEach($interpolatorFactories, eachInterpolationFactory);\n }\n\n /**\n * @name getTranslationTable\n * @private\n *\n * @description\n * Returns a promise that resolves to the translation table\n * or is rejected if an error occurred.\n *\n * @param langKey\n * @returns {Q.promise}\n */\n var getTranslationTable = function (langKey) {\n var deferred = $q.defer();\n if (Object.prototype.hasOwnProperty.call($translationTable, langKey)) {\n deferred.resolve($translationTable[langKey]);\n } else if (langPromises[langKey]) {\n var onResolve = function (data) {\n translations(data.key, data.table);\n deferred.resolve(data.table);\n };\n onResolve.displayName = 'translationTableResolver';\n langPromises[langKey].then(onResolve, deferred.reject);\n } else {\n deferred.reject();\n }\n return deferred.promise;\n };\n\n /**\n * @name getFallbackTranslation\n * @private\n *\n * @description\n * Returns a promise that will resolve to the translation\n * or be rejected if no translation was found for the language.\n * This function is currently only used for fallback language translation.\n *\n * @param langKey The language to translate to.\n * @param translationId\n * @param interpolateParams\n * @param Interpolator\n * @returns {Q.promise}\n */\n var getFallbackTranslation = function (langKey, translationId, interpolateParams, Interpolator) {\n var deferred = $q.defer();\n\n var onResolve = function (translationTable) {\n if (Object.prototype.hasOwnProperty.call(translationTable, translationId)) {\n Interpolator.setLocale(langKey);\n var translation = translationTable[translationId];\n if (translation.substr(0, 2) === '@:') {\n getFallbackTranslation(langKey, translation.substr(2), interpolateParams, Interpolator)\n .then(deferred.resolve, deferred.reject);\n } else {\n deferred.resolve(Interpolator.interpolate(translationTable[translationId], interpolateParams));\n }\n Interpolator.setLocale($uses);\n } else {\n deferred.reject();\n }\n };\n onResolve.displayName = 'fallbackTranslationResolver';\n\n getTranslationTable(langKey).then(onResolve, deferred.reject);\n\n return deferred.promise;\n };\n\n /**\n * @name getFallbackTranslationInstant\n * @private\n *\n * @description\n * Returns a translation\n * This function is currently only used for fallback language translation.\n *\n * @param langKey The language to translate to.\n * @param translationId\n * @param interpolateParams\n * @param Interpolator\n * @returns {string} translation\n */\n var getFallbackTranslationInstant = function (langKey, translationId, interpolateParams, Interpolator) {\n var result, translationTable = $translationTable[langKey];\n\n if (translationTable && Object.prototype.hasOwnProperty.call(translationTable, translationId)) {\n Interpolator.setLocale(langKey);\n result = Interpolator.interpolate(translationTable[translationId], interpolateParams);\n if (result.substr(0, 2) === '@:') {\n return getFallbackTranslationInstant(langKey, result.substr(2), interpolateParams, Interpolator);\n }\n Interpolator.setLocale($uses);\n }\n\n return result;\n };\n\n\n /**\n * @name translateByHandler\n * @private\n *\n * Translate by missing translation handler.\n *\n * @param translationId\n * @returns translation created by $missingTranslationHandler or translationId is $missingTranslationHandler is\n * absent\n */\n var translateByHandler = function (translationId, interpolateParams) {\n // If we have a handler factory - we might also call it here to determine if it provides\n // a default text for a translationid that can't be found anywhere in our tables\n if ($missingTranslationHandlerFactory) {\n var resultString = $injector.get($missingTranslationHandlerFactory)(translationId, $uses, interpolateParams);\n if (resultString !== undefined) {\n return resultString;\n } else {\n return translationId;\n }\n } else {\n return translationId;\n }\n };\n\n /**\n * @name resolveForFallbackLanguage\n * @private\n *\n * Recursive helper function for fallbackTranslation that will sequentially look\n * for a translation in the fallbackLanguages starting with fallbackLanguageIndex.\n *\n * @param fallbackLanguageIndex\n * @param translationId\n * @param interpolateParams\n * @param Interpolator\n * @returns {Q.promise} Promise that will resolve to the translation.\n */\n var resolveForFallbackLanguage = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator, defaultTranslationText) {\n var deferred = $q.defer();\n\n if (fallbackLanguageIndex < $fallbackLanguage.length) {\n var langKey = $fallbackLanguage[fallbackLanguageIndex];\n getFallbackTranslation(langKey, translationId, interpolateParams, Interpolator).then(\n deferred.resolve,\n function () {\n // Look in the next fallback language for a translation.\n // It delays the resolving by passing another promise to resolve.\n resolveForFallbackLanguage(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator, defaultTranslationText).then(deferred.resolve);\n }\n );\n } else {\n // No translation found in any fallback language\n // if a default translation text is set in the directive, then return this as a result\n if (defaultTranslationText) {\n deferred.resolve(defaultTranslationText);\n } else {\n // if no default translation is set and an error handler is defined, send it to the handler\n // and then return the result\n deferred.resolve(translateByHandler(translationId, interpolateParams));\n }\n }\n return deferred.promise;\n };\n\n /**\n * @name resolveForFallbackLanguageInstant\n * @private\n *\n * Recursive helper function for fallbackTranslation that will sequentially look\n * for a translation in the fallbackLanguages starting with fallbackLanguageIndex.\n *\n * @param fallbackLanguageIndex\n * @param translationId\n * @param interpolateParams\n * @param Interpolator\n * @returns {string} translation\n */\n var resolveForFallbackLanguageInstant = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator) {\n var result;\n\n if (fallbackLanguageIndex < $fallbackLanguage.length) {\n var langKey = $fallbackLanguage[fallbackLanguageIndex];\n result = getFallbackTranslationInstant(langKey, translationId, interpolateParams, Interpolator);\n if (!result) {\n result = resolveForFallbackLanguageInstant(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator);\n }\n }\n return result;\n };\n\n /**\n * Translates with the usage of the fallback languages.\n *\n * @param translationId\n * @param interpolateParams\n * @param Interpolator\n * @returns {Q.promise} Promise, that resolves to the translation.\n */\n var fallbackTranslation = function (translationId, interpolateParams, Interpolator, defaultTranslationText) {\n // Start with the fallbackLanguage with index 0\n return resolveForFallbackLanguage((startFallbackIteration>0 ? startFallbackIteration : fallbackIndex), translationId, interpolateParams, Interpolator, defaultTranslationText);\n };\n\n /**\n * Translates with the usage of the fallback languages.\n *\n * @param translationId\n * @param interpolateParams\n * @param Interpolator\n * @returns {String} translation\n */\n var fallbackTranslationInstant = function (translationId, interpolateParams, Interpolator) {\n // Start with the fallbackLanguage with index 0\n return resolveForFallbackLanguageInstant((startFallbackIteration>0 ? startFallbackIteration : fallbackIndex), translationId, interpolateParams, Interpolator);\n };\n\n var determineTranslation = function (translationId, interpolateParams, interpolationId, defaultTranslationText) {\n\n var deferred = $q.defer();\n\n var table = $uses ? $translationTable[$uses] : $translationTable,\n Interpolator = (interpolationId) ? interpolatorHashMap[interpolationId] : defaultInterpolator;\n\n // if the translation id exists, we can just interpolate it\n if (table && Object.prototype.hasOwnProperty.call(table, translationId)) {\n var translation = table[translationId];\n\n // If using link, rerun $translate with linked translationId and return it\n if (translation.substr(0, 2) === '@:') {\n\n $translate(translation.substr(2), interpolateParams, interpolationId, defaultTranslationText)\n .then(deferred.resolve, deferred.reject);\n } else {\n deferred.resolve(Interpolator.interpolate(translation, interpolateParams));\n }\n } else {\n var missingTranslationHandlerTranslation;\n // for logging purposes only (as in $translateMissingTranslationHandlerLog), value is not returned to promise\n if ($missingTranslationHandlerFactory && !pendingLoader) {\n missingTranslationHandlerTranslation = translateByHandler(translationId, interpolateParams);\n }\n\n // since we couldn't translate the inital requested translation id,\n // we try it now with one or more fallback languages, if fallback language(s) is\n // configured.\n if ($uses && $fallbackLanguage && $fallbackLanguage.length) {\n fallbackTranslation(translationId, interpolateParams, Interpolator, defaultTranslationText)\n .then(function (translation) {\n deferred.resolve(translation);\n }, function (_translationId) {\n deferred.reject(applyNotFoundIndicators(_translationId));\n });\n } else if ($missingTranslationHandlerFactory && !pendingLoader && missingTranslationHandlerTranslation) {\n // looks like the requested translation id doesn't exists.\n // Now, if there is a registered handler for missing translations and no\n // asyncLoader is pending, we execute the handler\n if (defaultTranslationText) {\n deferred.resolve(defaultTranslationText);\n } else {\n deferred.resolve(missingTranslationHandlerTranslation);\n }\n } else {\n if (defaultTranslationText) {\n deferred.resolve(defaultTranslationText);\n } else {\n deferred.reject(applyNotFoundIndicators(translationId));\n }\n }\n }\n return deferred.promise;\n };\n\n var determineTranslationInstant = function (translationId, interpolateParams, interpolationId) {\n\n var result, table = $uses ? $translationTable[$uses] : $translationTable,\n Interpolator = defaultInterpolator;\n\n // if the interpolation id exists use custom interpolator\n if (interpolatorHashMap && Object.prototype.hasOwnProperty.call(interpolatorHashMap, interpolationId)) {\n Interpolator = interpolatorHashMap[interpolationId];\n }\n\n // if the translation id exists, we can just interpolate it\n if (table && Object.prototype.hasOwnProperty.call(table, translationId)) {\n var translation = table[translationId];\n\n // If using link, rerun $translate with linked translationId and return it\n if (translation.substr(0, 2) === '@:') {\n result = determineTranslationInstant(translation.substr(2), interpolateParams, interpolationId);\n } else {\n result = Interpolator.interpolate(translation, interpolateParams);\n }\n } else {\n var missingTranslationHandlerTranslation;\n // for logging purposes only (as in $translateMissingTranslationHandlerLog), value is not returned to promise\n if ($missingTranslationHandlerFactory && !pendingLoader) {\n missingTranslationHandlerTranslation = translateByHandler(translationId, interpolateParams);\n }\n\n // since we couldn't translate the inital requested translation id,\n // we try it now with one or more fallback languages, if fallback language(s) is\n // configured.\n if ($uses && $fallbackLanguage && $fallbackLanguage.length) {\n fallbackIndex = 0;\n result = fallbackTranslationInstant(translationId, interpolateParams, Interpolator);\n } else if ($missingTranslationHandlerFactory && !pendingLoader && missingTranslationHandlerTranslation) {\n // looks like the requested translation id doesn't exists.\n // Now, if there is a registered handler for missing translations and no\n // asyncLoader is pending, we execute the handler\n result = missingTranslationHandlerTranslation;\n } else {\n result = applyNotFoundIndicators(translationId);\n }\n }\n\n return result;\n };\n\n var clearNextLangAndPromise = function(key) {\n if ($nextLang === key) {\n $nextLang = undefined;\n }\n langPromises[key] = undefined;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translate#preferredLanguage\n * @methodOf pascalprecht.translate.$translate\n *\n * @description\n * Returns the language key for the preferred language.\n *\n * @param {string} langKey language String or Array to be used as preferredLanguage (changing at runtime)\n *\n * @return {string} preferred language key\n */\n $translate.preferredLanguage = function (langKey) {\n if(langKey) {\n setupPreferredLanguage(langKey);\n }\n return $preferredLanguage;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translate#cloakClassName\n * @methodOf pascalprecht.translate.$translate\n *\n * @description\n * Returns the configured class name for `translate-cloak` directive.\n *\n * @return {string} cloakClassName\n */\n $translate.cloakClassName = function () {\n return $cloakClassName;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translate#fallbackLanguage\n * @methodOf pascalprecht.translate.$translate\n *\n * @description\n * Returns the language key for the fallback languages or sets a new fallback stack.\n *\n * @param {string=} langKey language String or Array of fallback languages to be used (to change stack at runtime)\n *\n * @return {string||array} fallback language key\n */\n $translate.fallbackLanguage = function (langKey) {\n if (langKey !== undefined && langKey !== null) {\n fallbackStack(langKey);\n\n // as we might have an async loader initiated and a new translation language might have been defined\n // we need to add the promise to the stack also. So - iterate.\n if ($loaderFactory) {\n if ($fallbackLanguage && $fallbackLanguage.length) {\n for (var i = 0, len = $fallbackLanguage.length; i < len; i++) {\n if (!langPromises[$fallbackLanguage[i]]) {\n langPromises[$fallbackLanguage[i]] = loadAsync($fallbackLanguage[i]);\n }\n }\n }\n }\n $translate.use($translate.use());\n }\n if ($fallbackWasString) {\n return $fallbackLanguage[0];\n } else {\n return $fallbackLanguage;\n }\n\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translate#useFallbackLanguage\n * @methodOf pascalprecht.translate.$translate\n *\n * @description\n * Sets the first key of the fallback language stack to be used for translation.\n * Therefore all languages in the fallback array BEFORE this key will be skipped!\n *\n * @param {string=} langKey Contains the langKey the iteration shall start with. Set to false if you want to\n * get back to the whole stack\n */\n $translate.useFallbackLanguage = function (langKey) {\n if (langKey !== undefined && langKey !== null) {\n if (!langKey) {\n startFallbackIteration = 0;\n } else {\n var langKeyPosition = indexOf($fallbackLanguage, langKey);\n if (langKeyPosition > -1) {\n startFallbackIteration = langKeyPosition;\n }\n }\n\n }\n\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translate#proposedLanguage\n * @methodOf pascalprecht.translate.$translate\n *\n * @description\n * Returns the language key of language that is currently loaded asynchronously.\n *\n * @return {string} language key\n */\n $translate.proposedLanguage = function () {\n return $nextLang;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translate#storage\n * @methodOf pascalprecht.translate.$translate\n *\n * @description\n * Returns registered storage.\n *\n * @return {object} Storage\n */\n $translate.storage = function () {\n return Storage;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translate#use\n * @methodOf pascalprecht.translate.$translate\n *\n * @description\n * Tells angular-translate which language to use by given language key. This method is\n * used to change language at runtime. It also takes care of storing the language\n * key in a configured store to let your app remember the choosed language.\n *\n * When trying to 'use' a language which isn't available it tries to load it\n * asynchronously with registered loaders.\n *\n * Returns promise object with loaded language file data\n * @example\n * $translate.use(\"en_US\").then(function(data){\n * $scope.text = $translate(\"HELLO\");\n * });\n *\n * @param {string} key Language key\n * @return {string} Language key\n */\n $translate.use = function (key) {\n if (!key) {\n return $uses;\n }\n\n var deferred = $q.defer();\n\n $rootScope.$emit('$translateChangeStart', {language: key});\n\n // Try to get the aliased language key\n var aliasedKey = negotiateLocale(key);\n if (aliasedKey) {\n key = aliasedKey;\n }\n\n // if there isn't a translation table for the language we've requested,\n // we load it asynchronously\n if (($forceAsyncReloadEnabled || !$translationTable[key]) && $loaderFactory && !langPromises[key]) {\n $nextLang = key;\n langPromises[key] = loadAsync(key).then(function (translation) {\n translations(translation.key, translation.table);\n deferred.resolve(translation.key);\n useLanguage(translation.key);\n return translation;\n }, function (key) {\n $rootScope.$emit('$translateChangeError', {language: key});\n deferred.reject(key);\n $rootScope.$emit('$translateChangeEnd', {language: key});\n return $q.reject(key);\n });\n langPromises[key]['finally'](function () {\n clearNextLangAndPromise(key);\n });\n } else if ($nextLang === key && langPromises[key]) {\n // we are already loading this asynchronously\n // resolve our new deferred when the old langPromise is resolved\n langPromises[key].then(function (translation) {\n deferred.resolve(translation.key);\n return translation;\n }, function (key) {\n deferred.reject(key);\n return $q.reject(key);\n });\n } else {\n deferred.resolve(key);\n useLanguage(key);\n }\n\n return deferred.promise;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translate#storageKey\n * @methodOf pascalprecht.translate.$translate\n *\n * @description\n * Returns the key for the storage.\n *\n * @return {string} storage key\n */\n $translate.storageKey = function () {\n return storageKey();\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translate#isPostCompilingEnabled\n * @methodOf pascalprecht.translate.$translate\n *\n * @description\n * Returns whether post compiling is enabled or not\n *\n * @return {bool} storage key\n */\n $translate.isPostCompilingEnabled = function () {\n return $postCompilingEnabled;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translate#isForceAsyncReloadEnabled\n * @methodOf pascalprecht.translate.$translate\n *\n * @description\n * Returns whether force async reload is enabled or not\n *\n * @return {boolean} forceAsyncReload value\n */\n $translate.isForceAsyncReloadEnabled = function () {\n return $forceAsyncReloadEnabled;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translate#refresh\n * @methodOf pascalprecht.translate.$translate\n *\n * @description\n * Refreshes a translation table pointed by the given langKey. If langKey is not specified,\n * the module will drop all existent translation tables and load new version of those which\n * are currently in use.\n *\n * Refresh means that the module will drop target translation table and try to load it again.\n *\n * In case there are no loaders registered the refresh() method will throw an Error.\n *\n * If the module is able to refresh translation tables refresh() method will broadcast\n * $translateRefreshStart and $translateRefreshEnd events.\n *\n * @example\n * // this will drop all currently existent translation tables and reload those which are\n * // currently in use\n * $translate.refresh();\n * // this will refresh a translation table for the en_US language\n * $translate.refresh('en_US');\n *\n * @param {string} langKey A language key of the table, which has to be refreshed\n *\n * @return {promise} Promise, which will be resolved in case a translation tables refreshing\n * process is finished successfully, and reject if not.\n */\n $translate.refresh = function (langKey) {\n if (!$loaderFactory) {\n throw new Error('Couldn\\'t refresh translation table, no loader registered!');\n }\n\n var deferred = $q.defer();\n\n function resolve() {\n deferred.resolve();\n $rootScope.$emit('$translateRefreshEnd', {language: langKey});\n }\n\n function reject() {\n deferred.reject();\n $rootScope.$emit('$translateRefreshEnd', {language: langKey});\n }\n\n $rootScope.$emit('$translateRefreshStart', {language: langKey});\n\n if (!langKey) {\n // if there's no language key specified we refresh ALL THE THINGS!\n var tables = [], loadingKeys = {};\n\n // reload registered fallback languages\n if ($fallbackLanguage && $fallbackLanguage.length) {\n for (var i = 0, len = $fallbackLanguage.length; i < len; i++) {\n tables.push(loadAsync($fallbackLanguage[i]));\n loadingKeys[$fallbackLanguage[i]] = true;\n }\n }\n\n // reload currently used language\n if ($uses && !loadingKeys[$uses]) {\n tables.push(loadAsync($uses));\n }\n\n var allTranslationsLoaded = function (tableData) {\n $translationTable = {};\n angular.forEach(tableData, function (data) {\n translations(data.key, data.table);\n });\n if ($uses) {\n useLanguage($uses);\n }\n resolve();\n };\n allTranslationsLoaded.displayName = 'refreshPostProcessor';\n\n $q.all(tables).then(allTranslationsLoaded, reject);\n\n } else if ($translationTable[langKey]) {\n\n var oneTranslationsLoaded = function (data) {\n translations(data.key, data.table);\n if (langKey === $uses) {\n useLanguage($uses);\n }\n resolve();\n };\n oneTranslationsLoaded.displayName = 'refreshPostProcessor';\n\n loadAsync(langKey).then(oneTranslationsLoaded, reject);\n\n } else {\n reject();\n }\n return deferred.promise;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translate#instant\n * @methodOf pascalprecht.translate.$translate\n *\n * @description\n * Returns a translation instantly from the internal state of loaded translation. All rules\n * regarding the current language, the preferred language of even fallback languages will be\n * used except any promise handling. If a language was not found, an asynchronous loading\n * will be invoked in the background.\n *\n * @param {string|array} translationId A token which represents a translation id\n * This can be optionally an array of translation ids which\n * results that the function's promise returns an object where\n * each key is the translation id and the value the translation.\n * @param {object} interpolateParams Params\n * @param {string} interpolationId The id of the interpolation to use\n *\n * @return {string|object} translation\n */\n $translate.instant = function (translationId, interpolateParams, interpolationId) {\n\n // Detect undefined and null values to shorten the execution and prevent exceptions\n if (translationId === null || angular.isUndefined(translationId)) {\n return translationId;\n }\n\n // Duck detection: If the first argument is an array, a bunch of translations was requested.\n // The result is an object.\n if (angular.isArray(translationId)) {\n var results = {};\n for (var i = 0, c = translationId.length; i < c; i++) {\n results[translationId[i]] = $translate.instant(translationId[i], interpolateParams, interpolationId);\n }\n return results;\n }\n\n // We discarded unacceptable values. So we just need to verify if translationId is empty String\n if (angular.isString(translationId) && translationId.length < 1) {\n return translationId;\n }\n\n // trim off any whitespace\n if (translationId) {\n translationId = trim.apply(translationId);\n }\n\n var result, possibleLangKeys = [];\n if ($preferredLanguage) {\n possibleLangKeys.push($preferredLanguage);\n }\n if ($uses) {\n possibleLangKeys.push($uses);\n }\n if ($fallbackLanguage && $fallbackLanguage.length) {\n possibleLangKeys = possibleLangKeys.concat($fallbackLanguage);\n }\n for (var j = 0, d = possibleLangKeys.length; j < d; j++) {\n var possibleLangKey = possibleLangKeys[j];\n if ($translationTable[possibleLangKey]) {\n if (typeof $translationTable[possibleLangKey][translationId] !== 'undefined') {\n result = determineTranslationInstant(translationId, interpolateParams, interpolationId);\n } else if ($notFoundIndicatorLeft || $notFoundIndicatorRight) {\n result = applyNotFoundIndicators(translationId);\n }\n }\n if (typeof result !== 'undefined') {\n break;\n }\n }\n\n if (!result && result !== '') {\n // Return translation of default interpolator if not found anything.\n result = defaultInterpolator.interpolate(translationId, interpolateParams);\n if ($missingTranslationHandlerFactory && !pendingLoader) {\n result = translateByHandler(translationId, interpolateParams);\n }\n }\n\n return result;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translate#versionInfo\n * @methodOf pascalprecht.translate.$translate\n *\n * @description\n * Returns the current version information for the angular-translate library\n *\n * @return {string} angular-translate version\n */\n $translate.versionInfo = function () {\n return version;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translate#loaderCache\n * @methodOf pascalprecht.translate.$translate\n *\n * @description\n * Returns the defined loaderCache.\n *\n * @return {boolean|string|object} current value of loaderCache\n */\n $translate.loaderCache = function () {\n return loaderCache;\n };\n\n // internal purpose only\n $translate.directivePriority = function () {\n return directivePriority;\n };\n\n // internal purpose only\n $translate.statefulFilter = function () {\n return statefulFilter;\n };\n\n if ($loaderFactory) {\n\n // If at least one async loader is defined and there are no\n // (default) translations available we should try to load them.\n if (angular.equals($translationTable, {})) {\n $translate.use($translate.use());\n }\n\n // Also, if there are any fallback language registered, we start\n // loading them asynchronously as soon as we can.\n if ($fallbackLanguage && $fallbackLanguage.length) {\n var processAsyncResult = function (translation) {\n translations(translation.key, translation.table);\n $rootScope.$emit('$translateChangeEnd', { language: translation.key });\n return translation;\n };\n for (var i = 0, len = $fallbackLanguage.length; i < len; i++) {\n var fallbackLanguageId = $fallbackLanguage[i];\n if ($forceAsyncReloadEnabled || !$translationTable[fallbackLanguageId]) {\n langPromises[fallbackLanguageId] = loadAsync(fallbackLanguageId).then(processAsyncResult);\n }\n }\n }\n }\n\n return $translate;\n }\n ];\n}\n$translate.$inject = ['$STORAGE_KEY', '$windowProvider', '$translateSanitizationProvider', 'pascalprechtTranslateOverrider'];\n\n$translate.displayName = 'displayName';\n\n/**\n * @ngdoc object\n * @name pascalprecht.translate.$translateDefaultInterpolation\n * @requires $interpolate\n *\n * @description\n * Uses angular's `$interpolate` services to interpolate strings against some values.\n *\n * Be aware to configure a proper sanitization strategy.\n *\n * See also:\n * * {@link pascalprecht.translate.$translateSanitization}\n *\n * @return {object} $translateDefaultInterpolation Interpolator service\n */\nangular.module('pascalprecht.translate').factory('$translateDefaultInterpolation', $translateDefaultInterpolation);\n\nfunction $translateDefaultInterpolation ($interpolate, $translateSanitization) {\n\n 'use strict';\n\n var $translateInterpolator = {},\n $locale,\n $identifier = 'default';\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateDefaultInterpolation#setLocale\n * @methodOf pascalprecht.translate.$translateDefaultInterpolation\n *\n * @description\n * Sets current locale (this is currently not use in this interpolation).\n *\n * @param {string} locale Language key or locale.\n */\n $translateInterpolator.setLocale = function (locale) {\n $locale = locale;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateDefaultInterpolation#getInterpolationIdentifier\n * @methodOf pascalprecht.translate.$translateDefaultInterpolation\n *\n * @description\n * Returns an identifier for this interpolation service.\n *\n * @returns {string} $identifier\n */\n $translateInterpolator.getInterpolationIdentifier = function () {\n return $identifier;\n };\n\n /**\n * @deprecated will be removed in 3.0\n * @see {@link pascalprecht.translate.$translateSanitization}\n */\n $translateInterpolator.useSanitizeValueStrategy = function (value) {\n $translateSanitization.useStrategy(value);\n return this;\n };\n\n /**\n * @ngdoc function\n * @name pascalprecht.translate.$translateDefaultInterpolation#interpolate\n * @methodOf pascalprecht.translate.$translateDefaultInterpolation\n *\n * @description\n * Interpolates given string agains given interpolate params using angulars\n * `$interpolate` service.\n *\n * @returns {string} interpolated string.\n */\n $translateInterpolator.interpolate = function (string, interpolationParams) {\n interpolationParams = interpolationParams || {};\n interpolationParams = $translateSanitization.sanitize(interpolationParams, 'params');\n\n var interpolatedText = $interpolate(string)(interpolationParams);\n interpolatedText = $translateSanitization.sanitize(interpolatedText, 'text');\n\n return interpolatedText;\n };\n\n return $translateInterpolator;\n}\n$translateDefaultInterpolation.$inject = ['$interpolate', '$translateSanitization'];\n\n$translateDefaultInterpolation.displayName = '$translateDefaultInterpolation';\n\nangular.module('pascalprecht.translate').constant('$STORAGE_KEY', 'NG_TRANSLATE_LANG_KEY');\n\nangular.module('pascalprecht.translate')\n/**\n * @ngdoc directive\n * @name pascalprecht.translate.directive:translate\n * @requires $compile\n * @requires $filter\n * @requires $interpolate\n * @restrict A\n *\n * @description\n * Translates given translation id either through attribute or DOM content.\n * Internally it uses `translate` filter to translate translation id. It possible to\n * pass an optional `translate-values` object literal as string into translation id.\n *\n * @param {string=} translate Translation id which could be either string or interpolated string.\n * @param {string=} translate-values Values to pass into translation id. Can be passed as object literal string or interpolated object.\n * @param {string=} translate-attr-ATTR translate Translation id and put it into ATTR attribute.\n * @param {string=} translate-default will be used unless translation was successful\n * @param {boolean=} translate-compile (default true if present) defines locally activation of {@link pascalprecht.translate.$translateProvider#methods_usePostCompiling}\n *\n * @example\n \n \n
\n\n
\n        
TRANSLATION_ID
\n
\n        
\n        
{{translationId}}
\n
\n        
WITH_VALUES
\n
\n        
WITH_VALUES
\n
\n\n      
\n
\n \n angular.module('ngView', ['pascalprecht.translate'])\n\n .config(function ($translateProvider) {\n\n $translateProvider.translations('en',{\n 'TRANSLATION_ID': 'Hello there!',\n 'WITH_VALUES': 'The following value is dynamic: {{value}}'\n }).preferredLanguage('en');\n\n });\n\n angular.module('ngView').controller('TranslateCtrl', function ($scope) {\n $scope.translationId = 'TRANSLATION_ID';\n\n $scope.values = {\n value: 78\n };\n });\n \n \n it('should translate', function () {\n inject(function ($rootScope, $compile) {\n $rootScope.translationId = 'TRANSLATION_ID';\n\n element = $compile('

')($rootScope);\n $rootScope.$digest();\n expect(element.text()).toBe('Hello there!');\n\n element = $compile('

')($rootScope);\n $rootScope.$digest();\n expect(element.text()).toBe('Hello there!');\n\n element = $compile('

TRANSLATION_ID

')($rootScope);\n $rootScope.$digest();\n expect(element.text()).toBe('Hello there!');\n\n element = $compile('

{{translationId}}

')($rootScope);\n $rootScope.$digest();\n expect(element.text()).toBe('Hello there!');\n\n element = $compile('

')($rootScope);\n $rootScope.$digest();\n expect(element.attr('title')).toBe('Hello there!');\n });\n });\n
\n
\n */\n.directive('translate', translateDirective);\nfunction translateDirective($translate, $q, $interpolate, $compile, $parse, $rootScope) {\n\n 'use strict';\n\n /**\n * @name trim\n * @private\n *\n * @description\n * trim polyfill\n *\n * @returns {string} The string stripped of whitespace from both ends\n */\n var trim = function() {\n return this.toString().replace(/^\\s+|\\s+$/g, '');\n };\n\n return {\n restrict: 'AE',\n scope: true,\n priority: $translate.directivePriority(),\n compile: function (tElement, tAttr) {\n\n var translateValuesExist = (tAttr.translateValues) ?\n tAttr.translateValues : undefined;\n\n var translateInterpolation = (tAttr.translateInterpolation) ?\n tAttr.translateInterpolation : undefined;\n\n var translateValueExist = tElement[0].outerHTML.match(/translate-value-+/i);\n\n var interpolateRegExp = '^(.*)(' + $interpolate.startSymbol() + '.*' + $interpolate.endSymbol() + ')(.*)',\n watcherRegExp = '^(.*)' + $interpolate.startSymbol() + '(.*)' + $interpolate.endSymbol() + '(.*)';\n\n return function linkFn(scope, iElement, iAttr) {\n\n scope.interpolateParams = {};\n scope.preText = '';\n scope.postText = '';\n var translationIds = {};\n\n var initInterpolationParams = function (interpolateParams, iAttr, tAttr) {\n // initial setup\n if (iAttr.translateValues) {\n angular.extend(interpolateParams, $parse(iAttr.translateValues)(scope.$parent));\n }\n // initially fetch all attributes if existing and fill the params\n if (translateValueExist) {\n for (var attr in tAttr) {\n if (Object.prototype.hasOwnProperty.call(iAttr, attr) && attr.substr(0, 14) === 'translateValue' && attr !== 'translateValues') {\n var attributeName = angular.lowercase(attr.substr(14, 1)) + attr.substr(15);\n interpolateParams[attributeName] = tAttr[attr];\n }\n }\n }\n };\n\n // Ensures any change of the attribute \"translate\" containing the id will\n // be re-stored to the scope's \"translationId\".\n // If the attribute has no content, the element's text value (white spaces trimmed off) will be used.\n var observeElementTranslation = function (translationId) {\n\n // Remove any old watcher\n if (angular.isFunction(observeElementTranslation._unwatchOld)) {\n observeElementTranslation._unwatchOld();\n observeElementTranslation._unwatchOld = undefined;\n }\n\n if (angular.equals(translationId , '') || !angular.isDefined(translationId)) {\n // Resolve translation id by inner html if required\n var interpolateMatches = trim.apply(iElement.text()).match(interpolateRegExp);\n // Interpolate translation id if required\n if (angular.isArray(interpolateMatches)) {\n scope.preText = interpolateMatches[1];\n scope.postText = interpolateMatches[3];\n translationIds.translate = $interpolate(interpolateMatches[2])(scope.$parent);\n var watcherMatches = iElement.text().match(watcherRegExp);\n if (angular.isArray(watcherMatches) && watcherMatches[2] && watcherMatches[2].length) {\n observeElementTranslation._unwatchOld = scope.$watch(watcherMatches[2], function (newValue) {\n translationIds.translate = newValue;\n updateTranslations();\n });\n }\n } else {\n translationIds.translate = iElement.text().replace(/^\\s+|\\s+$/g,'');\n }\n } else {\n translationIds.translate = translationId;\n }\n updateTranslations();\n };\n\n var observeAttributeTranslation = function (translateAttr) {\n iAttr.$observe(translateAttr, function (translationId) {\n translationIds[translateAttr] = translationId;\n updateTranslations();\n });\n };\n\n // initial setup with values\n initInterpolationParams(scope.interpolateParams, iAttr, tAttr);\n\n var firstAttributeChangedEvent = true;\n iAttr.$observe('translate', function (translationId) {\n if (typeof translationId === 'undefined') {\n // case of element \"xyz\"\n observeElementTranslation('');\n } else {\n // case of regular attribute\n if (translationId !== '' || !firstAttributeChangedEvent) {\n translationIds.translate = translationId;\n updateTranslations();\n }\n }\n firstAttributeChangedEvent = false;\n });\n\n for (var translateAttr in iAttr) {\n if (iAttr.hasOwnProperty(translateAttr) && translateAttr.substr(0, 13) === 'translateAttr') {\n observeAttributeTranslation(translateAttr);\n }\n }\n\n iAttr.$observe('translateDefault', function (value) {\n scope.defaultText = value;\n });\n\n if (translateValuesExist) {\n iAttr.$observe('translateValues', function (interpolateParams) {\n if (interpolateParams) {\n scope.$parent.$watch(function () {\n angular.extend(scope.interpolateParams, $parse(interpolateParams)(scope.$parent));\n });\n }\n });\n }\n\n if (translateValueExist) {\n var observeValueAttribute = function (attrName) {\n iAttr.$observe(attrName, function (value) {\n var attributeName = angular.lowercase(attrName.substr(14, 1)) + attrName.substr(15);\n scope.interpolateParams[attributeName] = value;\n });\n };\n for (var attr in iAttr) {\n if (Object.prototype.hasOwnProperty.call(iAttr, attr) && attr.substr(0, 14) === 'translateValue' && attr !== 'translateValues') {\n observeValueAttribute(attr);\n }\n }\n }\n\n // Master update function\n var updateTranslations = function () {\n for (var key in translationIds) {\n\n if (translationIds.hasOwnProperty(key) && translationIds[key] !== undefined) {\n updateTranslation(key, translationIds[key], scope, scope.interpolateParams, scope.defaultText);\n }\n }\n };\n\n // Put translation processing function outside loop\n var updateTranslation = function(translateAttr, translationId, scope, interpolateParams, defaultTranslationText) {\n if (translationId) {\n $translate(translationId, interpolateParams, translateInterpolation, defaultTranslationText)\n .then(function (translation) {\n applyTranslation(translation, scope, true, translateAttr);\n }, function (translationId) {\n applyTranslation(translationId, scope, false, translateAttr);\n });\n } else {\n // as an empty string cannot be translated, we can solve this using successful=false\n applyTranslation(translationId, scope, false, translateAttr);\n }\n };\n\n var applyTranslation = function (value, scope, successful, translateAttr) {\n if (translateAttr === 'translate') {\n // default translate into innerHTML\n if (!successful && typeof scope.defaultText !== 'undefined') {\n value = scope.defaultText;\n }\n iElement.html(scope.preText + value + scope.postText);\n var globallyEnabled = $translate.isPostCompilingEnabled();\n var locallyDefined = typeof tAttr.translateCompile !== 'undefined';\n var locallyEnabled = locallyDefined && tAttr.translateCompile !== 'false';\n if ((globallyEnabled && !locallyDefined) || locallyEnabled) {\n $compile(iElement.contents())(scope);\n }\n } else {\n // translate attribute\n if (!successful && typeof scope.defaultText !== 'undefined') {\n value = scope.defaultText;\n }\n var attributeName = iAttr.$attr[translateAttr];\n if (attributeName.substr(0, 5) === 'data-') {\n // ensure html5 data prefix is stripped\n attributeName = attributeName.substr(5);\n }\n attributeName = attributeName.substr(15);\n iElement.attr(attributeName, value);\n }\n };\n\n if (translateValuesExist || translateValueExist || iAttr.translateDefault) {\n scope.$watch('interpolateParams', updateTranslations, true);\n }\n\n // Ensures the text will be refreshed after the current language was changed\n // w/ $translate.use(...)\n var unbind = $rootScope.$on('$translateChangeSuccess', updateTranslations);\n\n // ensure translation will be looked up at least one\n if (iElement.text().length) {\n if (iAttr.translate) {\n observeElementTranslation(iAttr.translate);\n } else {\n observeElementTranslation('');\n }\n } else if (iAttr.translate) {\n // ensure attribute will be not skipped\n observeElementTranslation(iAttr.translate);\n }\n updateTranslations();\n scope.$on('$destroy', unbind);\n };\n }\n };\n}\ntranslateDirective.$inject = ['$translate', '$q', '$interpolate', '$compile', '$parse', '$rootScope'];\n\ntranslateDirective.displayName = 'translateDirective';\n\nangular.module('pascalprecht.translate')\n/**\n * @ngdoc directive\n * @name pascalprecht.translate.directive:translateCloak\n * @requires $rootScope\n * @requires $translate\n * @restrict A\n *\n * $description\n * Adds a `translate-cloak` class name to the given element where this directive\n * is applied initially and removes it, once a loader has finished loading.\n *\n * This directive can be used to prevent initial flickering when loading translation\n * data asynchronously.\n *\n * The class name is defined in\n * {@link pascalprecht.translate.$translateProvider#cloakClassName $translate.cloakClassName()}.\n *\n * @param {string=} translate-cloak If a translationId is provided, it will be used for showing\n * or hiding the cloak. Basically it relies on the translation\n * resolve.\n */\n.directive('translateCloak', translateCloakDirective);\n\nfunction translateCloakDirective($rootScope, $translate) {\n\n 'use strict';\n\n return {\n compile: function (tElement) {\n var applyCloak = function () {\n tElement.addClass($translate.cloakClassName());\n },\n removeCloak = function () {\n tElement.removeClass($translate.cloakClassName());\n },\n removeListener = $rootScope.$on('$translateChangeEnd', function () {\n removeCloak();\n removeListener();\n removeListener = null;\n });\n applyCloak();\n\n return function linkFn(scope, iElement, iAttr) {\n // Register a watcher for the defined translation allowing a fine tuned cloak\n if (iAttr.translateCloak && iAttr.translateCloak.length) {\n iAttr.$observe('translateCloak', function (translationId) {\n $translate(translationId).then(removeCloak, applyCloak);\n });\n }\n };\n }\n };\n}\ntranslateCloakDirective.$inject = ['$rootScope', '$translate'];\n\ntranslateCloakDirective.displayName = 'translateCloakDirective';\n\nangular.module('pascalprecht.translate')\n/**\n * @ngdoc filter\n * @name pascalprecht.translate.filter:translate\n * @requires $parse\n * @requires pascalprecht.translate.$translate\n * @function\n *\n * @description\n * Uses `$translate` service to translate contents. Accepts interpolate parameters\n * to pass dynamized values though translation.\n *\n * @param {string} translationId A translation id to be translated.\n * @param {*=} interpolateParams Optional object literal (as hash or string) to pass values into translation.\n *\n * @returns {string} Translated text.\n *\n * @example\n \n \n
\n\n
{{ 'TRANSLATION_ID' | translate }}
\n
{{ translationId | translate }}
\n
{{ 'WITH_VALUES' | translate:'{value: 5}' }}
\n
{{ 'WITH_VALUES' | translate:values }}
\n\n
\n
\n \n angular.module('ngView', ['pascalprecht.translate'])\n\n .config(function ($translateProvider) {\n\n $translateProvider.translations('en', {\n 'TRANSLATION_ID': 'Hello there!',\n 'WITH_VALUES': 'The following value is dynamic: {{value}}'\n });\n $translateProvider.preferredLanguage('en');\n\n });\n\n angular.module('ngView').controller('TranslateCtrl', function ($scope) {\n $scope.translationId = 'TRANSLATION_ID';\n\n $scope.values = {\n value: 78\n };\n });\n \n
\n */\n.filter('translate', translateFilterFactory);\n\nfunction translateFilterFactory($parse, $translate) {\n\n 'use strict';\n\n var translateFilter = function (translationId, interpolateParams, interpolation) {\n\n if (!angular.isObject(interpolateParams)) {\n interpolateParams = $parse(interpolateParams)(this);\n }\n\n return $translate.instant(translationId, interpolateParams, interpolation);\n };\n\n if ($translate.statefulFilter()) {\n translateFilter.$stateful = true;\n }\n\n return translateFilter;\n}\ntranslateFilterFactory.$inject = ['$parse', '$translate'];\n\ntranslateFilterFactory.displayName = 'translateFilterFactory';\n\nangular.module('pascalprecht.translate')\n\n/**\n * @ngdoc object\n * @name pascalprecht.translate.$translationCache\n * @requires $cacheFactory\n *\n * @description\n * The first time a translation table is used, it is loaded in the translation cache for quick retrieval. You\n * can load translation tables directly into the cache by consuming the\n * `$translationCache` service directly.\n *\n * @return {object} $cacheFactory object.\n */\n .factory('$translationCache', $translationCache);\n\nfunction $translationCache($cacheFactory) {\n\n 'use strict';\n\n return $cacheFactory('translations');\n}\n$translationCache.$inject = ['$cacheFactory'];\n\n$translationCache.displayName = '$translationCache';\nreturn 'pascalprecht.translate';\n\n}));\n","if (typeof module !== 'undefined' && typeof exports !== 'undefined' && module.exports === exports){\n module.exports = 'highcharts-ng';\n}\n\n(function () {\n 'use strict';\n /*global angular: false, Highcharts: false */\n\n\n angular.module('highcharts-ng', [])\n .provider('highchartsNG', highchartsNGProvider)\n .directive('highchart', ['highchartsNG', '$timeout', highchart]);\n \n function highchartsNGProvider(){\n var modules = [];\n var basePath = false;\n var lazyLoad = false;\n return {\n HIGHCHART: 'highcharts.js',\n HIGHSTOCK: 'stock/highstock.js',\n basePath: function (p) {\n basePath = p;\n },\n lazyLoad: function (list) {\n if (list === undefined) {\n modules = [this.HIGHCHART];\n } else {\n modules = list;\n }\n lazyLoad = true;\n },\n $get: ['$window', '$rootScope', function ($window, $rootScope) {\n if (!basePath) {\n basePath = (window.location.protocol === 'https:' ? 'https' : 'http') + '://code.highcharts.com/';\n }\n return highchartsNG($window, $rootScope, lazyLoad, basePath, modules);\n }]\n };\n }\n function highchartsNG($window, $rootScope, lazyload, basePath, modules) {\n var readyQueue = [];\n var loading = false;\n return {\n lazyLoad:lazyload,\n ready: function (callback, thisArg) {\n if (typeof $window.Highcharts !== 'undefined' || !lazyload) {\n callback();\n } else {\n readyQueue.push([callback, thisArg]);\n if (loading) {\n return;\n }\n loading = true;\n var self = this;\n if (typeof jQuery === 'undefined') {\n modules.unshift('adapters/standalone-framework.js');\n }\n var doWork = function () {\n if (modules.length === 0) {\n loading = false;\n $rootScope.$apply(function () {\n angular.forEach(readyQueue, function (e) {\n // invoke callback passing 'thisArg'\n e[0].apply(e[1], []);\n });\n });\n } else {\n var s = modules.shift();\n self.loadScript(s, doWork);\n }\n };\n doWork();\n }\n },\n loadScript: function (path, callback) {\n var s = document.createElement('script');\n s.type = 'text/javascript';\n s.src = basePath + path;\n s.onload = callback;\n document.getElementsByTagName('body')[0].appendChild(s);\n },\n //IE8 support\n indexOf: function (arr, find, i /*opt*/) {\n if (i === undefined) i = 0;\n if (i < 0) i += arr.length;\n if (i < 0) i = 0;\n for (var n = arr.length; i < n; i++)\n if (i in arr && arr[i] === find)\n return i;\n return -1;\n },\n\n prependMethod: function (obj, method, func) {\n var original = obj[method];\n obj[method] = function () {\n var args = Array.prototype.slice.call(arguments);\n func.apply(this, args);\n if (original) {\n return original.apply(this, args);\n } else {\n return;\n }\n\n };\n },\n\n deepExtend: function deepExtend(destination, source) {\n //Slightly strange behaviour in edge cases (e.g. passing in non objects)\n //But does the job for current use cases.\n if (angular.isArray(source)) {\n destination = angular.isArray(destination) ? destination : [];\n for (var i = 0; i < source.length; i++) {\n destination[i] = deepExtend(destination[i] || {}, source[i]);\n }\n } else if (angular.isObject(source)) {\n destination = angular.isObject(destination) ? destination : {};\n for (var property in source) {\n destination[property] = deepExtend(destination[property] || {}, source[property]);\n }\n } else {\n destination = source;\n }\n return destination;\n }\n };\n }\n\n function highchart(highchartsNGUtils, $timeout) {\n\n // acceptable shared state\n var seriesId = 0;\n var ensureIds = function (series) {\n var changed = false;\n angular.forEach(series, function(s) {\n if (!angular.isDefined(s.id)) {\n s.id = 'series-' + seriesId++;\n changed = true;\n }\n });\n return changed;\n };\n\n // immutable\n var axisNames = [ 'xAxis', 'yAxis' ];\n var chartTypeMap = {\n 'stock': 'StockChart',\n 'map': 'Map',\n 'chart': 'Chart'\n };\n\n var getMergedOptions = function (scope, element, config) {\n var mergedOptions = {};\n\n var defaultOptions = {\n chart: {\n events: {}\n },\n title: {},\n subtitle: {},\n series: [],\n credits: {},\n plotOptions: {},\n navigator: {enabled: false},\n xAxis: {\n events: {}\n },\n yAxis: {\n events: {}\n }\n };\n\n if (config.options) {\n mergedOptions = highchartsNGUtils.deepExtend(defaultOptions, config.options);\n } else {\n mergedOptions = defaultOptions;\n }\n mergedOptions.chart.renderTo = element[0];\n\n angular.forEach(axisNames, function(axisName) {\n if(angular.isDefined(config[axisName])) {\n mergedOptions[axisName] = highchartsNGUtils.deepExtend(mergedOptions[axisName] || {}, config[axisName]);\n\n if(angular.isDefined(config[axisName].currentMin) ||\n angular.isDefined(config[axisName].currentMax)) {\n\n highchartsNGUtils.prependMethod(mergedOptions.chart.events, 'selection', function(e){\n var thisChart = this;\n if (e[axisName]) {\n scope.$apply(function () {\n scope.config[axisName].currentMin = e[axisName][0].min;\n scope.config[axisName].currentMax = e[axisName][0].max;\n });\n } else {\n //handle reset button - zoom out to all\n scope.$apply(function () {\n scope.config[axisName].currentMin = thisChart[axisName][0].dataMin;\n scope.config[axisName].currentMax = thisChart[axisName][0].dataMax;\n });\n }\n });\n\n highchartsNGUtils.prependMethod(mergedOptions.chart.events, 'addSeries', function(e){\n scope.config[axisName].currentMin = this[axisName][0].min || scope.config[axisName].currentMin;\n scope.config[axisName].currentMax = this[axisName][0].max || scope.config[axisName].currentMax;\n });\n highchartsNGUtils.prependMethod(mergedOptions[axisName].events, 'setExtremes', function (e) {\n if (e.trigger && e.trigger !== 'zoom') { // zoom trigger is handled by selection event\n $timeout(function () {\n scope.config[axisName].currentMin = e.min;\n scope.config[axisName].currentMax = e.max;\n scope.config[axisName].min = e.min; // set min and max to adjust scrollbar/navigator\n scope.config[axisName].max = e.max;\n }, 0);\n }\n });\n }\n }\n });\n\n if(config.title) {\n mergedOptions.title = config.title;\n }\n if (config.subtitle) {\n mergedOptions.subtitle = config.subtitle;\n }\n if (config.credits) {\n mergedOptions.credits = config.credits;\n }\n if(config.size) {\n if (config.size.width) {\n mergedOptions.chart.width = config.size.width;\n }\n if (config.size.height) {\n mergedOptions.chart.height = config.size.height;\n }\n }\n return mergedOptions;\n };\n\n var updateZoom = function (axis, modelAxis) {\n var extremes = axis.getExtremes();\n if(modelAxis.currentMin !== extremes.dataMin || modelAxis.currentMax !== extremes.dataMax) {\n if (axis.setExtremes) {\n axis.setExtremes(modelAxis.currentMin, modelAxis.currentMax, false);\n } else {\n axis.detachedsetExtremes(modelAxis.currentMin, modelAxis.currentMax, false);\n }\n }\n };\n\n var processExtremes = function(chart, axis, axisName) {\n if(axis.currentMin || axis.currentMax) {\n chart[axisName][0].setExtremes(axis.currentMin, axis.currentMax, true);\n }\n };\n\n var chartOptionsWithoutEasyOptions = function (options) {\n return angular.extend(\n highchartsNGUtils.deepExtend({}, options),\n { data: null, visible: null }\n );\n };\n\n var getChartType = function(scope) {\n if (scope.config === undefined) return 'Chart';\n return chartTypeMap[('' + scope.config.chartType).toLowerCase()] ||\n (scope.config.useHighStocks ? 'StockChart' : 'Chart');\n };\n\n var res = {\n restrict: 'EAC',\n replace: true,\n template: '
',\n scope: {\n config: '=',\n disableDataWatch: '='\n },\n link: function (scope, element, attrs) {\n // We keep some chart-specific variables here as a closure\n // instead of storing them on 'scope'.\n\n // prevSeriesOptions is maintained by processSeries\n var prevSeriesOptions = {};\n\n var processSeries = function(series) {\n var i;\n var ids = [];\n\n if(series) {\n var setIds = ensureIds(series);\n if(setIds && !scope.disableDataWatch) {\n //If we have set some ids this will trigger another digest cycle.\n //In this scenario just return early and let the next cycle take care of changes\n return false;\n }\n\n //Find series to add or update\n angular.forEach(series, function(s) {\n ids.push(s.id);\n var chartSeries = chart.get(s.id);\n if (chartSeries) {\n if (!angular.equals(prevSeriesOptions[s.id], chartOptionsWithoutEasyOptions(s))) {\n chartSeries.update(angular.copy(s), false);\n } else {\n if (s.visible !== undefined && chartSeries.visible !== s.visible) {\n chartSeries.setVisible(s.visible, false);\n }\n chartSeries.setData(angular.copy(s.data), false);\n }\n } else {\n chart.addSeries(angular.copy(s), false);\n }\n prevSeriesOptions[s.id] = chartOptionsWithoutEasyOptions(s);\n });\n\n // Shows no data text if all series are empty\n if(scope.config.noData) {\n var chartContainsData = false;\n\n for(i = 0; i < series.length; i++) {\n if (series[i].data && series[i].data.length > 0) {\n chartContainsData = true;\n\n break;\n }\n }\n\n if (!chartContainsData) {\n chart.showLoading(scope.config.noData);\n } else {\n chart.hideLoading();\n }\n }\n }\n\n //Now remove any missing series\n for(i = chart.series.length - 1; i >= 0; i--) {\n var s = chart.series[i];\n if (s.options.id !== 'highcharts-navigator-series' && highchartsNGUtils.indexOf(ids, s.options.id) < 0) {\n s.remove(false);\n }\n }\n\n return true;\n };\n\n // chart is maintained by initChart\n var chart = false;\n var initChart = function() {\n if (chart) chart.destroy();\n prevSeriesOptions = {};\n var config = scope.config || {};\n var mergedOptions = getMergedOptions(scope, element, config);\n var func = config.func || undefined;\n var chartType = getChartType(scope);\n\n chart = new Highcharts[chartType](mergedOptions, func);\n\n for (var i = 0; i < axisNames.length; i++) {\n if (config[axisNames[i]]) {\n processExtremes(chart, config[axisNames[i]], axisNames[i]);\n }\n }\n if(config.loading) {\n chart.showLoading();\n }\n config.getHighcharts = function() {\n return chart;\n };\n\n };\n initChart();\n\n\n if(scope.disableDataWatch){\n scope.$watchCollection('config.series', function (newSeries, oldSeries) {\n processSeries(newSeries);\n chart.redraw();\n });\n } else {\n scope.$watch('config.series', function (newSeries, oldSeries) {\n var needsRedraw = processSeries(newSeries);\n if(needsRedraw) {\n chart.redraw();\n }\n }, true);\n }\n\n scope.$watch('config.title', function (newTitle) {\n chart.setTitle(newTitle, true);\n }, true);\n\n scope.$watch('config.subtitle', function (newSubtitle) {\n chart.setTitle(true, newSubtitle);\n }, true);\n\n scope.$watch('config.loading', function (loading) {\n if(loading) {\n chart.showLoading(loading === true ? null : loading);\n } else {\n chart.hideLoading();\n }\n });\n scope.$watch('config.noData', function (noData) {\n if(scope.config && scope.config.loading) {\n chart.showLoading(noData);\n }\n }, true);\n\n scope.$watch('config.credits.enabled', function (enabled) {\n if (enabled) {\n chart.credits.show();\n } else if (chart.credits) {\n chart.credits.hide();\n }\n });\n\n scope.$watch(getChartType, function (chartType, oldChartType) {\n if (chartType === oldChartType) return;\n initChart();\n });\n\n angular.forEach(axisNames, function(axisName) {\n scope.$watch('config.' + axisName, function(newAxes, oldAxes) {\n if (newAxes === oldAxes || !newAxes) {\n return;\n }\n\n if (angular.isArray(newAxes)) {\n\n for (var axisIndex = 0; axisIndex < newAxes.length; axisIndex++) {\n var axis = newAxes[axisIndex];\n\n if (axisIndex < chart[axisName].length) {\n chart[axisName][axisIndex].update(axis, false);\n updateZoom(chart[axisName][axisIndex], angular.copy(axis));\n }\n\n }\n\n } else {\n // update single axis\n chart[axisName][0].update(newAxes, false);\n updateZoom(chart[axisName][0], angular.copy(newAxes));\n }\n\n chart.redraw();\n }, true);\n });\n scope.$watch('config.options', function (newOptions, oldOptions, scope) {\n //do nothing when called on registration\n if (newOptions === oldOptions) return;\n initChart();\n processSeries(scope.config.series);\n chart.redraw();\n }, true);\n\n scope.$watch('config.size', function (newSize, oldSize) {\n if(newSize === oldSize) return;\n if(newSize) {\n chart.setSize(newSize.width || chart.chartWidth, newSize.height || chart.chartHeight);\n }\n }, true);\n\n scope.$on('highchartsng.reflow', function () {\n chart.reflow();\n });\n\n scope.$on('$destroy', function() {\n if (chart) {\n try{\n chart.destroy();\n }catch(ex){\n // fail silently as highcharts will throw exception if element doesn't exist\n }\n\n $timeout(function(){\n element.remove();\n }, 0);\n }\n });\n\n }\n };\n \n // override link fn if lazy loading is enabled\n if(highchartsNGUtils.lazyLoad){\n var oldLink = res.link;\n res.link = function(){\n var args = arguments;\n highchartsNGUtils.ready(function(){\n oldLink.apply(this, args);\n }, this);\n };\n }\n return res;\n }\n}());\n","/* global angular */\n(function(window, document) {\n 'use strict';\n\n /*\n * AngularJS ngDropover\n * Version: 0.0.0\n *\n * Copyright 2015\n * All Rights Reserved.\n * Use, reproduction, distribution, and modification of this code is subject to the terms and\n * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php\n *\n * Authors: Tony Smith & Ricky Sandoval\n * \n */\n\n /*\n * Altered to prevent naming collision with $position. Factory name changed to $positionDropover.\n * \n * JTower\n * Nov 2015\n */\n\n angular.module('ngDropover', [])\n .run(['$document', '$rootScope', function($document, $rootScope) {\n\n if (!Array.prototype.indexOf) {\n Array.prototype.indexOf = function(elt /*, from*/ ) {\n var len = this.length >>> 0;\n\n var from = Number(arguments[1]) || 0;\n from = (from < 0) ? Math.ceil(from) : Math.floor(from);\n if (from < 0) {\n from += len;\n }\n\n for (; from < len; from++) {\n if (from in this && this[from] === elt) {\n return from;\n }\n }\n return -1;\n };\n }\n\n $rootScope.scrolling = false;\n $document.on('touchmove', function(event){\n $rootScope.scrolling = true;\n });\n $document.on('touchend click', function(event) {\n event = (event.originalEvent && event.originalEvent.target) ? event.originalEvent : event;\n var ids = getIds(event.target);\n if (event.ngDropoverId) {\n ids.push(event.ngDropoverId);\n }\n if (event.which !== 3 && !$rootScope.scrolling) {\n $rootScope.$emit(\"ngDropover.documentClick\", {\n fromDocument: true,\n ngDropoverId: ids\n });\n }\n $rootScope.scrolling = false;\n });\n\n function getIds(element) {\n var ids = [];\n while (element && element !== document) {\n if (element.attributes && element.attributes.getNamedItem('ng-dropover')) {\n ids.push(element.attributes.getNamedItem('ng-dropover').nodeValue);\n }\n if (element.attributes && element.attributes.getNamedItem('ng-dropover-trigger')) {\n ids.push(($rootScope.$eval(element.attributes.getNamedItem('ng-dropover-trigger').nodeValue).targetId || ''));\n }\n element = element.parentNode;\n }\n return ids;\n }\n }])\n .constant(\n 'ngDropoverConfig', {\n 'horizontalOffset': 0,\n 'verticalOffset': 0,\n 'triggerEvent': 'click',\n 'position': 'bottom-left',\n 'closeOnClickOff': true,\n 'groupId': ''\n }\n )\n .constant(\n 'positions', [\n 'bottom',\n 'bottom-left',\n 'bottom-center',\n 'bottom-right',\n 'top',\n 'top-left',\n 'top-center',\n 'top-right',\n 'left',\n 'left-bottom',\n 'left-center',\n 'left-top',\n 'right',\n 'right-bottom',\n 'right-center',\n 'right-top'\n ]\n )\n .factory('triggerEventsMap', function() {\n\n var triggerMap = {\n 'mouseover': 'mouseleave',\n 'click': 'click',\n 'focus': 'blur',\n 'none': 'none',\n 'touchend click': 'touchend click'\n };\n\n return {\n getTriggers: function(triggerEvent) {\n if (triggerEvent === 'hover') {\n triggerEvent = 'mouseover';\n }\n if (triggerEvent === 'click') {\n triggerEvent = 'touchend click';\n }\n\n if (triggerMap.hasOwnProperty(triggerEvent)) {\n return {\n 'show': triggerEvent,\n 'hide': triggerMap[triggerEvent]\n };\n }\n return null;\n }\n };\n })\n .directive('ngDropover', ['ngDropoverConfig', 'positions', '$rootScope', '$positionDropover', '$document', '$window', 'triggerEventsMap', '$timeout', function(ngDropoverConfig, positions, $rootScope, $positionDropover, $document, $window, triggerEventsMap, $timeout) {\n\n function logError(id, element, message) {\n console.log(\"? ngDropover Error | ID:\" + id + \" ?\");\n console.log(element);\n console.log(message);\n console.log(\"\");\n }\n\n return {\n restrict: 'A',\n replace: true,\n scope: {\n target: '@ngDropover',\n ngDropoverOptions: '@ngDropoverOptions'\n },\n link: function(scope, elm, attrs) {\n\n var dropoverContents, triggerElements, handlers, transition = {\n duration: 0\n };\n\n function init() {\n\n scope.config = angular.extend({}, ngDropoverConfig, scope.$eval(scope.ngDropoverOptions));\n scope.positions = positions;\n handlers = {\n toggle: function(event) {\n if (fromContents(event)) {\n return;\n }\n if (event.type === \"touchend\") {\n event.preventDefault();\n if ($rootScope.scrolling){\n $rootScope.scrolling = false;\n return;\n }\n }\n scope.toggle(scope.ngDropoverId);\n },\n open: function(event) {\n if (!fromContents(event) && !scope.isOpen) {\n scope.open(scope.ngDropoverId);\n }\n },\n close: function(event) {\n if (!fromContents(event) && scope.isOpen) {\n scope.close(scope.ngDropoverId);\n }\n },\n markEvent: function(event) {\n event = event.originalEvent || event;\n event['ngDropoverId'] = scope.ngDropoverId;\n }\n };\n setHtml();\n\n function fromContents(event) {\n event = (event.originalEvent && event.originalEvent.target) ? event.originalEvent : event;\n var element = event.target;\n if (event.ngDropoverId) {\n return true;\n }\n\n while (element && element !== document && element !== elm[0]) {\n if (element.attributes && element.attributes.getNamedItem('ng-dropover-contents')) {\n return true;\n }\n element = element.parentNode;\n }\n return false;\n }\n\n setDropoverObj();\n\n scope.$watch('ngDropoverOptions', function() {\n unsetTriggers();\n scope.config = angular.extend({}, ngDropoverConfig, scope.$eval(scope.ngDropoverOptions));\n if (typeof(scope.config.position) !== 'string' || scope.positions.indexOf(scope.config.position) === -1) {\n logError(scope.ngDropoverId, angular.element(elm), \"Position must be a string and one of these values: \" + scope.positions);\n scope.config.position = \"bottom-left\";\n }\n setTriggers();\n positionContents();\n setPositionClass();\n }, true);\n\n $document.ready(function() {\n positionContents();\n });\n }\n\n init();\n\n function setHtml() {\n elm.addClass(scope.config.groupId + \" ngdo\");\n elm.attr(\"ng-dropover\", scope.ngDropoverId);\n dropoverContents = getDropoverContents();\n dropoverContents.css({\n 'position': 'absolute',\n 'display': 'none'\n }).addClass('ngdo-contents ' + scope.config.groupId);\n transition.event = getTransitions();\n transition.handler = function(event) {\n if (event.propertyName === \"visibility\") {\n return;\n }\n dropoverContents.css({\n 'display': 'none'\n });\n dropoverContents[0].removeEventListener(transition.event, transition.handler);\n };\n dropoverContents.on('touchend click', handlers.markEvent);\n }\n\n function setDropoverObj() {\n scope.dropoverObj = {\n options: scope.config,\n id: scope.ngDropoverId,\n children: elm[0].querySelectorAll('[ng-dropover]'),\n element: elm,\n dropoverContents: dropoverContents\n };\n }\n\n //Get the trigger from the config if the user set it. Otherwise the trigger will default to the scope's element\n function setTriggers() {\n var triggerObj = triggerEventsMap.getTriggers(scope.config.triggerEvent);\n if (!triggerObj) {\n logError(scope.ngDropoverId, angular.element(elm), \"triggerEvent must be a string: 'none', 'click', 'hover', 'focus'\");\n }\n\n if (triggerObj && triggerObj.show !== \"none\") {\n //If the the trigger's event to open matches the event to close, then send to the toggle method\n //else send to individual open and close methods\n if (triggerObj.show === triggerObj.hide) {\n elm.on(triggerObj.show, handlers.toggle);\n } else {\n \n if (isLink(elm[0])) {\n elm.on('touchend', handlers.toggle);\n }\n elm.on(triggerObj.show, handlers.open);\n elm.on(triggerObj.hide, handlers.close);\n if (scope.config.triggerEvent === 'hover') {\n dropoverContents.on('mouseleave', function(){\n handlers.close({});\n });\n }\n }\n }\n }\n\n function isLink(element) {\n if (element.attributes && (element.attributes.getNamedItem('ng-click') || element.attributes.getNamedItem('href'))){\n return true;\n } \n return false;\n }\n\n function unsetTriggers() {\n var triggerObj = triggerEventsMap.getTriggers(scope.config.triggerEvent);\n if (!triggerObj || triggerObj.show === 'none') {\n return;\n }\n if (triggerObj.show === triggerObj.hide) {\n elm.off(triggerObj.show, handlers.toggle);\n } else {\n if (isLink(elm[0])) {\n elm.off('touchend', handlers.toggle);\n }\n elm.off(triggerObj.show, handlers.open);\n elm.off(triggerObj.hide, handlers.close);\n if (scope.config.triggerEvent === 'hover') {\n dropoverContents.off('mouseleave', function(){\n handlers.close({});\n });\n }\n }\n }\n\n function positionContents() {\n\n var offX, offY, positions, oldVis, oldDisplay;\n\n offX = parseInt(scope.config.horizontalOffset, 10) || 0;\n offY = parseInt(scope.config.verticalOffset, 10) || 0;\n oldDisplay = $positionDropover.getStyle(dropoverContents[0], 'display');\n\n dropoverContents.css({\n 'visibility': 'hidden',\n 'display': ''\n });\n\n positions = $positionDropover.positionElements(elm, dropoverContents, scope.config.position, false);\n dropoverContents.css({\n 'left': positions.left + offX + 'px',\n 'top': positions.top + offY + 'px',\n 'display': oldDisplay,\n 'visibility': ''\n });\n }\n\n function setPositionClass() {\n var classList = elm[0].className.split(' ');\n for (var i = 0, l = classList.length; i < l; i++) {\n var stripPrefix = classList[i].substring(5, classList[i].length);\n if (scope.positions.indexOf(stripPrefix) > 0) {\n elm.removeClass(classList[i]);\n }\n }\n elm.addClass('ngdo-' + scope.config.position);\n }\n\n function getDropoverContents() {\n var ret;\n if (elm[0].querySelector('[ng-dropover-contents]')) {\n ret = angular.element(elm[0].querySelector('[ng-dropover-contents]'));\n return ret;\n } else {\n\n ret = angular.element(\"
Oops, you forgot to specify what goes in the dropdown
\");\n elm.append(ret);\n return ret;\n }\n }\n\n scope.open = function(ngDropoverId) {\n if (transition.event) {\n dropoverContents[0].removeEventListener(transition.event, transition.handler);\n }\n if (ngDropoverId === scope.ngDropoverId && !scope.isOpen) {\n\n positionContents();\n\n //start the display process and fire events\n $rootScope.$broadcast('ngDropover.opening', scope.dropoverObj);\n dropoverContents.css({\n 'display': 'inline-block'\n });\n elm.addClass('ngdo-open');\n angular.element($window).bind('resize', positionContents);\n\n scope.isOpen = true;\n }\n };\n\n scope.close = function(ngDropoverId) {\n if (ngDropoverId === scope.ngDropoverId && scope.isOpen) {\n closer();\n }\n };\n\n scope.toggle = function(ngDropoverId) {\n if (!scope.isOpen) {\n scope.open(ngDropoverId);\n } else {\n scope.close(ngDropoverId);\n }\n };\n\n scope.closeAll = function(ngDropoverId) {\n if (scope.isOpen && ngDropoverId !== scope.ngDropoverId) {\n closer();\n }\n };\n\n function getTransitions() {\n var transitions = {\n 'transition': 'transitionend',\n 'OTransition': 'oTransitionEnd',\n 'MozTransition': 'transitionend',\n 'webkitTransition': 'webkitTransitionEnd'\n };\n var propertyCheck = {\n 'transition': 'transitionDuration',\n 'OTransition': 'oTransitionDuration',\n 'MozTransition': 'MozTransitionDuration',\n 'webkitTransition': 'WebkitTransitionDuration'\n };\n var t;\n for (t in transitions) {\n if (dropoverContents[0].style[t] !== undefined && parseFloat($positionDropover.getStyle(dropoverContents[0], propertyCheck[t]), 10) > 0) {\n transition.duration = Math.floor(parseFloat($positionDropover.getStyle(dropoverContents[0], propertyCheck[t]), 10) * 1000);\n return transitions[t];\n }\n }\n return undefined;\n }\n\n function closer() {\n if (transition.event) {\n $timeout(function() {\n if (!scope.isOpen) {\n dropoverContents[0].addEventListener(transition.event, transition.handler);\n }\n }, transition.duration / 2);\n } else {\n dropoverContents.css({\n 'display': 'none'\n });\n }\n elm.removeClass('ngdo-open');\n scope.isOpen = false;\n\n $rootScope.$broadcast('ngDropover.closing', scope.dropoverObj);\n\n angular.element($window).unbind('resize', positionContents);\n }\n\n scope.$on('$destroy', function() {\n unsetTriggers();\n angular.element($window).unbind('resize', positionContents);\n dropoverContents.off('touchend click', handlers.markEvent);\n });\n\n },\n controller: [\n '$scope', '$element', '$attrs',\n function($scope, $element, $attrs) {\n\n $scope.isOpen = false;\n\n $scope.ngDropoverId = $scope.target || ('' + $scope.$id);\n\n //set up event listeners\n $scope.openListener = $rootScope.$on('ngDropover.open', function(event, ngDropoverId) {\n $scope.open(ngDropoverId);\n });\n\n $scope.closeListener = $rootScope.$on('ngDropover.close', function(event, ngDropoverId) {\n $scope.close(ngDropoverId);\n });\n\n $scope.toggleListener = $rootScope.$on('ngDropover.toggle', function(event, ngDropoverId) {\n if (!$scope.isOpen) {\n $scope.open(ngDropoverId);\n } else {\n $scope.close(ngDropoverId);\n }\n });\n\n $scope.closeAllListener = $rootScope.$on('ngDropover.closeAll', function(event, ngDropoverId) {\n $scope.closeAll(ngDropoverId);\n });\n\n $scope.documentClickListener = $rootScope.$on('ngDropover.documentClick', function(event, info) {\n if ((!info.ngDropoverId || (info.ngDropoverId).indexOf($scope.ngDropoverId) < 0) && !(!$scope.config.closeOnClickOff && info.fromDocument)) {\n // Unless closeOnClickOff is false and the event was from the document listener\n $scope.closeAll();\n }\n });\n\n $scope.$on('$destroy', function() {\n $scope.openListener();\n $scope.openListener = null;\n $scope.closeListener();\n $scope.closeListener = null;\n $scope.toggleListener();\n $scope.toggleListener = null;\n $scope.closeAllListener();\n $scope.closeAllListener = null;\n $scope.documentClickListener();\n $scope.documentClickListener = null;\n });\n }\n ]\n };\n }]).factory('$positionDropover', ['$document', '$window', function($document, $window) {\n\n function getStyle(el, cssprop) {\n if (el.currentStyle) { //IE\n return el.currentStyle[cssprop];\n } else if ($window.getComputedStyle) {\n return $window.getComputedStyle(el)[cssprop];\n }\n // finally try and get inline style\n return el.style[cssprop];\n }\n\n /**\n * Checks if a given element is statically positioned\n * @param element - raw DOM element\n */\n function isStaticPositioned(element) {\n return (getStyle(element, 'position') || 'static') === 'static';\n }\n\n /**\n * returns the closest, non-statically positioned parentOffset of a given element\n * @param element\n */\n var parentOffsetEl = function(element) {\n var docDomEl = $document[0];\n var offsetParent = element.offsetParent || docDomEl;\n while (offsetParent && offsetParent !== docDomEl && isStaticPositioned(offsetParent)) {\n offsetParent = offsetParent.offsetParent;\n }\n return offsetParent || docDomEl;\n };\n\n return {\n\n getStyle: getStyle,\n\n /**\n * Provides read-only equivalent of jQuery's position function:\n * http://api.jquery.com/position/\n */\n position: function(element) {\n var elBCR = this.offset(element);\n var offsetParentBCR = {\n top: 0,\n left: 0\n };\n var offsetParentEl = parentOffsetEl(element[0]);\n if (offsetParentEl !== $document[0]) {\n offsetParentBCR = this.offset(angular.element(offsetParentEl));\n offsetParentBCR.top += offsetParentEl.clientTop - offsetParentEl.scrollTop;\n offsetParentBCR.left += offsetParentEl.clientLeft - offsetParentEl.scrollLeft;\n }\n var boundingClientRect = element[0].getBoundingClientRect();\n return {\n width: boundingClientRect.width || element.prop('offsetWidth'),\n height: boundingClientRect.height || element.prop('offsetHeight'),\n top: elBCR.top - offsetParentBCR.top,\n left: elBCR.left - offsetParentBCR.left\n };\n },\n\n /**\n * Provides read-only equivalent of jQuery's offset function:\n * http://api.jquery.com/offset/\n */\n offset: function(element) {\n var boundingClientRect = element[0].getBoundingClientRect();\n return {\n width: boundingClientRect.width || element.prop('offsetWidth'),\n height: boundingClientRect.height || element.prop('offsetHeight'),\n top: boundingClientRect.top + ($window.pageYOffset || $document[0].documentElement.scrollTop),\n left: boundingClientRect.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft)\n };\n },\n\n /**\n * Provides coordinates for the targetEl in relation to hostEl\n */\n positionElements: function(hostEl, targetEl, positionStr, appendToBody) {\n\n var positionStrParts = positionStr.split('-');\n var pos0 = positionStrParts[0],\n pos1 = positionStrParts[1] || 'center';\n\n var hostElPos,\n targetElWidth,\n targetElHeight,\n targetElPos;\n\n hostElPos = appendToBody ? this.offset(hostEl) : this.position(hostEl);\n\n if (!isStaticPositioned(hostEl[0])) {\n hostElPos.top = -hostEl[0].clientTop;\n hostElPos.left = -hostEl[0].clientLeft;\n }\n\n targetElWidth = targetEl.prop('offsetWidth');\n targetElHeight = targetEl.prop('offsetHeight');\n\n var shiftWidth = {\n center: function() {\n return hostElPos.left + hostElPos.width / 2 - targetElWidth / 2;\n },\n left: function() {\n return hostElPos.left;\n },\n right: function() {\n if (pos1 === \"right\") {\n return hostElPos.left + (hostElPos.width - targetElWidth);\n }\n return hostElPos.left + hostElPos.width;\n }\n };\n\n var shiftHeight = {\n center: function() {\n return hostElPos.top + hostElPos.height / 2 - targetElHeight / 2;\n },\n top: function() {\n return hostElPos.top;\n },\n bottom: function() {\n return hostElPos.top + hostElPos.height;\n }\n };\n\n switch (pos0) {\n case 'right':\n targetElPos = {\n top: shiftHeight[pos1](),\n left: shiftWidth[pos0]()\n };\n break;\n case 'left':\n targetElPos = {\n top: shiftHeight[pos1](),\n left: hostElPos.left - targetElWidth\n };\n break;\n case 'bottom':\n targetElPos = {\n top: shiftHeight[pos0](),\n left: shiftWidth[pos1]()\n };\n break;\n default:\n targetElPos = {\n top: hostElPos.top - targetElHeight,\n left: shiftWidth[pos1]()\n };\n break;\n }\n return targetElPos;\n }\n };\n }])\n .directive('ngDropoverTrigger', ['$rootScope', '$document', 'triggerEventsMap', function($rootScope, $document, triggerEventsMap) {\n return {\n restrict: 'AE',\n scope: {\n triggerOptions: '@ngDropoverTrigger'\n },\n link: function(scope, element, attrs) {\n var options = scope.$eval(scope.triggerOptions);\n\n var triggerObj = triggerEventsMap.getTriggers(options.triggerEvent || 'click');\n element.addClass('ngdo-trigger');\n\n var handlers = {\n action: function(event){\n scope.$emit('ngDropover.' + options.action, options.targetId);\n },\n toggle: function(event){\n if (event.type === 'touchend') {\n event.preventDefault();\n if ($rootScope.scrolling) {\n $rootScope.scrolling = false;\n return;\n }\n }\n scope.$emit('ngDropover.toggle', options.targetId);\n },\n show: function(event){\n scope.$emit('ngDropover.open', options.targetId);\n },\n hide: function(event){\n scope.$emit('ngDropover.close', options.targetId);\n },\n touch: function(event){\n event.preventDefault();\n if ($rootScope.scrolling) {\n $rootScope.scrolling = false;\n return;\n }\n scope.$emit('ngDropover.' + (options.action || 'toggle'), options.targetId);\n }\n };\n\n if (options.action === \"open\" || options.action === \"close\") {\n element.on(triggerObj.show, handlers.action);\n } else {\n if (triggerObj.show === triggerObj.hide) {\n element.on(triggerObj.show, handlers.toggle);\n } else {\n element.on(triggerObj.show, handlers.show);\n\n element.on(triggerObj.hide, handlers.hide);\n }\n }\n if (options.triggerEvent === 'hover') {\n element.on('touchend', handlers.touch);\n }\n\n scope.$on('destroy', function(){\n if (options.action === \"open\" || options.action === \"close\") {\n element.off(triggerObj.show, handlers.action);\n } else {\n if (triggerObj.show === triggerObj.hide) {\n element.off(triggerObj.show, handlers.toggle);\n } else {\n element.off(triggerObj.show, handlers.show);\n\n element.off(triggerObj.hide, handlers.hide);\n }\n }\n if (options.triggerEvent === 'hover') {\n element.off('touchend', handlers.touch);\n }\n });\n }\n };\n }]);\n})(window, document);","(function () {\n 'use strict';\n\n angular.module('nha.behavior').config(config);\n\n config.$inject = ['$stateProvider', '$urlRouterProvider', '$locationProvider', '$breadcrumbProvider', '$sceDelegateProvider', '$compileProvider', 'RestangularProvider', 'appSettings'];\n\n function config($stateProvider, $urlRouterProvider, $locationProvider, $breadcrumbProvider, $sceDelegateProvider, $compileProvider, RestangularProvider, appSettings) {\n\n // this allow angular to talk to other angular and support CORS\n \t$sceDelegateProvider.resourceUrlWhitelist([\n       \t\t'self',\n\t\t\t'https://*.nhatest.com/**',\n       \t\t'https://*.mynhadev.com/**',\n 'https://*.nhaschools.com/**', 'https://*.mynha.com/**', 'https://mynha.com/**'\n \t]);\n\n \t// Disable debug info attributes. This is new in 1.3 and is a perf optimization\n if (appSettings.environment != 'dev' && appSettings.environment != 'ci') {\n \t\t$compileProvider.debugInfoEnabled(false);\n \t}\n\n // grab our breadcrumb template root\n $breadcrumbProvider.setOptions({\n templateUrl: appSettings.coreWebRootUrl + 'app/directives/breadcrumb/breadcrumb.html'\n });\n\n $urlRouterProvider\n .otherwise('/');\n\n // Remove # from URL\n $locationProvider.html5Mode({ enabled: true });\n $locationProvider.hashPrefix('!');\n\n // default base url to attendance Api\n RestangularProvider.setBaseUrl(appSettings.behaviorServicesRootUrl);\n }\n\n // what to run when the app first loads\n angular.module('nha.behavior').run(['$location', '$rootScope', 'stateTransitionSecurityCheck', 'userContextService', 'appSettings', function ($location, $rootScope, stateTransitionSecurityCheck, userContextService, appSettings) {\n\n\t\tuserContextService.ensureUserContext().then(function (user) {\n\t\t\tvar myNHA = window['myNHA'];\n\t\t\tvar tagManager = new myNHA.TagManagerService();\n\t\t\ttagManager.setupUserID();\n\t\t});\n\n\t\tstateTransitionSecurityCheck.attachStateChangeListener();\n\n var pageTitleAppName = ' | NHA Student Information System';\n var defaultPageTitle = 'Behavior' + pageTitleAppName;\n\n // whenever the UI Route change, fire off this event to update the page title\n $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {\n _utils.enableScrollToTopOnStateChangeSuccess();\n if (toState.hasOwnProperty('title')) {\n document.title = toState.title + pageTitleAppName;\n } else if(document.title !== defaultPageTitle) {\n document.title = defaultPageTitle;\n }\n });\n }]);\n\n\n})();"," (function () {\n 'use strict';\n angular.module('nha.behavior', _ng.moduleInit([\n 'ngDropover',\n 'flexcalendar',\n 'flexcalendar.defaultTranslation',\n 'pascalprecht.translate',\n 'nha.core',\n\t\t'nha.portal',\n 'ui.bootstrap',\n 'highcharts-ng'\n ]));\n\n})();","(function () {\n 'use strict';\n angular.module('nha.behavior').config(config);\n\n config.$inject = ['$stateProvider', 'appSettings', '$urlRouterProvider'];\n\n function config($stateProvider, appSettings, $urlRouterProvider) {\n $stateProvider\n .state('403', {\n url: '/403',\n templateUrl: appSettings.coreWebRootUrl + 'app/templates/403.html',\n ncyBreadcrumb: {\n label: 'No Access',\n parent: 'main'\n },\n title: 'No Access'\n })\n .state('behavior-courses', {\n url: '/courses',\n templateUrl: 'app/components/course-list/course-list.html',\n controller: 'CourseListCtrl',\n controllerAs: 'courseListVM',\n data: {\n security: {\n requiredResource: 'ui_course_list',\n api: 'Behavior'\n }\n },\n resolve: {\n authorization: ['stateTransitionSecurityCheck', function (stateTransitionSecurityCheck) {\n return stateTransitionSecurityCheck.resolveAuthorization('ui_course_list', 'Behavior');\n }]\n },\n ncyBreadcrumb: {\n label: '{{ breadcrumbs.courselist }}',\n parent: 'main'\n },\n title: 'Courses'\n })\n .state('behavior-manager', {\n url: '/manager',\n templateUrl: 'app/components/manager/manager.html',\n controller: 'ManagerCtrl as managerVM',\n onEnter: [\n '$state', '$timeout', function($state, $timeout) {\n $timeout(function() {\n }, 0);\n }\n ],\n data: {\n security: {\n requiredResource: 'ui_behavior_manager',\n api: 'Behavior'\n }\n },\n resolve: {\n authorization: ['stateTransitionSecurityCheck', function (stateTransitionSecurityCheck) {\n return stateTransitionSecurityCheck.resolveAuthorization('ui_behavior_manager', 'Behavior');\n }]\n },\n ncyBreadcrumb: {\n label: 'Record Student Behavior',\n parent: 'main'\n }\n })\n .state('incident', {\n url: '/incident',\n templateUrl: 'app/components/incident/incident.html',\n ncyBreadcrumb: {\n label: 'Incident',\n parent: 'behavior-manager'\n }\n })\n .state('behavior-incident-positive', {\n // This state is for mobile only\n url: '/incident/add/0/{studentInSchoolId:int}/{courseSectionGroupId:int}/{specialsCourseSectionId:int}/{meetingBlockTimeId:int}',\n templateUrl: appSettings.behaviorWebRootUrl + 'app/components/positive-behavior-add/mobile/behavior-incident-positive.html',\n controller: 'PositiveBehaviorIncidentCtrl',\n controllerAs: 'positiveBehaviorIncidentVM',\n data: {\n security: {\n requiredResource: 'ui_add_level_zero_two_three',\n api: 'Behavior'\n }\n },\n resolve: {\n authorization: ['stateTransitionSecurityCheck', function (stateTransitionSecurityCheck) {\n return stateTransitionSecurityCheck.resolveAuthorization('ui_add_level_zero_two_three', 'Behavior');\n }]\n },\n params: {\n behaviorLevelId: 0,\n action: 'add'\n },\n ncyBreadcrumb: {\n label: 'Positive Observed Behavior',\n parent: 'behavior-students'\n },\n title: 'Positive Observed Behavior'\n })\n .state('level-two-three', {\n url: '/incident/add/{behaviorLevelId:int}/{studentInSchoolId:int}/{courseSectionGroupId:int}/{specialsCourseSectionId:int}/{meetingBlockTimeId:int}/{date}',\n params: {\n action: \"add\"\n },\n views: {\n '': {\n templateUrl: appSettings.behaviorWebRootUrl + 'app/components/incident/level-two-three/level-two-three.html',\n controller: 'LevelTwoThreeCtrl',\n controllerAs: 'levelTwoThreeVM'\n },\n 'content@level-two-three': {\n templateUrl: appSettings.behaviorWebRootUrl + 'app/components/incident/level-two-three/templates/_level-two-three.desktop.html',\n controller: 'LevelTwoThreeDesktopCtrl',\n controllerAs: 'levelTwoThreeDesktopVM'\n },\n 'content-mobile@level-two-three': {\n templateUrl: appSettings.behaviorWebRootUrl + 'app/components/incident/level-two-three/templates/_level-two-three.mobile.html',\n controller: 'LevelTwoThreeMobileCtrl',\n controllerAs: 'levelTwoThreeMobileVM'\n }\n },\n data: {\n security: {\n requiredResource: 'ui_add_level_zero_two_three',\n api: 'Behavior'\n }\n },\n resolve: {\n authorization: ['stateTransitionSecurityCheck', function (stateTransitionSecurityCheck) {\n return stateTransitionSecurityCheck.resolveAuthorization('ui_add_level_zero_two_three', 'Behavior');\n }]\n },\n ncyBreadcrumb: {\n label: 'Add Incident',\n parent: 'behavior-students'\n },\n title: 'Behavior Incident'\n })\n .state('incident.level-four', {\n url: '/level-four/{studentInSchoolId:int}',\n parent: 'incident',\n templateUrl: appSettings.behaviorWebRootUrl + 'app/components/incident/level-four/level-four.html',\n controller: 'LevelFourCtrl',\n controllerAs: 'levelFourVM',\n data: {\n security: {\n requiredResource: 'ui_add_level_four',\n api: 'Behavior'\n }\n },\n resolve: {\n authorization: ['stateTransitionSecurityCheck', function (stateTransitionSecurityCheck) {\n return stateTransitionSecurityCheck.resolveAuthorization('ui_add_level_four', 'Behavior');\n }]\n },\n params: {\n action: \"add\"\n },\n ncyBreadcrumb: {\n label: 'Level 4 Incident',\n parent: 'behavior-manager'\n },\n title: 'Add Incident'\n })\n .state('incident.level-five-six', {\n url: '/level-five-six/{studentInSchoolId:int}',\n templateUrl: appSettings.behaviorWebRootUrl + 'app/components/incident/level-five-six/level-five-six.html',\n controller: 'LevelFiveSixCtrl',\n controllerAs: 'levelFiveSixVM',\n data: {\n security: {\n requiredResource: 'ui_add_level_five',\n api: 'Behavior'\n }\n },\n resolve: {\n authorization: ['stateTransitionSecurityCheck', function (stateTransitionSecurityCheck) {\n return stateTransitionSecurityCheck.resolveAuthorization('ui_add_level_five', 'Behavior');\n }]\n },\n params: {\n action: \"add\",\n behaviorLevelId: 5\n },\n ncyBreadcrumb: {\n label: 'Level 5 Incident',\n parent: 'behavior-manager'\n },\n title: 'Add Incident'\n })\n .state('behavior-students.list', {\n url: '/list',\n templateUrl: 'app/components/student-list/templates/_student-list.html',\n data: {\n security: {\n requiredResource: 'ui_student_list',\n api: 'Behavior'\n }\n },\n resolve: {\n authorization: ['stateTransitionSecurityCheck', function (stateTransitionSecurityCheck) {\n return stateTransitionSecurityCheck.resolveAuthorization('ui_student_list', 'Behavior');\n }]\n },\n ncyBreadcrumb: {\n label: '{{breadcrumbs.studentlist | characters:40 :false}}',\n parent: 'behavior-courses'\n },\n title: 'Students'\n })\n .state('behavior-students.grid', {\n url: '/grid',\n templateUrl: 'app/components/student-list/templates/_student-grid.html',\n data: {\n security: {\n requiredResource: 'ui_student_list',\n api: 'Behavior'\n }\n },\n resolve: {\n authorization: ['stateTransitionSecurityCheck', function (stateTransitionSecurityCheck) {\n return stateTransitionSecurityCheck.resolveAuthorization('ui_student_list', 'Behavior');\n }]\n },\n ncyBreadcrumb: {\n label: '{{breadcrumbs.studentlist | characters:40 :false}}',\n parent: 'behavior-courses'\n },\n title: 'Students'\n })\n .state('behavior-students', {\n url: '/course/{courseSectionGroupId:int}/{specialsCourseSectionId:int}/:startDate/:endDate',\n templateUrl: 'app/components/student-list/studentlist.html',\n controller: 'StudentListCtrl',\n controllerAs: 'studentListVM',\n data: {\n security: {\n requiredResource: 'ui_student_list',\n api: 'Behavior'\n }\n },\n resolve: {\n authorization: ['stateTransitionSecurityCheck', function (stateTransitionSecurityCheck) {\n return stateTransitionSecurityCheck.resolveAuthorization('ui_student_list', 'Behavior');\n }]\n },\n ncyBreadcrumb: {\n label: '{{breadcrumbs.studentlist | characters:40 :false}}',\n parent: 'behavior-courses'\n },\n title: 'Students'\n });\n }\n})();","/**\n * course-list.controller\n * @namespace gradebook\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .controller('CourseListCtrl', CourseListCtrl);\n\n // protect against minification\n /* @ngInject */\n CourseListCtrl.$inject = ['$state', '$stateParams', '$q', '$scope', '$controller', 'behaviorCourseSummaryRepository', 'courseSummaryFilterCountsRepository',\n 'userContextService', '$location', 'matchmedia', 'appSettings', '$rootScope', 'behaviorSessionCache', 'behaviorUserRoleService'];\n\n /**\n * @name CourseListController\n * @description Constructor for course-list.controller\n * @memberOf gradebook\n */\n function CourseListCtrl($state, $stateParams, $q, $scope, $controller, behaviorCourseSummaryRepository, courseSummaryFilterCountsRepository,\n userContextService, $location, matchmedia, appSettings, $rootScope, behaviorSessionCache, behaviorUserRoleService) {\n\n // Controller as vm - see route configuration\n var courseListVM = this;\n\n matchmedia.onPhone(function (mediaQueryList) {\n courseListVM.isPhone = matchmedia.isPhone();\n });\n\n // Properties associated to view model - sorted alphabetically\n // helps you instantly identify which members of the controller can be bound and used in the View \n courseListVM.allFieldsSelected = false;\n courseListVM.blockName = \"\";\n courseListVM.courses = [];\n courseListVM.coursesAppendLoading = false;\n courseListVM.coursesLoading = true;\n courseListVM.currentCourseSections = [];\n courseListVM.expandedCourseSectionGroupID = null;\n courseListVM.initialFiltersLoaded = false;\n courseListVM.initialLoad = true;\n courseListVM.isTeacher = false;\n courseListVM.markingPeriod = null;\n courseListVM.moreCoursesExist = false;\n courseListVM.searchText = null;\n courseListVM.sortOrder = null;\n courseListVM.specialsAreLoading = false;\n courseListVM.startDate = moment().format('YYYY-MM-DD');\n\n // Navigation pass-thru methods - sorted alphabetically, linked directly to navigationManager method calls\n // helps you instantly identify which members of the controller can be bound and used in the View \n \n // Controller methods associated to view model (init, reset, submit)\n courseListVM.init = init;\n\n // All other methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the controller can be bound and used in the View \n courseListVM.changeSorting = changeSorting;\n courseListVM.formatTimeString = convertTime24to12;\n courseListVM.initFilters = initFilters;\n courseListVM.isSelfContainedCourse = isSelfContainedCourse;\n courseListVM.loadCourses = loadCourses;\n courseListVM.loadCourseSections = loadCourseSections;\n courseListVM.openUrlForStaffManagementStaffDetails = openUrlForStaffManagementStaffDetails;\n courseListVM.setFilterCounts = setFilterCounts;\n courseListVM.setupFilterChangeListener = setupFilterChangeListener;\n courseListVM.searchTextChanged = searchTextChanged;\n courseListVM.showCourseSections = showCourseSections;\n \n // Initialize \n courseListVM.init();\n\n function init() {\n isMoreThanATeacher()\n .then(function () {\n userContextService.ensureUserContext().then(function(context) {\n courseListVM.staffId = context['http://schemas.mynha.com/SIS/Core/StaffID'];\n\n // Use null staff ID for filters if not a Teacher\n var filterStaffId = courseListVM.isTeacher === true ? courseListVM.staffId : null;\n\n // Initialize our filters\n courseListVM.initFilters(filterStaffId);\n\n // Setup event listener\n courseListVM.setupFilterChangeListener();\n });\n });\n }\n\n function isMoreThanATeacher() {\n return behaviorUserRoleService.isMoreThanATeacher().then(function(result) {\n courseListVM.isTeacher = !result;\n });\n }\n\n function openUrlForStaffManagementStaffDetails(staffId) {\n _utils.openUrl(appSettings.staffManagementWebRootUrl + 'staff-record/' + staffId, true);\n }\n\n function convertTime24to12(time24){\n var tmpArr = time24.split(':'), time12;\n if(+tmpArr[0] == 12) {\n time12 = tmpArr[0] + ':' + tmpArr[1] + 'p';\n } else {\n if(+tmpArr[0] == '00') {\n time12 = '12:' + tmpArr[1] + 'a';\n } else {\n if(+tmpArr[0] > 12) {\n time12 = (+tmpArr[0]-12) + ':' + tmpArr[1] + 'p';\n } else {\n time12 = (+tmpArr[0]) + ':' + tmpArr[1] + 'a';\n }\n }\n }\n return time12;\n }\n\n function showCourseSections(index, course) {\n if (courseListVM.expandedCourseSectionGroupID === null || courseListVM.expandedCourseSectionGroupID !== index) {\n courseListVM.expandedCourseSectionGroupID = index;\n loadCourseSections(course);\n } else {\n courseListVM.expandedCourseSectionGroupID = null;\n }\n }\n\n function updateFilterCounts(updatedItems, filterItems) {\n _.each(filterItems, function (filterItem) {\n var updatedItem = _.find(updatedItems, function (item) {\n return filterItem.id === item.id;\n });\n\n filterItem.count = updatedItem ? updatedItem.count : 0;\n });\n }\n\n function setFilterCounts(counts, filters) {\n _.forEach(counts.filters, function (c) {\n if (c.typeName.toUpperCase() === filters.AcademicYear.name.toUpperCase()) {\n updateFilterCounts(c.items, filters.AcademicYear.items);\n }\n else if (c.typeName.toUpperCase() === filters.School.name.toUpperCase()) {\n updateFilterCounts(c.items, filters.School.items);\n }\n else if (c.typeName.toUpperCase() === filters.GradeLevel.name.toUpperCase()) {\n updateFilterCounts(c.items, filters.GradeLevel.items);\n }\n else if (c.typeName.toUpperCase() === filters.MarkingPeriod.name.toUpperCase()) {\n updateFilterCounts(c.items, filters.MarkingPeriod.items);\n }\n else if (c.typeName.toUpperCase() === filters.Staff.name.toUpperCase()) {\n updateFilterCounts(c.items, filters.Staff.items);\n }\n });\n }\n\n function changeSorting(expression) {\n courseListVM.sortOrder = expression;\n courseListVM.expandedCourseSectionGroupID = null;\n courseListVM.loadCourses(false);\n }\n\n function searchTextChanged(searchText) {\n loadFilterCounts();\n courseListVM.loadCourses(false);\n }\n\n function loadFilterCounts() {\n if (!appSettings.disableFilterCounts) {\n $scope.filterConfig.countsLoading = true;\n courseSummaryFilterCountsRepository.getCourseSummaryFilterCounts(getPagingParams()).then(\n function (filterCounts) {\n courseListVM.setFilterCounts(filterCounts, $scope.filterConfig.filters);\n $scope.filterConfig.countsLoading = false;\n }\n );\n }\n }\n\n function setupFilterChangeListener() {\n $scope.$on('filterChange', function (event, filters) {\n if (courseListVM.courses) { courseListVM.initialLoad = false; }\n\n courseListVM.selectedFilters = filters.selectedFilters;\n courseListVM.initialFiltersLoaded = true;\n\n if (!courseListVM.isPhone) {\n loadFilterCounts();\n } else {\n // Mobile requires all fields to be filled out before showing courses.\n courseListVM.allFieldsSelected = !courseListVM.initialLoad && courseListVM.selectedFilters.Staff && courseListVM.selectedFilters.School;\n }\n\n courseListVM.expandedCourseSectionGroupID = null;\n courseListVM.loadCourses();\n }, true);\n }\n\n $rootScope.$on('nha:core:default-school-changed', unApplyCachedFilterConfig);\n\n function getPagingParams(append) {\n var pagingParameters = {};\n\n pagingParameters.append = append || false;\n\n pagingParameters.sortOrder = courseListVM.sortOrder;\n\n if (courseListVM.searchText) {\n pagingParameters.searchText = courseListVM.searchText;\n }\n\n if (courseListVM.selectedFilters) {\n pagingParameters.filters = courseListVM.selectedFilters;\n }\n\n return pagingParameters;\n }\n\n function loadCourses(append) {\n var pagingParameters = getPagingParams(append);\n\n courseListVM.isPhone ? loadCourseDataMobile(pagingParameters) : loadCourseDataDesktop(pagingParameters);\n }\n\n function loadCourseDataDesktop(pagingParameters) {\n var preventDoubleInfiniteScroll = pagingParameters.append && (courseListVM.coursesAppendLoading || courseListVM.coursesLoading);\n var noMoreCoures = pagingParameters.append && !courseListVM.moreCoursesExist;\n\n if (preventDoubleInfiniteScroll || noMoreCoures) {\n return;\n }\n\n // Start the spinners\n if (pagingParameters.append) {\n courseListVM.coursesAppendLoading = true;\n } else {\n courseListVM.coursesLoading = true;\n }\n\n behaviorCourseSummaryRepository.getAll(pagingParameters).then(\n function (result) {\n var filteredCoursesForStaffSelection = _.cloneDeep(result);\n\n var forRemoval = [];\n\n _.forEach(result, function (course) {\n course['showTimes'] = !isSelfContainedCourse(course);\n course.staffNameLastFirst = (course.staffNameLastFirst || \"\").toString();\n\n if (course.timeAndPeriod.length === 2) {\n if (course.timeAndPeriod[0].periodName === 'AM' && course.timeAndPeriod[1].periodName === 'PM') {\n course['mtgBlockForDisplaying'] = course.timeAndPeriod[0].periodName + '/' + course.timeAndPeriod[1].periodName;\n }\n } else if (course.timeAndPeriod.length === 1) {\n course['mtgBlockForDisplaying'] = course.timeAndPeriod[0].periodName;\n }\n\n // if two or more teachers selected, search for duplicates\n if (courseListVM.selectedFilters.Staff) {\n \n if (courseListVM.selectedFilters.Staff.items.length > 1) {\n \n var arr = _.filter(filteredCoursesForStaffSelection, { 'courseSectionGroupID': course.courseSectionGroupID, 'meetingBlockTimeID': course.meetingBlockTimeID });\n\n if (arr.length > 1) {\n var hasPrimary = _.some(arr, {'order': 1});\n\n if (hasPrimary) {\n var temp = _.filter(arr, function(q) { return q.order !== 1; });\n forRemoval = forRemoval.concat(temp);\n } else {\n forRemoval = forRemoval.concat(_.drop(arr, 1));\n }\n }\n }\n }\n });\n\n if (pagingParameters.append) {\n courseListVM.courses = courseListVM.courses.concat(result);\n } else {\n courseListVM.courses = result;\n }\n\n // if there are duplicates, remove them from the view\n _.forEach(forRemoval, function (q) {\n _.remove(courseListVM.courses, function (currentObject) {\n return (currentObject.courseSectionGroupID === q.courseSectionGroupID && currentObject.meetingBlockTimeID === q.meetingBlockTimeID && currentObject.order === q.order);\n });\n });\n \n courseListVM.moreCoursesExist = behaviorCourseSummaryRepository.moreExist;\n courseListVM.coursesLoading = false;\n courseListVM.coursesAppendLoading = false;\n });\n }\n\n function loadCourseDataMobile(pagingParameters) {\n if (!courseListVM.allFieldsSelected) {\n return;\n }\n\n courseListVM.coursesLoading = true;\n var pagingParameters = getPagingParams();\n var courseCount = 0;\n\n behaviorCourseSummaryRepository.getAllForMobile(pagingParameters).then(\n function (result) {\n if (result.length > 0) {\n var courseSectionID = 0;\n var staffID = 0;\n var courseSectionGroupID = result[0].courseSectionGroupID;\n var meetingBlockTimeID = result[0].meetingBlockTimeID;\n var academicYearID = result[0].academicYearID;\n var matched = null;\n\n behaviorCourseSummaryRepository.getCourseName(courseSectionGroupID, meetingBlockTimeID, academicYearID).then(function(returned) {\n _.forEach(result, function (course) {\n if (course) {\n courseSectionID = course.courseSectionID;\n staffID = course.staffID;\n\n if (courseListVM.isSelfContainedCourse(course)) {\n matched = _.find(returned, { 'courseSectionID': courseSectionID, 'staffID': staffID });\n\n if (matched) {\n course.isSpecial = matched.isSpecial;\n }\n\n if (course.isSpecial) {\n course['subjectName'] = matched.courseSectionSystemGeneratedName;\n\n } else if (course.isHomeroom) {\n\n if (courseCount === 0) {\n course['subjectName'] = \"Homeroom\";\n courseCount++;\n\n } else {\n result = _.filter(result, function (n) {\n return n.courseSectionID !== course.courseSectionID;\n });\n }\n }\n } else {\n var csgId = course.courseSectionGroupID;\n var mtbId = course.meetingBlockTimeID;\n var csName = course.courseSectionSystemGeneratedName;\n\n // are the ID's and name the same? (note my purposeful omission of CourseSectionID)\n var duplicatedCourses = _(result)\n .filter(function (r) { return r.meetingBlockTimeID === mtbId && r.courseSectionGroupID === csgId && r.courseSectionSystemGeneratedName === csName; })\n .value();\n\n if (duplicatedCourses.length > 1) {\n duplicatedCourses = _.drop(duplicatedCourses); // retain one of the duplicates for displaying\n result = _.pullAll(result, duplicatedCourses); // but get rid of the rest\n }\n }\n }\n });\n\n if (pagingParameters.append) {\n courseListVM.courses = courseListVM.courses.concat(result);\n } else {\n courseListVM.courses = result;\n }\n\n courseListVM.coursesLoading = false;\n });\n } else {\n if (pagingParameters.append) {\n courseListVM.courses = courseListVM.courses.concat(result);\n } else {\n courseListVM.courses = result;\n }\n\n courseListVM.coursesLoading = false;\n }\n });\n }\n\n function loadCourseSections(courseSectionGroup) {\n courseListVM.specialsAreLoading = true;\n courseListVM.primaryStaffId = courseSectionGroup.staffID;\n\n behaviorCourseSummaryRepository.getCourseSectionGroupCourseSections(courseSectionGroup).then(function (data) {\n\n var showFilteredSpecials = _.some(data, { 'staffID': courseListVM.primaryStaffId });\n var filteredByStaffId = [];\n courseListVM.currentCourseSections = data;\n\n _.forEach(courseListVM.currentCourseSections, function (course) {\n course.staffNameLastFirst = course.staffNameLastFirst;\n\n if (courseListVM.selectedFilters.Staff) {\n if (_.some(courseListVM.selectedFilters.Staff.items, { 'id': course.staffID })) {\n filteredByStaffId.push(course);\n }\n }\n });\n if (courseListVM.selectedFilters.Staff && showFilteredSpecials) { courseListVM.currentCourseSections = filteredByStaffId; }\n\n courseListVM.specialsAreLoading = false;\n });\n }\n\n function isSelfContainedCourse(course) {\n return _.every(course.timeAndPeriod, function (period) {\n return period.periodName == \"AM\" || period.periodName == \"PM\";\n });\n }\n\n function initFilters(staffId) {\n var filterConfig;\n \n if (!courseListVM.isPhone) {\n filterConfig = {\n filters:\n {\n \"AcademicYear\": { name: \"AcademicYear\", displayName: \"Academic Year\", type: \"radio\", items: null },\n \"School\": { name: \"School\", displayName: \"School\", type: \"radio\", items: null, persist: true },\n \"GradeLevel\": { name: \"GradeLevel\", displayName: \"Grade Level\", type: \"checkbox\", items: null },\n \"MarkingPeriod\": { name: \"MarkingPeriod\", displayName: \"Marking Period\", type: \"checkbox\", items: null, isCollapsed: true },\n \"Staff\": { name: \"Staff\", displayName: \"Teacher Name\", type: \"checkbox\", items: null, isCollapsed: true, defaultId: staffId}\n //\"Period\": { name: \"Period\", displayName: \"Meeting Block\", type: \"checkbox\", items: null, isCollapsed: true },\n //\"Wing\": { name: \"Wing\", displayName: \"Wing\", type: \"checkbox\", items: null, isCollapsed: true }\n },\n type: \"classes\"\n };\n } else {\n filterConfig = {\n filters:\n {\n \"AcademicYear\": { name: \"AcademicYear\", displayName: \"Academic Year\", type: \"radio\", items: null, currentYearOnly: true },\n \"School\": { name: \"School\", displayName: \"School\", type: \"radio\", items: null, persist: true, isTeacher: courseListVM.isTeacher },\n \"GradeLevel\": { name: \"GradeLevel\", displayName: \"Grade Level\", type: \"checkbox\", items: null, hideOnMobile: true },\n \"MarkingPeriod\": { name: \"MarkingPeriod\", displayName: \"Marking Period\", type: \"checkbox\", items: null, includeNoneOption: true, isCollapsed: true, hideOnMobile: true },\n \"Staff\": { name: \"Staff\", displayName: \"Teacher Name\", type: \"radio\", items: null, isCollapsed: true, defaultId: staffId, isTeacher: courseListVM.isTeacher}\n //\"Period\": { name: \"Period\", displayName: \"Meeting Block\", type: \"checkbox\", items: null, isCollapsed: true, hideOnMobile: true },\n //\"Wing\": { name: \"Wing\", displayName: \"Wing\", type: \"checkbox\", items: null, isCollapsed: true, hideOnMobile: true }\n },\n type: \"classes\",\n isPhone: true\n };\n }\n\n $scope.filterConfig = filterConfig;\n applyCachedFilterConfig();\n }\n\n function applyCachedFilterConfig() {\n if (!courseListVM.staffId) { return; }\n\n var savedFilterConfig = behaviorSessionCache.get('behavior.savedFilterConfig.' + courseListVM.staffId);\n if (savedFilterConfig) {\n _(savedFilterConfig)\n // filter out any values that are not in the filterConfig.\n .filter(function (filter) { return !_.isEmpty($scope.filterConfig.filters[filter.name]); })\n .each(function (filter) {\n $scope.filterConfig.filters[filter.name].defaultId = _.map(filter.items, 'id');\n });\n }\n }\n\n function unApplyCachedFilterConfig() {\n if (courseListVM.staffId) {\n var savedFilterConfig = behaviorSessionCache.get('behavior.savedFilterConfig.' + courseListVM.staffId);\n\n if (savedFilterConfig) {\n _(savedFilterConfig)\n // filter out any values that are not in the filterConfig.\n .filter(function (filter) { return !_.isEmpty($scope.filterConfig.filters[filter.name]); })\n .each(function (filter) {\n $scope.filterConfig.filters[filter.name].defaultId = null;\n });\n }\n\n behaviorSessionCache.remove('behavior.savedFilterConfig.' + courseListVM.staffId);\n }\n }\n }\n})();\n","/**\n * level-five-six.controller\n * @namespace behavior\n */\n(function () {\n\t'use strict';\n\n\t// define one component per file (single responsibility)\n\tangular\n\t\t.module('nha.behavior')\n\t\t.controller('LevelFiveSixCtrl', LevelFiveSixCtrl);\n\n\t// protect against minification\n\t/* @ngInject */\n\tLevelFiveSixCtrl.$inject = ['appSettings', '$state', '$stateParams', '$q', '$scope', '$controller',\n\t\t'userContextService', 'enumService', '$location', 'locationRepository', 'stateRepository',\n\t\t'observationRepository', 'actionRepository', 'behaviorEventIncidentRepository',\n\t\t'$window', 'behaviorCache', 'personSearchService', 'schoolService', 'apiSecurityService',\n\t\t'behaviorEventMultipleParticipantIncidentRepository', 'stateBehaviorQuestionAnswerService',\n\t\t'studentListService', 'roleRepository', 'behaviorStateManagementService', 'BehaviorRestangular',\n\t\t'behaviorUserRoleService', 'behaviorDirtyCheckService', '$timeout', 'behaviorAlertService'];\n\n /**\n * @name LevelFiveSixCtrl\n * @description Constructor for level-five-six.controller\n * @memberOf behavior\n */\n\tfunction LevelFiveSixCtrl(appSettings, $state, $stateParams, $q, $scope, $controller,\n\t\tuserContextService, enumService, $location, locationRepository, stateRepository,\n\t\tobservationRepository, actionRepository, behaviorEventIncidentRepository,\n\t\t$window, behaviorCache, personSearchService, schoolService, apiSecurityService,\n\t\tbehaviorEventMultipleParticipantIncidentRepository, stateBehaviorQuestionAnswerService,\n\t\tstudentListService, roleRepository, behaviorStateManagementService, behaviorRestangular,\n\t\tbehaviorUserRoleService, behaviorDirtyCheckService, $timeout, behaviorAlertService) {\n\n\t\t// ReSharper disable PossiblyUnassignedProperty\n\t\tvar moment = window.moment;\n\t\tvar _ = window._;\n\n\t\t// Controller as vm - see route configuration\n\t\tvar levelFiveSixVM = this;\n\n\t\tlevelFiveSixVM.levelFiveSixTemplateUrl = appSettings.behaviorWebRootUrl + 'app/components/incident/level-five-six/templates/_level-five-six.html';\n\n\t\t// SECTION I: Extract passed-in values\n\n\t\t// SECTION II: Properties associated to view model - sorted alphabetically\n\t\tlevelFiveSixVM.actions = [];\n\t\tlevelFiveSixVM.behaviorLevelId = 5;\n\t\tlevelFiveSixVM.behaviorObservationPlaceholder = \"Select\";\n\t\tlevelFiveSixVM.dateEntryOptions = {\n\t\t\tmaxDate: moment(),\n\t\t\tdaysOfWeekDisabled: [0, 6],\n\t\t\tuseCurrent: false\n\t\t};\n\t\tlevelFiveSixVM.hasLevelSixParticipant = false;\n\t\tlevelFiveSixVM.incidentDate = moment().format('YYYY-MM-DD');\n\t\tlevelFiveSixVM.incidentTime = null;\n\t\tlevelFiveSixVM.isAddingAParticipant = false;\n\t\tlevelFiveSixVM.isEditingAParticipant = false;\n\t\tlevelFiveSixVM.isOhioSchool = false;\n\t\tlevelFiveSixVM.isStateQuestionAnswerCollapsed = false;\n\t\tlevelFiveSixVM.isParticipantSectionCollapsed = false;\n\t\tlevelFiveSixVM.isLoading = false;\n\t\tlevelFiveSixVM.isReadOnly = false;\n\t\tlevelFiveSixVM.isTeacher = false;\n\t\tlevelFiveSixVM.maximumObservationsLimitReached = false;\n\t\tlevelFiveSixVM.noObservationsSelected = false;\n\t\tlevelFiveSixVM.notes = '';\n\t\tlevelFiveSixVM.originalStudent = {};\n\t\tlevelFiveSixVM.observations = [];\n\t\tlevelFiveSixVM.participants = [];\n\t\tlevelFiveSixVM.previousIncident = null;\n\t\tlevelFiveSixVM.primaryAction = { name: '', startDate: '', duration: '' };\n\t\tlevelFiveSixVM.school = {};\n\t\tlevelFiveSixVM.searchPersons = [];\n\t\tlevelFiveSixVM.selectedLocation = null;\n\t\tlevelFiveSixVM.selectedObservedBehavior = null;\n\t\tlevelFiveSixVM.selectedObservedBehaviors = [];\n\t\tlevelFiveSixVM.selectedObservedBehaviorArray = {\n\t\t\tselectedObservation: null\n\t\t};\n\t\tlevelFiveSixVM.selectedReferredBy = null;\n\t\tlevelFiveSixVM.staffID = null;\n\t\tlevelFiveSixVM.stateID = 0;\n\t\tlevelFiveSixVM.stateQuestions = [];\n\t\tlevelFiveSixVM.staticMomentObjectForTimeZone = moment();\n\t\tlevelFiveSixVM.timeEntryOptions = {\n\t\t\tformat: 'LT'\n\t\t};\n\t\tlevelFiveSixVM.uiParticipants = [];\n\t\tuserContextService.ensureUserContext().then(function (context) {\n\t\t\tlevelFiveSixVM.staffID = context['http://schemas.mynha.com/SIS/Core/StaffID'];\n\t\t});\n\t\tlevelFiveSixVM.studentInSchoolId = $state.params.studentInSchoolId;\n\n\t\t// SECTION III: Navigation pass-thru methods - sorted alphabetically\n\t\tlevelFiveSixVM.onCancelClick = onCancelClick;\n\t\tlevelFiveSixVM.onSaveClick = onSaveClick;\n\n\t\t// SECTION IV: Controller methods associated to view model (init, reset, submit) - sorted alphabetically\n\t\tlevelFiveSixVM.onAddParticipant = onAddParticipant;\n\t\tlevelFiveSixVM.onEditClick = onEditClick;\n\t\tlevelFiveSixVM.onIncidentDateChanged = onIncidentDateChanged;\n\t\tlevelFiveSixVM.onObservedBehaviorChange = onObservedBehaviorChange;\n\t\tlevelFiveSixVM.onStateQuestionAnswerChange = onStateQuestionAnswerChange;\n\t\tlevelFiveSixVM.onTrashClick = onTrashClick;\n\t\tlevelFiveSixVM.onTypeAheadBlur = onTypeAheadBlur;\n\t\tlevelFiveSixVM.showHideStateQuestions = showHideStateQuestions;\n\t\tlevelFiveSixVM.showQuestionFilter = showQuestionFilter;\n\n\t\t// SECTION V: All other methods - sorted alphabetically \n\t\tlevelFiveSixVM.anyStateQuestions = anyStateQuestions;\n\t\tlevelFiveSixVM.areAllStateQuestionsAnswered = areAllStateQuestionsAnswered;\n\t\tlevelFiveSixVM.checkForAnyLevelSixParticipants = checkForAnyLevelSixParticipants;\n\t\tlevelFiveSixVM.checkForAnyLevelSixParticipantsOnParticipantSave = checkForAnyLevelSixParticipantsOnParticipantSave;\n\t\tlevelFiveSixVM.checkForCorrectNumberOfSelectedBehaviors = checkForCorrectNumberOfSelectedBehaviors;\n\t\tlevelFiveSixVM.getActionsForUi = getActionsForUi;\n\t\tlevelFiveSixVM.getEnabledCount = getEnabledCount;\n\t\tlevelFiveSixVM.getLevelforUi = getLevelforUi;\n\t\tlevelFiveSixVM.getObservationActionParams = getObservationActionParams;\n\t\tlevelFiveSixVM.getParticipantTypeName = getParticipantTypeName;\n\t\tlevelFiveSixVM.getRoleNameById = getRoleNameById;\n\t\tlevelFiveSixVM.getStudentUrl = getStudentUrl;\n\t\tlevelFiveSixVM.hasSelectedAnObservationRequiringNotes = hasSelectedAnObservationRequiringNotes;\n\t\tlevelFiveSixVM.isBehaviorAdd = isBehaviorAdd;\n\t\tlevelFiveSixVM.isBehaviorUpdate = isBehaviorUpdate;\n\t\tlevelFiveSixVM.isFirstParticipant = isFirstParticipant;\n\t\tlevelFiveSixVM.isOffenderOrParticipant = isOffenderOrParticipant;\n\t\tlevelFiveSixVM.isParticipantTypeOther = isParticipantTypeOther;\n\t\tlevelFiveSixVM.isParticipantTypeStudent = isParticipantTypeStudent;\n\t\tlevelFiveSixVM.isParticipantWitnessOrVictim = isParticipantWitnessOrVictim;\n\t\tlevelFiveSixVM.isWitnessOrVictim = isWitnessOrVictim;\n\t\tlevelFiveSixVM.loadActions = loadActions;\n\t\tlevelFiveSixVM.onLoadFailure = onLoadFailure;\n\t\tlevelFiveSixVM.showAnswerTextInput = showAnswerTextInput;\n\t\tlevelFiveSixVM.validateIncidentDateTime = validateIncidentDateTime;\n\t\tlevelFiveSixVM.validateStateQuestionsAndAnswers = validateStateQuestionsAndAnswers;\n\n\t\t// Initialize \n\t\tinit();\n\n\t\tfunction init() {\n\t\t\tlevelFiveSixVM.isLoading = true;\n\t\t\t$q.all([\n\t\t\t\tisMoreThanATeacher(),\n\t\t\t\tloadAppState(),\n\t\t\t\tloadDataPermissionsForPage()\n\t\t\t])\n\t\t\t\t.then(function () {\n\t\t\t\t\tlevelFiveSixVM.incidentTime = moment().format();\n\t\t\t\t})\n\t\t\t\t.then(checkForReadOnly)\n\t\t\t\t.then(loadSchoolForTimezone)\n\t\t\t\t.then(function () {\n\t\t\t\t\tlevelFiveSixVM.originalStudent = levelFiveSixVM.student;\n\t\t\t\t\tif (levelFiveSixVM.originalStudent.personID) {\n\t\t\t\t\t\tlevelFiveSixVM.originalStudent.studentInSchoolID = levelFiveSixVM.originalStudent.personID;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar promises = [loadState()];\n\n\t\t\t\t\tif (isBehaviorUpdate()) {\n\t\t\t\t\t\tpromises.push(loadPreviousIncident());\n\t\t\t\t\t}\n\n\t\t\t\t\treturn $q.all(promises);\n\t\t\t\t})\n\t\t\t\t.then(function () {\n\t\t\t\t\tif (isBehaviorUpdate()) {\n\t\t\t\t\t\treturn $q.all([\n\t\t\t\t\t\t\tloadStateQuestionAnswers(),\n\t\t\t\t\t\t\tloadActions(),\n\t\t\t\t\t\t\tloadBehaviorRoles()\n\t\t\t\t\t\t]).then(function () {\n\t\t\t\t\t\t\t_.forEach(levelFiveSixVM.previousIncident.BehaviorEventParticipantViews, function (participant) {\n\t\t\t\t\t\t\t\tsetParticipantViewValuesFromPreviousIncident(participant);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tmatchStateQuestions();\n\t\t\t\t\t\t\tshowHideStateQuestions();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then(function () {\n\t\t\t\t\tvar promises = [\n\t\t\t\t\t\tloadLocations(),\n\t\t\t\t\t\tloadObservations(),\n\t\t\t\t\t\tloadStartEndTime()\n\t\t\t\t\t];\n\n\t\t\t\t\tif (!isBehaviorUpdate()) {\n\t\t\t\t\t\tpromises.push(loadStateQuestionAnswers());\n\t\t\t\t\t\tpromises.push(loadActions());\n\t\t\t\t\t}\n\n\t\t\t\t\tlevelFiveSixVM.isLoading = false;\n\n\t\t\t\t\t$timeout(function () {\n\t\t\t\t\t\tif (levelFiveSixVM.form) { levelFiveSixVM.form.$setPristine(); }\n\t\t\t\t\t}, 0);\n\n\t\t\t\t\treturn $q.all(promises);\n\t\t\t\t});\n\t\t}\n\n\t\tfunction isMoreThanATeacher() {\n\t\t\treturn behaviorUserRoleService.isMoreThanATeacher().then(function (result) {\n\t\t\t\tlevelFiveSixVM.isTeacher = !result;\n\t\t\t});\n\t\t}\n\n\t\tfunction checkForReadOnly() {\n\t\t\tif (isBehaviorUpdate()) {\n\t\t\t\tapiSecurityService.isAccessAllowed('uisr_update_level_five', 'Get', behaviorRestangular).then(function (result) {\n\t\t\t\t\tlevelFiveSixVM.isReadOnly = !result;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction loadAppState() {\n\t\t\treturn behaviorStateManagementService.getInitialValues($state.params).then(function (q) {\n\t\t\t\tlevelFiveSixVM = _.assign(levelFiveSixVM, q);\n\t\t\t});\n\t\t}\n\n\t\tfunction loadDataPermissionsForPage() {\n\t\t\treturn behaviorUserRoleService.loadDataPermissionsForPage($state, levelFiveSixVM).then(function (result) {\n\t\t\t\tif (!result) {\n\t\t\t\t\t$state.go('403');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction getObservationActionParams() {\n\t\t\tvar params =\n\t\t\t{\n\t\t\t\tbehaviorLevelID: 5,\n\t\t\t\tacademicYearID: levelFiveSixVM.academicYearId,\n\t\t\t\tschoolID: levelFiveSixVM.schoolId\n\t\t\t};\n\n\t\t\tif (isBehaviorUpdate() && levelFiveSixVM.hasLevelSixParticipant) { params.behaviorLevelID = 6; }\n\n\t\t\treturn params;\n\t\t}\n\n\t\t$scope.searchPerson = function (name) {\n\t\t\treturn personSearchService.staffSearch(name, levelFiveSixVM.schoolId).then(function (results) {\n\t\t\t\tlevelFiveSixVM.searchPersons.length = 0;\n\n\t\t\t\tvar searchPersons = results.map(function (r) {\n\t\t\t\t\treturn { name: r.firstName + ' ' + r.lastName, personID: r.personID };\n\t\t\t\t});\n\n\t\t\t\tArray.prototype.push.apply(levelFiveSixVM.searchPersons, searchPersons);\n\n\t\t\t\treturn levelFiveSixVM.searchPersons;\n\t\t\t});\n\t\t};\n\n\t\tfunction onTypeAheadBlur() {\n\t\t\tvalidateReferredByField();\n\n\t\t\tif (levelFiveSixVM.form.referredBy.$invalid) {\n\t\t\t\tlevelFiveSixVM.selectedReferredBy = '';\n\t\t\t}\n\t\t}\n\n\t\t// ------------------ Data load functions --------------------------\n\t\tfunction loadStartEndTime() {\n\t\t\treturn behaviorEventIncidentRepository\n\t\t\t\t.GetSchoolStartEndTime(levelFiveSixVM.schoolId, levelFiveSixVM.academicYearId)\n\t\t\t\t.then(function (result) {\n\t\t\t\t\tlevelFiveSixVM.schoolStartTime = moment(result.startTime, 'LT').format('LT');\n\t\t\t\t\tlevelFiveSixVM.schoolEndTime = moment(result.endTime, 'LT').format('LT');\n\t\t\t\t});\n\t\t}\n\n\t\tfunction loadActions() {\n\t\t\treturn actionRepository.getAll(getObservationActionParams()).then(function (results) {\n\t\t\t\tlevelFiveSixVM.actions = results;\n\t\t\t});\n\t\t}\n\n\t\tfunction loadLocations() {\n\t\t\treturn locationRepository.getAll().then(function (results) {\n\t\t\t\tlevelFiveSixVM.locations = results;\n\t\t\t});\n\t\t}\n\n\t\tfunction loadObservations() {\n\t\t\treturn observationRepository.getAll(getObservationActionParams()).then(function (results) {\n\t\t\t\tlevelFiveSixVM.observations.length = 0;\n\t\t\t\tArray.prototype.push.apply(levelFiveSixVM.observations, results);\n\t\t\t});\n\t\t}\n\n\t\tfunction loadState() {\n\t\t\treturn stateRepository.get(levelFiveSixVM.stateID).then(function (result) {\n\t\t\t\tlevelFiveSixVM.isOhioSchool = result.name === \"Ohio\";\n\t\t\t});\n\t\t}\n\n\t\tfunction loadBehaviorRoles() {\n\t\t\treturn roleRepository.getAll().then(function (results) {\n\t\t\t\tlevelFiveSixVM.behaviorRoles = results;\n\t\t\t});\n\t\t}\n\n\t\tfunction loadStateQuestionAnswers() {\n\t\t\treturn stateBehaviorQuestionAnswerService.getObservationQuestionAnswer(levelFiveSixVM.stateID).then(function (results) {\n\t\t\t\tlevelFiveSixVM.stateQuestions.length = 0;\n\t\t\t\tvar modifiedResults = results.filter(function (qa) {\n\t\t\t\t\treturn qa.behaviorLevelID === levelFiveSixVM.behaviorLevelId;\n\t\t\t\t}).map(function (qa) {\n\t\t\t\t\tqa.answerDataType = qa.answerDataType ? qa.answerDataType.toLowerCase() : 'boolean';\n\t\t\t\t\tqa.selectedAnswer = null;\n\t\t\t\t\tqa.enabled = false;\n\t\t\t\t\tqa.active = false;\n\t\t\t\t\treturn qa;\n\t\t\t\t});\n\n\t\t\t\tArray.prototype.push.apply(levelFiveSixVM.stateQuestions, modifiedResults);\n\n\t\t\t\t// If this is a school with an Observation multi-select (currently, just Ohio schools),\n\t\t\t\t// we need to group the state questions by their behaviorObservationID so that we can\n\t\t\t\t// order them properly in the UI - Workfront Ref #72783\n\t\t\t\tif (levelFiveSixVM.isOhioSchool) {\n\t\t\t\t\tvar groupedResults = _.groupBy(modifiedResults, 'behaviorObservationID');\n\t\t\t\t\tvar groupNumber = 0;\n\t\t\t\t\tvar newArray = [];\n\n\t\t\t\t\t_.each(groupedResults, function (group) {\n\t\t\t\t\t\tgroupNumber = groupNumber + 1;\n\n\t\t\t\t\t\t_.each(group, function (question) {\n\t\t\t\t\t\t\tquestion.orderNumber = groupNumber + (question.orderNumber / 10);\n\t\t\t\t\t\t\tnewArray.push(question);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\tlevelFiveSixVM.stateQuestions = _.cloneDeep(newArray);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction loadSchoolForTimezone() {\n\t\t\treturn schoolService.get(levelFiveSixVM.schoolId).then(function (school) {\n\t\t\t\tlevelFiveSixVM.school = school;\n\t\t\t\tlevelFiveSixVM.stateID = school.stateID;\n\t\t\t}, function (error) {\n\t\t\t\tbehaviorAlertService.goSwal(\"loadFailure\", goToPreviousScreen);\n\t\t\t});\n\t\t}\n\n\t\t// ------------------ On Change / Event functions --------------------------\n\t\tfunction onCancelClick() {\n\t\t\tbehaviorDirtyCheckService.isFormDirty(levelFiveSixVM.form) ? behaviorAlertService.goSwal('dirtyForm', goToPreviousScreen) : goToPreviousScreen();\n\t\t}\n\n\t\tfunction onSaveClick() {\n\t\t\tlevelFiveSixVM.saveButtonHasBeenClicked = true;\n\n\t\t\tif (isFormValid()) {\n\t\t\t\tlevelFiveSixVM.isLoading = true;\n\n\t\t\t\tvar incident =\n\t\t\t\t{\n\t\t\t\t\tBehaviorEvent: buildBehaviorEvent(),\n\t\t\t\t\tBehaviorEventObservations: buildBehaviorEventObservations(),\n\t\t\t\t\tBehaviorEventParticipantViews: _(levelFiveSixVM.participants)\n\t\t\t\t\t\t.map(buildBehaviorEventParticipantView)\n\t\t\t\t\t\t.value(),\n\t\t\t\t\tStateBehaviorObservationResults: _(levelFiveSixVM.stateQuestions)\n\t\t\t\t\t\t.filter(function (x) { return x.enabled === true && x.active === true; })\n\t\t\t\t\t\t.map(buildStateBehaviorObservationResult)\n\t\t\t\t\t\t.value()\n\t\t\t\t};\n\n\t\t\t\tif (isBehaviorAdd()) {\n\t\t\t\t\tbehaviorEventMultipleParticipantIncidentRepository.set(incident).then(onSaveSuccess, onSaveFailure);\n\t\t\t\t} else if (isBehaviorUpdate()) {\n\t\t\t\t\tbehaviorEventMultipleParticipantIncidentRepository.put(incident).then(onSaveSuccess, onSaveFailure);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbehaviorAlertService.goSwal('validationFailure', null, 'Please complete required fields before saving');\n\t\t\t}\n\t\t}\n\n\t\tfunction onSaveSuccess(saveEventIncident) {\n\t\t\tlevelFiveSixVM.isLoading = false;\n\t\t\tbehaviorAlertService.goSwal('saveSuccess', goToPreviousScreen);\n\t\t}\n\n\t\tfunction onSaveFailure(error) {\n\t\t\tlevelFiveSixVM.isLoading = false;\n\t\t\tbehaviorAlertService.goSwal('saveFailureWithMsg', null, error.data.exceptionMessage);\n\t\t}\n\n\t\tfunction wrongBehaviorLevel() {\n\t\t\tswal({\n\t\t\t\ttitle: 'Behavior Event Edit',\n\t\t\t\ttext: 'Only events of behavior level 5 or 6 can be edited from this URL.',\n\t\t\t\ttype: 'error',\n\t\t\t\tshowCancelButton: false,\n\t\t\t\tconfirmButtonColor: '#DD6B55',\n\t\t\t\tconfirmButtonText: 'OK',\n\t\t\t\tcloseOnConfirm: true\n\t\t\t}, function (isConfirmed) {\n\t\t\t\tif (isConfirmed === true) {\n\t\t\t\t\tgoToPreviousScreen();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t$scope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {\n\t\t\tswal.close();\n\t\t});\n\n\t\tfunction onDataLoadError(error) {\n\t\t\tbehaviorAlertService.goSwal('retrievalFailure', goToPreviousScreen);\n\t\t}\n\n\t\tfunction onEditClick(participant) {\n\n\t\t\tif (!isIncidentFormValid()) {\n\t\t\t\tswal('Required fields not completed', 'Please complete required fields before adding a participant');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlevelFiveSixVM.isEditingAParticipant = true; // this will tell the add participant directive that we are editing, instead of interrogating state params like before\n\n\t\t\tlevelFiveSixVM.participantIndex = levelFiveSixVM.participants.indexOf(participant);\n\t\t}\n\n\t\tfunction onAddParticipant() {\n\n\t\t\tif (!isIncidentFormValid()) {\n\t\t\t\tswal('Required fields not completed', 'Please complete required fields before adding a participant');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlevelFiveSixVM.form.participantsField.$setValidity('missingVictim', true);\n\t\t\tlevelFiveSixVM.form.participantsField.$setValidity('missingOriginalStudent', true);\n\t\t\tlevelFiveSixVM.form.participantsField.$setValidity('missingOneOffenderOrParticipant', true);\n\n\t\t\tlevelFiveSixVM.isAddingAParticipant = !levelFiveSixVM.isAddingAParticipant;\n\t\t}\n\n\t\tfunction onTrashClick(participant) {\n\n\t\t\tvar index = levelFiveSixVM.participants.indexOf(participant);\n\t\t\tlevelFiveSixVM.participants.splice(index, 1);\n\t\t\tlevelFiveSixVM.checkForAnyLevelSixParticipants();\n\t\t}\n\n\t\tfunction onLoadFailure() {\n\t\t\tbehaviorAlertService.goSwal('loadFailure', goToPreviousScreen);\n\t\t}\n\n\t\tfunction onIncidentDateChanged() {\n\t\t\tclearAllStateQuestions();\n\t\t\tonStateQuestionAnswerChange();\n\t\t}\n\n\t\tfunction onObservedBehaviorChange() {\n\t\t\tclearAllStateQuestions();\n\t\t\tonStateQuestionAnswerChange();\n\t\t}\n\n\t\tfunction onStateQuestionAnswerChange() {\n\t\t\tif (levelFiveSixVM.form) {\n\t\t\t\tlevelFiveSixVM.form.stateQuestionAnswers.$setValidity(\n\t\t\t\t\t'unanswered',\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (isBehaviorUpdate()) {\n\t\t\t\tmatchStateQuestions();\n\t\t\t}\n\n\t\t\tshowHideStateQuestions();\n\t\t}\n\n\t\t// ------------------ Form validation functions --------------------------\n\t\tfunction setFormDirty() {\n\t\t\tlevelFiveSixVM.form.incidentDate.$setDirty();\n\t\t\tlevelFiveSixVM.form.incidentTime.$setDirty();\n\t\t\tlevelFiveSixVM.form.referredBy.$setDirty();\n\t\t\tlevelFiveSixVM.isOhioSchool ? levelFiveSixVM.form.selectedObservations.$setDirty() : levelFiveSixVM.form.observedBehavior.$setDirty();\n\t\t}\n\n\t\tfunction isFormValid() {\n\t\t\tsetFormDirty();\n\t\t\tvar partFormValid = isParticipantFormValid();\n\t\t\tvar incidentFormValid = isIncidentFormValid();\n\t\t\tvar stateQuestionsFormValid = isStateQuestionsFormValid();\n\n\t\t\treturn partFormValid && incidentFormValid && stateQuestionsFormValid && areNotesCompleteIfRequired();\n\t\t}\n\n\t\tfunction isParticipantFormValid() {\n\t\t\tvalidateVictim();\n\t\t\tvalidateOriginalStudent();\n\t\t\tvalidateOneOffenderOrParticipant();\n\n\t\t\treturn levelFiveSixVM.form.participantsField.$valid;\n\t\t}\n\n\t\tfunction isIncidentFormValid() {\n\t\t\tsetFormDirty();\n\t\t\tvalidateReferredByField();\n\t\t\tvalidateIncidentDateTime();\n\t\t\tlevelFiveSixVM.isOhioSchool ? validateMultiSelectObservedBehaviors() : validateObservedBehavior();\n\n\t\t\t// Check if all fields are valid\n\t\t\tvar validity = levelFiveSixVM.form.incidentDate.$valid &&\n\t\t\t\tlevelFiveSixVM.form.incidentTime.$valid &&\n\t\t\t\tlevelFiveSixVM.form.referredBy.$valid;\n\n\t\t\treturn levelFiveSixVM.isOhioSchool ? (validity && levelFiveSixVM.form.selectedObservations.$valid && !levelFiveSixVM.maximumObservationsLimitReached) : (validity && levelFiveSixVM.form.observedBehavior.$valid);\n\t\t}\n\n\t\tfunction hasSelectedAnObservationRequiringNotes() {\n\t\t\tif (!levelFiveSixVM.isOhioSchool && !levelFiveSixVM.selectedObservedBehavior) { return false; }\n\n\t\t\tif (!levelFiveSixVM.isOhioSchool) {\n\t\t\t\treturn _.result(_.find(levelFiveSixVM.observations, function (obs) {\n\t\t\t\t\treturn obs.behaviorObservationID === levelFiveSixVM.selectedObservedBehavior;\n\t\t\t\t}), 'isNotesRequired');\n\t\t\t} else {\n\t\t\t\tvar returned = false;\n\n\t\t\t\t_.each(levelFiveSixVM.selectedObservedBehaviors, function (obs) {\n\t\t\t\t\tif (!returned) {\n\t\t\t\t\t\treturned = _.result(_.find(levelFiveSixVM.observations, function (o) {\n\t\t\t\t\t\t\treturn o.behaviorObservationID === obs.behaviorObservationID;\n\t\t\t\t\t\t}), 'isNotesRequired');\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn returned;\n\t\t\t}\n\t\t}\n\n\t\tfunction isStateQuestionsFormValid() {\n\t\t\tvalidateStateQuestions();\n\t\t\treturn levelFiveSixVM.form.stateQuestionAnswers.$valid;\n\t\t}\n\n\t\tfunction validateObservedBehavior() {\n\t\t\tvar isValid = _.isEmpty(levelFiveSixVM.selectedObservedBehavior);\n\n\t\t\tlevelFiveSixVM.form.observedBehavior.$setValidity(\n\t\t\t\t'noSelection',\n\t\t\t\tisValid\n\t\t\t);\n\t\t}\n\n\t\tfunction validateMultiSelectObservedBehaviors() {\n\t\t\tvar isValid = !_.isEmpty(levelFiveSixVM.selectedObservedBehaviors);\n\n\t\t\tlevelFiveSixVM.form.selectedObservations.$setValidity(\n\t\t\t\t'noSelection',\n\t\t\t\tisValid\n\t\t\t);\n\t\t}\n\n\t\tfunction validateIncidentDateTime() {\n\t\t\tif (!levelFiveSixVM.form) return; // So watches don't try to access form before template has been rendered...\n\n\t\t\t// Date\n\t\t\tlevelFiveSixVM.form.incidentDate.$setDirty();\n\t\t\tvar isValidDate = moment.isMoment(levelFiveSixVM.incidentDate) && moment(levelFiveSixVM.incidentDate).isValid();\n\n\t\t\tlevelFiveSixVM.form.incidentDate.$setValidity(\n\t\t\t\t'invalidDate',\n\t\t\t\tisValidDate\n\t\t\t);\n\n\t\t\tif (isValidDate) {\n\t\t\t\tvar isNotWeekendDate = !(moment(levelFiveSixVM.incidentDate).day() % 6 === 0);\n\n\t\t\t\tlevelFiveSixVM.form.incidentDate.$setValidity(\n\t\t\t\t\t'weekendDate',\n\t\t\t\t\tisNotWeekendDate\n\t\t\t\t);\n\n\t\t\t\tvar isValidPastActionDate = _(levelFiveSixVM.participants)\n\t\t\t\t\t.map('selectedActions')\n\t\t\t\t\t.flatten()\n\t\t\t\t\t.filter({ isStartDateRequired: true })\n\t\t\t\t\t.every(function (action) {\n\t\t\t\t\t\t// Diff checks if action date/time is later than incident date/time.\n\t\t\t\t\t\treturn moment(action.actionStartDate).diff(levelFiveSixVM.incidentDate, 'days') >= 0;\n\t\t\t\t\t});\n\n\t\t\t\tlevelFiveSixVM.form.incidentDate.$setValidity(\n\t\t\t\t\t'pastActionDate',\n\t\t\t\t\tisValidPastActionDate\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Time\n\t\t\tif (levelFiveSixVM.form.incidentTime.$pristine && !levelFiveSixVM.incidentTime) {\n\t\t\t\treturn; // Don't check time if the control hasn't been touched yet.\n\t\t\t}\n\n\t\t\tvar isValidIncidentTime = false;\n\t\t\tvar isIncidentTimeBeforeAllActionTimes = false;\n\t\t\tvar isNotInFuture = false;\n\t\t\tvar clonedIncidentTime;\n\n\t\t\tif (levelFiveSixVM.incidentTime) {\n\n\t\t\t\tif (moment.isMoment(levelFiveSixVM.incidentTime)) {\n\t\t\t\t\tclonedIncidentTime = createMomentWithSetDate(levelFiveSixVM.incidentTime.getTime(), levelFiveSixVM.incidentDate);\n\t\t\t\t} else {\n\t\t\t\t\tclonedIncidentTime = createMomentWithSetDate(levelFiveSixVM.incidentTime, levelFiveSixVM.incidentDate);\n\t\t\t\t}\n\n\t\t\t\tisValidIncidentTime = clonedIncidentTime.isValid();\n\n\t\t\t\tisIncidentTimeBeforeAllActionTimes = _(levelFiveSixVM.participants)\n\t\t\t\t\t.map('selectedActions')\n\t\t\t\t\t.flatten()\n\t\t\t\t\t.filter({ isStartTimeRequired: true })\n\t\t\t\t\t.every(function (action) {\n\t\t\t\t\t\t// Diff checks if action date/time is later than incident date/time.\n\t\t\t\t\t\treturn moment(action.actionStartDate).diff(levelFiveSixVM.incidentDate, 'days') >= 1 ||\n\t\t\t\t\t\t\tmoment(action.actionStartTime).diff(clonedIncidentTime, 'minutes') >= 0;\n\t\t\t\t\t});\n\n\t\t\t\tisNotInFuture = clonedIncidentTime.diff(moment(), 'minutes') <= 0;\n\t\t\t}\n\n\t\t\tlevelFiveSixVM.form.incidentTime.$setValidity(\n\t\t\t\t'invalidTime',\n\t\t\t\tisValidIncidentTime\n\t\t\t);\n\n\t\t\tif (isValidIncidentTime) {\n\t\t\t\tlevelFiveSixVM.form.incidentTime.$setValidity(\n\t\t\t\t\t'futureTime',\n\t\t\t\t\tisNotInFuture\n\t\t\t\t);\n\n\t\t\t\tlevelFiveSixVM.form.incidentTime.$setValidity(\n\t\t\t\t\t'pastActionTime',\n\t\t\t\t\tisIncidentTimeBeforeAllActionTimes\n\t\t\t\t);\n\n\t\t\t\tvar schoolStartTime = createMomentWithSetDate(moment(levelFiveSixVM.schoolStartTime, 'LT'), levelFiveSixVM.incidentDate);\n\t\t\t\tvar schoolEndTime = createMomentWithSetDate(moment(levelFiveSixVM.schoolEndTime, 'LT'), levelFiveSixVM.incidentDate);\n\n\t\t\t\tif (clonedIncidentTime) {\n\t\t\t\t\tlevelFiveSixVM.warnTimeNotBetweenSchoolStartEndTime = !(clonedIncidentTime.isAfter(schoolStartTime) &&\n\t\t\t\t\t\tclonedIncidentTime.isBefore(schoolEndTime));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction validateStateQuestions() {\n\t\t\tvar isValid = levelFiveSixVM.areAllStateQuestionsAnswered(levelFiveSixVM.stateQuestions);\n\n\t\t\tlevelFiveSixVM.form.stateQuestionAnswers.$setValidity(\n\t\t\t\t'unanswered',\n\t\t\t\tisValid\n\t\t\t);\n\t\t}\n\n\t\tfunction validateReferredByField() {\n\t\t\tif (!levelFiveSixVM.form) return;\n\n\t\t\tvar isValid = !_.isEmpty(levelFiveSixVM.selectedReferredBy) &&\n\t\t\t\t_.isPlainObject(levelFiveSixVM.selectedReferredBy) &&\n\t\t\t\t!_.isEmpty(levelFiveSixVM.selectedReferredBy.name) &&\n\t\t\t\t!_.isUndefined(levelFiveSixVM.selectedReferredBy.personID);\n\n\t\t\tlevelFiveSixVM.form.referredBy.$setValidity(\n\t\t\t\t'nameError',\n\t\t\t\tisValid\n\t\t\t);\n\t\t}\n\n\t\tfunction validateVictim() {\n\t\t\tvar obsId = levelFiveSixVM.selectedObservedBehavior ? levelFiveSixVM.selectedObservedBehavior : null;\n\t\t\tvar obsIds = levelFiveSixVM.isOhioSchool ? _.map(levelFiveSixVM.selectedObservedBehaviors, 'behaviorObservationID') : null;\n\t\t\tvar observedBehavior = {};\n\t\t\tvar isObservedBullying = false;\n\t\t\tvar isValid = true;\n\n\t\t\tif (!obsId && !obsIds) return;\n\n\t\t\tif (levelFiveSixVM.isOhioSchool) {\n\t\t\t\t_.each(obsIds, function (id) {\n\t\t\t\t\tobservedBehavior = _(levelFiveSixVM.observations).find({ behaviorObservationID: id });\n\t\t\t\t\tisObservedBullying = observedBehavior ? observedBehavior.isBullying : false;\n\n\t\t\t\t\tif (isValid) {\n\t\t\t\t\t\tisValid = isObservedBullying === false ||\n\t\t\t\t\t\t\t_(levelFiveSixVM.participants).some(function (participant) { return participant.selectedRole === 3 }); // Check for victim role in participants\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tobservedBehavior = _(levelFiveSixVM.observations).find({ behaviorObservationID: obsId }),\n\t\t\t\t\tisObservedBullying = observedBehavior ? observedBehavior.isBullying : false,\n\t\t\t\t\tisValid = isObservedBullying === false ||\n\t\t\t\t\t_(levelFiveSixVM.participants).some(function (participant) { return participant.selectedRole === 3 }); // Check for victim role in participants\n\t\t\t}\n\n\t\t\tlevelFiveSixVM.form.participantsField.$setValidity(\n\t\t\t\t'missingVictim',\n\t\t\t\tisValid\n\t\t\t);\n\t\t}\n\n\t\tfunction validateOriginalStudent() {\n\t\t\tvar isValid = isBehaviorUpdate() ||\n\t\t\t\t_(levelFiveSixVM.participants).some({ selectedPerson: { personID: levelFiveSixVM.originalStudent.studentInSchoolID } });\n\n\t\t\tlevelFiveSixVM.form.participantsField.$setValidity(\n\t\t\t\t'missingOriginalStudent',\n\t\t\t\tisValid\n\t\t\t);\n\t\t}\n\n\t\tfunction validateOneOffenderOrParticipant() {\n\t\t\tvar isValid = _(levelFiveSixVM.participants).some(isOffenderOrParticipant);\n\n\t\t\tlevelFiveSixVM.form.participantsField.$setValidity(\n\t\t\t\t'missingOneOffenderOrParticipant',\n\t\t\t\tisValid\n\t\t\t);\n\t\t}\n\n\t\tfunction checkForCorrectNumberOfSelectedBehaviors() {\n\t\t\tvar observationArray = [];\n\t\t\tvar pluckedObservation = {};\n\t\t\tlevelFiveSixVM.selectedObservedBehaviors = [];\n\n\t\t\tfor (var key in levelFiveSixVM.selectedObservedBehaviorArray.selectedObservation) {\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(levelFiveSixVM.selectedObservedBehaviorArray.selectedObservation, key)) {\n\t\t\t\t\tif (levelFiveSixVM.selectedObservedBehaviorArray.selectedObservation[key] === true) { observationArray.push(key); }\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_.each(observationArray, function (obs) {\n\t\t\t\tpluckedObservation = _.find(levelFiveSixVM.observations, ['behaviorObservationName', obs]);\n\t\t\t\tif (pluckedObservation) { levelFiveSixVM.selectedObservedBehaviors.push(pluckedObservation); }\n\t\t\t});\n\n\t\t\tlevelFiveSixVM.behaviorObservationPlaceholder = observationArray.length === 0 ? \"Select\" : observationArray.length === 1 ? observationArray[0] : \"Multiple selections\";\n\n\t\t\tlevelFiveSixVM.maximumObservationsLimitReached = observationArray.length > 5 ? true : false;\n\n\t\t\tlevelFiveSixVM.noObservationsSelected = observationArray.length === 0;\n\n\t\t\tvalidateMultiSelectObservedBehaviors();\n\t\t}\n\n\t\tfunction areNotesCompleteIfRequired() {\n\t\t\tif (!hasSelectedAnObservationRequiringNotes()) { return true; }\n\n\t\t\treturn levelFiveSixVM.notes.length > 0;\n\t\t}\n\n\t\t$scope.$watch('levelFiveSixVM.incidentTime', validateIncidentDateTime);\n\t\t$scope.$watch('levelFiveSixVM.incidentDate', validateIncidentDateTime);\n\n\t\t// ------------------ Entity data building functions --------------------------\n\t\tfunction buildBehaviorEvent() {\n\t\t\treturn {\n\t\t\t\tBehaviorEventID: isBehaviorUpdate() ? levelFiveSixVM.behaviorEventId : 0,\n\t\t\t\tDate: levelFiveSixVM.incidentDate,\n\t\t\t\tTime: moment(levelFiveSixVM.incidentTime).format('HH:mm:ss'),\n\t\t\t\tBehaviorLocationID: levelFiveSixVM.selectedLocation,\n\t\t\t\tNotes: levelFiveSixVM.notes,\n\t\t\t\tReferredByStaffID: levelFiveSixVM.selectedReferredBy.personID,\n\t\t\t\t//CourseSectionGroupID\n\t\t\t\t//MeetingBlockTimeID\n\t\t\t\tIsCourseSectionBehaviorEvent: false,\n\t\t\t\tIsIncomplete: false,\n\t\t\t\t//CoreSubjectLevel1ID\n\t\t\t\tSchoolID: levelFiveSixVM.schoolId,\n\t\t\t\tAcademicYearID: levelFiveSixVM.academicYearId,\n\t\t\t\tCreatedByStaffID: levelFiveSixVM.staffID,\n\t\t\t\tIsAdvancedFieldIncomplete: true\n\t\t\t};\n\t\t}\n\n\t\tfunction buildBehaviorEventObservations() {\n\t\t\tvar observationArray = [];\n\n\t\t\tif (levelFiveSixVM.isOhioSchool) {\n\t\t\t\t_.each(_.map(levelFiveSixVM.selectedObservedBehaviors, 'behaviorObservationID'), function (obs) {\n\t\t\t\t\tobservationArray.push({\n\t\t\t\t\t\tBehaviorObservationID: obs,\n\t\t\t\t\t\tCreatedByStaffID: levelFiveSixVM.staffID\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tobservationArray.push({\n\t\t\t\t\tBehaviorObservationID: levelFiveSixVM.selectedObservedBehavior,\n\t\t\t\t\tCreatedByStaffID: levelFiveSixVM.staffID\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn observationArray;\n\t\t}\n\n\t\tfunction buildBehaviorEventParticipantView(participant) {\n\t\t\tvar behaviorEventParticipantView =\n\t\t\t{\n\t\t\t\tBehaviorEventParticipant:\n\t\t\t\t{\n\t\t\t\t\tBehaviorEventParticipantID: 0,\n\t\t\t\t\tBehaviorEventID: 0,\n\t\t\t\t\tAcademicYearID: levelFiveSixVM.academicYearId,\n\t\t\t\t\tSchoolID: levelFiveSixVM.schoolId,\n\t\t\t\t\tBehaviorParticipantTypeID: participant.selectedParticipantType,\n\t\t\t\t\tParticipantStudentInSchoolID: participant.selectedParticipantType === 1 ? participant.selectedPerson.personID : null,\n\t\t\t\t\tParticipantGuardianID: participant.selectedParticipantType === 2 ? participant.selectedPerson.personID : null,\n\t\t\t\t\tParticipantStaffID: participant.selectedParticipantType === 3 ? participant.selectedPerson.personID : null,\n\t\t\t\t\tParticipantOther: participant.selectedParticipantType === 4 ? participant.selectedPerson : null,\n\t\t\t\t\tParticipantOtherAge: participant.otherParticipantAge ? participant.otherParticipantAge : null,\n\t\t\t\t\tParticipantOtherRaceId: participant.otherParticipantRace ? participant.otherParticipantRace : null,\n\t\t\t\t\tParticipantOtherIsHispanic: participant.otherParticipantIsHispanic != null ? participant.otherParticipantIsHispanic : null,\n\t\t\t\t\tParticipantOtherGenderId: participant.otherParticipantSex ? participant.otherParticipantSex : null,\n\t\t\t\t\tBehaviorLevelID: participant.selectedLevel || -1, // -1 is the No Behavior value\n\t\t\t\t\tBehaviorRoleID: participant.selectedRole,\n\t\t\t\t\tIncludeInParentEmail: false,\n\t\t\t\t\tActionsPriorToBehavior: null,\n\t\t\t\t\tStudentGainFromBehavior: null,\n\t\t\t\t\tNotes: participant.notes,\n\t\t\t\t\tIsPendingLevel6: participant.isPendingLevel6,\n\t\t\t\t\tIsRestraint: participant.isRestraint,\n\t\t\t\t\tIsSecluded: participant.isSecluded,\n\t\t\t\t\tRestartBspCount: participant.restartBspCount,\n\t\t\t\t\tCreatedByStaffID: levelFiveSixVM.staffID,\n\t\t\t\t},\n\n\t\t\t\t// Build \n\t\t\t\tBehaviorEventParticipantMotivations: buildEventParticipantOptions(\n\t\t\t\t\tparticipant.selectedMotivations,\n\t\t\t\t\tbuildBehaviorEventParticipantMotivation),\n\t\t\t\tBehaviorEventParticipantInterventions: buildEventParticipantOptions(\n\t\t\t\t\tparticipant.selectedInterventions,\n\t\t\t\t\tbuildBehaviorEventParticipantIntervention),\n\t\t\t\tBehaviorEventParticipantActions: buildEventParticipantOptions(\n\t\t\t\t\tparticipant.selectedActions,\n\t\t\t\t\tbuildBehaviorEventParticipantAction),\n\t\t\t\tStateBehaviorActionResults: buildParticipantStateBehaviorActionResultViews(participant)\n\t\t\t};\n\n\t\t\tif (isBehaviorUpdate()) {\n\n\t\t\t\tvar previousIncidentParticipant = _.find(levelFiveSixVM.previousIncident.BehaviorEventParticipantViews, function (bep) {\n\t\t\t\t\tvar personID = participant.selectedPerson.personID;\n\t\t\t\t\treturn (bep.behaviorEventParticipant.participantStudentInSchoolID === personID ||\n\t\t\t\t\t\tbep.behaviorEventParticipant.participantGuardianID === personID ||\n\t\t\t\t\t\tbep.behaviorEventParticipant.participantStaffID === personID) &&\n\t\t\t\t\t\tbep.behaviorEventParticipant.behaviorParticipantTypeID === participant.selectedParticipantType;\n\t\t\t\t});\n\n\t\t\t\tif (previousIncidentParticipant) {\n\t\t\t\t\tbehaviorEventParticipantView.BehaviorEventParticipant.BehaviorEventParticipantID = previousIncidentParticipant.behaviorEventParticipant.behaviorEventParticipantID;\n\t\t\t\t\tbehaviorEventParticipantView.BehaviorEventID = levelFiveSixVM.behaviorEventId;\n\n\t\t\t\t\t_.forEach(previousIncidentParticipant.behaviorEventParticipantMotivations, function (motivation) {\n\n\t\t\t\t\t\tvar item = _.find(behaviorEventParticipantView.BehaviorEventParticipantMotivations, {\n\t\t\t\t\t\t\t'BehaviorMotivationID': motivation.behaviorMotivationID\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (item) {\n\t\t\t\t\t\t\titem.BehaviorEventParticipantMotivationID = motivation.behaviorEventParticipantMotivationID;\n\t\t\t\t\t\t\titem.BehaviorEventParticipantID = motivation.behaviorEventParticipantID;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t_.forEach(previousIncidentParticipant.behaviorEventParticipantInterventions, function (intervention) {\n\n\t\t\t\t\t\tvar item = _.find(behaviorEventParticipantView.BehaviorEventParticipantInterventions, {\n\t\t\t\t\t\t\t'BehaviorInterventionID': intervention.behaviorInterventionID\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (item) {\n\t\t\t\t\t\t\titem.BehaviorEventParticipantInterventionID = intervention.behaviorEventParticipantInterventionID;\n\t\t\t\t\t\t\titem.BehaviorEventParticipantID = intervention.behaviorEventParticipantID;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t_.forEach(previousIncidentParticipant.stateBehaviorActionResults, function (actionResult) {\n\n\t\t\t\t\t\tvar item = _.find(behaviorEventParticipantView.StateBehaviorActionResults, function (ar) {\n\t\t\t\t\t\t\treturn ar.StateBehaviorActionResult.StateBehaviorActionResultID === actionResult.stateBehaviorActionResult.stateBehaviorActionResultID;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (item) {\n\t\t\t\t\t\t\tactionResult.stateBehaviorActionResult.BehaviorEventParticipantID = item.StateBehaviorActionResult.BehaviorEventParticipantID;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn behaviorEventParticipantView;\n\t\t}\n\n\t\t// One participant options mapper to rule them all. And in the darkness...\n\t\tfunction buildEventParticipantOptions(options, buildFn) {\n\t\t\treturn _(options)\n\t\t\t\t.filter({ formChecked: true })\n\t\t\t\t.map(buildFn)\n\t\t\t\t.value();\n\t\t}\n\n\t\t// Motivations\n\t\tfunction buildBehaviorEventParticipantMotivation(motivation) {\n\t\t\treturn {\n\t\t\t\tBehaviorEventParticipantMotivationID: 0,\n\t\t\t\tBehaviorEventParticipantID: 0,\n\t\t\t\tBehaviorMotivationID: motivation.behaviorMotivationID,\n\t\t\t\tCreatedByStaffID: levelFiveSixVM.staffID\n\t\t\t};\n\t\t}\n\n\t\t// Interventions\n\t\tfunction buildBehaviorEventParticipantIntervention(intervention) {\n\t\t\treturn {\n\t\t\t\tBehaviorEventParticipantInterventionID: 0,\n\t\t\t\tBehaviorEventParticipantID: 0,\n\t\t\t\tBehaviorInterventionID: intervention.behaviorInterventionID,\n\t\t\t\tCreatedByStaffID: levelFiveSixVM.staffID\n\t\t\t};\n\t\t}\n\n\t\t// Actions\n\t\tfunction buildBehaviorEventParticipantAction(action) {\n\t\t\treturn {\n\t\t\t\tBehaviorEventParticipantActionID: 0,\n\t\t\t\tBehaviorEventParticipantID: 0,\n\t\t\t\tBehaviorActionID: action.behaviorActionID,\n\t\t\t\tActionStartDate: action.actionStartDate,\n\t\t\t\tActionEndDate: action.actionEndDate,\n\t\t\t\tActionStartTime: action.actionStartTime ? moment(action.actionStartTime).format('HH:mm:ss') : null,\n\t\t\t\tActionDuration: action.actionDuration,\n\t\t\t\tBoardDecisionDate: action.boardDecisionDate,\n\t\t\t\tReturnDate: action.returnDate,\n\t\t\t\tActionDaysExtendedInNextAY: action.actionDaysExtendedInNextAY,\n\t\t\t\tIsActionPermanent: false,\n\t\t\t\tCreatedByStaffID: levelFiveSixVM.staffID\n\t\t\t};\n\t\t}\n\n\t\t// State Observation Question / Answers\n\t\tfunction buildStateBehaviorObservationResult(question) {\n\t\t\treturn {\n\t\t\t\tStateBehaviorObservationQuestionID: question.stateBehaviorObservationQuestionID,\n\t\t\t\tStateBehaviorObservationAnswerID: question.selectedAnswer,\n\t\t\t\tAnswerText: question.answerText\n\t\t\t};\n\t\t}\n\n\t\tfunction buildParticipantStateBehaviorActionResultViews(participant) {\n\t\t\tvar results = [];\n\n\t\t\t_.forEach(_.filter(participant.selectedStateQuestions, { active: true }), function (question) {\n\t\t\t\tif (question.answerDataType === 'staffdropdownmultiplevalue') {\n\t\t\t\t\tvar instanceNumber = 0;\n\t\t\t\t\t_.forEach(question.selected, function (selection) {\n\t\t\t\t\t\tvar view = {\n\t\t\t\t\t\t\tBehaviorActionID: question.behaviorActionID,\n\t\t\t\t\t\t\tIsSpecialEducationStudentRecievingInstructionFromCertifiedTeacher: isCertifiedTeacherQuestion(question),\n\t\t\t\t\t\t\tIsSpecialEducationStudentInterfacingWithGeneralEducationStudents: isGeneralEducationQuestion(question),\n\t\t\t\t\t\t\tIsSpecialEducationStudentReceivingServices: isSpecialEducationStudentReceivingServicesQuestion(question),\n\t\t\t\t\t\t\tStateBehaviorActionResult: {\n\t\t\t\t\t\t\t\tStateBehaviorActionResultID: question.stateBehaviorActionResultID || 0,\n\t\t\t\t\t\t\t\tBehaviorActionID: question.behaviorActionID || null,\n\t\t\t\t\t\t\t\tBehaviorEventParticipantID: 0,\n\t\t\t\t\t\t\t\tStateBehaviorActionQuestionID: question.stateBehaviorActionQuestionID,\n\t\t\t\t\t\t\t\tStateBehaviorActionAnswerID: question.selectedAnswer,\n\t\t\t\t\t\t\t\tInstanceNumber: ++instanceNumber,\n\t\t\t\t\t\t\t\tStaffID: selection.staffID,\n\t\t\t\t\t\t\t\tAnswerText: selection.displayName\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresults.push(view);\n\t\t\t\t\t});\n\t\t\t\t} else if (question.answerDataType === 'dropdownmultiplevalue') {\n\t\t\t\t\tvar instanceNumber = 0;\n\t\t\t\t\t_.forEach(question.selected, function (selection) {\n\t\t\t\t\t\tvar view = {\n\t\t\t\t\t\t\tBehaviorActionID: question.behaviorActionID,\n\t\t\t\t\t\t\tIsSpecialEducationStudentRecievingInstructionFromCertifiedTeacher: isCertifiedTeacherQuestion(question),\n\t\t\t\t\t\t\tIsSpecialEducationStudentInterfacingWithGeneralEducationStudents: isGeneralEducationQuestion(question),\n\t\t\t\t\t\t\tIsSpecialEducationStudentReceivingServices: isSpecialEducationStudentReceivingServicesQuestion(question),\n\t\t\t\t\t\t\tStateBehaviorActionResult: {\n\t\t\t\t\t\t\t\tStateBehaviorActionResultID: question.stateBehaviorActionResultID || 0,\n\t\t\t\t\t\t\t\tBehaviorActionID: question.behaviorActionID || null,\n\t\t\t\t\t\t\t\tBehaviorEventParticipantID: 0,\n\t\t\t\t\t\t\t\tStateBehaviorActionQuestionID: question.stateBehaviorActionQuestionID,\n\t\t\t\t\t\t\t\tStateBehaviorActionAnswerID: selection.stateBehaviorActionAnswerID,\n\t\t\t\t\t\t\t\tInstanceNumber: ++instanceNumber\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresults.push(view);\n\t\t\t\t\t});\n\t\t\t\t} else if (question.answerDataType === 'staffdropdownsinglevalue') {\n\t\t\t\t\tvar selectedStaff = question.selected;\n\t\t\t\t\tvar view = {\n\t\t\t\t\t\tBehaviorActionID: question.behaviorActionID,\n\t\t\t\t\t\tIsSpecialEducationStudentRecievingInstructionFromCertifiedTeacher: isCertifiedTeacherQuestion(question),\n\t\t\t\t\t\tIsSpecialEducationStudentInterfacingWithGeneralEducationStudents: isGeneralEducationQuestion(question),\n\t\t\t\t\t\tIsSpecialEducationStudentReceivingServices: isSpecialEducationStudentReceivingServicesQuestion(question),\n\t\t\t\t\t\tStateBehaviorActionResult: {\n\t\t\t\t\t\t\tStateBehaviorActionResultID: question.stateBehaviorActionResultID || 0,\n\t\t\t\t\t\t\tBehaviorActionID: question.behaviorActionID || null,\n\t\t\t\t\t\t\tBehaviorEventParticipantID: 0,\n\t\t\t\t\t\t\tStateBehaviorActionQuestionID: question.stateBehaviorActionQuestionID,\n\t\t\t\t\t\t\tStateBehaviorActionAnswerID: question.selectedAnswer,\n\t\t\t\t\t\t\tInstanceNumber: 1,\n\t\t\t\t\t\t\tStaffID: selectedStaff.staffID,\n\t\t\t\t\t\t\tAnswerText: selectedStaff.displayName\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tresults.push(view);\n\t\t\t\t} else {\n\t\t\t\t\tvar view = buildStateBehaviorActionResultView(question);\n\t\t\t\t\tresults.push(view);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn results;\n\t\t}\n\n\t\t// State Action Question / Answers\n\t\tfunction buildStateBehaviorActionResultView(question) {\n\t\t\treturn {\n\t\t\t\tBehaviorActionID: question.behaviorActionID,\n\t\t\t\tIsSpecialEducationStudentRecievingInstructionFromCertifiedTeacher: isCertifiedTeacherQuestion(question),\n\t\t\t\tIsSpecialEducationStudentInterfacingWithGeneralEducationStudents: isGeneralEducationQuestion(question),\n\t\t\t\tIsSpecialEducationStudentReceivingServices: isSpecialEducationStudentReceivingServicesQuestion(question),\n\t\t\t\tStateBehaviorActionResult: {\n\t\t\t\t\tStateBehaviorActionResultID: question.stateBehaviorActionResultID || 0,\n\t\t\t\t\tBehaviorActionID: question.behaviorActionID || null,\n\t\t\t\t\tBehaviorEventParticipantID: 0,\n\t\t\t\t\tStateBehaviorActionQuestionID: question.stateBehaviorActionQuestionID,\n\t\t\t\t\tStateBehaviorActionAnswerID: question.selectedAnswer,\n\t\t\t\t\tInstanceNumber: 1,\n\t\t\t\t\tAnswerText: formatAnswerText(question)\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tfunction formatAnswerText(question) {\n\t\t\tif (question.answerDataType) {\n\t\t\t\tswitch (question.answerDataType) {\n\t\t\t\t\tcase 'datetime':\n\t\t\t\t\t\treturn createMomentWithSetDate(question.answerTextTime, question.answerTextDate).format();\n\t\t\t\t\tcase 'date':\n\t\t\t\t\t\treturn question.answerTextDate.format('YYYY-MM-DD');\n\t\t\t\t\tcase 'time':\n\t\t\t\t\t\treturn moment(question.answerTextTime).format('HH:mm');\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn question.answerText;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (question.answerText) {\n\t\t\t\t\treturn question.answerText;\n\t\t\t\t} else if (question.answerTextTime && question.answerTextDate) {\n\t\t\t\t\treturn createMomentWithSetDate(question.answerTextTime, question.answerTextDate).format();\n\t\t\t\t} else if (question.answerTextTime) {\n\t\t\t\t\treturn moment(question.answerTextTime).format('HH:mm');\n\t\t\t\t} else if (question.answerTextDate) {\n\t\t\t\t\treturn question.answerTextDate.format('YYYY-MM-DD');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// ------------------ State Question / Answer functions --------------------------\n\t\tfunction getEnabledCount(questions) {\n\t\t\tvar enabledAndActive = _.filter(questions, function (q) {\n\t\t\t\treturn q.enabled === true && q.active === true;\n\t\t\t});\n\t\t\treturn enabledAndActive ? enabledAndActive.length : 0;\n\t\t}\n\n\t\tfunction showHideStateQuestions() {\n\t\t\tvar now = moment();\n\t\t\tvar effectiveDate = moment(levelFiveSixVM.incidentDate) || moment({\n\t\t\t\tyear: now.year(),\n\t\t\t\tmonth: now.month(),\n\t\t\t\tday: now.date()\n\t\t\t});\n\n\t\t\tif (!levelFiveSixVM.isOhioSchool) {\n\t\t\t\t_(levelFiveSixVM.stateQuestions)\n\t\t\t\t\t.filter({ 'behaviorObservationID': levelFiveSixVM.selectedObservedBehavior })\n\t\t\t\t\t.each(function (q) {\n\t\t\t\t\t\tq.active = moment(q.startDate) <= effectiveDate && (_.isNull(q.endDate) || moment(q.endDate) >= effectiveDate);\n\t\t\t\t\t\t_.each(q.answers, function (qa) {\n\t\t\t\t\t\t\tqa.active = moment(qa.startDate) <= effectiveDate && (_.isNull(qa.endDate) || moment(qa.endDate) >= effectiveDate)\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif (isRootQuestion(q) || hasSatisfyingParentAnswer(q)) {\n\t\t\t\t\t\t\tq.enabled = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tclearStateQuestion(q);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t_.each(levelFiveSixVM.selectedObservedBehaviors, function (obs) {\n\t\t\t\t\t_(levelFiveSixVM.stateQuestions)\n\t\t\t\t\t\t.filter({ 'behaviorObservationID': obs.behaviorObservationID })\n\t\t\t\t\t\t.each(function (q) {\n\t\t\t\t\t\t\tq.active = moment(q.startDate) <= effectiveDate && (_.isNull(q.endDate) || moment(q.endDate) >= effectiveDate);\n\t\t\t\t\t\t\t_.each(q.answers, function (qa) {\n\t\t\t\t\t\t\t\tqa.active = moment(qa.startDate) <= effectiveDate && (_.isNull(qa.endDate) || moment(qa.endDate) >= effectiveDate)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tif (isRootQuestion(q) || hasSatisfyingParentAnswer(q)) {\n\t\t\t\t\t\t\t\tq.enabled = true;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tclearStateQuestion(q);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction showQuestionFilter(qa) {\n\t\t\treturn qa.enabled === true && qa.active === true;\n\t\t}\n\n\t\tfunction isRootQuestion(question) {\n\t\t\t// Root questions are ones with no parent questions\n\t\t\tvar returnValue = question.parentStateBehaviorObservationQuestionID === null;\n\t\t\t//log('Question:', question.question, '- ID:', question.stateBehaviorActionQuestionID, '- Fn Name: isRootQuestion', '- Return Value:', returnValue);\n\t\t\treturn returnValue;\n\t\t}\n\n\t\tfunction hasSatisfyingParentAnswer(question) {\n\t\t\tvar parentQuestion = getParentQuestion(question.parentStateBehaviorObservationQuestionID);\n\n\t\t\t// Has a parent question\n\t\t\tvar hasParentQuestion = question.parentStateBehaviorObservationQuestionID !== null;\n\n\t\t\t// Question ignores parent answer as long as it has one\n\t\t\tvar questionIgnoresParentsAnswer = question.parentStateBehaviorObservationAnswerID === null && parentQuestion.selectedAnswer !== null;\n\n\t\t\t// Parent's selectedAnswer is the questions parentStateBehaviorObservationAnswerID\n\t\t\tvar questionsParentHasMatchingAnswer = parentQuestion.selectedAnswer == question.parentStateBehaviorObservationAnswerID && parentQuestion.selectedAnswer !== null;\n\n\t\t\treturn hasParentQuestion && (questionIgnoresParentsAnswer || questionsParentHasMatchingAnswer);\n\t\t}\n\n\t\tfunction getParentQuestion(parentStateBehaviorObservationQuestionId) {\n\t\t\treturn _(levelFiveSixVM.stateQuestions).find({ 'stateBehaviorObservationQuestionID': parentStateBehaviorObservationQuestionId });\n\t\t}\n\n\t\tfunction clearAllStateQuestions() {\n\t\t\t_(levelFiveSixVM.stateQuestions).each(clearStateQuestion);\n\t\t}\n\n\t\tfunction clearStateQuestion(question) {\n\t\t\tquestion.enabled = false;\n\t\t\tquestion.selectedAnswer = null;\n\t\t\tquestion.answerText = null;\n\t\t\tquestion.showAnswerTextInput = false;\n\t\t\tquestion.selected = null;\n\t\t\tif (question.schoolStaffList) {\n\t\t\t\tvar selected = _.filter(question.schoolStaffList, { selected: true });\n\t\t\t\t_.each(selected, function (s) {\n\t\t\t\t\ts.selected = false;\n\t\t\t\t});\n\t\t\t\tquestion.displayText = \"Select all that apply...\";\n\t\t\t}\n\t\t\tif (question.answers) {\n\t\t\t\tvar selected = _.filter(question.answers, { selected: true });\n\t\t\t\t_.each(selected, function (s) {\n\t\t\t\t\ts.selected = false;\n\t\t\t\t});\n\t\t\t\tquestion.displayText = \"Select all that apply...\";\n\t\t\t}\n\t\t}\n\n\t\tfunction areAllStateQuestionsAnswered(stateQuestions) {\n\t\t\treturn validateStateQuestionsAndAnswers(stateQuestions)\n\t\t\t\t.every(function (q) { return !q.showFieldError; });\n\t\t}\n\n\t\tfunction validateStateQuestionsAndAnswers(stateQuestions) {\n\t\t\t// We only want this to fire if the user has clicked the save button and validation logic ran (and failed)\n\t\t\t// Otherwise, you would see error messages under the state questions as soon as someone clicked one of the answers\n\t\t\t// Alternatively, we want this to run if someone passed in stateQuestions as a parameter\n\t\t\tif (stateQuestions || levelFiveSixVM.saveButtonHasBeenClicked) {\n\t\t\t\t_(stateQuestions || levelFiveSixVM.stateQuestions)\n\t\t\t\t\t.filter(function (q) { return q.enabled === true && q.active === true; })\n\t\t\t\t\t.each(function (q) {\n\t\t\t\t\t\tvar isValid;\n\t\t\t\t\t\tswitch (q.answerDataType) {\n\t\t\t\t\t\t\tcase 'boolean':\n\t\t\t\t\t\t\tcase 'dropdown':\n\t\t\t\t\t\t\t\tisValid = validateSelectedAnswer(q);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'textbox':\n\t\t\t\t\t\t\tcase 'int':\n\t\t\t\t\t\t\tcase 'textarea':\n\t\t\t\t\t\t\t\tisValid = validateAnswerText(q);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'date':\n\t\t\t\t\t\t\t\tisValid = validateAnswerTextDate(q);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'datetime':\n\t\t\t\t\t\t\t\tisValid = validateAnswerTextDate(q) && validateAnswerTextTime(q);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'time':\n\t\t\t\t\t\t\t\tisValid = validateAnswerTextTime(q);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'staffdropdownsinglevalue':\n\t\t\t\t\t\t\t\tisValid = validateStaffDropDownSingleAnswer(q);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'staffdropdownmultiplevalue':\n\t\t\t\t\t\t\tcase 'dropdownmultiplevalue':\n\t\t\t\t\t\t\t\tisValid = validateStaffDropDownMultipleAnswer(q);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tq.showFieldError = !isValid;\n\t\t\t\t\t});\n\n\t\t\t\treturn stateQuestions ? stateQuestions : null;\n\t\t\t}\n\t\t}\n\n\t\tfunction validateStaffDropDownSingleAnswer(q) {\n\t\t\treturn !!q.selected\n\t\t}\n\n\t\tfunction validateStaffDropDownMultipleAnswer(q) {\n\t\t\treturn _.size(q.selected) > 0;\n\t\t}\n\n\t\tfunction validateSelectedAnswer(q) {\n\t\t\tif (q.showAnswerTextInput) {\n\t\t\t\treturn !!q.selectedAnswer && validateAnswerText(q);\n\t\t\t}\n\n\t\t\treturn !!q.selectedAnswer;\n\t\t}\n\n\t\tfunction validateAnswerText(q) {\n\t\t\treturn !!q.answerText;\n\t\t}\n\n\t\tfunction validateAnswerTextDate(q) {\n\t\t\treturn !!q.answerTextDate && moment.isMoment(q.answerTextDate) && moment(q.answerTextDate).isValid();\n\t\t}\n\n\t\tfunction validateAnswerTextTime(q) {\n\t\t\treturn !!q.answerTextTime && moment(q.answerTextTime).isValid();\n\t\t}\n\n\t\tfunction showAnswerTextInput(qa, idColumnName) {\n\t\t\tvar selectedAnswer = _(qa.answers).find(function (answer) {\n\t\t\t\treturn answer[idColumnName] == qa.selectedAnswer;\n\t\t\t});\n\n\t\t\tif (selectedAnswer) {\n\t\t\t\tqa.showAnswerTextInput = selectedAnswer.isTextEntry;\n\t\t\t}\n\t\t}\n\n\t\t// ------------------ Edit / Update event functions --------------------------\n\t\tfunction setFormValues(behaviorEvent) {\n\t\t\tvar previousEvent = behaviorEvent.behaviorEvent;\n\t\t\tvar previousObservations = behaviorEvent.behaviorEventObservations;\n\t\t\tvar previousParticipants = behaviorEvent.behaviorEventParticipantViews;\n\t\t\tvar previousStateBehaviorObservationResults = behaviorEvent.stateBehaviorObservationResults;\n\n\t\t\tvar isCorrectBehaviorLevel = _(previousParticipants).some(function (participantView) {\n\t\t\t\treturn participantView.behaviorEventParticipant.behaviorLevelID === 5 || participantView.behaviorEventParticipant.behaviorLevelID === 6;\n\t\t\t});\n\n\t\t\tif (!isCorrectBehaviorLevel) {\n\t\t\t\twrongBehaviorLevel();\n\t\t\t}\n\n\t\t\tlevelFiveSixVM.previousIncident =\n\t\t\t{\n\t\t\t\tBehaviorEvent: previousEvent,\n\t\t\t\tBehaviorEventObservations: previousObservations,\n\t\t\t\tBehaviorEventParticipantViews: previousParticipants,\n\t\t\t\tStateBehaviorObservationResults: previousStateBehaviorObservationResults\n\t\t\t};\n\n\t\t\t_.each(levelFiveSixVM.previousIncident.BehaviorEventParticipantViews, function (bep) {\n\t\t\t\t_.each(bep.behaviorEventParticipantActions, function (action) {\n\t\t\t\t\tif (action.actionStartDate) {\n\t\t\t\t\t\taction.actionStartDate = moment.utc(action.actionStartDate).format('L');\n\t\t\t\t\t}\n\t\t\t\t\tif (action.actionEndDate) {\n\t\t\t\t\t\taction.actionEndDate = moment.utc(action.actionEndDate).format('L');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tlevelFiveSixVM.incidentDate = moment.utc(previousEvent.date).format('L');\n\t\t\tlevelFiveSixVM.incidentTime = createMomentWithSetDate(moment(previousEvent.time, 'HH:mma'), levelFiveSixVM.incidentDate).toDate();\n\t\t\tlevelFiveSixVM.selectedLocation = previousEvent.behaviorLocationID;\n\t\t\tlevelFiveSixVM.notes = previousEvent.notes;\n\n\t\t\t// Referred By\n\t\t\tloadReferredBy(previousEvent.referredByStaffID);\n\n\t\t\t// Participants\n\t\t\tlevelFiveSixVM.checkForAnyLevelSixParticipants(previousParticipants);\n\n\t\t\t// Observation(s)\n\t\t\tif (levelFiveSixVM.isOhioSchool) {\n\t\t\t\tlevelFiveSixVM.selectedObservedBehavior = null;\n\t\t\t\tlevelFiveSixVM.selectedObservedBehaviors = previousObservations;\n\n\t\t\t\tvar selectedObservations = {};\n\n\t\t\t\t_.each(levelFiveSixVM.selectedObservedBehaviors, function (obs) {\n\t\t\t\t\tvar observationName = obs.behaviorObservationName;\n\t\t\t\t\tselectedObservations[observationName] = true;\n\t\t\t\t});\n\n\t\t\t\tlevelFiveSixVM.selectedObservedBehaviorArray.selectedObservation = _.clone(selectedObservations, true);\n\n\t\t\t\tlevelFiveSixVM.behaviorObservationPlaceholder = previousObservations.length === 0 ? \"Select\" : previousObservations.length === 1 ? previousObservations[0].behaviorObservationName : \"Multiple selections\";\n\t\t\t} else {\n\t\t\t\tlevelFiveSixVM.selectedObservedBehavior = previousObservations[0].behaviorObservationID;\n\t\t\t\tlevelFiveSixVM.selectedObservedBehaviors = [];\n\t\t\t}\n\n\t\t\tonObservedBehaviorChange();\n\t\t}\n\n\t\tfunction matchStateQuestions() {\n\t\t\t// State Observation questions\n\t\t\t_(levelFiveSixVM.stateQuestions).each(function (qa) {\n\t\t\t\tvar selectedAnswer = _(levelFiveSixVM.previousIncident.StateBehaviorObservationResults).find({ stateBehaviorObservationQuestionID: qa.stateBehaviorObservationQuestionID });\n\n\t\t\t\tif (!_.isEmpty(selectedAnswer) && qa.selectedAnswer === null) {\n\t\t\t\t\tqa.selectedAnswer = selectedAnswer.stateBehaviorObservationAnswerID;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction loadReferredBy(staffId) {\n\t\t\tlevelFiveSixVM.isReferredByTypaheadLoading = true;\n\n\t\t\tpersonSearchService.staffSearchByID(staffId).then(function (data) {\n\t\t\t\tlevelFiveSixVM.selectedReferredBy = { name: data[0].firstName + ' ' + data[0].lastName, personID: data[0].personID };\n\t\t\t\tlevelFiveSixVM.isReferredByTypaheadLoading = false;\n\t\t\t}, function (error) {\n\t\t\t\tlog('Referred by staffID did not load properly', error);\n\t\t\t});\n\t\t}\n\n\t\tfunction loadParticipantUiValues(participant) {\n\t\t\tswitch (participant.behaviorParticipantTypeID) {\n\t\t\t\tcase 1:\n\t\t\t\t\treturn studentListService.getStudentsIndicators(participant.participantStudentInSchoolID).then(function (student) {\n\t\t\t\t\t\treturn student[0];\n\t\t\t\t\t});\n\t\t\t\tcase 2:\n\t\t\t\t\treturn personSearchService.parentSearchByID(participant.participantGuardianID).then(function (data) {\n\t\t\t\t\t\treturn _(data).map(function (p) {\n\t\t\t\t\t\t\tp.fullName = p.firstName + ' ' + p.lastName;\n\t\t\t\t\t\t\treturn p;\n\t\t\t\t\t\t}).last();\n\t\t\t\t\t});\n\t\t\t\tcase 3:\n\t\t\t\t\treturn personSearchService.staffSearchByID(participant.participantStaffID).then(function (data) {\n\t\t\t\t\t\treturn _(data).map(function (p) {\n\t\t\t\t\t\t\tp.fullName = p.firstName + ' ' + p.lastName;\n\t\t\t\t\t\t\treturn p;\n\t\t\t\t\t\t}).last();\n\t\t\t\t\t});\n\t\t\t\tcase 4:\n\t\t\t\t\tparticipant.fullName = participant.participantOther;\n\t\t\t\t\treturn participant;\n\t\t\t}\n\t\t}\n\n\t\tfunction getLevelforUi(participant) {\n\t\t\tvar level = participant.selectedLevel;\n\n\t\t\tif (level <= 0) { return null; }\n\n\t\t\tif (level === 5) { return participant.isPendingLevel6 ? '5-P6' : '5'; }\n\n\t\t\treturn level;\n\t\t}\n\n\t\tfunction setParticipantViewValuesFromPreviousIncident(participant) {\n\t\t\t$q.all({\n\t\t\t\tparticipantUiValues: loadParticipantUiValues(participant.behaviorEventParticipant)\n\t\t\t}).then(function (data) {\n\t\t\t\tvar participantUiValues = data.participantUiValues;\n\n\t\t\t\tvar level = participant.behaviorEventParticipant.behaviorLevelID;\n\t\t\t\tvar updatedParticipant = {\n\t\t\t\t\tselectedParticipantType: participant.behaviorEventParticipant.behaviorParticipantTypeID,\n\t\t\t\t\tselectedPerson: !isParticipantTypeOther(participant.behaviorEventParticipant.behaviorParticipantTypeID) ?\n\t\t\t\t\t\t{ name: participantUiValues.fullName, studentID: participantUiValues.studentID, personID: getParticipantId(participant.behaviorEventParticipant) } :\n\t\t\t\t\t\tparticipantUiValues.fullName,\n\t\t\t\t\tselectedRole: participant.behaviorEventParticipant.behaviorRoleID,\n\t\t\t\t\tselectedLevel: level,\n\t\t\t\t\tnotes: participant.behaviorEventParticipant.notes,\n\t\t\t\t\tisPendingLevel6: participant.behaviorEventParticipant.isPendingLevel6,\n\t\t\t\t\tisRestraint: participant.behaviorEventParticipant.isRestraint,\n\t\t\t\t\tisSecluded: participant.behaviorEventParticipant.isSecluded,\n\t\t\t\t\trestartBspCount: participant.behaviorEventParticipant.restartBspCount,\n\t\t\t\t\tisSpecialEd: participantUiValues.isSpecialEd,\n\t\t\t\t\tisSection504: participantUiValues.isSection504,\n\t\t\t\t\tselectedActions: buildParticipantSelectedOptionsFromSavedData(participant.behaviorEventParticipantActions),\n\t\t\t\t\tselectedInterventions: buildParticipantSelectedOptionsFromSavedData(participant.behaviorEventParticipantInterventions),\n\t\t\t\t\tselectedMotivations: buildParticipantSelectedOptionsFromSavedData(participant.behaviorEventParticipantMotivations),\n\t\t\t\t\tselectedStateQuestions: buildParticipantStateSelectedQuestions(participant.stateBehaviorActionResults),\n\t\t\t\t\tmaxExpulsionDuration: participant.behaviorEventParticipant.maxExpulsionDuration\n\t\t\t\t};\n\n\t\t\t\t// type=other UI values\n\t\t\t\tif (updatedParticipant.selectedParticipantType == 4) {\n\t\t\t\t\tupdatedParticipant.otherParticipantAge = participantUiValues.participantOtherAge;\n\t\t\t\t\tupdatedParticipant.otherParticipantSex = participantUiValues.participantOtherGenderId;\n\t\t\t\t\tupdatedParticipant.otherParticipantIsHispanic = participantUiValues.participantOtherIsHispanic;\n\t\t\t\t\tupdatedParticipant.otherParticipantRace = participantUiValues.participantOtherRaceId;\n\t\t\t\t}\n\n\t\t\t\tvar actionsForUi = levelFiveSixVM.getActionsForUi(updatedParticipant);\n\t\t\t\tvar roleName = levelFiveSixVM.getRoleNameById(levelFiveSixVM.behaviorRoles, participant.behaviorEventParticipant.behaviorRoleID);\n\n\t\t\t\tupdatedParticipant.levelFiveUi = {\n\t\t\t\t\tfullName: participantUiValues.fullName,\n\t\t\t\t\trole: roleName,\n\t\t\t\t\tlevel: getLevelforUi(updatedParticipant),\n\t\t\t\t\tactionTaken: actionsForUi ? _.map(actionsForUi, 'name') : null,\n\t\t\t\t\tactionStartDate: actionsForUi ? _.map(actionsForUi, 'startDate') : null,\n\t\t\t\t\tduration: actionsForUi ? _.map(actionsForUi, 'duration') : null,\n\n\t\t\t\t\t// Student only fields\n\t\t\t\t\tstudentInSchoolId: participantUiValues.studentInSchoolID,\n\t\t\t\t\tstudentId: participantUiValues.studentID,\n\t\t\t\t\tactiveBSP: participantUiValues.activeBSP,\n\t\t\t\t\tisSpecialEd: participantUiValues.isSpecialEd,\n\t\t\t\t\tisSection504: participantUiValues.isSection504,\n\t\t\t\t\tisInSchoolSuspended: participantUiValues.isInSchoolSuspended,\n\t\t\t\t\tisOutOfSchoolSuspended: participantUiValues.isOutOfSchoolSuspended,\n\t\t\t\t\tisExpelled: participantUiValues.isExpelled\n\t\t\t\t};\n\n\t\t\t\tlevelFiveSixVM.participants.push(updatedParticipant);\n\t\t\t});\n\t\t}\n\n\t\tfunction buildParticipantStateSelectedQuestions(stateBehaviorActionResults) {\n\t\t\tlog('stateBehaviorActionResults', stateBehaviorActionResults);\n\t\t\tvar rawMapping = _(stateBehaviorActionResults).map(buildSelectedStateActionQuestionsFromSavedData).value();\n\t\t\tlog('rawMapping', rawMapping);\n\t\t\t//var groupedMapping = _.groupBy(rawMapping, 'stateBehaviorActionQuestionID');\n\t\t\t//log('groupedMapping', groupedMapping);\n\t\t\treturn rawMapping;\n\t\t}\n\n\t\tfunction getParticipantId(participant) {\n\t\t\treturn participant.participantStudentInSchoolID || participant.participantStaffID || participant.participantGuardianID;\n\t\t}\n\n\t\tfunction buildParticipantSelectedOptionsFromSavedData(selectedEventParticipantOptions) {\n\t\t\treturn _(selectedEventParticipantOptions).map(function (option) {\n\t\t\t\tif (option.actionStartTime) {\n\t\t\t\t\toption.actionStartTime = moment(option.actionStartTime, 'HH:mm:ss').toDate();\n\t\t\t\t}\n\n\t\t\t\toption.formChecked = true;\n\t\t\t\treturn option;\n\t\t\t}).value();\n\t\t}\n\n\t\tfunction buildSelectedStateActionQuestionsFromSavedData(qa) {\n\t\t\t// Database doesn't store text answers and date answers any differently so we make that distinction here.\n\t\t\tvar answerTextDate = moment(qa.stateBehaviorActionResult.answerText, 'YYYY-MM-DD', true), // true = strict format\n\t\t\t\tanswerTextDateTime = moment(qa.stateBehaviorActionResult.answerText, 'YYYY-MM-DDTHH:mm:ssZ', true),\n\t\t\t\tanswerTextTime = null,\n\t\t\t\tanswerText = null;\n\n\t\t\tif (answerTextDateTime.isValid()) {\n\t\t\t\tanswerTextDate = moment(answerTextDateTime);\n\t\t\t\tanswerTextTime = answerTextDateTime.toDate();\n\t\t\t} else {\n\t\t\t\tanswerTextTime = moment(qa.stateBehaviorActionResult.answerText, 'HH:mm', true);\n\t\t\t\tif (!answerTextTime.isValid()) {\n\t\t\t\t\tanswerTextTime = null;\n\t\t\t\t} else {\n\t\t\t\t\tanswerTextTime = answerTextTime.toDate();\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tif (!answerTextDate.isValid() && !answerTextDateTime.isValid()) {\n\t\t\t\tanswerText = qa.stateBehaviorActionResult.answerText;\n\t\t\t\tanswerTextDate = null;\n\t\t\t\tanswerTextDateTime = null;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tbehaviorActionID: qa.behaviorActionID,\n\t\t\t\tstateBehaviorActionResultID: qa.stateBehaviorActionResult.stateBehaviorActionResultID,\n\t\t\t\tstateBehaviorActionQuestionID: qa.stateBehaviorActionResult.stateBehaviorActionQuestionID,\n\t\t\t\tselectedAnswer: qa.stateBehaviorActionResult.stateBehaviorActionAnswerID,\n\t\t\t\tanswerText: answerText,\n\t\t\t\tanswerTextDate: answerTextDate,\n\t\t\t\tanswerTextTime: answerTextTime, // && answerTextTime.isValid() ? answerTextTime : null,\n\t\t\t\tinstanceNumber: qa.stateBehaviorActionResult.instanceNumber,\n\t\t\t\tstaffID: qa.stateBehaviorActionResult.staffID\n\t\t\t};\n\t\t}\n\n\t\tfunction loadPreviousIncident() {\n\t\t\treturn behaviorEventMultipleParticipantIncidentRepository.get(levelFiveSixVM.behaviorEventId)\n\t\t\t\t.then(setFormValues, onDataLoadError);\n\t\t}\n\n\t\t// ------------------ Helper functions --------------------------\n\t\tvar isCertifiedTeacherQuestion = specialEdStudentAndActionParticipantFactory('usesIsSpecialEducationStudentRecievingInstructionFromCertifiedTeacher');\n\t\tvar isGeneralEducationQuestion = specialEdStudentAndActionParticipantFactory('usesIsSpecialEducationStudentInterfacingWithGeneralEducationStudents');\n\t\tvar isSpecialEducationStudentReceivingServicesQuestion = specialEdStudentAndActionParticipantFactory('usesIsSpecialEducationStudentReceivingServices');\n\n\t\tfunction specialEdStudentAndActionParticipantFactory(fieldName) {\n /* \n \n I'm putting this comment here because the name of this function isn't very descriptive.\n There's a special rule for some state action questions:\n - Was Instruction provided to the student by a certified Teacher and\n - Did the student receive instruction with General Ed Peers?\n - Will the student continue to receive programs/services specified in the IEP?\n\n The answers need to be recorded on the BehaviorEventParticipantActions table.\n\n This function can handle the logic for getting the value for either of those questions without duplicating logic.\n */\n\n\t\t\treturn function (question) {\n\t\t\t\t// Check if question is the right type of question\n\t\t\t\tif (question[fieldName] === false) return null;\n\n\t\t\t\t// Check if user answered 'yes'\n\t\t\t\treturn _(question.answers)\n\t\t\t\t\t.filter(function (a) {\n\t\t\t\t\t\treturn a.stateBehaviorActionAnswerID == question.selectedAnswer;\n\t\t\t\t\t})\n\t\t\t\t\t.some(function (a) {\n\t\t\t\t\t\treturn _(a.answer.toLowerCase()).includes('y');\n\t\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\tfunction goToPreviousScreen() {\n\t\t\tif (levelFiveSixVM.isStudentRecord) {\n\t\t\t\t$state.go('student.behavior.main.behaviorlist');\n\t\t\t} else {\n\t\t\t\t$state.go('behavior-manager');\n\t\t\t}\n\t\t}\n\n\t\tfunction createMomentWithSetDate(time, date) {\n\t\t\treturn moment(time).set({ years: moment(date).year(), months: moment(date).month(), date: moment(date).date() });\n\t\t}\n\n\t\tfunction isOffenderOrParticipant(participant) {\n\t\t\treturn participant.selectedRole === 1 || participant.selectedRole === 2;\n\t\t}\n\n\t\tfunction anyStateQuestions() {\n\t\t\treturn _(levelFiveSixVM.stateQuestions).some(function (x) { return x.enabled === true; });\n\t\t}\n\n\t\tfunction isParticipantTypeStudent(selectedParticipantType) {\n\t\t\treturn selectedParticipantType === 1 ? true : false; // Student\n\t\t}\n\n\t\tfunction isParticipantTypeOther(selectedParticipantType) {\n\t\t\treturn selectedParticipantType && selectedParticipantType === 4 ? true : false; // Other\n\t\t}\n\n\t\tfunction getRoleById(roles, roleId) {\n\t\t\treturn _.find(roles, { behaviorRoleID: roleId });\n\t\t}\n\n\t\tfunction getRoleNameById(roles, roleId) {\n\t\t\tvar role = getRoleById(roles, roleId);\n\n\t\t\tif (role) {\n\t\t\t\treturn role.behaviorRoleName;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tfunction isWitnessOrVictim(roleId) {\n\t\t\treturn roleId === 3 || roleId === 4;\n\t\t}\n\n\t\tfunction isParticipantWitnessOrVictim(participant) {\n\t\t\treturn isWitnessOrVictim(participant.selectedRole);\n\t\t}\n\n\t\tfunction isFirstParticipant() {\n\t\t\treturn levelFiveSixVM.participants.length === 0;\n\t\t}\n\n\t\tfunction getParticipantTypeName(participantTypes, participant) {\n\t\t\t// TODO could possibly be moved into add-participant.controler.js?\n\t\t\treturn _.find(participantTypes,\n\t\t\t\t{ \"behaviorParticipantTypeID\": participant.selectedParticipantType })\n\t\t\t\t.behaviorParticipantTypeName;\n\t\t}\n\n\t\tfunction getActionsForUi(participant) {\n\t\t\tvar returnedActions = [];\n\n\t\t\tif (participant.selectedActions) {\n\t\t\t\t_.forEach(participant.selectedActions, function (action) {\n\t\t\t\t\tvar returnedAction = {\n\t\t\t\t\t\tname: action.behaviorActionName,\n\t\t\t\t\t\tduration: action.actionDuration ? action.actionDuration + ' days' : '---',\n\t\t\t\t\t\tstartDate: action.actionStartDate ? moment(action.actionStartDate).format('L') : '---',\n\t\t\t\t\t\tendDate: action.actionEndDate ? moment(action.actionEndDate).format('L') : '---',\n\t\t\t\t\t};\n\n\t\t\t\t\treturnedActions.push(returnedAction);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn returnedActions;\n\t\t}\n\n\t\tfunction isBehaviorAdd() {\n\t\t\treturn levelFiveSixVM.action === 'add';\n\t\t}\n\n\t\tfunction isBehaviorUpdate() {\n\t\t\treturn levelFiveSixVM.action === 'update';\n\t\t}\n\n\t\tfunction refreshFormValues() {\n\t\t\tvar oldObservationText = \"\";\n\t\t\tvar oldObservationNames = [];\n\n\t\t\tif (!levelFiveSixVM.isOhioSchool) {\n\t\t\t\tvar oldObservationId = levelFiveSixVM.selectedObservedBehavior;\n\t\t\t\toldObservationText = _.find(levelFiveSixVM.observations, { behaviorObservationID: oldObservationId }).behaviorObservationName;\n\t\t\t} else {\n\t\t\t\t_.each(levelFiveSixVM.selectedObservedBehaviors, function (selected) {\n\t\t\t\t\tvar obs = _.find(levelFiveSixVM.observations, ['behaviorObservationID', selected.behaviorObservationID]);\n\t\t\t\t\tif (obs) {\n\t\t\t\t\t\toldObservationNames.push(obs.behaviorObservationName);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tvar oldStateQuestions = [];\n\t\t\tArray.prototype.push.apply(oldStateQuestions, _.filter(_.cloneDeep(levelFiveSixVM.stateQuestions), function (f) { return f.enabled === true && f.active === true; }));\n\n\t\t\t$q.all([\n\t\t\t\tloadObservations(),\n\t\t\t\tloadStateQuestionAnswers()\n\t\t\t]).then(function () {\n\t\t\t\tvar obs = null;\n\t\t\t\tvar matchedObs = [];\n\n\t\t\t\tif (levelFiveSixVM.isOhioSchool) {\n\t\t\t\t\t_.each(oldObservationNames, function (observation) {\n\t\t\t\t\t\tvar found = _.find(levelFiveSixVM.observations, ['behaviorObservationName', observation]);\n\t\t\t\t\t\tif (found) {\n\t\t\t\t\t\t\tmatchedObs.push(found);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tif (matchedObs.length > 0) {\n\t\t\t\t\t\tvar selectedObservations = {};\n\n\t\t\t\t\t\t_.each(matchedObs, function (matched) {\n\t\t\t\t\t\t\tvar observationName = matched.behaviorObservationName;\n\t\t\t\t\t\t\tselectedObservations[observationName] = true;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tlevelFiveSixVM.selectedObservedBehaviorArray.selectedObservation = _.clone(selectedObservations, true);\n\n\t\t\t\t\t\tcheckForCorrectNumberOfSelectedBehaviors();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tobs = _.find(levelFiveSixVM.observations, { behaviorObservationName: oldObservationText }).behaviorObservationID;\n\t\t\t\t\tif (obs) { levelFiveSixVM.selectedObservedBehavior = obs; }\n\t\t\t\t}\n\n\t\t\t\tif (obs || matchedObs.length > 0) {\n\t\t\t\t\t_.forEach(levelFiveSixVM.stateQuestions, function (q) {\n\t\t\t\t\t\t// match the old question to the new question\n\t\t\t\t\t\tvar matched = _.find(oldStateQuestions, { question: q.question });\n\n\t\t\t\t\t\tif (matched) {\n\t\t\t\t\t\t\t// grab the selected answer from the old question, find if it's yes or no\n\t\t\t\t\t\t\tvar answerString = _.find(matched.answers, { stateBehaviorObservationAnswerID: matched.selectedAnswer }).answer;\n\n\t\t\t\t\t\t\t// find the new answer ID\n\t\t\t\t\t\t\tvar newAnswerId = _.find(q.answers, { answer: answerString }).stateBehaviorObservationAnswerID;\n\n\t\t\t\t\t\t\t// set the selectedAnswer property of the new question, to yes or no accordingly\n\t\t\t\t\t\t\tq.selectedAnswer = newAnswerId;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tshowHideStateQuestions();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction checkForAnyLevelSixParticipants(previousParticipantViews) {\n\t\t\tlevelFiveSixVM.hasLevelSixParticipant = _(previousParticipantViews).map('behaviorEventParticipant').some({ 'behaviorLevelID': 6 });\n\t\t\tlevelFiveSixVM.behaviorLevelId = levelFiveSixVM.hasLevelSixParticipant ? 6 : 5;\n\t\t}\n\n\t\tfunction checkForAnyLevelSixParticipantsOnParticipantSave(participants) {\n\t\t\tvar currentLevel = levelFiveSixVM.behaviorLevelId;\n\t\t\tlevelFiveSixVM.hasLevelSixParticipant = _.some(participants, { 'selectedLevel': 6 });\n\t\t\tlevelFiveSixVM.behaviorLevelId = levelFiveSixVM.hasLevelSixParticipant ? 6 : 5;\n\t\t\tif (currentLevel !== levelFiveSixVM.behaviorLevelId) { refreshFormValues(); }\n\t\t}\n\n\t\tfunction getStudentUrl(studentInSchoolId) {\n\t\t\treturn appSettings.studentManagementWebRootUrl + studentInSchoolId + '/behavior/overview';\n\t\t}\n\t}\n})();\n","/**\n * level-four.controller\n * @namespace behavior\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .controller('LevelFourCtrl', LevelFourCtrl);\n\n // protect against minification\n /* @ngInject */\n LevelFourCtrl.$inject = ['$state', '$stateParams', '$q', '$scope', '$controller', 'userContextService', 'enumService', '$location', 'schoolService',\n 'locationRepository', 'observationRepository', 'actionRepository', 'behaviorEventIncidentRepository', '$window', '$uibModal',\n 'appSettings', 'studentListService', 'behaviorDocumentRepository', 'behaviorStateManagementService', 'behaviorUserRoleService',\n '$compile', '$sce', '$document', '$timeout', 'behaviorDirtyCheckService', 'behaviorAlertService', 'apiSecurityService', 'BehaviorRestangular'];\n\n /**\n * @name LevelFourCtrl\n * @description Constructor for level-four.controller\n * @memberOf behavior\n */\n function LevelFourCtrl($state, $stateParams, $q, $scope, $controller, userContextService, enumService, $location, schoolService,\n locationRepository, observationRepository, actionRepository, behaviorEventIncidentRepository, $window, $uibModal,\n appSettings, studentListService, behaviorDocumentRepository, behaviorStateManagementService, behaviorUserRoleService,\n $compile, $sce, $document, $timeout, behaviorDirtyCheckService, behaviorAlertService, apiSecurityService, BehaviorRestangular) {\n\n // inject Breadcrumb Controller to provide additional model data for breadcrumbs\n //$controller('breadcrumbController', { $scope: $scope });\n\n // ReSharper disable PossiblyUnassignedProperty\n var moment = window.moment;\n var _ = window._;\n\n // Controller as vm - see route configuration\n var levelFourVM = this;\n\n levelFourVM.incident = {\n time: \"\",\n date: moment().format('L')\n };\n\n // SECTION I: Extract passed-in values\n\n // SECTION II: Properties associated to view model - sorted alphabetically\n levelFourVM.actionDuration = 1.0;\n levelFourVM.actionStartDate = moment().format('L');\n levelFourVM.behaviorActionId = 0;\n levelFourVM.behaviorEventParticipant = {};\n levelFourVM.behaviorEventParticipantActions = [];\n levelFourVM.behaviorEventParticipantDocuments = [];\n levelFourVM.behaviorIncident = {};\n levelFourVM.behaviorLevelId = 4;\n levelFourVM.bspAction = { behaviorActionName: \"Select...\" };\n levelFourVM.bspActions = [];\n levelFourVM.bspEndDate = null;\n levelFourVM.bspEndReason = null;\n levelFourVM.bspMeetingDate = moment(levelFourVM.incident.date).format('YYYY-MM-DD');\n levelFourVM.bspMeetingTime = moment(new Date()).format('HH:mm:ss');\n levelFourVM.documentsForDeletion = [];\n levelFourVM.dateForDocument = moment(levelFourVM.incident.date).format('YYYY-MM-DD');\n levelFourVM.documentImage = [];\n levelFourVM.event = {};\n levelFourVM.isActionPermanent = 0;\n levelFourVM.isActiveIep = false;\n levelFourVM.isBehaviorActionLoading = false;\n levelFourVM.isBehaviorCollapsed = false;\n levelFourVM.isBip = false;\n levelFourVM.isBsp = false;\n levelFourVM.isBspCollapsed = false;\n levelFourVM.isBspEnded = false;\n levelFourVM.isDateToday = false;\n levelFourVM.isInitialBspOrBip = false;\n levelFourVM.isLoading = false;\n levelFourVM.isReadOnly = false;\n levelFourVM.isRevisedBspOrBip = false;\n levelFourVM.isSaving = false;\n levelFourVM.isTeacher = false;\n levelFourVM.isTimeSelectedInFuture = false;\n levelFourVM.isUpdatedBspOrBip = false;\n levelFourVM.isUpdatingARevision = false;\n levelFourVM.isValidActionDate = false;\n levelFourVM.isValidDate = false;\n levelFourVM.isValidTime = false;\n levelFourVM.maxDate = moment();\n levelFourVM.mostRecentBspOrBip = {};\n levelFourVM.notes = \"\";\n levelFourVM.observations = [];\n levelFourVM.observationSearchText = '';\n levelFourVM.parentAttended = false;\n levelFourVM.previousIncident = {\n behaviorEvent: {},\n behaviorEventParticipant: {},\n behaviorEventObservations: [],\n behaviorEventParticipantActions: [],\n behaviorEventParticipantInterventions: [],\n behaviorEventParticipantMotivations: [],\n behaviorEventParticipantDocuments: []\n };\n levelFourVM.revisionReason = \"\";\n levelFourVM.sameDayAndBeforeFivePmCutoff = true;\n levelFourVM.school = {};\n levelFourVM.selectedDocument = {};\n levelFourVM.staffId = userContextService.ensureUserContext().then(function (context) {\n return levelFourVM.staffId = context['http://schemas.mynha.com/SIS/Core/StaffID'];\n });\n levelFourVM.staticMomentObjectForTimeZone = moment();\n levelFourVM.studentGuardianCanBeEmailed = false;\n levelFourVM.studentInSchoolId = $state.params.studentInSchoolId;\n levelFourVM.supportingDocumentation = [];\n levelFourVM.timeEntryOptions = {\n format: \"LT\"\n };\n levelFourVM.tooltipDescription = \"\";\n levelFourVM.tooltipName = \"\";\n levelFourVM.warnTimeNotBetweenSchoolStartEndTime = false;\n\n // SECTION III: Navigation pass-thru methods - sorted alphabetically\n levelFourVM.onCancelClick = onCancelClick;\n\n // SECTION IV: Controller methods associated to view model (init, reset, submit) - sorted alphabetically\n levelFourVM.init = init;\n levelFourVM.onSaveClick = onSaveClick;\n\n // SECTION V: All other methods - sorted alphabetically\n levelFourVM.getDocument = getDocument;\n levelFourVM.hasSelectedAnObservation = hasSelectedAnObservation;\n levelFourVM.hasSelectedAnObservationRequiringNotes = hasSelectedAnObservationRequiringNotes;\n levelFourVM.onDocumentClick = onDocumentClick;\n levelFourVM.onIncidentUpdateFailure = onIncidentUpdateFailure;\n levelFourVM.onObservationClick = onObservationClick;\n levelFourVM.onTrashClick = onTrashClick;\n levelFourVM.searchTextChanged = searchTextChanged;\n levelFourVM.setPlanType = setPlanType;\n levelFourVM.showObservationDetails = showObservationDetails;\n levelFourVM.showObservationName = showObservationName;\n levelFourVM.uploadFile = uploadFile;\n levelFourVM.validateDate = validateDate;\n levelFourVM.validateIncidentDate = validateIncidentDate;\n levelFourVM.validateIncidentTime = validateIncidentTime;\n\n // Initialize \n levelFourVM.init();\n\n function init() {\n levelFourVM.isLoading = true;\n $q.all([\n loadDataPermissionsForPage(),\n isMoreThanATeacher(),\n loadAppState()\n ])\n .then(function () {\n levelFourVM.incident.time = moment().format();\n })\n .then(checkForReadOnly)\n .then(loadSchoolForTimezone)\n .then(function() {\n levelFourVM.isBehaviorActionLoading = true;\n checkIfRevisingUpdatingCreatingOrEnding();\n\n if (levelFourVM.isRevisedBspOrBip) {\n return getPreviousLevelFourIncidentDetails();\n }\n\n if (isBehaviorUpdate()) {\n return loadIncidentWithBehaviorEventID();\n }\n })\n .then(loadIep)\n .then(function() {\n loadAll();\n levelFourVM.isLoading = false;\n });\n }\n\n function isMoreThanATeacher() {\n return behaviorUserRoleService.isMoreThanATeacher().then(function (result) {\n levelFourVM.isTeacher = !result;\n });\n }\n\n function checkForReadOnly() {\n if (isBehaviorUpdate()) {\n apiSecurityService.isAccessAllowed(\"uisr_update_level_four\", \"Get\", BehaviorRestangular).then(function (result) {\n levelFourVM.isReadOnly = !result;\n });\n }\n }\n\n function loadAppState() {\n return behaviorStateManagementService.getInitialValues($state.params).then(function (q) {\n levelFourVM = _.assign(levelFourVM, q);\n });\n }\n\n function loadDataPermissionsForPage() {\n return behaviorUserRoleService.loadDataPermissionsForPage($state).then(function (result) {\n if (!result) {\n $state.go('403');\n } else {\n $timeout(function () {\n if (levelFourVM.incidentForm) { levelFourVM.incidentForm.$setPristine(); }\n }, 0);\n }\n });\n }\n\n function loadStartEndTime() {\n return behaviorEventIncidentRepository\n .GetSchoolStartEndTime(levelFourVM.schoolId, levelFourVM.academicYearId)\n .then(function (result) {\n levelFourVM.schoolStartTime = moment(result.startTime, 'HH:mm:ss');\n levelFourVM.schoolEndTime = moment(result.endTime, 'HH:mm:ss');\n });\n }\n\n function loadAll() {\n $q.all([\n loadObservations(),\n loadActions(),\n loadStartEndTime()\n ]).then(function () {\n if (levelFourVM.isInitialBspOrBip) { loadPreSelectedObservations(); }\n\n if (levelFourVM.isRevisedBspOrBip) {\n setIncidentRevisionData(levelFourVM.revisisionIncident);\n delete levelFourVM.revisisionIncident;\n }\n\n checkIfStudentGuardianHasEmailAndCanBeContacted();\n });\n }\n\n function checkIfStudentGuardianHasEmailAndCanBeContacted() {\n return studentListService.checkIfStudentGuardianHasEmailAndCanBeContacted(levelFourVM.studentInSchoolId).then(function (answer) {\n levelFourVM.studentGuardianCanBeEmailed = answer.length > 0;\n checkIfDateTodayAndTimeBeforeFivePm();\n }, function (error) {\n behaviorAlertService.goSwal(\"loadFailure\", goToPreviousScreen);\n });\n }\n\n function loadSchoolForTimezone() {\n return schoolService.get(levelFourVM.schoolId).then(function (school) {\n levelFourVM.school = school;\n }, function (error) {\n behaviorAlertService.goSwal(\"loadFailure\", goToPreviousScreen);\n });\n }\n\n // What action is the user trying to perform?\n function checkIfRevisingUpdatingCreatingOrEnding() {\n\n switch (levelFourVM.action) {\n case \"add\":\n levelFourVM.isInitialBspOrBip = true;\n break;\n case \"update\":\n levelFourVM.isUpdatedBspOrBip = true;\n break;\n case \"revise\":\n levelFourVM.isRevisedBspOrBip = true;\n break;\n }\n }\n\n function searchTextChanged(value) {\n levelFourVM.observationSearchText = value;\n }\n\n // Set Behavior Support Plan Type and behaviorActionId\n function setPlanType(item) {\n levelFourVM.behaviorActionId = item.behaviorActionID;\n }\n\n function goToPreviousScreen() {\n levelFourVM.isStudentRecord ? $state.go('student.behavior.main.behaviorlist') : $state.go('behavior-manager');\n }\n\n function onSaveClick() {\n\t\t\tvar params = {\n SchoolID: levelFourVM.schoolId,\n AcademicYearID: levelFourVM.academicYearId,\n Date: moment(levelFourVM.incident.date).format('YYYY-MM-DD')\n }\n\n behaviorEventIncidentRepository.isWithinAcademicSchoolYear(params).then(function(isWithinAcademicYear) {\n\n if (validateRequiredFields() && isComplete() && isWithinAcademicYear[0]) {\n\n levelFourVM.isSaving = true;\n\n levelFourVM.observations = _.filter(levelFourVM.observations, { formChecked: true });\n\n buildGoodModel();\n\n\t\t\t\t\tdeleteDocuments(levelFourVM.documentsForDeletion);\n\n levelFourVM.behaviorIncident = {\n BehaviorEvent: levelFourVM.event,\n BehaviorEventObservations: levelFourVM.observations,\n BehaviorEventParticipantActions: levelFourVM.behaviorEventParticipantActions,\n BehaviorEventParticipant: levelFourVM.behaviorEventParticipant,\n IsMobile: false\n };\n\n if (levelFourVM.isUpdatedBspOrBip) {\n behaviorEventIncidentRepository.put(levelFourVM.behaviorIncident).then(documentSaveMethod, onSaveFailure);\n } else if (levelFourVM.isInitialBspOrBip) {\n behaviorEventIncidentRepository.set(levelFourVM.behaviorIncident).then(documentSaveMethod, onSaveFailure);\n } else if (levelFourVM.isRevisedBspOrBip) {\n endLevelFourIncident();\n }\n } else if (!isWithinAcademicYear[0]) {\n dateNotWithinAcademicYearError();\n } else {\n onIncompleteFormError();\n } \n });\n }\n\n function documentSaveMethod(data) {\n\n var participant = data.behaviorEventParticipant;\n\n // Only send new docs for persistence\n if (!levelFourVM.isInitialBspOrBip) {\n for (var d = 0; d < levelFourVM.supportingDocumentation.length; d++) {\n if (levelFourVM.supportingDocumentation[d].BehaviorDocument.behaviorDocumentID) {\n levelFourVM.supportingDocumentation.splice(d, 1);\n d = -1;\n }\n }\n }\n\n if (levelFourVM.supportingDocumentation.length > 0 && levelFourVM.supportingDocumentation) {\n\n behaviorDocumentRepository.addBehaviorDocuments(levelFourVM.supportingDocumentation)\n .then(function (docData) {\n\n _.forEach(docData, function(doc) {\n var docModel =\n {\n BehaviorEventParticipantID: participant.behaviorEventParticipantID || levelFourVM.previousIncident.behaviorEventParticipant.behaviorEventParticipantID,\n DocumentDate: moment(levelFourVM.incident.date).format('YYYY-MM-DD'),\n BehaviorDocumentID: doc.behaviorDocument.behaviorDocumentID\n };\n\n levelFourVM.behaviorEventParticipantDocuments.push(docModel);\n });\n\n\t\t\t\t\t\tbehaviorEventIncidentRepository.saveDocumentParticipants(levelFourVM.behaviorEventParticipantDocuments).then(function (returndData) {\n\t\t\t\t\t\t\tonSaveSuccess();\n\n }, function (reason) {\n\n // Because final persistence failed, need to clean up (delete) isolated document entities\n behaviorDocumentRepository.deleteBehaviorDocuments(levelFourVM.behaviorEventParticipantDocuments).then(function(returnedData) {\n log('Behavior Level Four Document Cleanup Succeeded', returnedData);\n });\n\n onDocumentSaveFailure();\n });\n }, function (reason) {\n\n log('Behavior Level Four Documents Failed to Save', reason);\n onDocumentSaveFailure();\n });\n } else {\n onSaveSuccess();\n }\n }\n\n // Click event for the already selected observations, NOT the checkboxes\n function onObservationClick(observation) {\n observation.formChecked ? observation.formChecked = false : observation.formChecked = true;\n }\n\n function onCancelClick() {\n if (hasSelectedAnObservation() && isBehaviorAdd()) {\n levelFourVM.incidentForm.observations.$setDirty();\n } else if (hasSelectedAnObservation() && !isBehaviorAdd()) {\n var newObs = _.map(_.filter(levelFourVM.observations, { 'formChecked': true }), 'behaviorObservationID');\n var oldObs = _.map(levelFourVM.previousIncident.behaviorEventObservations, 'behaviorObservationID');\n var q = _.intersection(newObs, oldObs);\n if (q.length !== newObs.length) { levelFourVM.incidentForm.observations.$setDirty(); }\n }\n\n if (behaviorDirtyCheckService.isFormDirty(levelFourVM.incidentForm)) {\n swal({\n title: 'Are you sure?',\n text : \"Any data you have entered will be lost.\",\n type: 'warning',\n showCancelButton: true,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'Yes',\n closeOnConfirm: true\n }, function (isConfirmed) {\n if (isConfirmed === true) {\n goToPreviousScreen();\n } else {\n levelFourVM.incidentForm.observations.$setPristine();\n }\n });\n } else {\n goToPreviousScreen();\n }\n }\n\n // Upload supporting documentation\n function uploadFile() {\n var modalInstance = $uibModal.open({\n templateUrl: appSettings.behaviorWebRootUrl + 'app/components/incident/level-four/templates/_upload-file-modal.html',\n controller: 'UploadFileModalCtrl',\n controllerAs: 'uploadFileModalVM',\n resolve: {\n student: function () {\n return levelFourVM.student;\n },\n staffId: function () {\n return levelFourVM.staffId;\n },\n academicYearID: function () {\n return levelFourVM.academicYearId;\n },\n schoolID: function () {\n return levelFourVM.schoolId;\n },\n date: function () {\n return moment(levelFourVM.incident.date).format('YYYY-MM-DD');\n }\n }\n });\n\n // Add new document to the supporting documentation array\n modalInstance.result.then(function (result) {\n levelFourVM.supportingDocumentation.push(result);\n }), function () {\n swal({\n title: 'Behavior Document Not Saved',\n text: \"Document upload was unsuccessful. Please start over, and try again.\",\n type: 'error',\n showCancelButton: true,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'Done',\n closeOnConfirm: true\n }, function (isConfirmed) {\n if (isConfirmed === true) {\n $window.history.back();\n }\n });\n };\n }\n\n // View document (not currently implemented)\n function onDocumentClick(document) {\n if (document.BehaviorDocumentVersion.BehaviorDocumentVersionData) {\n levelFourVM.documentImage = document.BehaviorDocumentVersion.BehaviorDocumentVersionData;\n }\n }\n\n // Delete document\n function onTrashClick(document) {\n swal({\n title: 'Delete',\n text: \"Do you really want to delete this document?\",\n type: 'warning',\n showCancelButton: true,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'Done',\n closeOnConfirm: true\n }, function (isConfirmed) {\n if (isConfirmed === true) {\n // Check if doc has already been persisted\n if (document.BehaviorDocument.behaviorDocumentID) {\n // Wait to delete until the user clicks \"Save\"\n levelFourVM.documentsForDeletion.push(document);\n levelFourVM.supportingDocumentation = _.without(levelFourVM.supportingDocumentation, document);\n } else {\n // Remove doc from view\n levelFourVM.supportingDocumentation = _.without(levelFourVM.supportingDocumentation, document);\n }\n }\n });\n }\n\n function deleteDocuments(documents) {\n\n _.forEach(documents, function (document) {\n\n behaviorDocumentRepository.deleteBehaviorDocumentById(document.BehaviorDocument.behaviorDocumentID).then(function(returnedData) {\n\n log('Document Deletion Succeeded', returnedData);\n\n }, function(reason) {\n\n log('Document Deletion Failed', reason);\n });\n });\n }\n\n function endLevelFourIncident() {\n\n var model =\n {\n StudentInSchoolID: levelFourVM.studentInSchoolId,\n Date: moment().format('YYYY-MM-DD'),\n Reason: \"Revised BSP/BIP started.\",\n StaffID: levelFourVM.staffId\n };\n \n behaviorEventIncidentRepository.endLevelFourIncident(model).then(function (result) {\n\n behaviorEventIncidentRepository.set(levelFourVM.behaviorIncident).then(documentSaveMethod, onSaveFailure);\n\n }, function (error) {\n\n log('Ending the BSP/BIP failed', error);\n });\n }\n\n function setCommonFormValuesFromReturnedIncident(incident) {\n\t\t\tlevelFourVM.mostRecentBspOrBip =\n {\n BehaviorEvent: incident.behaviorEvent,\n BehaviorEventObservations: incident.behaviorEventObservations,\n BehaviorEventParticipantActions: incident.behaviorEventParticipantActions,\n BehaviorEventParticipantDocuments: incident.behaviorEventParticipantDocuments,\n BehaviorEventParticipant: incident.behaviorEventParticipant\n };\n\n var action = levelFourVM.mostRecentBspOrBip.BehaviorEventParticipantActions[0];\n levelFourVM.parentAttended = action ? action.bspMeetingAttendedByParent : null;\n levelFourVM.includeInParentEmail = incident.behaviorEventParticipant.includeInParentEmail ? incident.behaviorEventParticipant.includeInParentEmail : false;\n levelFourVM.notes = levelFourVM.mostRecentBspOrBip.BehaviorEvent.notes;\n }\n\n function setIncidentRevisionData(revisionIncident) {\n\n setCommonFormValuesFromReturnedIncident(revisionIncident);\n\n var action = levelFourVM.mostRecentBspOrBip.BehaviorEventParticipantActions[0];\n\n if (!action) {\n // Nothing to set if there's no action\n return;\n }\n\n var mostRecentBspOrBipActionID = action.behaviorActionID;\n var mostRecentBspOrBipAction = _(levelFourVM.allActions).find({ behaviorActionID: mostRecentBspOrBipActionID });\n \n if (!mostRecentBspOrBipAction) {\n onDataLoadError('Failed to set mostRecentBspOrBipAction');\n return;\n }\n\n var isIntervention = _.includes(mostRecentBspOrBipAction.behaviorActionName.toLowerCase(), 'intervention');\n \n var revisionAction = _(levelFourVM.allActions).find(function (action) {\n return _.includes(action.behaviorActionName.toLowerCase(), isIntervention ? 'intervention' : 'support') &&\n _.includes(action.behaviorActionName.toLowerCase(), 'revision');\n });\n\n if (!revisionAction) {\n onDataLoadError('Failed to set revisionAction');\n return;\n }\n\n levelFourVM.bspAction = revisionAction;\n levelFourVM.isBip = isIntervention;\n levelFourVM.isLoading = false;\n levelFourVM.isBehaviorActionLoading = false;\n }\n\n function setActionDetails() {\n\n // Actions\n var action = levelFourVM.mostRecentBspOrBip.BehaviorEventParticipantActions[0];\n\n if (!action) {\n // No action details to set.\n return;\n }\n\n var previousActionID = action.behaviorActionID;\n var actionItems = _.filter(levelFourVM.bspActions, { behaviorActionID: previousActionID });\n\n levelFourVM.bspAction = actionItems[0];\n\n if (previousActionID === 2 || previousActionID === 3 || previousActionID === 4) { levelFourVM.isBip = true; }\n\n if (previousActionID === 7 || previousActionID === 8 || previousActionID === 9) { levelFourVM.isBsp = true; }\n\n levelFourVM.isBehaviorActionLoading = false;\n }\n\n function setFormValues(behaviorEvent) {\n\t\t levelFourVM.previousIncident = behaviorEvent;\n setCommonFormValuesFromReturnedIncident(behaviorEvent);\n\n levelFourVM.incident.date = moment.utc(behaviorEvent.behaviorEvent.date).format('L');\n levelFourVM.incident.time = moment(behaviorEvent.behaviorEvent.time, 'HH:mm:ss').toDate();\n\n var action = levelFourVM.mostRecentBspOrBip.BehaviorEventParticipantActions[0];\n\n if (action) {\n levelFourVM.actionStartDate = moment(action.actionStartDate).format('L');\n levelFourVM.isBspEnded = action.isbspEnded;\n\t\t\t\tlevelFourVM.bspEndDate = action.bspEndDate ? moment(action.bspEndDate).format('L') : null;\n levelFourVM.bspEndReason = action.bspEndReason;\n levelFourVM.revisionReason = action.bspRevisionReason;\n\n if (levelFourVM.revisionReason) {\n levelFourVM.isUpdatingARevision = true;\n }\n }\n\n // Documents\n if (levelFourVM.mostRecentBspOrBip.BehaviorEventParticipantDocuments.length > 0) {\n var docIds = _(levelFourVM.mostRecentBspOrBip.BehaviorEventParticipantDocuments)\n .filter(function (a) { return a.behaviorDocumentID })\n .map('behaviorDocumentID')\n .value();\n\n _.forEach(docIds, function (id) {\n behaviorDocumentRepository.getAllDocDetails(id).then(function (docResult) {\n var docEntity =\n {\n BehaviorDocument: docResult.behaviorDocument,\n BehaviorDocumentMeta: docResult.behaviorDocumentMeta,\n BehaviorDocumentVersion: docResult.behaviorDocumentVersion\n };\n\n docEntity.BehaviorDocument.createDate = moment(docEntity.BehaviorDocument.createDate).toDate();\n\n levelFourVM.supportingDocumentation.push(docEntity);\n\n levelFourVM.isLoading = false;\n\n }, function (docIssue) {\n\n log('Recent BSP/BIP doc retrieval failed', docIssue);\n\n onDocumentRetrievalFailure();\n\n levelFourVM.isLoading = false;\n });\n });\n } else { levelFourVM.isLoading = false; }\n }\n\n // ------------------ Load functions --------------------------\n function loadPreSelectedObservations() {\n var studentInSchoolID = levelFourVM.studentInSchoolId;\n var schoolID = levelFourVM.schoolId;\n var academicYearID = levelFourVM.academicYearId;\n\n return studentListService.getObservationsForLevel4Event(studentInSchoolID, schoolID, academicYearID).then(function (data) {\n\n levelFourVM.observations = _(levelFourVM.observations)\n .map(function (observation, i) {\n observation.formChecked = _.includes(data, observation.behaviorObservationID);\n\n return observation;\n })\n .orderBy(['formChecked', 'behaviorObservationID'], ['desc', 'asc'])\n .value();\n\n levelFourVM.isLoading = false;\n }, function (error) {\n log('Failed to retrieve observations for level 4 event', error);\n levelFourVM.isLoading = false;\n });\n }\n\n function loadIep() {\n return studentListService.isStudentActiveIep(levelFourVM.student.studentID).then(function (result) {\n levelFourVM.isActiveIep = _(result).size() > 0;\n });\n }\n\n function loadActions() {\n // Level 4 actions - just BSP/BIP specific\n return actionRepository.getAll(getObservationActionParams()).then(function(data) {\n levelFourVM.allActions = data;\n\n if ((levelFourVM.isInitialBspOrBip || levelFourVM.isUpdatedBspOrBip) && !levelFourVM.isUpdatingARevision) {\n _.forEach(data, function (option) {\n if (levelFourVM.isActiveIep && option.behaviorActionName && !_.includes(option.behaviorActionName, 'Hold') && _.includes(option.behaviorActionName, 'Initial')) {\n levelFourVM.bspActions.push(option);\n } else if (!levelFourVM.isActiveIep && option.behaviorActionName && !_.includes(option.behaviorActionName, 'Hold') && _.includes(option.behaviorActionName, 'Initial') && _.includes(option.behaviorActionName, 'Support')) {\n levelFourVM.bspActions.push(option);\n }\n });\n }\n else if (levelFourVM.isRevisedBspOrBip || (levelFourVM.isUpdatedBspOrBip && levelFourVM.isUpdatingARevision)) {\n _.forEach(data, function (option) {\n if (levelFourVM.isActiveIep && option.behaviorActionName && !_.includes(option.behaviorActionName, 'Hold') && _.includes(option.behaviorActionName, 'Revision')) {\n levelFourVM.bspActions.push(option);\n } else if (!levelFourVM.isActiveIep && option.behaviorActionName && !_.includes(option.behaviorActionName, 'Hold') && _.includes(option.behaviorActionName, 'Revision') && _.includes(option.behaviorActionName, 'Support')) {\n levelFourVM.bspActions.push(option);\n }\n });\n }\n\n if (levelFourVM.isUpdatedBspOrBip) {\n setActionDetails();\n } else {\n levelFourVM.isBehaviorActionLoading = false;\n }\n });\n }\n\n function loadObservations() {\n return observationRepository.getAll(getObservationActionParams()).then(function (data) {\n\n levelFourVM.originalObservations = _.cloneDeep(data);\n\n var dataWithShortenedNames = _.map(data, function (obs) {\n if (obs.behaviorObservationName.length > 60) {\n obs.behaviorObservationName = obs.behaviorObservationName.substring(0, 57) + \"...\";\n obs['nameIsShortened'] = true;\n obs['nameFull'] = _.find(levelFourVM.originalObservations, { 'behaviorObservationID': obs.behaviorObservationID }).behaviorObservationName;\n }\n\n if (obs.examples) {\n if (obs.examples.length > 60) {\n obs.examples = obs.examples.substring(0, 57) + \"...\";\n obs['descIsShortened'] = true;\n obs['descFull'] = _.find(levelFourVM.originalObservations, { 'behaviorObservationID': obs.behaviorObservationID }).examples;\n }\n }\n\n return obs;\n });\n\n if (levelFourVM.mostRecentBspOrBip && levelFourVM.mostRecentBspOrBip.BehaviorEventObservations) {\n _.forEach(dataWithShortenedNames, function (obs) {\n obs.formChecked = _.some(levelFourVM.mostRecentBspOrBip.BehaviorEventObservations, {'behaviorObservationID': obs.behaviorObservationID});\n });\n } else if (levelFourVM.revisisionIncident) {\n _.forEach(dataWithShortenedNames, function (obs) {\n obs.formChecked = _.some(levelFourVM.revisisionIncident.behaviorEventObservations, {'behaviorObservationID': obs.behaviorObservationID});\n });\n }\n\n dataWithShortenedNames = _(dataWithShortenedNames).orderBy(['formChecked', 'behaviorObservationID'], ['desc', 'asc']).value();\n\n levelFourVM.observations = dataWithShortenedNames;\n });\n }\n\n // Get BSP/BIP Incident with BehaviorEventID\n function loadIncidentWithBehaviorEventID() {\n return behaviorEventIncidentRepository.getSingleParticipantEventIncident(levelFourVM.behaviorEventId)\n .then(setFormValues, onDataLoadError);\n }\n\n // Get most recent BSP/BIP\n function getPreviousLevelFourIncidentDetails() {\n return behaviorEventIncidentRepository.getMostRecentLevelFourIncidentWithStudentInSchoolID(levelFourVM.studentInSchoolId)\n .then(function (revisionIncident) {\n if (!_.isEmpty(revisionIncident.behaviorEvent)) {\n levelFourVM.revisisionIncident = revisionIncident;\n }\n }, onDataLoadError);\n }\n\n function getDocument(id) {\n behaviorDocumentRepository.getDocumentById(id).then(function(response) {\n var fileExtensionLookup = {\n 'application/pdf': '.pdf',\n 'application/msword': '.doc',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': '.docx',\n 'application/vnd.ms-excel': '.xls',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': '.xlsx'\n };\n\n var blob = new Blob([response.data], { type: response.headers('content-type') });\n var filename = response.headers('Content-Disposition')\n .substring(response.headers('Content-Disposition').indexOf('=') + 1)\n .replace(new RegExp('\"', 'g'), '');\n\n var extension = fileExtensionLookup[response.headers('content-type')] || '';\n\n if ($window.navigator.msSaveOrOpenBlob) {\n $window.navigator.msSaveOrOpenBlob(blob, filename + extension);\n } else {\n\n $scope.url = $sce.trustAsResourceUrl(URL.createObjectURL(blob));\n var anchorStr = \"\";\n var body = $document.find('body').eq(0);\n body.append(anchorStr);\n body.find('#file-' + $scope.versionId)[0].click();\n $('#file-' + $scope.versionId).remove();\n }\n });\n }\n\n // ------------------ Helper functions --------------------------\n function isBehaviorAdd() {\n return levelFourVM.action === 'add';\n }\n\n function isBehaviorUpdate() {\n return levelFourVM.action === 'update';\n }\n\n function hasSelectedAnObservation() {\n return _.some(levelFourVM.observations, 'formChecked');\n }\n\n function hasSelectedAnObservationRequiringNotes() {\n return _.some(levelFourVM.observations, { 'formChecked': true, 'isNotesRequired': true });\n }\n\n function showObservationDetails($event, observation) {\n var scope = $scope.$new(true);\n scope.levelFourVM = this;\n\n levelFourVM.tooltipName = null;\n levelFourVM.tooltipDescription = observation.descFull;\n return showTooltipBase($event, '#observation-descriptions-tooltip', { x: -37, y: 7 }, scope);\n }\n\n function showObservationName($event, observation) {\n var scope = $scope.$new(true);\n scope.levelFourVM = this;\n\n levelFourVM.tooltipName = observation.nameFull;\n levelFourVM.tooltipDescription = null;\n return showTooltipBase($event, '#observation-descriptions-tooltip', { x: -37, y: 7 }, scope);\n }\n\n function showTooltipBase($event, elementSelector, settings, scope) {\n var template = $(elementSelector).contents().text();\n var x = $($event.target).offset().left + $($event.target).width();\n var y = $($event.target).offset().top + $($event.target).height();\n\n if (!settings) settings = {\n x: 0, y: 0\n };\n\n var tip = $compile(template)(scope);\n $(tip).appendTo(document.body)\n .offset({ top: y + settings.y, left: x + settings.x })\n .show();\n $(\"div\", tip).show();\n\n // stops current click from propagating to the body\n // and closing the tooltip\n $event.stopPropagation();\n\n // set up hide event handlers\n var bodyClickHandler = function (e) {\n $(document.body).unbind('click', bodyClickHandler);\n $(tip).unbind('click', tipClickHandler);\n $(tip).remove();\n if (typeof (settings.onClose) == 'function') settings.onClose();\n };\n var tipClickHandler = function (e) {\n e.stopPropagation();\n };\n\n $(document.body).bind('click', bodyClickHandler);\n $(tip).bind('click', tipClickHandler);\n\n $('[ng-dropover]').not(tip).unbind('click').remove();\n }\n\n function getObservationActionParams() {\n return {\n academicYearID: levelFourVM.academicYearId,\n schoolID: levelFourVM.schoolId,\n behaviorLevelID: levelFourVM.behaviorLevelId\n };\n }\n\n // ------------------ Builder functions --------------------------\n function buildBehaviorEvent() {\n if (levelFourVM.isInitialBspOrBip || levelFourVM.isRevisedBspOrBip) {\n levelFourVM.event =\n {\n SchoolID: levelFourVM.schoolId,\n AcademicYearID: levelFourVM.academicYearId,\n Date: moment(levelFourVM.incident.date).format('YYYY-MM-DD'),\n Time: moment(levelFourVM.incident.time).format('HH:mm:ss'),\n BehaviorLocationID: 5,\n Notes: levelFourVM.notes,\n IsCourseSectionBehaviorEvent: 0,\n IsIncomplete: false,\n IsAdvancedFieldIncomplete: false,\n CreatedByStaffID: levelFourVM.staffId\n };\n } else {\n levelFourVM.event =\n {\n BehaviorEventID: levelFourVM.mostRecentBspOrBip.BehaviorEvent.behaviorEventID,\n\t\t\t\t\tSchoolID: levelFourVM.schoolId,\n AcademicYearID: levelFourVM.academicYearId,\n Date: moment(levelFourVM.incident.date).format('YYYY-MM-DD'),\n Time: moment(levelFourVM.incident.time).format('HH:mm:ss'),\n Notes: levelFourVM.notes,\n CreatedByStaffID: levelFourVM.staffId,\n LastModifiedByStaffID: levelFourVM.staffId\n };\n }\n }\n\n function buildBehaviorEventParticipantAction() {\n var action = {};\n if (levelFourVM.behaviorActionId === 0) { levelFourVM.behaviorActionId = levelFourVM.bspAction.behaviorActionID; }\n\n if (!levelFourVM.behaviorActionId) {\n // Don't build if there's no behavior action id.\n return;\n }\n\n if (levelFourVM.isInitialBspOrBip || levelFourVM.isRevisedBspOrBip) {\n action =\n {\n BehaviorActionID: levelFourVM.behaviorActionId,\n ActionStartDate: moment(levelFourVM.actionStartDate).format('YYYY-MM-DD'),\n IsActionPermanent: levelFourVM.isActionPermanent,\n BSPMeetingDate: levelFourVM.bspMeetingDate,\n BSPMeetingTime: levelFourVM.bspMeetingTime,\n BSPMeetingAttendedByParent: levelFourVM.parentAttended,\n BSPRevisionReason: levelFourVM.isRevisedBspOrBip ? levelFourVM.revisionReason : null,\n BSPMeetingNotes: levelFourVM.notes,\n CreatedByStaffID: levelFourVM.staffId\n };\n } else {\n var mostRecentAction = levelFourVM.mostRecentBspOrBip.BehaviorEventParticipantActions[0];\n action =\n {\n BehaviorActionID: levelFourVM.behaviorActionId,\n ActionStartDate: moment(levelFourVM.actionStartDate).format('YYYY-MM-DD'),\n BSPMeetingDate: levelFourVM.bspMeetingDate,\n BSPMeetingTime: levelFourVM.bspMeetingTime,\n BSPMeetingAttendedByParent: levelFourVM.parentAttended,\n BSPMeetingNotes: levelFourVM.notes,\n IsBSPEnded: levelFourVM.isBspEnded,\n BSPEndDate: (mostRecentAction && mostRecentAction.isBSPEnded && !levelFourVM.isBspEnded) ? null : levelFourVM.bspEndDate,\n BSPEndReason: (mostRecentAction && mostRecentAction.isbspEnded && !levelFourVM.isBspEnded) ? null : levelFourVM.bspEndReason,\n BSPRevisionReason: levelFourVM.revisionReason ? levelFourVM.revisionReason : null,\n LastModifiedByStaffID: levelFourVM.staffId,\n CreatedByStaffID: mostRecentAction ? mostRecentAction.createdByStaffID : levelFourVM.staffId\n };\n }\n\n\t\t\tlevelFourVM.behaviorEventParticipantActions.push(action);\n }\n\n function buildBehaviorEventParticipant() {\n\t\t\tif (levelFourVM.isInitialBspOrBip || levelFourVM.isRevisedBspOrBip) {\n levelFourVM.behaviorEventParticipant =\n {\n AcademicYearID: levelFourVM.academicYearId,\n SchoolID: levelFourVM.schoolId,\n BehaviorParticipantTypeID: 1, // student\n ParticipantStudentInSchoolID: levelFourVM.studentInSchoolId,\n BehaviorLevelID: levelFourVM.behaviorLevelId, // 4\n BehaviorRoleID: 1, // offender\n IncludeInParentEmail: levelFourVM.includeInParentEmail,\n IsPendingLevel6: false,\n IsRestraint: false,\n IsSecluded: false,\n RestartBSPCount: true,\n CreatedByStaffID: levelFourVM.staffId\n };\n } else {\n\t\t\t\tlevelFourVM.behaviorEventParticipant = levelFourVM.mostRecentBspOrBip.BehaviorEventParticipant;\n\t\t\t\tlevelFourVM.behaviorEventParticipant.LastModifiedByStaffID = levelFourVM.staffId;\n\t\t\t\tlevelFourVM.behaviorEventParticipant.IncludeInParentEmail = levelFourVM.includeInParentEmail;\n }\n }\n\n function buildBehaviorEventParticipantObservations() {\n var array = [];\n\n if (levelFourVM.isInitialBspOrBip) {\n _.forEach(levelFourVM.observations, function (item) {\n var tempOne =\n {\n BehaviorObservationID: item.behaviorObservationID,\n CreatedByStaffID: levelFourVM.staffId\n };\n array.push(tempOne);\n });\n } else {\n _.forEach(levelFourVM.observations, function (obs) {\n if (!obs.behaviorEventObservationID) {\n var tempTwo =\n {\n BehaviorEventID: levelFourVM.mostRecentBspOrBip.BehaviorEvent.behaviorEventID,\n BehaviorObservationID: obs.behaviorObservationID,\n CreatedByStaffID: levelFourVM.staffId,\n LastModifiedByStaffID: levelFourVM.staffId\n };\n array.push(tempTwo);\n } else {\n var tempThree =\n {\n BehaviorObservationID: obs.behaviorObservationID,\n LastModifiedByStaffID: levelFourVM.staffId\n };\n array.push(tempThree);\n }\n });\n }\n levelFourVM.observations = array;\n }\n\n function buildGoodModel() {\n\n buildBehaviorEvent();\n\n buildBehaviorEventParticipantAction();\n\n buildBehaviorEventParticipant();\n\n buildBehaviorEventParticipantObservations();\n }\n\n // ------------------ Validation --------------------------\n function isComplete() {\n return validateIncidentDate() && validateIncidentTime() && hasSelectedAnObservation() && levelFourVM.studentInSchoolId && levelFourVM.actionStartDate;\n }\n\n function validateRequiredFields() {\n if (hasSelectedAnObservationRequiringNotes() && levelFourVM.notes.length === 0) { return false; }\n return true;\n }\n\n function validateDate(date) {\n return moment(date).isValid();\n }\n\n function validateIncidentDate() {\n // Clone\n var originalDate = moment(levelFourVM.incident.date);\n\n $timeout(function() {\n // Timeout is hack because the date being changed doesn't change without it.\n if (levelFourVM.incident.date) {\n\n levelFourVM.isValidDate = moment(levelFourVM.incident.date).isValid();\n\n if (levelFourVM.isValidDate) {\n levelFourVM.isDateToday = moment().format('YYYY-MM-DD') === moment(levelFourVM.incident.date).format('YYYY-MM-DD');\n checkIfDateTodayAndTimeBeforeFivePm();\n\n var dateChanged = levelFourVM.incident.date.diff(originalDate, 'day') !== 0;\n if (!dateChanged) return;\n }\n\n // Validate time again now that date has been changed\n if (levelFourVM.incident.time) {\n levelFourVM.validateIncidentTime();\n }\n }\n });\n\n return levelFourVM.isValidDate;\n }\n\n function validateIncidentTime() {\n if (levelFourVM.incident.time) {\n\n levelFourVM.isValidTime = moment(levelFourVM.incident.time).isValid();\n\n if (levelFourVM.isValidTime) {\n // Check if time is outside school hours\n levelFourVM.warnTimeNotBetweenSchoolStartEndTime = !(moment(levelFourVM.incident.time).diff(levelFourVM.schoolStartTime, 'minutes') >= 0 &&\n moment(levelFourVM.incident.time).diff(levelFourVM.schoolEndTime, 'minutes') <= 0);\n\n // Check if time is in the future\n if (levelFourVM.incident.date) {\n if (levelFourVM.isDateToday) {\n levelFourVM.isTimeSelectedInFuture = moment(levelFourVM.incident.time).isAfter(moment().add(15, 'seconds'));\n } else {\n levelFourVM.isTimeSelectedInFuture = false;\n }\n } else {\n levelFourVM.isTimeSelectedInFuture = false;\n }\n }\n } else {\n levelFourVM.isValidTime = false;\n }\n\n return levelFourVM.isValidTime;\n }\n\n function checkIfDateTodayAndTimeBeforeFivePm() {\n if (!levelFourVM.studentGuardianCanBeEmailed) {\n levelFourVM.sameDayAndBeforeFivePmCutoff = false;\n return;\n }\n\n if (levelFourVM.incident.date) {\n if (!levelFourVM.isDateToday) {\n levelFourVM.sameDayAndBeforeFivePmCutoff = false;\n return;\n } else {\n levelFourVM.sameDayAndBeforeFivePmCutoff = true;\n }\n }\n\n if (levelFourVM.school.timeZone) {\n var currentTimeInSchoolTz = moment(new Date()).tz(levelFourVM.school.timeZone.timeZoneName).format(\"YYYY-MM-DD HH:mm\");\n var fiveOClockEST = moment().set({ 'hour': 17, 'minute': 0, 'second': 0 }).format(\"YYYY-MM-DD HH:mm\");\n\n levelFourVM.sameDayAndBeforeFivePmCutoff = moment(currentTimeInSchoolTz).isBefore(fiveOClockEST);\n }\n }\n\n // ------------------ Sweet Alerts --------------------------\n function onSaveSuccess() {\n levelFourVM.isSaving = false;\n behaviorAlertService.goSwal(\"saveSuccess\", goToPreviousScreen);\n }\n\n function onIncidentUpdateFailure() {\n levelFourVM.isSaving = false;\n behaviorAlertService.goSwal(\"updateFailure\", goToPreviousScreen);\n }\n\n function onDocumentSaveFailure() {\n levelFourVM.isSaving = false;\n behaviorAlertService.goSwal(\"warningWithMsg\", goToPreviousScreen, \"Behavior event saved successfully. However, document upload was unsuccessful. Please try again.\");\n }\n\n function onDocumentRetrievalFailure() {\n levelFourVM.isSaving = false;\n behaviorAlertService.goSwal(\"warningWithMsg\", goToPreviousScreen, \"Sorry, but we were unable to retrieve Documents associated with this incident. Please try again.\");\n }\n\n function onSaveFailure(reason) {\n levelFourVM.isSaving = false;\n if (reason.data.exceptionMessage) {\n behaviorAlertService.goSwal(\"saveFailureWithMsg\", goToPreviousScreen, reason.data.exceptionMessage);\n } else {\n behaviorAlertService.goSwal(\"saveFailure\", goToPreviousScreen);\n }\n }\n\n function onIncompleteFormError() {\n behaviorAlertService.goSwal(\"validationFailure\", null, \"Please complete required fields before saving\");\n }\n\n function onDataLoadError(reason) {\n levelFourVM.isSaving = false;\n behaviorAlertService.goSwal(\"retrievalFailure\", goToPreviousScreen);\n }\n\n function dateNotWithinAcademicYearError() {\n swal({\n title: \"Warning!\",\n text: \"Date selected must be within Academic Year.\",\n type: 'warning',\n showCancelButton: false,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'OK',\n closeOnConfirm: true\n });\n }\n\n $scope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {\n swal.close();\n });\n }\n})();\n","/**\n * upload-file-modal.controller\n * @namespace behavior\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n\t\t.module('nha.behavior')\n\t\t.controller('UploadFileModalCtrl', UploadFileModalCtrl);\n\n // protect against minification\n /* @ngInject */\n UploadFileModalCtrl.$inject = ['$q', '$state', '$stateParams', 'behaviorCache', 'behaviorDocumentRepository', '$uibModalInstance', 'student', 'staffId', 'academicYearID',\n 'schoolID', 'date', '$window', 'fileReaderFactory', 'toastr', '$scope', 'mimeTypesRepository'];\n\n /**\n\t* @name UploadFileModalCtrl\n\t* @description Constructor for upload-file-modal.controller\n\t* @memberOf behavior\n\t*/\n function UploadFileModalCtrl($q, $state, $stateParams, behaviorCache, behaviorDocumentRepository, $uibModalInstance, student, staffId, academicYearID,\n schoolID, date, $window, fileReaderFactory, toastr, $scope, mimeTypesRepository) {\n\n // Controller as vm - see route configuration\n var uploadFileModalVM = this;\n\n // Properties associated to view model - sorted alphabetically\n // helps you instantly identify which members of the controller can be bound and used in the View \n uploadFileModalVM.academicYearID = academicYearID;\n uploadFileModalVM.byteArray = [];\n uploadFileModalVM.date = date;\n uploadFileModalVM.description = \"\";\n uploadFileModalVM.mimeType = \"\";\n uploadFileModalVM.mimeTypeID = 0;\n uploadFileModalVM.schoolID = schoolID;\n uploadFileModalVM.student = student;\n uploadFileModalVM.staffId = staffId;\n\n // Uploaded file properties\n uploadFileModalVM.file = {};\n uploadFileModalVM.file.fileRaw = '';\n uploadFileModalVM.file.fileDataUrl = '';\n uploadFileModalVM.file.byteArray = []; // base64 bytearray\n uploadFileModalVM.file.fileMimeType = '';\n uploadFileModalVM.file.fileMimeTypeID = 0;\n\n // Master document object\n uploadFileModalVM.document = {};\n\n // Navigation pass-thru methods - sorted alphabetically, linked directly to navigationManager method calls\n // helps you instantly identify which members of the controller can be bound and used in the View \n uploadFileModalVM.onCancelClick = onCancelClick;\n uploadFileModalVM.onSaveClick = onSaveClick;\n\n // Controller methods associated to view model (init, reset, submit)\n //uploadFileModalVM.init = init;\n\n // All other methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the controller can be bound and used in the View \n uploadFileModalVM.getFileByteArray = getFileByteArray;\n uploadFileModalVM.getFileMimeType = getFileMimeType;\n uploadFileModalVM.isComplete = isComplete;\n uploadFileModalVM.readFile = readFile;\n uploadFileModalVM.retrieveFileValues = retrieveFileValues;\n\n function onSaveClick() {\n\n $q.all([\n getFileSize()\n ]).then(function (size) {\n\n var complete = uploadFileModalVM.isComplete();\n\n if (complete && size <= 10) {\n\n uploadFileModalVM.document =\n {\n // Object for Phoenix_Documents.Behavior.BehaviorDocuments\n BehaviorDocument:\n {\n Title: uploadFileModalVM.title,\n Description: uploadFileModalVM.description,\n Filename: uploadFileModalVM.file.fileName,\n MimeTypeID: uploadFileModalVM.mimeTypeID\n },\n // Object for Phoenix_Documents.Behavior.BehaviorDocumentVersions\n BehaviorDocumentVersion:\n {\n IsCurrent: 1,\n FileExtension: uploadFileModalVM.mimeType,\n BehaviorDocumentVersionData: uploadFileModalVM.byteArray\n },\n // Object for Phoenix_Documents.Behavior.BehaviorDocumentMeta\n BehaviorDocumentMeta:\n {\n Keyword: \"BSP Document\" // todo? what's this for\n }\n };\n\n // Dismiss modal with doc\n $uibModalInstance.close(uploadFileModalVM.document);\n\n } else if (size > 10) {\n fileTooLargeAlert();\n\n onCancelClick();\n } else {\n swal(\"Sorry, we encountered an error while trying to determine the file type.\", \"Please try again.\");\n }\n });\n }\n\n function fileTooLargeAlert() {\n swal(\"Files must be smaller than 10MB\", \"Please upload a smaller file\");\n }\n\n function getFileSize() {\n var deferred = $.Deferred();\n var size = uploadFileModalVM.file.fileRaw.size / 1048576;\n if (size) { deferred.resolve(size); }\n return deferred.promise();\n }\n\n function isComplete() {\n var complete = false;\n\n complete = ((uploadFileModalVM.byteArray !== null) &&\n (uploadFileModalVM.mimeType !== null) &&\n (uploadFileModalVM.mimeTypeID > 0));\n\n return complete;\n }\n\n function onCancelClick() {\n $uibModalInstance.dismiss();\n }\n\n function getFileByteArray(fileDataUrl) {\n if (fileDataUrl) {\n return fileDataUrl.split(',')[1];\n } else {\n return [];\n }\n }\n\n function getFileMimeType(fileDataUrl) {\n if (fileDataUrl) {\n return fileDataUrl.split(',')[0].split(';')[0].split(':')[1];\n } else {\n return '';\n }\n }\n\n // Reads uploaded file into a DataUrl (href referencable)\n function readFile(fileToRead, model, dataUrlField) {\n // Default title\n uploadFileModalVM.title = fileToRead.name;\n // Client-side check for desired file types, restricted to PDF's currently\n var isValidFileType = fileToRead.type === 'application/pdf';\n // If valid, convert file for storage\n if (isValidFileType) {\n fileReaderFactory.readAsDataUrl(fileToRead, $scope).then(function (result) {\n model[dataUrlField] = result; // enum.base64ToBytes(result);\n if (model[dataUrlField]) {\n // Retrieve file values\n uploadFileModalVM.retrieveFileValues(model);\n }\n });\n } else {\n toastr.warning('\\'' + fileToRead.name + '\\' ' + ' does not contain an allowed mime-type.');\n }\n }\n\n function retrieveFileValues(model) {\n if (model) {\n // Extract byte array\n uploadFileModalVM.byteArray = uploadFileModalVM.getFileByteArray(model.fileDataUrl);\n // Extract MIME type\n uploadFileModalVM.mimeType = uploadFileModalVM.getFileMimeType(model.fileDataUrl);\n // Retrieve MIME type ID\n mimeTypesRepository.getMimeTypeID(uploadFileModalVM.mimeType).then(function (result) {\n uploadFileModalVM.mimeTypeID = result[0].mimeTypeID;\n });\n }\n }\n }\n})();\n","/**\n * level-two-three-desktop.controller\n * @namespace behavior\n */\n(function () {\n\t'use strict';\n\n\t// define one component per file (single responsibility)\n\tangular\n\t\t.module('nha.behavior')\n\t\t.controller('LevelTwoThreeDesktopCtrl', LevelTwoThreeDesktopCtrl);\n\n\t// protect against minification\n\t/* @ngInject */\n\tLevelTwoThreeDesktopCtrl.$inject = ['$state', '$stateParams', '$q', '$scope', '$controller', 'userContextService', 'enumService', '$location', 'matchmedia', 'courseService',\n\t\t'observationRepository', 'actionRepository', 'motivationRepository', 'interventionRepository', 'locationRepository', 'behaviorEventRepository', 'behaviorAlertService',\n\t\t'behaviorEventIncidentRepository', 'behaviorCourseSummaryRepository', 'studentListService', '$window', 'behaviorAttributeRepository', 'behaviorStateManagementService',\n\t\t'behaviorBehaviorListService', 'behaviorCache', 'appSettings', '$timeout', 'behaviorUserRoleService', '$rootScope', 'behaviorDirtyCheckService', 'behaviorSessionCache',\n\t\t'behaviorBlueRedIncidentCommon', 'behaviorAttendanceRepository', 'apiSecurityService', 'BehaviorRestangular', 'schoolService'];\n\n /**\n * @name LevelTwoThreeDesktopCtrl\n * @description Constructor for level-two-three-desktop.controller\n * @memberOf behavior\n */\n\tfunction LevelTwoThreeDesktopCtrl($state, $stateParams, $q, $scope, $controller, userContextService, enumService, $location, matchmedia, courseService,\n\t\tobservationRepository, actionRepository, motivationRepository, interventionRepository, locationRepository, behaviorEventRepository, behaviorAlertService,\n\t\tbehaviorEventIncidentRepository, behaviorCourseSummaryRepository, studentListService, $window, behaviorAttributeRepository, behaviorStateManagementService,\n\t\tbehaviorBehaviorListService, behaviorCache, appSettings, $timeout, behaviorUserRoleService, $rootScope, behaviorDirtyCheckService, behaviorSessionCache,\n\t\tbehaviorBlueRedIncidentCommon, behaviorAttendanceRepository, apiSecurityService, behaviorRestangular, schoolService) {\n\n\t\t// ReSharper disable PossiblyUnassignedProperty\n\t\tvar moment = window.moment;\n\t\tvar _ = window._;\n\t\t// ReSharper restore PossiblyUnassignedProperty\n\n\t\t// Controller as vm - see route configuration\n\t\tvar levelTwoThreeDesktopVM = this;\n\n\t\t// SECTION I: Extract passed-in values\n\n\t\t// SECTION II: Properties associated to view model - sorted alphabetically\n\t\tlevelTwoThreeDesktopVM.actions = [];\n\t\tlevelTwoThreeDesktopVM.behaviorLevelId = null;\n\t\tlevelTwoThreeDesktopVM.coreSubjectLevel1ID = null;\n\t\tlevelTwoThreeDesktopVM.courseSectionSubjects = [];\n\t\tlevelTwoThreeDesktopVM.checkingForExistingEvents = false;\n\t\tlevelTwoThreeDesktopVM.courseNotInSessionForDateTimeSelected = false;\n\t\tlevelTwoThreeDesktopVM.maxDate = moment();\n\t\tlevelTwoThreeDesktopVM.incidentDate = $state.params.date ? moment($state.params.date, 'YYYY-MM-DD') : moment().format('YYYY-MM-DD');\n\t\tlevelTwoThreeDesktopVM.incidentDateOptions = { useCurrent: false, daysOfWeekDisabled: [0, 6], maxDate: levelTwoThreeDesktopVM.maxDate };\n\t\tlevelTwoThreeDesktopVM.incidentsInLast20Days = 0;\n\t\tlevelTwoThreeDesktopVM.incidentMode = 'simple'; // allowable: 'simple' or 'advanced'\n\t\tlevelTwoThreeDesktopVM.incidentTime = \"\";\n\t\tlevelTwoThreeDesktopVM.includeEmail = false;\n\t\tlevelTwoThreeDesktopVM.interventions = [];\n\t\tlevelTwoThreeDesktopVM.interventionSearchText = '';\n\t\tlevelTwoThreeDesktopVM.isActionsollapsed = false;\n\t\tlevelTwoThreeDesktopVM.isAdvancedFormRequired = false;\n\t\tlevelTwoThreeDesktopVM.isBehaviorCollapsed = false;\n\t\tlevelTwoThreeDesktopVM.isInitialLevelTwoIncident = false;\n\t\tlevelTwoThreeDesktopVM.isInitialLevelThreeIncident = false;\n\t\tlevelTwoThreeDesktopVM.isInterventionCollapsed = false;\n\t\tlevelTwoThreeDesktopVM.isLoading = false;\n\t\tlevelTwoThreeDesktopVM.isMotivationCollapsed = false;\n\t\tlevelTwoThreeDesktopVM.isReadOnly = false;\n\t\tlevelTwoThreeDesktopVM.isSaving = false;\n\t\tlevelTwoThreeDesktopVM.isSavingSpinner = false;\n\t\tlevelTwoThreeDesktopVM.isSavingAndAddLevel3Spinner = false;\n\t\tlevelTwoThreeDesktopVM.isTeacher = false;\n\t\tlevelTwoThreeDesktopVM.isUpdatedLevelTwoIncident = false;\n\t\tlevelTwoThreeDesktopVM.isUpdatedLevelThreeIncident = false;\n\t\tlevelTwoThreeDesktopVM.locations = [];\n\t\tlevelTwoThreeDesktopVM.motivations = [];\n\t\tlevelTwoThreeDesktopVM.notes = '';\n\t\tlevelTwoThreeDesktopVM.observations = [];\n\t\tlevelTwoThreeDesktopVM.previousIncident = {\n\t\t\tbehaviorEventObservations: [],\n\t\t\tbehaviorEventParticipantActions: [],\n\t\t\tbehaviorEventParticipantInterventions: [],\n\t\t\tbehaviorEventParticipantMotivations: []\n\t\t};\n\t\tlevelTwoThreeDesktopVM.previousIncidentInSameMeetingBlockTime = null;\n\t\tlevelTwoThreeDesktopVM.sameDayAndBeforeFivePmCutoff = true;\n\t\tlevelTwoThreeDesktopVM.school = {};\n\t\tlevelTwoThreeDesktopVM.selectedActions = [];\n\t\tlevelTwoThreeDesktopVM.selectedInterventions = [];\n\t\tlevelTwoThreeDesktopVM.selectedLocation = 0; // Defaults to classroom on locations load\n\t\tlevelTwoThreeDesktopVM.selectedMotivations = [];\n\t\tlevelTwoThreeDesktopVM.selectedObservations = [];\n\t\tlevelTwoThreeDesktopVM.staffId = userContextService.ensureUserContext().then(function (context) {\n\t\t\treturn levelTwoThreeDesktopVM.staffId = context['http://schemas.mynha.com/SIS/Core/StaffID'];\n\t\t});\n\t\tlevelTwoThreeDesktopVM.staticMomentObjectForTimeZone = moment();\n\t\tlevelTwoThreeDesktopVM.studentCourseAndMeetingBlocks = [];\n\t\tlevelTwoThreeDesktopVM.studentGuardianCanBeEmailed = false;\n\t\tlevelTwoThreeDesktopVM.studentWasPresent = true;\n\t\tlevelTwoThreeDesktopVM.courseSectionGroupId = $state.params.courseSectionGroupId || 0;\n\t\tlevelTwoThreeDesktopVM.specialsCourseSectionId = $state.params.specialsCourseSectionId || 0;\n\t\tlevelTwoThreeDesktopVM.selectedCourseIsSpecial = $state.params.isStudentRecord ? false : levelTwoThreeDesktopVM.specialsCourseSectionId > 0;\n\t\tlevelTwoThreeDesktopVM.meetingBlockTimeId = $state.params.meetingBlockTimeId || 0;\n\t\tlevelTwoThreeDesktopVM.studentInSchoolId = $state.params.studentInSchoolId || $state.params.studentId || 0;\n\n\t\t// SECTION III: Navigation pass-thru methods - sorted alphabetically\n\t\tlevelTwoThreeDesktopVM.goToPreviousScreen = goToPreviousScreen;\n\n\t\t// SECTION IV: Controller methods associated to view model (init, reset, submit) - sorted alphabetically\n\t\tlevelTwoThreeDesktopVM.init = init;\n\t\tlevelTwoThreeDesktopVM.save = save;\n\t\tlevelTwoThreeDesktopVM.saveAndAddLevelThree = saveAndAddLevelThree;\n\n\t\t// SECTION V: All other methods - sorted alphabetically\n\t\tlevelTwoThreeDesktopVM.cancelClickPropogation = cancelClickPropogation;\n\t\tlevelTwoThreeDesktopVM.isBehaviorAdd = isBehaviorAdd;\n\t\tlevelTwoThreeDesktopVM.isBehaviorUpdate = isBehaviorUpdate;\n\t\tlevelTwoThreeDesktopVM.isNotesFieldRequired = isNotesFieldRequired;\n\t\tlevelTwoThreeDesktopVM.isTileSelected = isTileSelected;\n\t\tlevelTwoThreeDesktopVM.isValid = isValid;\n\t\tlevelTwoThreeDesktopVM.onCancelClick = onCancelClick;\n\t\tlevelTwoThreeDesktopVM.onCourseSectionGroupAndMeetingBlockSelection = onCourseSectionGroupAndMeetingBlockSelection;\n\t\tlevelTwoThreeDesktopVM.onDateChange = onDateChange;\n\t\tlevelTwoThreeDesktopVM.onTimeChange = onTimeChange;\n\t\tlevelTwoThreeDesktopVM.setIncidentMode = setIncidentMode;\n\t\tlevelTwoThreeDesktopVM.toggleSelectedTile = toggleSelectedTile;\n\t\tlevelTwoThreeDesktopVM.validateIncidentDate = validateIncidentDate;\n\t\tlevelTwoThreeDesktopVM.validateIncidentTime = validateIncidentTime;\n\t\tlevelTwoThreeDesktopVM.validateMotivation = validateMotivation;\n\t\tlevelTwoThreeDesktopVM.validateObservation = validateObservation;\n\n\t\t// Initialize \n\t\tlevelTwoThreeDesktopVM.init();\n\n\t\tfunction init() {\n\t\t\tlevelTwoThreeDesktopVM.isLoading = true;\n\t\t\t$q.all([\n\t\t\t\tloadDataPermissionsForPage(),\n\t\t\t\tisMoreThanATeacher(),\n\t\t\t\tloadAppState()\n\t\t\t])\n\t\t\t\t.then(function () {\n\t\t\t\t\tlevelTwoThreeDesktopVM.incidentTime = moment().format();\n\t\t\t\t})\n\t\t\t\t.then(checkForReadOnly)\n\t\t\t\t.then(loadSchoolForTimezone)\n\t\t\t\t.then(function () {\n\t\t\t\t\tif (isBehaviorAdd() && !levelTwoThreeDesktopVM.isStudentRecord) {\n\t\t\t\t\t\t// Check for cache, if it doesn't exist, we need to make a call to fill out the breadcrumb\n\t\t\t\t\t\tvar hasStudent = behaviorCache.exists('behavior.' + levelTwoThreeDesktopVM.studentInSchoolId + '.student');\n\t\t\t\t\t\tif (!hasStudent) {\n\t\t\t\t\t\t\tloadCourseName();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvalidateEventEntry();\n\t\t\t\t\t\tloadAllFormData();\n\t\t\t\t\t} else if (isBehaviorAdd() && levelTwoThreeDesktopVM.isStudentRecord) {\n\t\t\t\t\t\t// Add from Student Record\n\t\t\t\t\t\tloadAllFormData();\n\n\t\t\t\t\t} else if (isBehaviorUpdate() && levelTwoThreeDesktopVM.isStudentRecord) {\n\t\t\t\t\t\t// Update from Student Record\n\t\t\t\t\t\tloadPreviousIncident().then(function () {\n\t\t\t\t\t\t\tloadAllFormData();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\n\t\tfunction isMoreThanATeacher() {\n\t\t\treturn behaviorUserRoleService.isMoreThanATeacher().then(function (result) {\n\t\t\t\tlevelTwoThreeDesktopVM.isTeacher = !result;\n\t\t\t});\n\t\t}\n\n\t\tfunction checkForReadOnly() {\n\t\t\tif (isBehaviorUpdate()) {\n\t\t\t\treturn apiSecurityService.isAccessAllowed(\"uisr_update_level_zero_two_three\", \"Get\", behaviorRestangular).then(function (result) {\n\t\t\t\t\tlevelTwoThreeDesktopVM.isReadOnly = !result;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction loadAppState() {\n\t\t\treturn behaviorStateManagementService.getInitialValues($state.params).then(function (q) {\n\t\t\t\tlevelTwoThreeDesktopVM = _.assign(levelTwoThreeDesktopVM, q);\n\t\t\t});\n\t\t}\n\n\t\tfunction loadDataPermissionsForPage() {\n\t\t\treturn behaviorUserRoleService.loadDataPermissionsForPage($state).then(function (result) {\n\t\t\t\tif (!result) {\n\t\t\t\t\t$state.go('403');\n\t\t\t\t} else {\n\t\t\t\t\tlevelTwoThreeDesktopVM.isLoading = false;\n\t\t\t\t\t$timeout(function () {\n\t\t\t\t\t\tif (levelTwoThreeDesktopVM.form) { levelTwoThreeDesktopVM.form.$setPristine(); }\n\t\t\t\t\t}, 0);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction loadStartEndTime() {\n\t\t\treturn behaviorEventIncidentRepository\n\t\t\t\t.GetSchoolStartEndTime(levelTwoThreeDesktopVM.schoolId, levelTwoThreeDesktopVM.academicYearId)\n\t\t\t\t.then(function (result) {\n\t\t\t\t\tlevelTwoThreeDesktopVM.schoolStartTime = moment(result.startTime, 'HH:mm:ss');\n\t\t\t\t\tlevelTwoThreeDesktopVM.schoolEndTime = moment(result.endTime, 'HH:mm:ss');\n\t\t\t\t});\n\t\t}\n\n\t\tfunction loadAllFormData() {\n\t\t\tif (levelTwoThreeDesktopVM.valuesLoadedProperly) {\n\t\t\t\t$q.all([\n\t\t\t\t\tloadObservations(),\n\t\t\t\t\tloadActions(),\n\t\t\t\t\tloadMotivations(),\n\t\t\t\t\tloadInterventions(),\n\t\t\t\t\tloadStartEndTime()\n\t\t\t\t]).then(function () {\n\t\t\t\t\tcheckForAdvancedFormRequired();\n\t\t\t\t\tloadBehaviorObservationsCount();\n\t\t\t\t\tcheckIfCreatingOrUpdating();\n\t\t\t\t\tcheckIfStudentGuardianHasEmailAndCanBeContacted();\n\n\t\t\t\t\tif (levelTwoThreeDesktopVM.isStudentRecord) {\n\t\t\t\t\t\tloadStudentCourseAndMeetingBlocks().then(setPreviouslySelectedCourseSectionAndMeetingBlock);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t\t.then(loadLocations);\n\t\t\t} else {\n\t\t\t\tonLoadFailure();\n\t\t\t}\n\t\t}\n\n\t\tfunction checkIfStudentGuardianHasEmailAndCanBeContacted() {\n\t\t\treturn studentListService.checkIfStudentGuardianHasEmailAndCanBeContacted(levelTwoThreeDesktopVM.studentInSchoolId).then(function (answer) {\n\t\t\t\tlevelTwoThreeDesktopVM.studentGuardianCanBeEmailed = answer.length > 0;\n\t\t\t\tcheckIfDateTodayAndTimeBeforeFivePm();\n\t\t\t}, function (error) {\n\t\t\t\tbehaviorAlertService.goSwal(\"loadFailure\", goToPreviousScreen);\n\t\t\t});\n\t\t}\n\n\t\tfunction loadSchoolForTimezone() {\n\t\t\treturn schoolService.get(levelTwoThreeDesktopVM.schoolId).then(function (school) {\n\t\t\t\tlevelTwoThreeDesktopVM.school = school;\n\t\t\t}, function (error) {\n\t\t\t\tbehaviorAlertService.goSwal(\"loadFailure\", goToPreviousScreen);\n\t\t\t});\n\t\t}\n\n\t\tfunction checkForAdvancedFormRequired() {\n\t\t\tif (levelTwoThreeDesktopVM.studentInSchoolId !== null) {\n\t\t\t\treturn behaviorAttributeRepository.getForStudentInSchool(levelTwoThreeDesktopVM.studentInSchoolId).then(function (attributes) {\n\t\t\t\t\tif (typeof attributes !== \"undefined\") {\n\t\t\t\t\t\tif (attributes.isAdvancedBehaviorEntryRequired) {\n\t\t\t\t\t\t\tsetIncidentMode('advanced');\n\t\t\t\t\t\t\tlevelTwoThreeDesktopVM.isAdvancedFormRequired = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction getObservationActionParams() {\n\t\t\treturn {\n\t\t\t\tacademicYearID: levelTwoThreeDesktopVM.academicYearId,\n\t\t\t\tschoolID: levelTwoThreeDesktopVM.schoolId,\n\t\t\t\tbehaviorLevelID: levelTwoThreeDesktopVM.behaviorLevelId\n\t\t\t};\n\t\t}\n\n\t\t// What action is the user trying to perform?\n\t\tfunction checkIfCreatingOrUpdating() {\n\n\t\t\tif (levelTwoThreeDesktopVM.behaviorLevelId === 2) {\n\t\t\t\tisBehaviorUpdate() ? levelTwoThreeDesktopVM.isUpdatedLevelTwoIncident = true : levelTwoThreeDesktopVM.isInitialLevelTwoIncident = true;\n\t\t\t} else if (levelTwoThreeDesktopVM.behaviorLevelId === 3) {\n\t\t\t\tisBehaviorUpdate() ? levelTwoThreeDesktopVM.isUpdatedLevelThreeIncident = true : levelTwoThreeDesktopVM.isInitialLevelThreeIncident = true;\n\t\t\t}\n\t\t}\n\n\t\t// Initial load failure\n\t\tfunction onLoadFailure() {\n\t\t\tbehaviorAlertService.goSwal(\"loadFailure\", goToPreviousScreen);\n\t\t}\n\n\t\tfunction validateEventEntry() {\n\t\t\t// Checks a students previous events for any incompletes or events that happened on the same day and navigates the user to the correct action.\n\t\t\tvar deferred = $q.defer();\n\t\t\tif (levelTwoThreeDesktopVM.allStudentEvents) {\n\t\t\t\tcheckIncompleteAndConflictingEvents(levelTwoThreeDesktopVM.allStudentEvents);\n\t\t\t\tdeferred.resolve();\n\t\t\t} else {\n\t\t\t\tbehaviorBlueRedIncidentCommon.loadBehaviorEventsForStudent(levelTwoThreeDesktopVM.studentInSchoolId)\n\t\t\t\t\t.then(function (data) {\n\t\t\t\t\t\tlevelTwoThreeDesktopVM.allStudentEvents = data;\n\t\t\t\t\t\tcheckIncompleteAndConflictingEvents(levelTwoThreeDesktopVM.allStudentEvents);\n\t\t\t\t\t\tdeferred.resolve();\n\t\t\t\t\t});\n\t\t\t}\n\t\t\treturn deferred.promise;\n\t\t}\n\n\t\tfunction checkIncompleteAndConflictingEvents(events) {\n\t\t\tvar params = [events, levelTwoThreeDesktopVM.meetingBlockTimeId, levelTwoThreeDesktopVM.specialsCourseSectionId, levelTwoThreeDesktopVM.incidentDate, levelTwoThreeDesktopVM.selectedCourseIsSpecial];\n\n\t\t\tif (behaviorBlueRedIncidentCommon.anyIncompleteEvents.apply(null, params)) {\n\t\t\t\tonIncompleteEvent();\n\t\t\t} else {\n\t\t\t\tvar todaysHighestEvent = behaviorBlueRedIncidentCommon.getHighestLevelEventForDate.apply(null, params);\n\t\t\t\tcheckForValidBehaviorLevel(todaysHighestEvent);\n\t\t\t}\n\t\t}\n\n\t\tfunction checkForValidBehaviorLevel(todaysHighestEvent) {\n\t\t\tif (todaysHighestEvent) {\n\t\t\t\tvar highestLevel = todaysHighestEvent.behaviorLevelID;\n\n\t\t\t\tif (highestLevel === 3) {\n\t\t\t\t\tlevelTwoThreeDesktopVM.isLoading = false;\n\t\t\t\t\tbehaviorAlertService.goSwal(\"warningWithMsg\", null, \"The student has already reached level three behavior event for this time period. Consider escalation.\");\n\t\t\t\t} else if (highestLevel === 2) {\n\t\t\t\t\t// Set to level 3 if necessary\n\t\t\t\t\tif (levelTwoThreeDesktopVM.behaviorLevelId !== 3) {\n\t\t\t\t\t\tonUpdateToLevel3Alert();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Get the level two event that was saved on this day/course group/meeting block and save it's date for validation.\n\t\t\t\t\tvar date = moment(todaysHighestEvent.date);\n\t\t\t\t\tvar time = moment(todaysHighestEvent.time, 'HH:mm:ss');\n\n\t\t\t\t\tlevelTwoThreeDesktopVM.previousIncidentInSameMeetingBlockTime = date.set({ hour: time.hour(), minute: time.minute() });\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Set to level 2 if necesssary\n\t\t\t\tif (levelTwoThreeDesktopVM.behaviorLevelId !== 2) {\n\t\t\t\t\tonUpdateToLevel2Alert();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction onCourseSectionGroupAndMeetingBlockSelection() {\n\t\t\tif (!levelTwoThreeDesktopVM.selectedStudentCourseAndMeetingBlock) return;\n\n\t\t\tvar selectedCourseAndMeeting =\n\t\t\t\t_(levelTwoThreeDesktopVM.studentCourseAndMeetingBlocks)\n\t\t\t\t\t.find({\n\t\t\t\t\t\tuniqueId: levelTwoThreeDesktopVM.selectedStudentCourseAndMeetingBlock\n\t\t\t\t\t});\n\n\t\t\tif (selectedCourseAndMeeting) {\n\n\t\t\t\tlevelTwoThreeDesktopVM.courseSectionGroupId = selectedCourseAndMeeting.courseSectionGroupID;\n\t\t\t\tlevelTwoThreeDesktopVM.meetingBlockTimeId = selectedCourseAndMeeting.meetingBlockTimeID;\n\t\t\t\tlevelTwoThreeDesktopVM.coreSubjectLevel1ID = selectedCourseAndMeeting.subjectLevel1ID;\n\t\t\t\tlevelTwoThreeDesktopVM.specialsCourseSectionId = selectedCourseAndMeeting.courseSectionID;\n\t\t\t\tlevelTwoThreeDesktopVM.selectedCourseIsSpecial = selectedCourseAndMeeting.isSpecial;\n\n\t\t\t\tlevelTwoThreeDesktopVM.checkingForExistingEvents = true;\n\t\t\t\tlevelTwoThreeDesktopVM.previousIncidentInSameMeetingBlockTime = null;\n\n\t\t\t\tvalidateEventEntry().then(function () {\n\t\t\t\t\tlevelTwoThreeDesktopVM.checkingForExistingEvents = false;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (levelTwoThreeDesktopVM.incidentDate && selectedCourseAndMeeting) {\n\t\t\t\tbehaviorEventIncidentRepository.verifyCourseInSession(\n\t\t\t\t\tselectedCourseAndMeeting.isSpecial,\n\t\t\t\t\tmoment(levelTwoThreeDesktopVM.incidentDate).format('YYYY-MM-DD'),\n\t\t\t\t\tlevelTwoThreeDesktopVM.incidentTime ? moment(levelTwoThreeDesktopVM.incidentTime).format('HH:mm:ss') : moment().format('HH:mm:ss'),\n\t\t\t\t\tselectedCourseAndMeeting.courseSectionGroupID,\n\t\t\t\t\tselectedCourseAndMeeting.meetingBlockTimeID,\n\t\t\t\t\tselectedCourseAndMeeting.courseSectionID).then(function (q) {\n\t\t\t\t\t\tif (q[0] === true) {\n\t\t\t\t\t\t\tlevelTwoThreeDesktopVM.courseNotInSessionForDateTimeSelected = false;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlevelTwoThreeDesktopVM.courseNotInSessionForDateTimeSelected = true;\n\t\t\t\t\t\t\tbehaviorAlertService.goSwal(\"warningWithMsg\", null, \"Behavior event cannot be recorded on a date in which the course was not scheduled and/or cancelled.\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}, function (error) {\n\t\t\t\t\t\tbehaviorAlertService.goSwal(\"warningWithMsg\", goToPreviousScreen, \"Sorry, but we encountered an error while verifying the date and time of this course. Please try again.\");\n\t\t\t\t\t\tlog(\"Error encountered on behaviorEventIncidentRepository.verifyCourseInSession() call in Behavior Module\", error);\n\t\t\t\t\t});\n\n\t\t\t\tcheckIfStudentWasPresentForClass();\n\t\t\t}\n\t\t}\n\n\t\tfunction checkIfDateTodayAndTimeBeforeFivePm() {\n\t\t\tif (!levelTwoThreeDesktopVM.studentGuardianCanBeEmailed) {\n\t\t\t\tlevelTwoThreeDesktopVM.sameDayAndBeforeFivePmCutoff = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (levelTwoThreeDesktopVM.incidentDate) {\n\t\t\t\tvar isDateToday = moment().format('YYYY-MM-DD') === moment(levelTwoThreeDesktopVM.incidentDate).format('YYYY-MM-DD');\n\n\t\t\t\tif (!isDateToday) {\n\t\t\t\t\tlevelTwoThreeDesktopVM.sameDayAndBeforeFivePmCutoff = false;\n\t\t\t\t\treturn;\n\t\t\t\t} else {\n\t\t\t\t\tlevelTwoThreeDesktopVM.sameDayAndBeforeFivePmCutoff = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (levelTwoThreeDesktopVM.school.timeZone) {\n\t\t\t\tvar currentTimeInSchoolTz = moment(new Date()).tz(levelTwoThreeDesktopVM.school.timeZone.timeZoneName).format(\"YYYY-MM-DD HH:mm\");\n\t\t\t\tvar fiveOClockEST = moment().set({ 'hour': 17, 'minute': 0, 'second': 0 }).format(\"YYYY-MM-DD HH:mm\");\n\n\t\t\t\tlevelTwoThreeDesktopVM.sameDayAndBeforeFivePmCutoff = moment(currentTimeInSchoolTz).isBefore(fiveOClockEST);\n\t\t\t}\n\t\t}\n\n\t\tfunction onDateChange() {\n\t\t\t// Clone\n\t\t\tvar originalDate = moment(levelTwoThreeDesktopVM.incidentDate);\n\n\t\t\t$timeout(function () {\n\t\t\t\t// Timeout is hack because the date being changed doesn't change without it.\n\t\t\t\tvalidateIncidentDate();\n\n\t\t\t\tif (levelTwoThreeDesktopVM.incidentForm.incidentDate) {\n\t\t\t\t\tif (!levelTwoThreeDesktopVM.incidentForm.incidentDate.$valid) return;\n\t\t\t\t}\n\n\t\t\t\tvar dateChanged = levelTwoThreeDesktopVM.incidentDate.diff(originalDate, 'day') !== 0;\n\t\t\t\tif (!dateChanged) return;\n\n\t\t\t\tcheckIfDateTodayAndTimeBeforeFivePm();\n\n\t\t\t\tif (levelTwoThreeDesktopVM.isStudentRecord) {\n\t\t\t\t\t// Store currently selected course. This is used in student record so the the previously selected course section can be set after load.\n\t\t\t\t\tbehaviorSessionCache.put('behavior.selectedCourse' + levelTwoThreeDesktopVM.staffId, levelTwoThreeDesktopVM.selectedStudentCourseAndMeetingBlock);\n\n\t\t\t\t\tloadStudentCourseAndMeetingBlocks().then(setPreviouslySelectedCourseSectionAndMeetingBlock);\n\t\t\t\t} else {\n\t\t\t\t\tcheckIfStudentWasPresentForClass();\n\t\t\t\t\tvalidateEventEntry();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction onTimeChange() {\n\t\t\tif ((levelTwoThreeDesktopVM.incidentDate && levelTwoThreeDesktopVM.incidentTime) && ((levelTwoThreeDesktopVM.courseSectionGroupId || levelTwoThreeDesktopVM.meetingBlockTimeId || levelTwoThreeDesktopVM.specialsCourseSectionId) || levelTwoThreeDesktopVM.selectedCourseIsSpecial)) {\n\t\t\t\tcheckIfStudentWasPresentForClass();\n\t\t\t}\n\t\t}\n\n\t\tfunction checkIfStudentWasPresentForClass() {\n\t\t\tvar date = moment(levelTwoThreeDesktopVM.incidentDate).format('YYYY-MM-DD');\n\t\t\tvar time = levelTwoThreeDesktopVM.incidentTime ? moment(levelTwoThreeDesktopVM.incidentTime).format('HH:mm:ss') : null;\n\n\t\t\tif (levelTwoThreeDesktopVM.selectedCourseIsSpecial || !levelTwoThreeDesktopVM.selectedStudentCourseAndMeetingBlock) {\n\t\t\t\t// specials\n\t\t\t\treturn behaviorAttendanceRepository.checkIfStudentWasPresentForClassWithoutCourseInfo(levelTwoThreeDesktopVM.studentInSchoolId, date)\n\t\t\t\t\t.then(function (wasPresent) {\n\t\t\t\t\t\tlevelTwoThreeDesktopVM.studentWasPresent = wasPresent ? wasPresent.attendanceCodeEquivalencyID === 1 : false;\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// non-specials\n\t\t\t\treturn behaviorAttendanceRepository.checkIfStudentWasPresentForClass(\n\t\t\t\t\tlevelTwoThreeDesktopVM.studentInSchoolId,\n\t\t\t\t\tlevelTwoThreeDesktopVM.schoolId,\n\t\t\t\t\tdate,\n\t\t\t\t\ttime,\n\t\t\t\t\tlevelTwoThreeDesktopVM.courseSectionGroupId,\n\t\t\t\t\tlevelTwoThreeDesktopVM.meetingBlockTimeId,\n\t\t\t\t\tlevelTwoThreeDesktopVM.specialsCourseSectionId)\n\t\t\t\t\t.then(function (wasPresent) {\n\t\t\t\t\t\tlevelTwoThreeDesktopVM.studentWasPresent = wasPresent ? wasPresent.attendanceCodeEquivalencyID === 1 : false;\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction onIncompleteEvent() {\n\t\t\tlevelTwoThreeDesktopVM.isLoading = false;\n\n\t\t\tif (levelTwoThreeDesktopVM.isStudentRecord) {\n\t\t\t\tswal({\n\t\t\t\t\ttitle: 'Incomplete Event Exists',\n\t\t\t\t\ttext: \"An incomplete behavior event exists for this student during this meeting block time. Please complete that event in Student Record before creating a new one\",\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tshowCancelButton: false,\n\t\t\t\t\tconfirmButtonColor: '#DD6B55',\n\t\t\t\t\tconfirmButtonText: 'OK',\n\t\t\t\t\tcancelButtonText: \"Cancel\",\n\t\t\t\t\tcloseOnConfirm: true,\n\t\t\t\t\tcloseOnCancel: false\n\t\t\t\t}, function (isConfirmed) {\n\t\t\t\t\tif (isConfirmed === true) {\n\t\t\t\t\t\t$window.history.back();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tswal({\n\t\t\t\t\ttitle: 'Incomplete Event Exists',\n\t\t\t\t\ttext: \"An incomplete behavior event exists for this student during this meeting block time. Please complete that event in Student Record before creating a new one\",\n\t\t\t\t\ttype: 'warning',\n\t\t\t\t\tshowCancelButton: true,\n\t\t\t\t\tconfirmButtonColor: '#DD6B55',\n\t\t\t\t\tconfirmButtonText: 'Go to Student Record',\n\t\t\t\t\tcancelButtonText: \"Go Back\",\n\t\t\t\t\tcloseOnConfirm: true,\n\t\t\t\t\tcloseOnCancel: true\n\t\t\t\t}, function (isConfirmed) {\n\t\t\t\t\tif (isConfirmed === true) {\n\t\t\t\t\t\t$window.open(appSettings.studentManagementWebRootUrl + levelTwoThreeDesktopVM.studentInSchoolId + '/behavior/behaviorlist');\n\t\t\t\t\t\t$window.history.back();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$window.history.back();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction setPreviouslySelectedCourseSectionAndMeetingBlock() {\n\t\t\tvar storedValue = behaviorSessionCache.get('behavior.selectedCourse' + levelTwoThreeDesktopVM.staffId);\n\n\t\t\tvar storedValueIsOption = _.some(levelTwoThreeDesktopVM.studentCourseAndMeetingBlocks, { 'uniqueId': storedValue });\n\n\t\t\tif (storedValueIsOption) {\n\t\t\t\tlevelTwoThreeDesktopVM.selectedStudentCourseAndMeetingBlock = storedValue;\n\t\t\t\tonCourseSectionGroupAndMeetingBlockSelection();\n\t\t\t\tbehaviorSessionCache.remove('behavior.selectedCourse' + levelTwoThreeDesktopVM.staffId);\n\t\t\t}\n\t\t}\n\n\t\tfunction onUpdateToLevel2Alert() {\n\t\t\tlevelTwoThreeDesktopVM.isLoading = false;\n\n\t\t\tswal({\n\t\t\t\ttitle: 'Unable to enter Level 3 event',\n\t\t\t\ttext: \"You may not create a Level 3 event for this time period because a Level 2 event does not exist.\",\n\t\t\t\ttype: 'info',\n\t\t\t\tshowCancelButton: true,\n\t\t\t\tconfirmButtonColor: '#DD6B55',\n\t\t\t\tconfirmButtonText: 'Create Level 2 Event',\n\t\t\t\tcloseOnConfirm: true,\n\t\t\t\tcancelButtonText: \"Cancel\",\n\t\t\t\tcloseOnCancel: true\n\t\t\t}, function (isConfirmed) {\n\t\t\t\tif (isConfirmed === true) {\n\t\t\t\t\ttransitionToLevel(2);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction onUpdateToLevel3Alert() {\n\t\t\tlevelTwoThreeDesktopVM.isLoading = false;\n\t\t\tswal({\n\t\t\t\ttitle: 'Unable to enter Level 2 event',\n\t\t\t\ttext: \"You may not create a Level 2 event for this time period because a Level 2 event already exist.\",\n\t\t\t\ttype: 'info',\n\t\t\t\tshowCancelButton: true,\n\t\t\t\tconfirmButtonColor: '#DD6B55',\n\t\t\t\tconfirmButtonText: 'Create Level 3 Event',\n\t\t\t\tcloseOnConfirm: true,\n\t\t\t\tcancelButtonText: \"Cancel\",\n\t\t\t\tcloseOnCancel: true\n\t\t\t}, function (isConfirmed) {\n\t\t\t\tif (isConfirmed === true) {\n\t\t\t\t\ttransitionToLevel(3);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction transitionToLevel(behaviorLevelId) {\n\t\t\tlevelTwoThreeDesktopVM.behaviorLevelId = behaviorLevelId;\n\t\t\tlevelTwoThreeDesktopVM.isLoading = true;\n\n\t\t\t$q.all([\n\t\t\t\tloadObservations(),\n\t\t\t\tloadActions(),\n\t\t\t\tloadMotivations(),\n\t\t\t\tloadInterventions()\n\t\t\t]).then(function () {\n\t\t\t\tlevelTwoThreeDesktopVM.isLoading = false;\n\t\t\t});\n\n\t\t\t$state.params.behaviorLevelId = behaviorLevelId;\n\t\t\t$state.go($state.current, $state.params, { reload: false });\n\t\t}\n\n\t\t// controls form mode and affects validation. Expected mode values are 'advanced' or 'simple'\n\t\tfunction setIncidentMode(mode) {\n\t\t\tif (mode === 'advanced') {\n\t\t\t\tlevelTwoThreeDesktopVM.incidentMode = mode;\n\t\t\t\tif (!levelTwoThreeDesktopVM.isStudentRecord && !levelTwoThreeDesktopVM.selectedCourseIsSpecial) {\n\t\t\t\t\tloadCourseSubjects();\n\t\t\t\t}\n\t\t\t} else if (mode === 'simple' && !levelTwoThreeDesktopVM.isAdvancedFormRequired) {\n\t\t\t\tlevelTwoThreeDesktopVM.incidentMode = mode;\n\t\t\t}\n\t\t}\n\n\t\t//** option selection handling\n\t\tfunction toggleSelectedTile(tileGroup, tile) {\n\n\t\t\tif (!levelTwoThreeDesktopVM.isReadOnly) {\n\t\t\t\tif (levelTwoThreeDesktopVM.isTileSelected(tileGroup, tile)) {\n\t\t\t\t\tremoveTileFromView(tileGroup, tile);\n\t\t\t\t\t//log('Removed', tile);\n\t\t\t\t} else {\n\t\t\t\t\tlevelTwoThreeDesktopVM[tileGroup] = _.union(levelTwoThreeDesktopVM[tileGroup], [tile]);\n\t\t\t\t\t// log('Added', tile);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction isTileSelected(tileGroup, tile) {\n\t\t\treturn containsPreviousObservationActionInterventionOrMotivation(tileGroup, tile);\n\t\t}\n\n\t\tfunction cancelClickPropogation($event) {\n\t\t\tif ($event.target.nodeName === \"I\") {\n\t\t\t\t$rootScope.$emit('ngDropover.closeAll');\n\t\t\t}\n\n\t\t\t$event.stopPropagation();\n\t\t}\n\n\t\tlevelTwoThreeDesktopVM.closeTooltip = function closeTooltip(id) {\n\t\t\tlevelTwoThreeDesktopVM['tooltipOpen' + id] = false;\n\t\t};\n\n\t\tlevelTwoThreeDesktopVM.openToolTip = function openToolTip(id) {\n\t\t\tcloseAllOtherTooltips();\n\n\t\t\tlevelTwoThreeDesktopVM['tooltipOpen' + id] = true;\n\t\t};\n\n\t\tfunction closeAllOtherTooltips() {\n\t\t\t_.each(levelTwoThreeDesktopVM.observations, function (obs) {\n\t\t\t\tlevelTwoThreeDesktopVM['tooltipOpen' + obs.behaviorObservationID] = false;\n\t\t\t});\n\t\t}\n\n\t\tfunction getDefaultLocation(locations) {\n\t\t\treturn _(locations).filter({ behaviorLocationName: \"Classroom (in-person)\" }).map(\"behaviorLocationID\").first() || 0;\n\t\t}\n\n\t\t//** loaders\n\t\tfunction loadBehaviorObservationsCount() {\n\t\t\tstudentListService.getTenTwentyCount(levelTwoThreeDesktopVM.studentInSchoolId).then(function (result) {\n\t\t\t\tlevelTwoThreeDesktopVM.incidentsInLast20Days = result;\n\t\t\t});\n\t\t}\n\n\t\tfunction loadLocations() {\n\t\t\treturn locationRepository.getAll().then(function (data) {\n\t\t\t\tlevelTwoThreeDesktopVM.locations = data;\n\t\t\t\tlevelTwoThreeDesktopVM.selectedLocation = getDefaultLocation(levelTwoThreeDesktopVM.locations);\n\t\t\t});\n\t\t}\n\n\t\tfunction loadActions() {\n\t\t\tactionRepository.getAll(getObservationActionParams()).then(function (data) {\n\t\t\t\tlevelTwoThreeDesktopVM.actions = data;\n\t\t\t\tif (isBehaviorUpdate()) {\n\t\t\t\t\tsetActionNames(levelTwoThreeDesktopVM.previousIncident.behaviorEventParticipantActions);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction loadObservations() {\n\t\t\tobservationRepository.getAll(getObservationActionParams()).then(function (data) {\n\t\t\t\tlevelTwoThreeDesktopVM.observations = data;\n\t\t\t\tif (isBehaviorUpdate()) {\n\t\t\t\t\tsetObservationNames(levelTwoThreeDesktopVM.previousIncident.behaviorEventObservations);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction loadMotivations() {\n\t\t\tmotivationRepository.getByLevel(levelTwoThreeDesktopVM.behaviorLevelId).then(function (data) {\n\t\t\t\tlevelTwoThreeDesktopVM.motivations = data;\n\t\t\t\tif (isBehaviorUpdate()) {\n\t\t\t\t\tsetMotivationNames(levelTwoThreeDesktopVM.previousIncident.behaviorEventParticipantMotivations);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction loadInterventions() {\n\t\t\tinterventionRepository.getByLevel(levelTwoThreeDesktopVM.behaviorLevelId).then(function (data) {\n\t\t\t\tlevelTwoThreeDesktopVM.interventions = data;\n\t\t\t\tif (isBehaviorUpdate()) {\n\t\t\t\t\tsetInterventionNames(levelTwoThreeDesktopVM.previousIncident.behaviorEventParticipantInterventions);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction loadCourseSubjects() {\n\t\t\t// Behavior module only options for selecting course subjects\n\t\t\tbehaviorCourseSummaryRepository.getCourseSectionSubjects(levelTwoThreeDesktopVM.courseSectionGroupId).then(function (data) {\n\t\t\t\tlevelTwoThreeDesktopVM.courseSectionSubjects = data;\n\n\t\t\t\tif (levelTwoThreeDesktopVM.courseSectionSubjects.length === 1) {\n\t\t\t\t\tlevelTwoThreeDesktopVM.coreSubjectLevel1ID = levelTwoThreeDesktopVM.courseSectionSubjects[0].subjectLevel1ID;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// Student Record module only options for selecting course and meeting block time\n\t\tfunction loadStudentCourseAndMeetingBlocks() {\n\t\t\tvar params = {\n\t\t\t\t$select: 'courseSectionID,courseSubjectDisplayName,meetingBlockTimeID,meetingBlockTimeName,courseSectionGroupID,subjectTypeName'\n\t\t\t};\n\n\t\t\tlevelTwoThreeDesktopVM.isStudentCourseAndMeetingBlocksLoading = true;\n\n\t\t\treturn behaviorCourseSummaryRepository.getCoursesByStudent(\n\t\t\t\tfalse,\n\t\t\t\ttrue,\n\t\t\t\tlevelTwoThreeDesktopVM.studentInSchoolId,\n\t\t\t\tlevelTwoThreeDesktopVM.academicYearId,\n\t\t\t\tlevelTwoThreeDesktopVM.schoolId,\n\t\t\t\tmoment(levelTwoThreeDesktopVM.incidentDate).format('YYYY-MM-DD'),\n\t\t\t\tparams)\n\t\t\t\t.then(function (data) {\n\t\t\t\t\tlevelTwoThreeDesktopVM.studentCourseAndMeetingBlocks = courseService.shapeCourseDataForDropdown(data);\n\t\t\t\t\tlevelTwoThreeDesktopVM.courseListDisabled = !levelTwoThreeDesktopVM.studentCourseAndMeetingBlocks.length;\n\t\t\t\t\tlevelTwoThreeDesktopVM.isStudentCourseAndMeetingBlocksLoading = false;\n\t\t\t\t});\n\t\t}\n\n\t\tfunction loadCourseName() {\n\t\t\tbehaviorCourseSummaryRepository.getCourseName(levelTwoThreeDesktopVM.courseSectionGroupId, levelTwoThreeDesktopVM.meetingBlockTimeId, levelTwoThreeDesktopVM.academicYearId).then(function (result) {\n\t\t\t\tvar courseName = result[0].courseSubjectDisplayName;\n\t\t\t\t$scope.$emit('breadcrumb:update',\n\t\t\t\t\t{\n\t\t\t\t\t\tkey: 'studentlist',\n\t\t\t\t\t\tvalue: courseName\n\t\t\t\t\t});\n\t\t\t}, function (error) {\n\t\t\t\tlog('Error retrieving course name from DB', error);\n\t\t\t});\n\t\t}\n\n\t\tfunction isNotesFieldRequired() {\n\t\t\treturn _(levelTwoThreeDesktopVM.selectedObservations).some({ isNotesRequired: true }) ||\n\t\t\t\t_(levelTwoThreeDesktopVM.selectedActions).some({ isOther: true });\n\t\t}\n\n\t\tfunction setFormDirty() {\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.incidentTime.$setDirty();\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.incidentDate.$setDirty();\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.incidentLocation.$setDirty();\n\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.observations.$setDirty();\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.actions.$setDirty();\n\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.incidentNotes.$setDirty();\n\n\t\t\tif (levelTwoThreeDesktopVM.incidentMode === 'advanced') {\n\n\t\t\t\tif (levelTwoThreeDesktopVM.incidentForm.incidentSubject) {\n\t\t\t\t\tlevelTwoThreeDesktopVM.incidentForm.incidentSubject.$setDirty();\n\t\t\t\t}\n\n\t\t\t\tlevelTwoThreeDesktopVM.incidentForm.incidentNotes.$setDirty();\n\t\t\t\tlevelTwoThreeDesktopVM.incidentForm.studentActionsPriorToObservedBehavior.$setDirty();\n\t\t\t\tlevelTwoThreeDesktopVM.incidentForm.whatDidStudentGainFromBehavior.$setDirty();\n\n\t\t\t\tlevelTwoThreeDesktopVM.incidentForm.motivations.$setDirty();\n\t\t\t\tlevelTwoThreeDesktopVM.incidentForm.interventions.$setDirty();\n\t\t\t}\n\n\t\t\tif (levelTwoThreeDesktopVM.isStudentRecord && isBehaviorAdd()) {\n\t\t\t\tlevelTwoThreeDesktopVM.incidentForm.studentCourseAndMeetingBlock.$setDirty();\n\t\t\t}\n\t\t}\n\n\t\tfunction isValid() {\n\t\t\tsetFormDirty();\n\t\t\tvalidateIncidentDate();\n\t\t\tvalidateIncidentTime();\n\t\t\tvar validity = false;\n\n\t\t\tvalidity = levelTwoThreeDesktopVM.incidentForm.incidentDate.$valid &&\n\t\t\t\tlevelTwoThreeDesktopVM.incidentForm.incidentTime.$valid &&\n\t\t\t\tlevelTwoThreeDesktopVM.incidentForm.incidentLocation.$valid &&\n\t\t\t\tvalidateObservation() &&\n\t\t\t\tvalidateAction();\n\n\t\t\tif (validity && levelTwoThreeDesktopVM.incidentMode === 'advanced') {\n\t\t\t\tvar subjectIsValid = levelTwoThreeDesktopVM.incidentForm.incidentSubject\n\t\t\t\t\t? levelTwoThreeDesktopVM.incidentForm.incidentSubject.$valid\n\t\t\t\t\t: true;\n\n\t\t\t\tvalidity = validateMotivation() &&\n\t\t\t\t\tvalidateInterventions() &&\n\t\t\t\t\tsubjectIsValid &&\n\t\t\t\t\tlevelTwoThreeDesktopVM.incidentForm.studentActionsPriorToObservedBehavior.$valid &&\n\t\t\t\t\tlevelTwoThreeDesktopVM.incidentForm.whatDidStudentGainFromBehavior.$valid;\n\t\t\t}\n\n\t\t\tif (validity && levelTwoThreeDesktopVM.isStudentRecord && isBehaviorAdd()) {\n\t\t\t\tvalidity = levelTwoThreeDesktopVM.incidentForm.studentCourseAndMeetingBlock.$valid;\n\t\t\t}\n\n\t\t\tif (validity && levelTwoThreeDesktopVM.isNotesFieldRequired()) {\n\t\t\t\tvalidity = levelTwoThreeDesktopVM.incidentForm.incidentNotes.$valid;\n\t\t\t}\n\n\t\t\treturn validity;\n\t\t}\n\n\t\tfunction checkIftimeIsOutsideSchoolHours() {\n\t\t\t// Check if time is outside school hours\n\t\t\tlevelTwoThreeDesktopVM.warnTimeNotBetweenSchoolStartEndTime = !(moment(levelTwoThreeDesktopVM.incidentTime).diff(levelTwoThreeDesktopVM.schoolStartTime, 'minutes') >= 0 &&\n\t\t\t\tmoment(levelTwoThreeDesktopVM.incidentTime).diff(levelTwoThreeDesktopVM.schoolEndTime, 'minutes') <= 0);\n\t\t}\n\n\t\tfunction validateIncidentTime() {\n\t\t\tif (!levelTwoThreeDesktopVM.incidentForm.incidentTime) return true;\n\n\t\t\tif (levelTwoThreeDesktopVM.incidentForm.incidentTime.$pristine) return true;\n\n\t\t\tvar isValid = moment(levelTwoThreeDesktopVM.incidentTime).isValid();\n\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.incidentTime.$setValidity(\n\t\t\t\t'invalidTime',\n\t\t\t\tisValid\n\t\t\t);\n\n\t\t\tif (!isValid) return false;\n\n\t\t\tcheckIftimeIsOutsideSchoolHours();\n\n\t\t\tvar incidentTimeWithDate = moment(levelTwoThreeDesktopVM.incidentTime).set({ years: levelTwoThreeDesktopVM.incidentDate.year(), months: levelTwoThreeDesktopVM.incidentDate.month(), date: levelTwoThreeDesktopVM.incidentDate.date() });\n\n\t\t\tvar isNotInFuture = incidentTimeWithDate.diff(moment(), 'minutes') <= 0;\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.incidentTime.$setValidity(\n\t\t\t\t'futureTime',\n\t\t\t\tisNotInFuture\n\t\t\t);\n\n\t\t\t// Check if level 2 event for same day, course sectiong group and meeting block has an earlier date.\n\t\t\tvar isAfterPreviousIncidentInSameMeetingBlockTime = true;\n\n\t\t\tif (levelTwoThreeDesktopVM.previousIncidentInSameMeetingBlockTime) {\n\t\t\t\tisAfterPreviousIncidentInSameMeetingBlockTime = incidentTimeWithDate.diff(levelTwoThreeDesktopVM.previousIncidentInSameMeetingBlockTime, 'minute') >= 0;\n\n\t\t\t\tlevelTwoThreeDesktopVM.incidentForm.incidentTime.$setValidity(\n\t\t\t\t\t'previousIncidentInSameMeetingBlockTime',\n\t\t\t\t\tisAfterPreviousIncidentInSameMeetingBlockTime\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.incidentTime.$invalid = !(isNotInFuture && isAfterPreviousIncidentInSameMeetingBlockTime);\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.incidentTime.$valid = isNotInFuture && isAfterPreviousIncidentInSameMeetingBlockTime;\n\n\t\t\treturn isNotInFuture && isAfterPreviousIncidentInSameMeetingBlockTime;\n\t\t}\n\n\t\tfunction validateIncidentDate() {\n\t\t\tif (!levelTwoThreeDesktopVM.incidentForm.incidentDate) return;\n\n\t\t\t\n\t\t\tif (levelTwoThreeDesktopVM.incidentDate.isValid === undefined) {\n\t\t\t\tlevelTwoThreeDesktopVM.incidentDate = moment(levelTwoThreeDesktopVM.incidentDate);\n\t\t\t}\n\t\t\tvar isValidDate = levelTwoThreeDesktopVM.incidentDate.isValid();\n\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.incidentDate.$setValidity(\n\t\t\t\t'invalidDate',\n\t\t\t\tisValidDate\n\t\t\t);\n\n\t\t\tif (!isValidDate) return;\n\n\t\t\tvar isNotWeekendDate = !(moment(levelTwoThreeDesktopVM.incidentDate).day() % 6 === 0);\n\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.incidentDate.$setValidity(\n\t\t\t\t'weekendDate',\n\t\t\t\tisNotWeekendDate\n\t\t\t);\n\n\t\t\tif (levelTwoThreeDesktopVM.incidentTime) { validateIncidentTime(); }\n\t\t}\n\n\t\tfunction validateObservation() {\n\t\t\tvar hasSelectedAtLeastOne = levelTwoThreeDesktopVM.selectedObservations.length > 0;\n\t\t\tvar hasSelectedThreeOrLess = levelTwoThreeDesktopVM.selectedObservations.length <= 3;\n\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.observations.$setValidity(\n\t\t\t\t'noSelections',\n\t\t\t\thasSelectedAtLeastOne\n\t\t\t);\n\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.observations.$setValidity(\n\t\t\t\t'moreThanThreeSelections',\n\t\t\t\thasSelectedThreeOrLess\n\t\t\t);\n\n\t\t\treturn hasSelectedAtLeastOne && hasSelectedThreeOrLess;\n\t\t}\n\n\t\tfunction validateAction() {\n\t\t\tvar hasSelectedAtLeastOne = levelTwoThreeDesktopVM.selectedActions.length > 0;\n\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.actions.$setValidity(\n\t\t\t\t'noSelections',\n\t\t\t\thasSelectedAtLeastOne\n\t\t\t);\n\t\t\t//todo: look into why the above setValidity method isn't working\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.actions.$valid = hasSelectedAtLeastOne;\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.actions.$invalid = !hasSelectedAtLeastOne;\n\n\t\t\treturn hasSelectedAtLeastOne;\n\t\t}\n\n\t\tfunction validateMotivation() {\n\t\t\tvar hasSelectedAtLeastOne = levelTwoThreeDesktopVM.selectedMotivations.length > 0;\n\t\t\tvar hasSelectedThreeOrLess = levelTwoThreeDesktopVM.selectedMotivations.length <= 3;\n\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.motivations.$setValidity(\n\t\t\t\t'noSelections',\n\t\t\t\thasSelectedAtLeastOne\n\t\t\t);\n\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.motivations.$setValidity(\n\t\t\t\t'moreThanThreeSelections',\n\t\t\t\thasSelectedThreeOrLess\n\t\t\t);\n\n\t\t\treturn hasSelectedAtLeastOne && hasSelectedThreeOrLess;\n\t\t}\n\n\t\tfunction validateInterventions() {\n\t\t\tvar hasSelectedAtLeastOne = levelTwoThreeDesktopVM.selectedInterventions.length > 0;\n\n\t\t\tlevelTwoThreeDesktopVM.incidentForm.interventions.$setValidity(\n\t\t\t\t'noSelections',\n\t\t\t\thasSelectedAtLeastOne\n\t\t\t);\n\n\t\t\treturn hasSelectedAtLeastOne;\n\t\t}\n\n\t\tfunction setCreatedAndModifiedID(obj) {\n\n\t\t\tif (!obj.createdByStaffID) { obj.CreatedByStaffID = levelTwoThreeDesktopVM.staffId; }\n\n\t\t\tobj.LastModifiedByStaffID = levelTwoThreeDesktopVM.staffId;\n\t\t}\n\n\t\tfunction buildBehaviorEventIncidentFromView() {\n\n\t\t\tvar isInitial = levelTwoThreeDesktopVM.isInitialLevelTwoIncident || levelTwoThreeDesktopVM.isInitialLevelThreeIncident;\n\n\t\t\tvar behaviorEventIncident =\n\t\t\t{\n\t\t\t\tBehaviorEvent: {},\n\t\t\t\tBehaviorEventObservations: [],\n\t\t\t\tBehaviorEventParticipantActions: [],\n\t\t\t\tBehaviorEventParticipant: {},\n\t\t\t\tBehaviorEventParticipantInterventions: [],\n\t\t\t\tBehaviorEventParticipantMotivations: []\n\t\t\t};\n\n\t\t\t_.forEach(levelTwoThreeDesktopVM.selectedObservations, function (o) { setCreatedAndModifiedID(o); });\n\n\t\t\t_.forEach(levelTwoThreeDesktopVM.selectedActions, function (a) { setCreatedAndModifiedID(a); });\n\n\t\t\tif (isInitial) {\n\t\t\t\tbehaviorEventIncident.BehaviorEvent =\n\t\t\t\t{\n\t\t\t\t\tDate: moment(levelTwoThreeDesktopVM.incidentDate).format('YYYY-MM-DD'),\n\t\t\t\t\tTime: moment(levelTwoThreeDesktopVM.incidentTime).format('HH:mm:ss'),\n\t\t\t\t\tBehaviorLocationID: levelTwoThreeDesktopVM.selectedLocation,\n\t\t\t\t\tNotes: levelTwoThreeDesktopVM.notes,\n\t\t\t\t\tCourseSectionGroupID: levelTwoThreeDesktopVM.selectedCourseIsSpecial ? null : levelTwoThreeDesktopVM.courseSectionGroupId,\n\t\t\t\t\tSpecialsCourseSectionID: levelTwoThreeDesktopVM.selectedCourseIsSpecial ? levelTwoThreeDesktopVM.specialsCourseSectionId : null,\n\t\t\t\t\tMeetingBlockTimeID: levelTwoThreeDesktopVM.selectedCourseIsSpecial ? null : levelTwoThreeDesktopVM.meetingBlockTimeId,\n\t\t\t\t\tIsCourseSectionBehaviorEvent: 1,\n\t\t\t\t\tIsIncomplete: false,\n\t\t\t\t\tSchoolID: levelTwoThreeDesktopVM.schoolId,\n\t\t\t\t\tAcademicYearID: levelTwoThreeDesktopVM.academicYearId,\n\t\t\t\t\tCreatedByStaffID: levelTwoThreeDesktopVM.staffId,\n\t\t\t\t\tLastModifiedByStaffID: levelTwoThreeDesktopVM.staffId,\n\t\t\t\t\tIsAdvancedFieldIncomplete: false\n\t\t\t\t};\n\t\t\t\tbehaviorEventIncident.BehaviorEventObservations = levelTwoThreeDesktopVM.selectedObservations;\n\t\t\t\tbehaviorEventIncident.BehaviorEventParticipantActions = levelTwoThreeDesktopVM.selectedActions;\n\t\t\t\tbehaviorEventIncident.BehaviorEventParticipant =\n\t\t\t\t{\n\t\t\t\t\tBehaviorParticipantTypeID: 1, // hardcoded to student for level 2, 3\n\t\t\t\t\tParticipantStudentInSchoolID: levelTwoThreeDesktopVM.studentInSchoolId,\n\t\t\t\t\tBehaviorLevelID: levelTwoThreeDesktopVM.behaviorLevelId,\n\t\t\t\t\tBehaviorRoleID: 1, // offender\n\t\t\t\t\tIncludeInParentEmail: levelTwoThreeDesktopVM.includeEmail,\n\t\t\t\t\tCreatedByStaffID: levelTwoThreeDesktopVM.staffId,\n\t\t\t\t\tLastModifiedByStaffID: levelTwoThreeDesktopVM.staffId,\n\t\t\t\t\tSchoolID: levelTwoThreeDesktopVM.schoolId,\n\t\t\t\t\tAcademicYearID: levelTwoThreeDesktopVM.academicYearId\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tbehaviorEventIncident.BehaviorEvent =\n\t\t\t\t{\n\t\t\t\t\tBehaviorEventID: levelTwoThreeDesktopVM.behaviorEventId,\n\t\t\t\t\tDate: moment(levelTwoThreeDesktopVM.incidentDate).format('YYYY-MM-DD'),\n\t\t\t\t\tTime: moment(levelTwoThreeDesktopVM.incidentTime).format('HH:mm:ss'),\n\t\t\t\t\tBehaviorLocationID: levelTwoThreeDesktopVM.selectedLocation,\n\t\t\t\t\tNotes: levelTwoThreeDesktopVM.notes,\n\t\t\t\t\tIsIncomplete: false,\n\t\t\t\t\tLastModifiedByStaffID: levelTwoThreeDesktopVM.staffId\n\t\t\t\t};\n\t\t\t\tbehaviorEventIncident.BehaviorEventObservations = levelTwoThreeDesktopVM.selectedObservations;\n\t\t\t\tbehaviorEventIncident.BehaviorEventParticipantActions = levelTwoThreeDesktopVM.selectedActions;\n\t\t\t\tbehaviorEventIncident.BehaviorEventParticipant =\n\t\t\t\t{\n\t\t\t\t\tIncludeInParentEmail: levelTwoThreeDesktopVM.includeEmail,\n\t\t\t\t\tLastModifiedByStaffID: levelTwoThreeDesktopVM.staffId\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (levelTwoThreeDesktopVM.incidentMode === 'advanced') {\n\n\t\t\t\t_.forEach(levelTwoThreeDesktopVM.selectedInterventions, function (i) { setCreatedAndModifiedID(i); });\n\n\t\t\t\t_.forEach(levelTwoThreeDesktopVM.selectedMotivations, function (m) { setCreatedAndModifiedID(m); });\n\n\t\t\t\tbehaviorEventIncident.BehaviorEventParticipantInterventions = levelTwoThreeDesktopVM.selectedInterventions;\n\t\t\t\tbehaviorEventIncident.BehaviorEventParticipantMotivations = levelTwoThreeDesktopVM.selectedMotivations;\n\t\t\t\tbehaviorEventIncident.BehaviorEventParticipant.ActionsPriorToBehavior = levelTwoThreeDesktopVM.studentActionsPriorToObservedBehavior;\n\t\t\t\tbehaviorEventIncident.BehaviorEventParticipant.StudentGainFromBehavior = levelTwoThreeDesktopVM.whatDidStudentGainFromBehavior;\n\t\t\t\tbehaviorEventIncident.BehaviorEvent.CoreSubjectLevel1ID = levelTwoThreeDesktopVM.coreSubjectLevel1ID;\n\t\t\t\tbehaviorEventIncident.BehaviorEvent.IsAdvancedFieldIncomplete = true;\n\t\t\t}\n\n\t\t\treturn behaviorEventIncident;\n\t\t}\n\n\t\tfunction onCancelClick() {\n\t\t\tbehaviorDirtyCheckService.isFormDirty(levelTwoThreeDesktopVM.incidentForm) ? behaviorAlertService.goSwal(\"dirtyForm\", goToPreviousScreen, null) : goToPreviousScreen();\n\t\t}\n\n\t\tfunction goToPreviousScreen() {\n\t\t\tif (levelTwoThreeDesktopVM.isStudentRecord) {\n\t\t\t\t$state.go('student.behavior.main.behaviorlist');\n\t\t\t} else {\n\t\t\t\tvar lastStudentListPath = behaviorSessionCache.get('behavior.lastStudentListView.' + levelTwoThreeDesktopVM.staffId);\n\n\t\t\t\tif (lastStudentListPath) {\n\t\t\t\t\t$location.path(lastStudentListPath);\n\t\t\t\t} else {\n\t\t\t\t\t$state.go('behavior-courses');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction onSaveSuccess(saveEventIncident) {\n\t\t\tbehaviorAlertService.goSwal(\"saveSuccess\", goToPreviousScreen);\n\t\t}\n\n\t\tfunction onSaveFailure(error) {\n\t\t\tbehaviorAlertService.goSwal(\"saveFailureWithMsg\", goToPreviousScreen, error.data.exceptionMessage);\n\t\t}\n\n\t\t$scope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {\n\t\t\tswal.close();\n\t\t});\n\n\t\tfunction onSaveSuccessAndAddLevelThree(saveEventIncident) {\n\t\t\tif (levelTwoThreeDesktopVM.isStudentRecord) {\n\t\t\t\tbehaviorSessionCache.put('behavior.selectedCourse' + levelTwoThreeDesktopVM.staffId,\n\t\t\t\t\tlevelTwoThreeDesktopVM.selectedStudentCourseAndMeetingBlock);\n\t\t\t}\n\t\t\t$state.go($state.current,\n\t\t\t\t{\n\t\t\t\t\tstudentInSchoolId: levelTwoThreeDesktopVM.studentInSchoolId,\n\t\t\t\t\tbehaviorLevelId: 3,\n\t\t\t\t\tcourseSectionGroupId: levelTwoThreeDesktopVM.courseSectionGroupId,\n\t\t\t\t\tspecialsCourseSectionId: levelTwoThreeDesktopVM.specialsCourseSectionId,\n\t\t\t\t\tmeetingBlockTimeId: levelTwoThreeDesktopVM.meetingBlockTimeId,\n\t\t\t\t\tdate: levelTwoThreeDesktopVM.incidentDate.format('YYYY-MM-DD')\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\treload: true\n\t\t\t\t});\n\t\t}\n\n\t\tfunction save() {\n\t\t\tlevelTwoThreeDesktopVM.isSavingSpinner = true;\n\t\t\tsaveData(onSaveSuccess, onSaveFailure);\n\t\t}\n\n\t\tfunction saveAndAddLevelThree() {\n\t\t\tlevelTwoThreeDesktopVM.isSavingAndAddLevel3Spinner = true;\n\t\t\tsaveData(onSaveSuccessAndAddLevelThree, onSaveFailure);\n\t\t}\n\n\t\tfunction saveData(onSaveSuccessFn, onSaveFailureFn) {\n\t\t\tlevelTwoThreeDesktopVM.isSaving = true;\n\n\t\t\tcheckIfStudentWasPresentForClass().then(function () {\n\t\t\t\tvar behaviorEventIncident = buildBehaviorEventIncidentFromView();\n\n\t\t\t\tif (levelTwoThreeDesktopVM.isReadOnly) {\n\t\t\t\t\tdisableIsSaving();\n\t\t\t\t\tbehaviorAlertService.goSwal(\"validationFailure\", null, \"Sorry, but you do not have the necessary permissions to do this. Please contact Support if you believe this is incorrect.\");\n\t\t\t\t} else if (!levelTwoThreeDesktopVM.studentWasPresent) {\n\t\t\t\t\tdisableIsSaving();\n\t\t\t\t\tbehaviorAlertService.goSwal(\"validationFailure\", null, \"Please choose a date and time when the student was present and try again.\");\n\t\t\t\t} else if (isValid(behaviorEventIncident)) {\n\n\t\t\t\t\tif (levelTwoThreeDesktopVM.isInitialLevelTwoIncident || levelTwoThreeDesktopVM.isInitialLevelThreeIncident) {\n\t\t\t\t\t\tbehaviorEventIncidentRepository.set(behaviorEventIncident).then(onSaveSuccessFn, onSaveFailureFn).then(disableIsSaving);\n\t\t\t\t\t} else if (levelTwoThreeDesktopVM.isUpdatedLevelTwoIncident || levelTwoThreeDesktopVM.isUpdatedLevelThreeIncident) {\n\t\t\t\t\t\tbehaviorEventIncidentRepository.put(behaviorEventIncident).then(onSaveSuccessFn, onSaveFailureFn).then(disableIsSaving);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tdisableIsSaving();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction disableIsSaving() {\n\t\t\tlevelTwoThreeDesktopVM.isSaving = false;\n\t\t\tlevelTwoThreeDesktopVM.isSavingSpinner = false;\n\t\t\tlevelTwoThreeDesktopVM.isSavingAndAddLevel3Spinner = false;\n\t\t}\n\n\t\t// ------------------ Edit / Update event functions --------------------------\n\t\tfunction setFormValues(behaviorEvent) {\n\t\t\tlevelTwoThreeDesktopVM.previousIncident = behaviorEvent;\n\t\t\tvar previousEvent = behaviorEvent.behaviorEvent;\n\t\t\tvar previousParticipant = behaviorEvent.behaviorEventParticipant;\n\n\t\t\tlevelTwoThreeDesktopVM.behaviorLevelId = previousParticipant.behaviorLevelID;\n\t\t\tlevelTwoThreeDesktopVM.incidentDate = moment.utc(previousEvent.date).format('L');\n\t\t\tlevelTwoThreeDesktopVM.incidentTime = moment(previousEvent.time, 'HH:mm:ss').toDate();\n\t\t\tlevelTwoThreeDesktopVM.selectedLocation = previousEvent.behaviorLocationID;\n\t\t\tlevelTwoThreeDesktopVM.notes = previousEvent.notes;\n\t\t\tlevelTwoThreeDesktopVM.courseSectionGroupId = previousEvent.courseSectionGroupID;\n\t\t\tlevelTwoThreeDesktopVM.specialsCourseSectionId = previousEvent.specialsCourseSectionID;\n\t\t\tlevelTwoThreeDesktopVM.meetingBlockTimeId = previousEvent.meetingBlockTimeID;\n\t\t\tlevelTwoThreeDesktopVM.coreSubjectLevel1ID = previousEvent.coreSubjectLevel1ID;\n\n\t\t\tif (levelTwoThreeDesktopVM.isStudentRecord) {\n\t\t\t\tlevelTwoThreeDesktopVM.selectedStudentCourseAndMeetingBlock = getStudentCourseAndMeetingBlockId(levelTwoThreeDesktopVM.meetingBlockTimeId, previousEvent.courseSectionGroupID, levelTwoThreeDesktopVM.coreSubjectLevel1ID);\n\t\t\t}\n\n\t\t\tlevelTwoThreeDesktopVM.includeEmail = previousParticipant.includeInParentEmail;\n\t\t\tlevelTwoThreeDesktopVM.studentActionsPriorToObservedBehavior = previousParticipant.actionsPriorToBehavior;\n\t\t\tlevelTwoThreeDesktopVM.whatDidStudentGainFromBehavior = previousParticipant.studentGainFromBehavior;\n\n\t\t\tbehaviorEvent.behaviorEventParticipantInterventions.length > 0 ? setIncidentMode('advanced') : setIncidentMode('simple');\n\t\t}\n\n\t\tfunction getStudentCourseAndMeetingBlockId(meetingBlockTimeID, courseSectionGroupID, subjectLevel1ID) {\n\t\t\tvar id = _.parseInt(\"\".concat(meetingBlockTimeID, courseSectionGroupID, subjectLevel1ID));\n\t\t\treturn id;\n\t\t}\n\n\t\tfunction loadPreviousIncident() {\n\t\t\treturn behaviorEventIncidentRepository.getSingleParticipantEventIncident(levelTwoThreeDesktopVM.behaviorEventId)\n\t\t\t\t.then(setFormValues, onDataLoadError);\n\t\t}\n\n\t\tfunction onDataLoadError(reason) {\n\t\t\tbehaviorAlertService(\"retrievalFailure\", goToPreviousScreen);\n\t\t}\n\n\t\t// utilities\n\t\tfunction containsPreviousObservationActionInterventionOrMotivation(tileGroup, tile) {\n\t\t\tvar contains = [];\n\n\t\t\tswitch (tileGroup) {\n\t\t\t\tcase \"selectedObservations\":\n\t\t\t\t\tcontains = _.filter(levelTwoThreeDesktopVM.selectedObservations, function (o) {\n\t\t\t\t\t\treturn o.behaviorObservationID === tile.behaviorObservationID;\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"selectedMotivations\":\n\t\t\t\t\tcontains = _.filter(levelTwoThreeDesktopVM.selectedMotivations, function (m) {\n\t\t\t\t\t\treturn m.behaviorMotivationID === tile.behaviorMotivationID;\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"selectedInterventions\":\n\t\t\t\t\tcontains = _.filter(levelTwoThreeDesktopVM.selectedInterventions, function (i) {\n\t\t\t\t\t\treturn i.behaviorInterventionID === tile.behaviorInterventionID;\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"selectedActions\":\n\t\t\t\t\tcontains = _.filter(levelTwoThreeDesktopVM.selectedActions, function (a) {\n\t\t\t\t\t\treturn a.behaviorActionID === tile.behaviorActionID;\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn contains.length > 0 ? true : false;\n\t\t}\n\n\t\tfunction setActionNames(previousActions) {\n\t\t\tif (levelTwoThreeDesktopVM.actions.length === 0) return;\n\n\t\t\t_.forEach(previousActions, function (a) {\n\t\t\t\tlevelTwoThreeDesktopVM.selectedActions\n\t\t\t\t\t.push(_.find(levelTwoThreeDesktopVM.actions, { \"behaviorActionID\": a.behaviorActionID }));\n\t\t\t});\n\t\t}\n\n\t\tfunction setMotivationNames(previousMotivations) {\n\n\t\t\tif (levelTwoThreeDesktopVM.motivations.length === 0) return;\n\n\t\t\t_.forEach(previousMotivations, function (m) {\n\t\t\t\tlevelTwoThreeDesktopVM.selectedMotivations\n\t\t\t\t\t.push(_.find(levelTwoThreeDesktopVM.motivations, { \"behaviorMotivationID\": m.behaviorMotivationID }));\n\t\t\t});\n\t\t}\n\n\t\tfunction setInterventionNames(previousInterventions) {\n\n\t\t\tif (levelTwoThreeDesktopVM.interventions.length === 0) return;\n\n\t\t\t_.forEach(previousInterventions, function (i) {\n\t\t\t\tlevelTwoThreeDesktopVM.selectedInterventions\n\t\t\t\t\t.push(_.find(levelTwoThreeDesktopVM.interventions, { \"behaviorInterventionID\": i.behaviorInterventionID }));\n\t\t\t});\n\t\t}\n\n\t\tfunction setObservationNames(previousObservations) {\n\t\t\tif (levelTwoThreeDesktopVM.observations.length === 0) return;\n\n\t\t\t_.forEach(previousObservations, function (o) {\n\t\t\t\tlevelTwoThreeDesktopVM.selectedObservations\n\t\t\t\t\t.push(_.find(levelTwoThreeDesktopVM.observations, { \"behaviorObservationID\": o.behaviorObservationID }));\n\t\t\t});\n\t\t}\n\n\t\tfunction removeTileFromView(tileGroup, tile) {\n\t\t\tswitch (tileGroup) {\n\t\t\t\tcase \"selectedObservations\":\n\t\t\t\t\tlevelTwoThreeDesktopVM.selectedObservations = _.filter(levelTwoThreeDesktopVM.selectedObservations, function (o) {\n\t\t\t\t\t\treturn o.behaviorObservationID !== tile.behaviorObservationID;\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"selectedMotivations\":\n\t\t\t\t\tlevelTwoThreeDesktopVM.selectedMotivations = _.filter(levelTwoThreeDesktopVM.selectedMotivations, function (m) {\n\t\t\t\t\t\treturn m.behaviorMotivationID !== tile.behaviorMotivationID;\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"selectedInterventions\":\n\t\t\t\t\tlevelTwoThreeDesktopVM.selectedInterventions = _.filter(levelTwoThreeDesktopVM.selectedInterventions, function (i) {\n\t\t\t\t\t\treturn i.behaviorInterventionID !== tile.behaviorInterventionID;\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"selectedActions\":\n\t\t\t\t\tlevelTwoThreeDesktopVM.selectedActions = _.filter(levelTwoThreeDesktopVM.selectedActions, function (a) {\n\t\t\t\t\t\treturn a.behaviorActionID !== tile.behaviorActionID;\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfunction isBehaviorAdd() {\n\t\t\treturn levelTwoThreeDesktopVM.action === 'add';\n\t\t}\n\n\t\tfunction isBehaviorUpdate() {\n\t\t\treturn levelTwoThreeDesktopVM.action === 'update';\n\t\t}\n\t}\n})();\n","/**\n * level-two-three.controller\n * @namespace Behavior\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .controller('LevelTwoThreeMobileCtrl', LevelTwoThreeMobileCtrl);\n\n // protect against minification\n /* @ngInject */\n LevelTwoThreeMobileCtrl.$inject = ['$state', '$stateParams', '$q', '$scope', '$controller', 'userContextService', 'enumService', '$location',\n 'locationRepository', 'observationRepository', 'actionRepository', 'behaviorEventIncidentRepository', '$window', 'behaviorCache',\n 'behaviorStateManagementService', 'appSettings', 'behaviorBehaviorListService', 'behaviorUserRoleService', 'behaviorAlertService',\n 'behaviorBlueRedIncidentCommon', 'behaviorSessionCache', 'apiSecurityService', 'behaviorAttendanceRepository'];\n\n /**\n * @name LevelTwoThreeMobileCtrl\n * @description Constructor for behavior-incident-mobile.controller. Seperate from desktop because they function much differently.\n * @memberOf Behavior\n */\n function LevelTwoThreeMobileCtrl($state, $stateParams, $q, $scope, $controller, userContextService, enumService, $location,\n locationRepository, observationRepository, actionRepository, behaviorEventIncidentRepository, $window, behaviorCache,\n behaviorStateManagementService, appSettings, behaviorBehaviorListService, behaviorUserRoleService, behaviorAlertService,\n behaviorBlueRedIncidentCommon, behaviorSessionCache, apiSecurityService, behaviorAttendanceRepository) {\n\n // Controller as vm - see route configuration\n var levelTwoThreeMobileVM = this;\n\n levelTwoThreeMobileVM.tabs = [\n { name: \"Incident\", selected: true },\n { name: \"Observed Behavior\", selected: false },\n { name: \"Action\", selected: false }\n ];\n\n levelTwoThreeMobileVM.incident = {\n time: moment(),\n date: moment($state.params.date, 'YYYY-MM-DD').format('L')\n };\n\n // SECTION I: Extract passed-in values\n levelTwoThreeMobileVM.hasWritePermissions = false;\n\n // SECTION II: Properties associated to view model - sorted alphabetically\n levelTwoThreeMobileVM.actions = [];\n levelTwoThreeMobileVM.behaviorLocations = [];\n levelTwoThreeMobileVM.firstThreeActions = [];\n levelTwoThreeMobileVM.frequentlySelectedObservations = [];\n levelTwoThreeMobileVM.incidentIsSaving = true;\n levelTwoThreeMobileVM.includeInParentEmail = false;\n levelTwoThreeMobileVM.observations = [];\n levelTwoThreeMobileVM.observationAndActionParams = {};\n levelTwoThreeMobileVM.otherActionClicked = false;\n levelTwoThreeMobileVM.notesText = \"\";\n levelTwoThreeMobileVM.otherActionText = \"\";\n levelTwoThreeMobileVM.selectedLocation = null;\n levelTwoThreeMobileVM.selectedActions = [];\n levelTwoThreeMobileVM.selectedObservations = [];\n levelTwoThreeMobileVM.studentWasPresent = true;\n userContextService.ensureUserContext().then(function (context) {\n return levelTwoThreeMobileVM.staffId = context['http://schemas.mynha.com/SIS/Core/StaffID'];\n });\n levelTwoThreeMobileVM.timeForDisplaying = moment().format(\"hh:mm A\");\n levelTwoThreeMobileVM.courseSectionGroupId = $state.params.courseSectionGroupId || 0;\n levelTwoThreeMobileVM.specialsCourseSectionId = $state.params.specialsCourseSectionId || 0;\n levelTwoThreeMobileVM.selectedCourseIsSpecial = $state.params.isStudentRecord ? false: levelTwoThreeMobileVM.specialsCourseSectionId > 0;\n levelTwoThreeMobileVM.meetingBlockTimeId = $state.params.meetingBlockTimeId || 0;\n levelTwoThreeMobileVM.studentInSchoolId = $state.params.studentInSchoolId || $state.params.studentId || 0;\n\n // SECTION III: Navigation pass-thru methods - sorted alphabetically\n\n // SECTION IV: Controller methods associated to view model (init, reset, submit) - sorted alphabetically\n levelTwoThreeMobileVM.init = init;\n levelTwoThreeMobileVM.onCancelClick = onCancelClick;\n levelTwoThreeMobileVM.onSaveClick = onSaveClick;\n\n // SECTION V: All other methods - sorted alphabetically\n levelTwoThreeMobileVM.isComplete = isComplete;\n levelTwoThreeMobileVM.isAlreadySelectedAction = isAlreadySelectedAction;\n levelTwoThreeMobileVM.isAlreadySelectedObservation = isAlreadySelectedObservation;\n levelTwoThreeMobileVM.isTabVisible = isTabVisible;\n levelTwoThreeMobileVM.navigateToTab = navigateToTab;\n levelTwoThreeMobileVM.onActionClick = onActionClick;\n levelTwoThreeMobileVM.onObservationClick = onObservationClick;\n levelTwoThreeMobileVM.verifyMostBasicInfoForSaving = verifyMostBasicInfoForSaving;\n levelTwoThreeMobileVM.validateIncidentTime = validateIncidentTime;\n\n // Initialize\n levelTwoThreeMobileVM.init();\n\n function init() {\n loadDataPermissionsForPage()\n .then(loadUserPermissions)\n .then(loadAppState)\n .then(function() {\n validateEventEntry();\n\n return loadAllFormData();\n })\n .then(function() {\n validateIncidentTime();\n });\n }\n\n function loadUserPermissions() {\n return apiSecurityService.isAccessAllowed(\"ui_add_level_zero_two_three\", \"Get\").then(function(result) {\n levelTwoThreeMobileVM.hasWritePermissions = result;\n });\n }\n\n function loadAppState() {\n return behaviorStateManagementService.getInitialValues($state.params).then(function(q) {\n levelTwoThreeMobileVM = _.assign(levelTwoThreeMobileVM, q);\n });\n }\n\n function loadDataPermissionsForPage() {\n return behaviorUserRoleService.loadDataPermissionsForPage($state).then(function (q) {\n !q ? $state.go('403') : levelTwoThreeMobileVM.incidentIsSaving = false;\n });\n }\n\n // ------------------ Load functions -------------------------- //\n function loadAllFormData() {\n var queries = [];\n\n if (levelTwoThreeMobileVM.valuesLoadedProperly) {\n queries.push(loadLocations());\n queries.push(loadObservations());\n queries.push(loadActions());\n queries.push(loadStartEndTime());\n } else {\n onLoadFailure();\n }\n\n return $q.all(queries);\n }\n\n function loadStartEndTime() {\n return behaviorEventIncidentRepository\n .GetSchoolStartEndTime(levelTwoThreeMobileVM.schoolId, levelTwoThreeMobileVM.academicYearId)\n .then(function (result) {\n levelTwoThreeMobileVM.schoolStartTime = moment(result.startTime, 'HH:mm:ss');\n levelTwoThreeMobileVM.schoolEndTime = moment(result.endTime, 'HH:mm:ss');\n });\n }\n\n function loadLocations() {\n return locationRepository.getAll().then(function (results) {\n levelTwoThreeMobileVM.behaviorLocations = results;\n\n // Default selected location to Classroom\n levelTwoThreeMobileVM.selectedLocation = _(levelTwoThreeMobileVM.behaviorLocations)\n\t\t\t\t\t.filter(function (location) { return location.behaviorLocationName === \"Classroom (in-person)\"; })\n .first();\n });\n }\n\n function loadObservations() {\n return observationRepository.getAll(getObservationActionParams()).then(function (obsResults) {\n levelTwoThreeMobileVM.unfilteredObservations = _.cloneDeep(obsResults);\n levelTwoThreeMobileVM.observations = obsResults;\n\n // Get frequently selected behavior observations\n observationRepository.getFrequentlySelected(levelTwoThreeMobileVM.studentInSchoolId).then(function (freqSelectedResults) {\n\n // Remove frequently selected behaviors from all behaviors, to avoid duplication\n _.forEach(freqSelectedResults, function (fObs) {\n for (var x = 0; x < levelTwoThreeMobileVM.observations.length; x++) {\n if ((levelTwoThreeMobileVM.observations[x].behaviorObservationID === fObs.behaviorObservationID) ||\n (levelTwoThreeMobileVM.observations[x].behaviorObservationName === fObs.behaviorObservationName)) {\n // Add isNotesRequired property to frequently selected object\n _.assign(fObs, { 'isNotesRequired': levelTwoThreeMobileVM.observations[x].isNotesRequired });\n levelTwoThreeMobileVM.observations.splice(x, 1);\n }\n }\n });\n\n levelTwoThreeMobileVM.frequentlySelectedObservations = _.uniq(freqSelectedResults, 'behaviorObservationName');\n });\n });\n }\n\n function loadActions() {\n return actionRepository.getAll(getObservationActionParams()).then(function (data) {\n // Get first three actions for displaying on top row of Action screen\n for (var f = 0; f < 3; f++) { levelTwoThreeMobileVM.firstThreeActions.push(data[f]); }\n // Get the rest of the actions that will sit below the top row and the \"other\" input field\n for (var y = 3; y < data.length; y++) { levelTwoThreeMobileVM.actions.push(data[y]); }\n });\n }\n\n function loadBehaviorEventsForStudent() {\n var params = {\n $select: 'BehaviorEventID,MeetingBlockTimeID,Date,Time,BehaviorLevelID,CourseSectionGroupID,SpecialsCourseSectionID'\n };\n\n return behaviorBehaviorListService.getAllForStudent(params, null, levelTwoThreeMobileVM.studentInSchoolId)\n .then(function (data) {\n levelTwoThreeMobileVM.allPreviousIncidents = data;\n });\n }\n\n function getObservationActionParams() {\n return {\n academicYearID: levelTwoThreeMobileVM.academicYearId,\n schoolID: levelTwoThreeMobileVM.schoolId,\n behaviorLevelID: levelTwoThreeMobileVM.behaviorLevelId\n };\n }\n\n function onSaveSuccess(saveEventIncident) {\n levelTwoThreeMobileVM.incidentIsSaving = false;\n\n if (saveEventIncident.behaviorEvent.isIncomplete) {\n behaviorAlertService.goSwal(\"saveSuccessWithMsg\", goBack, \"Incomplete behavior event saved successfully. If not completed in 3 days, this event will be discarded.\");\n } else {\n behaviorAlertService.goSwal(\"saveSuccess\", goBack);\n }\n }\n\n function onIncompleteEvent() {\n levelTwoThreeMobileVM.isLoading = false;\n swal({\n title: 'Incomplete Event Exists',\n text: \"An incomplete behavior event exists for this student during this meeting block time. Please complete that event in Student Record before creating a new one\",\n type: 'warning',\n showCancelButton: false,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'OK',\n closeOnConfirm: true\n }, function (isConfirmed) {\n if (isConfirmed) {\n onCancelClick();\n }\n });\n }\n\n function buildBehaviorEventIncident() {\n\n _.forEach(levelTwoThreeMobileVM.selectedObservations, function(o) {\n var found = _.find(levelTwoThreeMobileVM.unfilteredObservations, { 'behaviorObservationName': o.behaviorObservationName });\n o.behaviorObservationID = found.behaviorObservationID;\n });\n\n var observationFields = {\n CreatedByStaffID: levelTwoThreeMobileVM.staffId,\n LastModifiedByStaffID: levelTwoThreeMobileVM.staffId\n };\n\n var actionFields = {\n CreatedByStaffID: levelTwoThreeMobileVM.staffId,\n LastModifiedByStaffID: levelTwoThreeMobileVM.staffId\n };\n\n var behaviorEventObservations = _.map(levelTwoThreeMobileVM.selectedObservations, function (i) {\n return _.extend({}, i, observationFields);\n });\n\n var behaviorEventParticipantActions = _.map(levelTwoThreeMobileVM.selectedActions, function (i) {\n return _.extend({}, i, actionFields);\n });\n\n // Setting notes text for \"other\" action selection\n if (levelTwoThreeMobileVM.otherActionText.length > 0) {\n _.forEach(behaviorEventParticipantActions, function (action) {\n if (action.isOther) { action['OtherAction'] = levelTwoThreeMobileVM.otherActionText; }\n });\n }\n\n // The main behavior incident\n var behaviorEventIncident = {\n // Behavior event\n BehaviorEvent:\n {\n Date: levelTwoThreeMobileVM.incident.date,\n Time: moment(levelTwoThreeMobileVM.incident.time).format('HH:mm:ss'),\n BehaviorLocationID: levelTwoThreeMobileVM.selectedLocation.behaviorLocationID,\n Notes: levelTwoThreeMobileVM.notesText,\n CourseSectionGroupID: levelTwoThreeMobileVM.selectedCourseIsSpecial ? null : levelTwoThreeMobileVM.courseSectionGroupId,\n SpecialsCourseSectionID: levelTwoThreeMobileVM.selectedCourseIsSpecial ? levelTwoThreeMobileVM.specialsCourseSectionId : null,\n MeetingBlockTimeID: levelTwoThreeMobileVM.selectedCourseIsSpecial ? null : levelTwoThreeMobileVM.meetingBlockTimeId,\n IsCourseSectionBehaviorEvent: 1,\n IsIncomplete: !levelTwoThreeMobileVM.isComplete(),\n SchoolID: levelTwoThreeMobileVM.schoolId,\n AcademicYearID: levelTwoThreeMobileVM.academicYearId,\n CreatedByStaffID: levelTwoThreeMobileVM.staffId,\n LastModifiedByStaffID: levelTwoThreeMobileVM.staffId,\n IsAdvancedFieldIncomplete: false\n },\n // Observations\n BehaviorEventObservations: behaviorEventObservations,\n // Actions\n BehaviorEventParticipantActions: behaviorEventParticipantActions,\n // Participants\n BehaviorEventParticipant:\n {\n BehaviorParticipantTypeID: 1, // hardcoded to student\n ParticipantStudentInSchoolID: levelTwoThreeMobileVM.studentInSchoolId,\n BehaviorLevelID: levelTwoThreeMobileVM.behaviorLevelId,\n BehaviorRoleID: 1, // hardcoded to offender\n IncludeInParentEmail: levelTwoThreeMobileVM.includeInParentEmail,\n CreatedByStaffID: levelTwoThreeMobileVM.staffId,\n LastModifiedByStaffID: levelTwoThreeMobileVM.staffId,\n AcademicYearID: levelTwoThreeMobileVM.academicYearId,\n SchoolID: levelTwoThreeMobileVM.schoolId,\n RestartBSPCount: false,\n Notes: levelTwoThreeMobileVM.notesText\n },\n // Mobile\n IsMobile: true\n };\n\n return behaviorEventIncident;\n }\n\n // Save\n function onSaveClick() {\n\n\t\t\tcheckIfStudentWasPresentForClass().then(function () {\n var dateTimeLocationComplete = verifyMostBasicInfoForSaving();\n if (!dateTimeLocationComplete) { dateTimeLocationNotLoaded(); }\n\n var observationNotesComplete = verifyObservationNotesCompletedIfRequired();\n if (!observationNotesComplete) { observationNotesNotComplete(); }\n\n var actionNotesComplete = verifyActionNotesCompletedIfRequired();\n if (!actionNotesComplete) { actionNotesNotComplete(); }\n\n if (dateTimeLocationComplete && observationNotesComplete && actionNotesComplete && levelTwoThreeMobileVM.studentWasPresent) {\n\n levelTwoThreeMobileVM.incidentIsSaving = true;\n\n var behaviorEventIncident = buildBehaviorEventIncident();\n\n behaviorEventIncidentRepository.set(behaviorEventIncident).then(onSaveSuccess, onSaveFailure);\n } else if (!levelTwoThreeMobileVM.studentWasPresent) {\n behaviorAlertService.goSwal(\"warningWithMsg\", null, \"Cannot record a Behavior Incident when student was not marked Present.\");\n }\n });\n }\n\n // Cancel\n function onCancelClick() {\n $window.history.back();\n }\n\n function isTabVisible(tabName) {\n var selectedTabName = _(levelTwoThreeMobileVM.tabs)\n .filter(function (tab) { return tab.selected === true; })\n .map('name')\n .first();\n\n return selectedTabName === tabName;\n }\n\n function isAlreadySelectedObservation(observation) {\n return _.includes(levelTwoThreeMobileVM.selectedObservations, observation);\n }\n\n function onObservationClick(observation) {\n if (levelTwoThreeMobileVM.hasWritePermissions) {\n var isAlreadySelected = isAlreadySelectedObservation(observation);\n\n if (isAlreadySelected) {\n levelTwoThreeMobileVM.selectedObservations = _.without(levelTwoThreeMobileVM.selectedObservations, observation);\n } else {\n if (levelTwoThreeMobileVM.selectedObservations.length < 3) {\n levelTwoThreeMobileVM.selectedObservations.push(observation);\n }\n }\n }\n }\n\n function checkIfStudentWasPresentForClass() {\n\t\t\tvar date = levelTwoThreeMobileVM.incident.date;\n\t\t\tvar time = levelTwoThreeMobileVM.incident.date;\n\n\t\t\tif (levelTwoThreeMobileVM.selectedCourseIsSpecial) {\n\t\t\t\t// specials\n\t\t\t\treturn behaviorAttendanceRepository.checkIfStudentWasPresentForClassWithoutCourseInfo(levelTwoThreeMobileVM.studentInSchoolId, date)\n\t\t\t\t\t.then(function (wasPresent) {\n\t\t\t\t\t\tlevelTwoThreeMobileVM.studentWasPresent = wasPresent ? wasPresent.attendanceCodeEquivalencyID === 1 : false;\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn behaviorAttendanceRepository.checkIfStudentWasPresentForClass(\n\t\t\t\t\tlevelTwoThreeMobileVM.studentInSchoolId,\n\t\t\t\t\tlevelTwoThreeMobileVM.schoolId,\n\t\t\t\t\tdate,\n\t\t\t\t\ttime,\n\t\t\t\t\tlevelTwoThreeMobileVM.courseSectionGroupId,\n\t\t\t\t\tlevelTwoThreeMobileVM.meetingBlockTimeId,\n\t\t\t\t\tlevelTwoThreeMobileVM.specialsCourseSectionId)\n\t\t\t\t\t.then(function (wasPresent) {\n\t\t\t\t\t\tlevelTwoThreeMobileVM.studentWasPresent = wasPresent ? wasPresent.attendanceCodeEquivalencyID === 1 : false;\n\t\t\t\t\t});\n\t\t\t}\n }\n\n function isAlreadySelectedAction(action) {\n return _.includes(levelTwoThreeMobileVM.selectedActions, action);\n }\n\n function onActionClick(action) {\n if (levelTwoThreeMobileVM.hasWritePermissions) {\n var isAlreadySelected = isAlreadySelectedAction(action);\n\n if (isAlreadySelected) {\n levelTwoThreeMobileVM.selectedActions = _.without(levelTwoThreeMobileVM.selectedActions, action);\n } else {\n levelTwoThreeMobileVM.selectedActions.push(action);\n }\n\n // Open input bar for \"other\" action click\n if ((action.isOther) && !levelTwoThreeMobileVM.otherActionClicked) {\n levelTwoThreeMobileVM.otherActionClicked = true;\n } else if ((action.isOther) && levelTwoThreeMobileVM.otherActionClicked) {\n levelTwoThreeMobileVM.otherActionClicked = false;\n }\n }\n }\n\n function navigateToTab(selectedTab) {\n _.forEach(levelTwoThreeMobileVM.tabs, function (tab) {\n tab.selected = false;\n });\n\n selectedTab.selected = true;\n }\n\n function transitionToLevel(behaviorLevelId) {\n levelTwoThreeMobileVM.behaviorLevelId = behaviorLevelId;\n levelTwoThreeMobileVM.incidentIsSaving = true;\n\n $q.all([\n loadObservations(),\n loadActions()\n ]).then(function () {\n levelTwoThreeMobileVM.incidentIsSaving = false;\n });\n\n $state.params.behaviorLevelId = behaviorLevelId;\n $state.go($state.current, $state.params, { reload: false });\n }\n\n // ------------------ Validation functions -------------------------- //\n function verifyObservationNotesCompletedIfRequired() {\n\n if ((_.some(levelTwoThreeMobileVM.selectedObservations, 'isNotesRequired')) && levelTwoThreeMobileVM.notesText.length === 0) { return false; }\n\n return true;\n }\n\n function verifyActionNotesCompletedIfRequired() {\n\n if (levelTwoThreeMobileVM.otherActionClicked && levelTwoThreeMobileVM.otherActionText.length === 0) { return false; }\n\n return true;\n }\n\n function isComplete() {\n return (levelTwoThreeMobileVM.incident.date !== null) &&\n (levelTwoThreeMobileVM.incident.time !== null) &&\n (levelTwoThreeMobileVM.selectedLocation !== null) &&\n (levelTwoThreeMobileVM.staffId !== null) &&\n (($state.params.courseSectionGroupId !== null && $state.params.meetingBlockTimeId !== null) || $state.params.specialsCourseSectionId !== null) &&\n (levelTwoThreeMobileVM.selectedObservations.length > 0) &&\n (levelTwoThreeMobileVM.selectedActions.length > 0);\n }\n\n // Verify most basic information to avoid an error if a user saves too quickly\n function verifyMostBasicInfoForSaving() {\n return levelTwoThreeMobileVM.incident.date && levelTwoThreeMobileVM.incident.time.isValid() && levelTwoThreeMobileVM.selectedLocation.behaviorLocationID;\n }\n\n function validateIncidentTime() {\n var now = levelTwoThreeMobileVM.incident.time;\n levelTwoThreeMobileVM.warnTimeNotBetweenSchoolStartEndTime = !((now.isAfter(levelTwoThreeMobileVM.schoolStartTime)) && (now.isBefore(levelTwoThreeMobileVM.schoolEndTime)));\n }\n\n // ------------------ Checks -------------------------- //\n function validateEventEntry() {\n // Checks a students previous events for any incompletes or events that happened on the same day and navigates the user to the correct action.\n var deferred = $q.defer();\n if (levelTwoThreeMobileVM.allStudentEvents) {\n checkIncompleteAndConflictingEvents(levelTwoThreeMobileVM.allStudentEvents);\n deferred.resolve();\n } else {\n behaviorBlueRedIncidentCommon.loadBehaviorEventsForStudent(levelTwoThreeMobileVM.studentInSchoolId)\n .then(function (data) {\n levelTwoThreeMobileVM.allStudentEvents = data;\n checkIncompleteAndConflictingEvents(levelTwoThreeMobileVM.allStudentEvents);\n deferred.resolve();\n });\n }\n return deferred.promise;\n }\n\n function checkIncompleteAndConflictingEvents(events) {\n var params =[events, levelTwoThreeMobileVM.meetingBlockTimeId, levelTwoThreeMobileVM.specialsCourseSectionId, levelTwoThreeMobileVM.incident.date, levelTwoThreeMobileVM.selectedCourseIsSpecial];\n\n if (behaviorBlueRedIncidentCommon.anyIncompleteEvents.apply(null, params)) {\n onIncompleteEvent();\n } else {\n var todaysHighestEvent = behaviorBlueRedIncidentCommon.getHighestLevelEventForDate.apply(null, params);\n checkForValidBehaviorLevel(todaysHighestEvent);\n }\n }\n\n function checkForValidBehaviorLevel(todaysHighestEvent) {\n log(todaysHighestEvent);\n\n if (todaysHighestEvent) {\n var highestLevel = todaysHighestEvent.behaviorLevelID;\n log(\"highest level\", highestLevel);\n\n if (highestLevel === 3) {\n //log(\"highestLevel === 3\");\n levelTwoThreeMobileVM.isLoading = false;\n behaviorAlertService.goSwal(\"warningWithMsg\", null, \"The student has already reached level three behavior event for this time period. Consider escalation.\");\n } else if (highestLevel === 2) {\n //log(\"highestLevel === 2\");\n // Set to level 3 if necessary\n if (levelTwoThreeMobileVM.behaviorLevelId !== 3) {\n onUpdateToLevel3Alert();\n }\n\n // Get the level two event that was saved on this day/course group/meeting block and save it's date for validation.\n var date = moment(todaysHighestEvent.date);\n var time = moment(todaysHighestEvent.time, 'HH:mm:ss');\n\n levelTwoThreeMobileVM.previousIncidentInSameMeetingBlockTime = date.set({\n hour: time.hour(), minute: time.minute()\n });\n }\n } else {\n //log(\"No highest event\");\n // Set to level 2 if necesssary\n if (levelTwoThreeMobileVM.behaviorLevelId !== 2) {\n onUpdateToLevel2Alert();\n }\n }\n }\n\n // ------------------ Helper function -------------------------- //\n function goBack() {\n $window.history.back();\n }\n\n function level3Reached() {\n swal.close();\n levelTwoThreeMobileVM.isFormDisabled = true;\n }\n\n // ------------------ Sweet alerts -------------------------- //\n function onSaveFailure(error) {\n levelTwoThreeMobileVM.incidentIsSaving = false;\n behaviorAlertService.goSwal(\"saveFailureWithMsg\", goBack, error.data.exceptionMessage);\n }\n\n function observationNotesNotComplete() {\n behaviorAlertService.goSwal(\"saveFailureWithMsg\", null, \"Notes are required for the current observation(s) selected. Please navigate to Incident tab and enter notes.\");\n }\n\n function actionNotesNotComplete() {\n behaviorAlertService.goSwal(\"saveFailureWithMsg\", null, \"Notes are required for the current action(s) selected. Please navigate to Action tab and enter notes.\");\n }\n\n function dateTimeLocationNotLoaded() {\n behaviorAlertService.goSwal(\"loadFailure\", goBack);\n }\n\n function onUpdateToLevel2Alert() {\n swal({\n title: 'Unable to enter Level 3 event',\n text: \"You may not create a Level 3 event for this time period because a Level 2 event does not exist.\",\n type: 'info',\n showCancelButton: true,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'Create Level 2 Event',\n closeOnConfirm: true,\n cancelButtonText: \"Cancel\",\n closeOnCancel: true\n }, function (isConfirmed) {\n if (isConfirmed === true) {\n transitionToLevel(2);\n }\n });\n }\n\n function onUpdateToLevel3Alert() {\n swal({\n title: 'Unable to enter Level 2 event',\n text: \"You may not create a Level 2 event for this time period because a Level 2 event already exist.\",\n type: 'info',\n showCancelButton: true,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'Create Level 3 Event',\n closeOnConfirm: true,\n cancelButtonText: \"Cancel\",\n closeOnCancel: true\n }, function (isConfirmed) {\n if (isConfirmed === true) {\n transitionToLevel(3);\n }\n });\n }\n\n function onLoadFailure() {\n behaviorAlertService.goSwal(\"loadFailure\", goBack);\n }\n }\n})();\n","/**\n * level-two-three.controller\n * @namespace behavior\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .controller('LevelTwoThreeCtrl', LevelTwoThreeCtrl);\n\n // protect against minification\n /* @ngInject */\n LevelTwoThreeCtrl.$inject = ['matchmedia', 'appSettings'];\n\n /**\n * @name LevelTwoThreeCtrl\n * @description Constructor for behavior-incident.controller\n * @memberOf behavior\n */\n function LevelTwoThreeCtrl(matchmedia, appSettings) {\n // Controller as vm - see route configuration\n var levelTwoThreeVM = this;\n\n levelTwoThreeVM.desktopUrl = appSettings.behaviorWebRootUrl + 'app/components/incident/level-two-three/templates/_level-two-three-layout.desktop.html';\n levelTwoThreeVM.mobileUrl = appSettings.behaviorWebRootUrl + 'app/components/incident/level-two-three/templates/_level-two-three-layout.mobile.html';\n\n matchmedia.onPhone(function (mediaQueryList) {\n levelTwoThreeVM.isPhone = matchmedia.isPhone() || (matchmedia.isTablet() && matchmedia.isPortrait()) ;\n });\n\n matchmedia.onTablet(function (mediaQueryList) {\n levelTwoThreeVM.isPhone = matchmedia.isPhone() || (matchmedia.isTablet() && matchmedia.isPortrait());\n });\n }\n})();\n","/**\n * end-level-four-modal.controller\n * @namespace behavior\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n\t\t.module('nha.behavior')\n\t\t.controller('EndLevelFourModalCtrl', EndLevelFourModalCtrl);\n\n // protect against minification\n /* @ngInject */\n EndLevelFourModalCtrl.$inject = ['$q', '$state', '$stateParams', 'behaviorCache', '$uibModalInstance', 'student', 'academicYearID',\n 'schoolID', 'date', 'staffID', '$window', '$scope', 'behaviorEventIncidentRepository'];\n\n /**\n\t* @name EndLevelFourModalCtrl\n\t* @description Constructor for end-level-four-modal.controller\n\t* @memberOf behavior\n\t*/\n function EndLevelFourModalCtrl($q, $state, $stateParams, behaviorCache, $uibModalInstance, student, academicYearID,\n schoolID, date, staffID, $window, $scope, behaviorEventIncidentRepository) {\n\n // Controller as vm - see route configuration\n var endLevelFourModalVM = this;\n\n // Properties associated to view model - sorted alphabetically\n // helps you instantly identify which members of the controller can be bound and used in the View \n endLevelFourModalVM.academicYearID = academicYearID;\n endLevelFourModalVM.date = date;\n endLevelFourModalVM.isEndDateInCurrentAcademicYear = true;\n endLevelFourModalVM.isSaving = false;\n endLevelFourModalVM.isValidEndDate = false;\n endLevelFourModalVM.reason = \"\";\n endLevelFourModalVM.schoolID = schoolID;\n endLevelFourModalVM.staffID = staffID;\n endLevelFourModalVM.student = student;\n\n // Navigation pass-thru methods - sorted alphabetically, linked directly to navigationManager method calls\n // helps you instantly identify which members of the controller can be bound and used in the View \n endLevelFourModalVM.onCancelClick = onCancelClick;\n endLevelFourModalVM.onSaveClick = onSaveClick;\n\n // All other methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the controller can be bound and used in the View \n endLevelFourModalVM.validateEndDate = validateEndDate;\n\n function buildGoodModel() {\n\n var model =\n {\n StudentInSchoolID: endLevelFourModalVM.student.studentInSchoolID,\n Date: endLevelFourModalVM.date,\n Reason: endLevelFourModalVM.reason,\n StaffID: endLevelFourModalVM.staffID\n };\n\n return model;\n }\n\n function isComplete() {\n\n var complete = false;\n\n complete = (endLevelFourModalVM.isValidEndDate && endLevelFourModalVM.isEndDateInCurrentAcademicYear && endLevelFourModalVM.reason.length > 0);\n\n return complete;\n }\n\n function onSaveClick() {\n\n endLevelFourModalVM.isSaving = true;\n\n var complete = isComplete();\n\n var model = buildGoodModel();\n\n if (complete) {\n\n behaviorEventIncidentRepository.endLevelFourIncident(model).then(function (result) {\n\n endLevelFourModalVM.isSaving = false;\n $uibModalInstance.close(result);\n\n }, function (error) {\n\n endLevelFourModalVM.isSaving = false;\n $uibModalInstance.close(result);\n });\n }\n }\n\n function validateEndDate() {\n\n if (endLevelFourModalVM.date) {\n\n endLevelFourModalVM.isValidEndDate = moment(endLevelFourModalVM.date).isValid();\n\n var validationParams =\n {\n SchoolID: endLevelFourModalVM.schoolID,\n AcademicYearID: endLevelFourModalVM.academicYearID,\n Date: moment(endLevelFourModalVM.date).format('YYYY-MM-DD')\n };\n\n behaviorEventIncidentRepository.isWithinAcademicSchoolYear(validationParams).then(function (result) {\n\n endLevelFourModalVM.isEndDateInCurrentAcademicYear = result[0];\n\n }, function (error) {\n log('Level 4 Incident: End date not within current academic year', error);\n });\n } else { endLevelFourModalVM.isValidEndDate = false; }\n\n return endLevelFourModalVM.isValidEndDate;\n }\n\n function onCancelClick() {\n $uibModalInstance.dismiss();\n }\n }\n})();\n","(function () {\n 'use strict';\n\n angular\n .module('nha.behavior')\n .controller('ManagerCtrl', ManagerCtrl);\n\n // protect against minification\n /* @ngInject */\n ManagerCtrl.$inject = ['$scope', 'matchmedia', 'userContextService', 'ipCookie', 'studentListService', '$location', '$q',\n '$state', 'behaviorCache', '$stateParams', '$controller', 'appSettings', '$compile', 'managerListFilterCountsRepository',\n 'behaviorEventIncidentRepository', '$uibModal', '$window', 'behaviorOverviewService', 'behaviorUserRoleService',\n 'behaviorAlertService', 'apiSecurityService', 'observationRepository'];\n\n /**\n * @name ManagerController\n * @description Constructor for manager\n * @memberOf behavior\n */\n function ManagerCtrl($scope, matchmedia, userContextService, ipCookie, studentListService, $location, $q,\n $state, behaviorCache, $stateParams, $controller, appSettings, $compile, managerListFilterCountsRepository,\n behaviorEventIncidentRepository, $uibModal, $window, behaviorOverviewService, behaviorUserRoleService,\n behaviorAlertService, apiSecurityService, observationRepository) {\n\n // ReSharper disable PossiblyUnassignedProperty\n var moment = window.moment;\n var _ = window._;\n // ReSharper restore PossiblyUnassignedProperty\n\n var managerVM = this;\n var parameters = {};\n\n managerVM.canReviseLevelFour = false;\n managerVM.canWriteLevelZeroTwoThree = false;\n managerVM.canWriteLevelFour = false;\n managerVM.canWriteLevelFive = false;\n managerVM.endDate = moment().format('L');\n managerVM.hasUpdatePermissions = false;\n managerVM.hasWritePermissions = false;\n managerVM.incidentLevelSelected = 0;\n managerVM.isEndDateInCurrentAcademicYear = false;\n managerVM.isValidEndDate = false;\n managerVM.isTeacher = false;\n managerVM.numberOfIncidents = 0;\n managerVM.positiveCountAltered = false;\n managerVM.positiveObservations = [];\n managerVM.searchText = \"\";\n managerVM.selectedYearForPositiveObs = null;\n managerVM.selectedSchoolForPositiveObs = null;\n managerVM.studentsLoading = true;\n managerVM.studentAppendLoading = false;\n managerVM.students = [];\n managerVM.showIndicators = true;\n managerVM.show = {\n indicators: false,\n positive: true,\n level2: true,\n level3: true,\n level4: true,\n level5: true,\n level6: true,\n bsp: false,\n removals: false\n };\n managerVM.removals = {\n isLoading: true,\n removalDayCount: 0.0,\n incidentCount: 0,\n lastRemovalDate: null,\n lastRemovalUserName: \"\",\n specialEdDocumentationFulfilled: false\n };\n managerVM.sortNameGroupModel = [\n { criteria: 'LastName', displayName: 'Last Name' },\n { criteria: 'FirstName', displayName: 'First Name' }\n ];\n managerVM.sort = [{ criteria: 'LastName', descending: false }];\n\n // All other methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the controller can be bound and used in the View\n managerVM.addLevelFiveIncident = addLevelFiveIncident;\n managerVM.addLevelFourIncident = addLevelFourIncident;\n managerVM.addLevelTwoIncident = addLevelTwoIncident;\n managerVM.addLevelThreeIncident = addLevelThreeIncident;\n managerVM.addPositiveModal = addPositiveModal;\n managerVM.bspLineOffset = bspLineOffset;\n managerVM.bspWidthPercent = bspWidthPercent;\n managerVM.changeSorting = changeSorting;\n managerVM.isBip = isBip;\n managerVM.endLevelFourIncident = endLevelFourIncident;\n managerVM.failedToEndBspOrBipMessage = failedToEndBspOrBipMessage;\n managerVM.getStudentBehaviorListUrl = getStudentBehaviorListUrl;\n managerVM.getStudentUrl = getStudentUrl;\n managerVM.loadStudents = loadStudents;\n //var throttledLoadStudents = _.throttle(loadStudents, 8000, { 'trailing': false });\n //managerVM.throttledLoadStudents = throttledLoadStudents;\n managerVM.allStudentsLoaded = false;\n managerVM.getBehaviorEventUpdateLink = getBehaviorEventUpdateLink;\n managerVM.reviseLevelFour = reviseLevelFour;\n managerVM.searchTextChanged = searchTextChanged;\n managerVM.show10in20Tooltip = show10in20Tooltip;\n managerVM.showRemovalsTooltip = showRemovalsTooltip;\n managerVM.showAddTooltip = showAddTooltip;\n managerVM.showBspTooltip = showBspTooltip;\n managerVM.showIssTooltip = showIssTooltip;\n managerVM.showLevelTooltip = showLevelTooltip;\n managerVM.showOssTooltip = showOssTooltip;\n managerVM.show504Tooltip = show504Tooltip;\n managerVM.showSeTooltip = showSeTooltip;\n managerVM.succeededToEndBspOrBipMessage = succeededToEndBspOrBipMessage;\n managerVM.viewOptionClick = viewOptionClick;\n managerVM.removalsLineOffset = removalsLineOffset;\n managerVM.removalsMaxValue = removalsMaxValue;\n managerVM.removalsWidthPercent = removalsWidthPercent;\n\n // Initialize\n init();\n\n function viewOptionClick(option) {\n managerVM.show[option] = !managerVM.show[option];\n updateSettings();\n }\n\n function getStudentUrl(studentInSchoolId) {\n return appSettings.studentManagementWebRootUrl + studentInSchoolId + '/behavior/overview';\n }\n\n function getStudentBehaviorListUrl(studentInSchoolId, level) {\n return appSettings.studentManagementWebRootUrl + studentInSchoolId + '/behavior/behaviorlist' + (level ? '/' + level : '');\n }\n\n function getIncidentUrl(studentInSchoolId) {\n return appSettings.studentManagementWebRootUrl + studentInSchoolId + '/behavior/incident';\n }\n\n function bspWidthPercent(currentValue) {\n var max = bspMaxValue(currentValue);\n return (parseFloat(currentValue) / max * 100) + '%';\n }\n\n function bspLineOffset(currentValue) {\n var max = bspMaxValue(currentValue);\n\n return (10 / max * 80) + '%';\n }\n\n function bspMaxValue(currentValue) {\n return Math.max(Math.ceil(currentValue / 10) * 10, 20);\n }\n\n function removalsWidthPercent(currentValue) {\n var max = bspMaxValue(currentValue);\n return (parseFloat(currentValue) / max * 100) + '%';\n }\n\n function removalsLineOffset(currentValue) {\n var max = removalsMaxValue(currentValue);\n return ((10 / max * 80)) + '%';\n }\n\n function removalsMaxValue(currentValue) {\n return Math.max(Math.ceil(currentValue / 10) * 10, 20);\n }\n\n function loadStaffId() {\n return userContextService.ensureUserContext().then(function (context) {\n managerVM.staffId = context['http://schemas.mynha.com/SIS/Core/StaffID'];\n });\n }\n\n function updateSettings() {\n var key = 'behavior.managerSettings.' + managerVM.staffId;\n var settings = {\n show: managerVM.show\n };\n\n ipCookie(key, settings);\n }\n\n function loadSettings() {\n var key = 'behavior.managerSettings.' + managerVM.staffId;\n var settings = ipCookie(key);\n\n if (settings) {\n managerVM.show = settings.show;\n }\n }\n\n function addPositiveModal(student) {\n if (student.isReadOnly) {\n return;\n }\n\n var modalInstance = $uibModal.open({\n templateUrl: appSettings.behaviorWebRootUrl + 'app/components/positive-behavior-add/desktop/positive-behavior-add-modal.html',\n controller: 'positiveBehaviorModalController',\n controllerAs: 'positiveBehaviorModalVM',\n size: 'xlg',\n resolve: {\n student: function () {\n return student;\n },\n courseSectionGroupId: function () {\n return 0;\n },\n staffId: function () {\n return managerVM.staffId;\n },\n meetingBlockTimeId: function () {\n return 0;\n },\n specialsCourseSectionId: function () {\n return 0;\n },\n academicYearId: function () {\n return student.academicYearID;\n },\n schoolId: function () {\n return student.schoolID;\n },\n positiveObservations: function () {\n return managerVM.positiveObservations;\n },\n eventDate: function () {\n return new Date();\n },\n eventTime: function () {\n return new Date();\n }\n }\n });\n\n modalInstance.result.then(function (saveEventIncident) {\n managerVM.positiveCountAltered = true;\n managerVM.loadStudents(false);\n managerVM.positiveCountAltered = false;\n });\n }\n\n function searchTextChanged(searchText) {\n managerVM.allStudentsLoaded = false;\n loadStudents(false);\n }\n\n function isBip(bspTypeName) {\n return _.includes(bspTypeName.toLowerCase(), 'intervention');\n }\n\n function changeSorting(expression) {\n managerVM.sort = expression;\n managerVM.allStudentsLoaded = false;\n loadStudents(false);\n }\n\n function showBspTooltip($event, student) {\n var scope = $scope.$new(true);\n scope.student = student;\n scope.managerVM = this;\n\n return showTooltipBase($event, $event.target, '#behavior-bsp-tooltip', { x: -40, y: 8 }, scope);\n }\n\n function show10in20Tooltip($event, student) {\n var scope = $scope.$new(true);\n scope.student = student;\n scope.managerVM = this;\n\n var target = event.currentTarget !== event.target ? event.target : $(event.target).find('span')[0];\n return showTooltipBase($event, target, '#behavior-10in20-tooltip', { x: -235, y: -35 }, scope);\n }\n\n function showRemovalsTooltip($event, student) {\n var scope = $scope.$new(true);\n scope.student = student;\n scope.managerVM = this;\n\n var target = event.currentTarget !== event.target ? event.target : $(event.target).find('span')[0];\n\n managerVM.removals.isLoading = true;\n\n var studentInSchoolId = student.studentInSchoolID;\n\n behaviorOverviewService.getBehaviorRemovals(studentInSchoolId).then(function (data) {\n managerVM.removals = data;\n managerVM.removals.isLoading = false;\n });\n\n var onClose = function () {\n managerVM.removals.isLoading = true;\n };\n\n return showTooltipBase($event, target, '#behavior-removals-tooltip', { x: -235, y: -35, onClose: onClose }, scope);\n }\n\n function showOssTooltip($event, student) {\n var scope = $scope.$new(true);\n scope.student = student;\n scope.managerVM = this;\n\n return showTooltipBase($event, $event.target, '#behavior-oss-tooltip', { x: -40, y: 8 }, scope);\n }\n\n function showIssTooltip($event, student) {\n var scope = $scope.$new(true);\n scope.student = student;\n scope.managerVM = this;\n\n return showTooltipBase($event, $event.target, '#behavior-iss-tooltip', { x: -40, y: 8 }, scope);\n }\n\n function showAddTooltip($event, student) {\n var scope = $scope.$new(true);\n scope.student = student;\n scope.managerVM = this;\n\n return showTooltipBase($event, $event.target, '#behavior-add-tooltip', { x: -72, y: -34 }, scope);\n }\n\n function show504Tooltip($event, student) {\n var scope = $scope.$new(true);\n scope.student = student;\n scope.managerVM = this;\n\n return showTooltipBase($event, $event.target, '#behavior-504-tooltip', { x: -37, y: 7 }, scope);\n }\n\n function showSeTooltip($event, student) {\n var scope = $scope.$new(true);\n scope.student = student;\n scope.managerVM = this;\n\n return showTooltipBase($event, $event.target, '#behavior-se-tooltip', { x: -37, y: 7 }, scope);\n }\n\n function showLevelTooltip($event, level, numIncidents, student) {\n managerVM.numberOfIncidents = numIncidents;\n managerVM.behaviorEventsLoading = true;\n\n var scope = $scope.$new(true);\n scope.student = student;\n scope.managerVM = this;\n scope.level = level;\n\n var academidYearId = managerVM.selectedFilters.AcademicYear.items[0].id;\n var studentInSchoolId = student.studentInSchoolID;\n\n studentListService.getBehaviorEvents(academidYearId, studentInSchoolId, level).then(function (data) {\n managerVM.behaviorEvents = _(data).map(function (i) {\n return {\n behaviorEventID: i.behaviorEventID,\n courseSectionGroupID: i.courseSectionGroupID,\n date: moment.utc(i.date).format('L'),\n meetingBlockTimeID: i.meetingBlockTimeID,\n observations: i.observations,\n behaviorLevelID: level\n };\n }).value();\n managerVM.behaviorEventsLoading = false;\n });\n\n var onClose = function (target) {\n managerVM.behaviorEventsLoading = true;\n $(target).removeClass('highlighted');\n };\n $($event.target).addClass('highlighted');\n return showTooltipBase($event, $event.target, '#behavior-level-tooltip', { x: -52, y: 20, onClose: onClose }, scope);\n }\n\n function showTooltipBase($event, target, elementSelector, settings, scope) {\n var template = $(elementSelector).contents().text();\n var x = $(target).offset().left + $(target).width();\n var y = $(target).offset().top + $(target).height();\n\n if (!settings) settings = { x: 0, y: 0 };\n\n var tip = $compile(template)(scope);\n $(tip).appendTo(document.body)\n .offset({ top: y + settings.y, left: x + settings.x })\n .show();\n tip.data(\"target\", target);\n $(\"div\", tip).show();\n\n // stops current click from propagating to the body\n // and closing the tooltip\n $event.stopPropagation();\n\n // set up hide event handlers\n var bodyClickHandler = function (e) {\n $(document.body).unbind('click', bodyClickHandler);\n $(tip).unbind('click', tipClickHandler);\n $(tip).remove();\n if (typeof (settings.onClose) == 'function') settings.onClose(target);\n };\n var tipClickHandler = function (e) { e.stopPropagation(); };\n\n $(document.body).bind('click', bodyClickHandler);\n $scope.$on('$stateChangeStart', bodyClickHandler);\n $(tip).bind('click', tipClickHandler);\n\n var tipsToHide = $('[ng-dropover]').not(tip).unbind('click');\n tipsToHide.each(function (idex, item) {\n $($(item).data(\"target\")).removeClass('highlighted');\n $(item).remove();\n });\n }\n\n function buildCacheAndGo(student, behaviorEvent, level, action) {\n var stateLevelString = \"\";\n\n switch (level) {\n case 4:\n stateLevelString = \"four\";\n break;\n case 5:\n case 6:\n stateLevelString = \"five-six\";\n break;\n }\n\n behaviorCache.set('behavior.' + student.studentInSchoolID + '.student', student);\n behaviorCache.set('behavior.' + student.studentInSchoolID + '.action', action);\n behaviorCache.set('behavior.studentInSchoolID', student.studentInSchoolID);\n\n behaviorCache.set('behavior.studentInSchoolID', student.studentInSchoolID);\n $state.go('incident.level-' + stateLevelString, { studentInSchoolId: student.studentInSchoolID });\n }\n\n function getBehaviorEventUpdateLink(behaviorLevelId, studentInSchoolID, behaviorEventID) {\n switch (behaviorLevelId) {\n case 2:\n case 3:\n return editLevelTwoThree(studentInSchoolID, behaviorEventID);\n case 4:\n return editLevelFour(studentInSchoolID, behaviorEventID);\n case 5:\n case 6:\n return editLevelFiveSix(studentInSchoolID, behaviorEventID);\n default:\n break;\n }\n }\n\n function editLevelTwoThree(studentInSchoolID, behaviorEventID) {\n var editLink = appSettings[\"studentManagementWebRootUrl\"] +\n studentInSchoolID + \"/\" +\n \"behavior/incident/update/bluered/\" +\n behaviorEventID + \"/\";\n return editLink;\n }\n\n function editLevelFour(studentInSchoolID, behaviorEventID) {\n var editLink = appSettings[\"studentManagementWebRootUrl\"] +\n studentInSchoolID + \"/\" +\n \"behavior/incident/update/4/\" +\n behaviorEventID;\n return editLink;\n }\n\n function editLevelFiveSix(studentInSchoolID, behaviorEventID) {\n var editLink = appSettings[\"studentManagementWebRootUrl\"] +\n studentInSchoolID + \"/\" +\n \"behavior/incident/update/fivesix/\" +\n behaviorEventID;\n return editLink;\n }\n\n function reviseLevelFour(studentInSchoolID) {\n var editLink = appSettings[\"studentManagementWebRootUrl\"] +\n studentInSchoolID + \"/\" +\n \"behavior/incident/revise/4\";\n return editLink;\n }\n\n function addLevelTwoIncident(student) {\n var addLink = appSettings[\"studentManagementWebRootUrl\"] +\n student.studentInSchoolID + \"/\" +\n \"behavior/incident/add/bluered/2/\";\n return addLink;\n }\n\n function addLevelThreeIncident(student) {\n var addLink = appSettings[\"studentManagementWebRootUrl\"] +\n student.studentInSchoolID + \"/\" +\n \"behavior/incident/add/bluered/3/\";\n return addLink;\n }\n\n function addLevelFourIncident(student) {\n buildCacheAndGo(student, 0, 4, \"add\");\n }\n\n function addLevelFiveIncident(student) {\n buildCacheAndGo(student, 0, 5, \"add\");\n }\n\n function endLevelFourIncident(student) {\n var modalInstance = $uibModal.open({\n templateUrl: appSettings.behaviorWebRootUrl + 'app/components/manager/templates/_end-level-four-modal.html',\n controller: 'EndLevelFourModalCtrl',\n controllerAs: 'endLevelFourModalVM',\n resolve: {\n student: function () {\n return student;\n },\n academicYearID: function () {\n return student.academicYearID;\n },\n schoolID: function () {\n return student.schoolID;\n },\n date: function () {\n return moment(managerVM.endDate).format('YYYY-MM-DD');\n },\n staffID: function () {\n return managerVM.staffId;\n }\n }\n });\n\n modalInstance.result.then(function (result) {\n result ? managerVM.succeededToEndBspOrBipMessage() : managerVM.failedToEndBspOrBipMessage();\n });\n }\n\n function failedToEndBspOrBipMessage() {\n behaviorAlertService.goSwal(\"warningWithMsg\", null, \"An error occurred while trying to end this BSP/BIP, please try again.\");\n }\n\n function succeededToEndBspOrBipMessage() {\n behaviorAlertService.goSwal(\"saveSuccessWithMsg\", loadStudents, \"This BSP/BIP was ended successfully.\");\n }\n\n function onGeneralError() {\n behaviorAlertService.goSwal(\"warningWithMsg\", goBack, \"An error has occurred, please try again.\");\n }\n\n function goBack() {\n $window.history.back();\n }\n\n function loadStudents(append) {\n if (!managerVM.positiveCountAltered) {\n if (managerVM.allStudentsLoaded || (append && (managerVM.studentsLoading || managerVM.studentAppendLoading))) { return; }\n }\n\n if (append) {\n managerVM.studentAppendLoading = true;\n } else {\n managerVM.studentsLoading = true;\n }\n\n parameters = {\n append: append,\n $skip: !append ? 0 : parameters.$skip + studentListService.pageSize,\n $top: studentListService.pageSize\n };\n\n if (managerVM.searchText) parameters.searchText = escapeSearchText(managerVM.searchText);\n parameters.academicYearId = managerVM.selectedFilters.AcademicYear.items.find(function (i) {\n return i.selected;\n }).id;\n\n // Filter counts\n if (!append) {\n if (!appSettings.disableFilterCounts) {\n managerVM.isLoadingFilterCounts = true;\n $scope.filterConfig.countsLoading = true;\n managerListFilterCountsRepository.getStudentsInSchoolFilterCounts(managerVM.selectedFilters, parameters.searchText)\n .then(function (filterCounts) {\n managerVM.isLoadingFilterCounts = false;\n setFilterCounts(filterCounts, $scope.filterConfig.filters);\n $scope.filterConfig.countsLoading = false;\n });\n }\n }\n\n\n if (managerVM.sort) parameters.sortOrder = managerVM.sort;\n\n studentListService.getStudentsForManager(parameters, managerVM.selectedFilters).then(function (results) {\n results = _(results).map(function (student) {\n if (student.isInSchoolSuspended) {\n student.inSchoolSuspendedEndDate = moment(student.inSchoolSuspendedStartDate).add(student.inSchoolSuspendedDuration, 'days');\n }\n\n if (student.isOutOfSchoolSuspended) {\n student.outOfSchoolSuspendedEndDate = moment(student.outOfSchoolSuspendedStartDate).add(student.outOfSchoolSuspendedDuration, 'days');\n }\n\n if (student.bspStartDate) {\n student.bspStartDate = moment.utc(student.bspStartDate).format('L');\n }\n\n student.isReadOnly = student.sisCurrentMasterStatusID != 2; // Enrolled\n\n return student;\n }).value();\n\n if (append) {\n managerVM.students = managerVM.students.concat(results);\n } else {\n managerVM.students = results;\n }\n\n\n managerVM.studentsLoading = false;\n managerVM.studentAppendLoading = false;\n\n managerVM.allStudentsLoaded = results && results.length < parameters.$top;\n });\n }\n\n managerVM.go = function (path) {\n $location.path(path);\n };\n\n function escapeSearchText(searchText) {\n searchText = searchText.replace(\"''\", \"'\");\n searchText = escape(searchText);\n return searchText;\n }\n\n function isMoreThanATeacher() {\n return behaviorUserRoleService.isMoreThanATeacher().then(function (result) {\n managerVM.isTeacher = !result;\n });\n }\n\n function checkForReadOnly() {\n var levelZeroTwoThree = false;\n var levelFour = false;\n var levelFiveSix = false;\n\n return apiSecurityService.isAccessAllowed(\"ui_add_level_zero_two_three\", \"Get\").then(function (result) {\n levelZeroTwoThree = result;\n\n apiSecurityService.isAccessAllowed(\"ui_add_level_four\", \"Get\").then(function (result) {\n levelFour = result;\n\n apiSecurityService.isAccessAllowed(\"ui_add_level_five\", \"Get\").then(function (result) {\n levelFiveSix = result;\n managerVM.hasWritePermissions = levelZeroTwoThree || levelFour || levelFiveSix;\n });\n });\n });\n }\n\n function loadPositiveObservations() {\n var year = null;\n var school = null;\n var reloadNeeded = false;\n\n if (managerVM.selectedFilters) {\n if (managerVM.selectedFilters.AcademicYear) {\n year = managerVM.selectedFilters.AcademicYear.items[0].id;\n }\n if (managerVM.selectedFilters.School) {\n school = managerVM.selectedFilters.School.items[0].id;\n }\n }\n\n if (year !== managerVM.selectedYearForPositiveObs) {\n managerVM.selectedYearForPositiveObs = year;\n reloadNeeded = true;\n }\n\n if (school !== managerVM.selectedSchoolForPositiveObs) {\n managerVM.selectedSchoolForPositiveObs = school;\n reloadNeeded = true;\n }\n\n if (reloadNeeded && year && school) {\n var observationAndActionParams = {\n academicYearID: year,\n schoolID: school,\n behaviorLevelID: 0\n };\n\n observationRepository.getAll(observationAndActionParams).then(function (data) {\n managerVM.positiveObservations = _.orderBy(data, ['orderNumber']);\n });\n }\n }\n\n function loadUpdatePermissions() {\n return apiSecurityService.isAccessAllowed(\"ui_update_incidents\", \"Get\").then(function (result) {\n managerVM.hasUpdatePermissions = result;\n });\n }\n\n function loadWritePermissions() {\n apiSecurityService.isAccessAllowed(\"ui_add_level_zero_two_three\", \"Get\").then(function (zeroTwoThree) {\n managerVM.canWriteLevelZeroTwoThree = zeroTwoThree;\n });\n\n apiSecurityService.isAccessAllowed(\"uisr_add_level_four\", \"Get\").then(function (four) {\n managerVM.canWriteLevelFour = four;\n });\n\n apiSecurityService.isAccessAllowed(\"uisr_add_level_four\", \"Get\").then(function (rFour) {\n managerVM.canReviseLevelFour = rFour;\n });\n\n apiSecurityService.isAccessAllowed(\"uisr_add_level_four\", \"Get\").then(function (five) {\n managerVM.canWriteLevelFive = five;\n });\n }\n\n function initFilters() {\n userContextService.ensureUserContext().then(function (context) {\n var staffId = context['http://schemas.mynha.com/SIS/Core/StaffID'];\n managerVM.staffId = staffId;\n\n for (var i = 0; i < context.role.length; i++) {\n if (Array.isArray(context.role)) {\n if (context.role[i] !== \"Employee\" && context.role[i] !== \"Teacher\") {\n staffId = null;\n }\n } else if (context.role !== \"Employee\") {\n staffId = null;\n }\n }\n\n $scope.filterConfig = {\n filters:\n {\n \"AcademicYear\": { name: \"AcademicYear\", displayName: \"Academic Year\", type: \"radio\", items: null, isCollapsed: false },\n \"School\": { name: \"School\", displayName: \"School\", type: \"radio\", items: null, persist: true, isCollapsed: false },\n \"GradeLevel\": { name: \"GradeLevel\", displayName: \"Grade\", type: \"checkbox\", items: null, isCollapsed: false },\n \"Homeroom\": { name: \"Homeroom\", displayName: \"Homeroom\", type: \"checkbox\", items: null, isCollapsed: true, isHidden: !!staffId, hideSelection: !!staffId },\n 'BehaviorSupportPlan': {\n name: 'BehaviorSupportPlan', displayName: \"Behavior Support Plan\", isCollapsed: true, type: 'checkbox', // Display name set dynamically in the filterChange event\n items: [\n { 'id': 1, columnName: 'RequiringBSP', 'description': 'Requiring BSP/BIP' },\n { 'id': 2, columnName: 'UpcomingBSP', 'description': 'Upcoming BSP/BIP' },\n { 'id': 3, columnName: 'ActiveBSP', 'description': 'Active BSP/BIP' }\n ]\n },\n 'SpecialServices': {\n name: 'SpecialServices', displayName: \"Special Services\", isCollapsed: true, type: 'checkbox', // Display name set dynamically in the filterChange event\n items: [\n { 'id': 1, columnName: 'IsSpecialEd', 'description': 'Special Education Student' },\n { 'id': 2, columnName: 'IsSection504', 'description': 'Section 504 Student' }\n ]\n },\n 'BehaviorLevels': {\n name: 'BehaviorLevels', displayName: \"Behavior Levels\", isCollapsed: true, type: 'checkbox', // Display name set dynamically in the filterChange event\n items: [\n { 'id': 2, columnName: 'L2', 'description': 'Level 2' },\n { 'id': 3, columnName: 'L3', 'description': 'Level 3' },\n { 'id': 4, columnName: 'L4', 'description': 'Level 4' },\n { 'id': 5, columnName: 'L5', 'description': 'Level 5' },\n { 'id': 6, columnName: 'L6', 'description': 'Level 6' }\n ]\n }\n },\n type: \"classes\"\n };\n\n $scope.$on('filterChange', function (event, filters) {\n managerVM.selectedFilters = filters.selectedFilters;\n managerVM.allStudentsLoaded = false;\n loadStudents(false);\n loadPositiveObservations();\n }, true);\n\n });\n }\n\n function updateFilterCounts(updatedItems, filterItems) {\n _.each(filterItems, function (filterItem) {\n var updatedItem = _.find(updatedItems, function (item) {\n return filterItem.id === item.id;\n });\n\n filterItem.count = updatedItem ? updatedItem.count : 0;\n });\n }\n\n function setFilterCounts(counts, filters) {\n _.forEach(counts.filters, function (c) {\n if (c.typeName.toUpperCase() === filters.AcademicYear.name.toUpperCase()) {\n updateFilterCounts(c.items, filters.AcademicYear.items);\n }\n else if (c.typeName.toUpperCase() === filters.School.name.toUpperCase()) {\n updateFilterCounts(c.items, filters.School.items);\n }\n else if (c.typeName.toUpperCase() === filters.GradeLevel.name.toUpperCase()) {\n updateFilterCounts(c.items, filters.GradeLevel.items);\n }\n else if (c.typeName.toUpperCase() === filters.Homeroom.name.toUpperCase()) {\n updateFilterCounts(c.items, filters.Homeroom.items);\n }\n else if (c.typeName.toUpperCase() === filters.BehaviorSupportPlan.name.toUpperCase()) {\n updateFilterCounts(c.items, filters.BehaviorSupportPlan.items);\n }\n else if (c.typeName.toUpperCase() === filters.SpecialServices.name.toUpperCase()) {\n updateFilterCounts(c.items, filters.SpecialServices.items);\n }\n else if (c.typeName.toUpperCase() === filters.BehaviorLevels.name.toUpperCase()) {\n updateFilterCounts(c.items, filters.BehaviorLevels.items);\n }\n else {\n log('setFilterCounts encountered counts for unexpected filter type. Filter Type == ' + c.typeName);\n }\n });\n }\n\n function init() {\n $q.all([\n isMoreThanATeacher(),\n checkForReadOnly(),\n loadUpdatePermissions()\n ])\n .then(loadStaffId)\n .then(function () {\n loadWritePermissions(); // workaround: due to if-resource-accessible directive not working within tooltips\n initFilters();\n loadSettings();\n });\n }\n }\n})();\n","/**\n * positive-behavior-add-multiple.controller\n * @namespace behavior\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .controller('positiveBehaviorMultipleModalController', positiveBehaviorMultipleModalController);\n\n // protect against minification\n /* @ngInject */\n positiveBehaviorMultipleModalController.$inject = ['$state', '$uibModalInstance', 'students', 'courseSectionGroupId', 'specialsCourseSectionId',\n 'staffId', 'meetingBlockTimeId', 'userContextService', 'academicYearId', 'schoolId', 'positiveObservations', 'behaviorEventIncidentRepository', 'eventDate', 'eventTime',\n 'behaviorUserRoleService', 'behaviorStateManagementService', 'behaviorBehaviorListService', 'behaviorAlertService', 'observationRepository'];\n\n /**\n * @name positiveBehaviorMultipleModalController\n * @description Constructor for positive-behavior-add-multiple-modal.controller\n * @memberOf behavior\n */\n function positiveBehaviorMultipleModalController($state, $uibModalInstance, students, courseSectionGroupId, specialsCourseSectionId,\n staffId, meetingBlockTimeId, userContextService, academicYearId, schoolId, positiveObservations, behaviorEventIncidentRepository, eventDate, eventTime,\n behaviorUserRoleService, behaviorStateManagementService, behaviorBehaviorListService, behaviorAlertService, observationRepository) {\n\n // Controller as vm - see route configuration\n var positiveBehaviorMultipleModalVM = this;\n\n // Properties\n positiveBehaviorMultipleModalVM.courseSectionGroupId = courseSectionGroupId;\n positiveBehaviorMultipleModalVM.isBehaviorManager = $state.current.name === 'behavior-manager';\n positiveBehaviorMultipleModalVM.isLoading = false;\n positiveBehaviorMultipleModalVM.isWeeklyPositiveCount = !positiveBehaviorMultipleModalVM.isBehaviorManager;\n positiveBehaviorMultipleModalVM.meetingBlockTimeId = meetingBlockTimeId;\n positiveBehaviorMultipleModalVM.notes = \"\";\n positiveBehaviorMultipleModalVM.observations = positiveObservations || [];\n positiveBehaviorMultipleModalVM.observationAndActionParams = {\n academicYearID: academicYearId,\n schoolID: schoolId,\n behaviorLevelID: 0\n };\n positiveBehaviorMultipleModalVM.selectedObservation = null;\n positiveBehaviorMultipleModalVM.showError = false;\n positiveBehaviorMultipleModalVM.specialsCourseSectionId = specialsCourseSectionId;\n positiveBehaviorMultipleModalVM.staffId = null;\n positiveBehaviorMultipleModalVM.student = students[0];\n\t\tpositiveBehaviorMultipleModalVM.students = students;\n\t\tpositiveBehaviorMultipleModalVM.selectedStudents = [];\n positiveBehaviorMultipleModalVM.isSaving = false;\n\t\tpositiveBehaviorMultipleModalVM.SelectAll = false;\n\t\tpositiveBehaviorMultipleModalVM.step1 = true;\n\n // Methods\n positiveBehaviorMultipleModalVM.cancel = cancel;\n positiveBehaviorMultipleModalVM.onBehaviorClick = onBehaviorClick;\n\t\tpositiveBehaviorMultipleModalVM.selectStudent = selectStudent;\n\t\tpositiveBehaviorMultipleModalVM.selectAllStudents = selectAllStudents;\n\t\tpositiveBehaviorMultipleModalVM.savePositiveBehaviorForMultiple = savePositiveBehaviorForMultiple;\n\t\tpositiveBehaviorMultipleModalVM.next = next;\n\t\tpositiveBehaviorMultipleModalVM.back = back;\n\n // START Only needed to display indicators in sidebar\n $state.params.studentInSchoolId = students[0].studentInSchoolID;\n $state.params.isPositiveBehaviorAdd = true; // for security purposes\n\n function loadAppState() {\n return behaviorStateManagementService.getInitialValues($state.params).then(function(q) {\n positiveBehaviorMultipleModalVM = _.assign(positiveBehaviorMultipleModalVM, q);\n });\n }\n // END Only needed to display indicators in sidebar\n\n function init() {\n userContextService.ensureUserContext().then(function (context) {\n positiveBehaviorMultipleModalVM.staffId = context['http://schemas.mynha.com/SIS/Core/StaffID'];\n loadAppState();\n loadObservations();\n });\n }\n\n function onBehaviorClick(behaviorId) {\n positiveBehaviorMultipleModalVM.selectedObservation = behaviorId;\n }\n\n function loadObservations() {\n if (positiveBehaviorMultipleModalVM.observations.length === 0) {\n positiveBehaviorMultipleModalVM.isLoading = true;\n observationRepository.getAll(positiveBehaviorMultipleModalVM.observationAndActionParams).then(function (data) {\n positiveBehaviorMultipleModalVM.observations = _.orderBy(data, ['orderNumber']);\n positiveBehaviorMultipleModalVM.isLoading = false;\n });\n }\n }\n\n function cancel() {\n\t\t\tpositiveBehaviorMultipleModalVM.students.forEach(student => {\n\t\t\t\tstudent.isSelected = false;\n\t\t\t})\n $uibModalInstance.dismiss();\n }\n\n function onSaveSuccess(saveEventIncident) {\n\t\t\tpositiveBehaviorMultipleModalVM.students.forEach(student => {\n\t\t\t\tif(student.isSelected){\n\t\t\t\t\tstudent.positiveBehaviorCount++\n\t\t\t\t\tstudent.isSelected = false;\n\t\t\t\t}\n\t\t\t})\n $uibModalInstance.close(saveEventIncident);\n }\n\n function onSaveFailure(error) {\n\t\t\tpositiveBehaviorMultipleModalVM.students.forEach(student => {\n\t\t\t\tif(student.isSelected){\n\t\t\t\t\tstudent.isSelected = false;\n\t\t\t\t}\n\t\t\t})\n behaviorAlertService.goSwal(\"saveFailureWithMsg\", cancel, 'One or more students do not have an valid attendance record for this date.');\n }\n\n\t\tfunction selectStudent(studentID) {\n\t\t\tvar studentInListAlready = false;\n\n\t\t\tpositiveBehaviorMultipleModalVM.selectedStudents.filter(x => {\n\t\t\t\tif(x.studentID == studentID)\n\t\t\t\t{\n\t\t\t\t\tpositiveBehaviorMultipleModalVM.selectedStudents = positiveBehaviorMultipleModalVM.selectedStudents\n\t\t\t\t\t\t.filter(x => x.studentID !== studentID)\n\t\t\t\t\tstudentInListAlready = true;\n\t\t\t\t}\n\t\t\t\treturn x.studentID == studentID;\n\t\t\t})\n\n\t\t\tif(studentInListAlready)\n\t\t\t{\n\t\t\t\tpositiveBehaviorMultipleModalVM.students.filter(x => {\n\t\t\t\t\tif (x.studentID == studentID)\n\t\t\t\t\t{\n\t\t\t\t\t\tx.isSelected = false;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif(!studentInListAlready){\n\t\t\t\tpositiveBehaviorMultipleModalVM.students.filter(x => {\n\t\t\t\t\tif (x.studentID == studentID)\n\t\t\t\t\t{\n\t\t\t\t\t\tx.isSelected = true;\n\n\t\t\t\t\t\tpositiveBehaviorMultipleModalVM.selectedStudents.push(x);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tfunction selectAllStudents() {\n\t\t\tpositiveBehaviorMultipleModalVM.SelectAll = !positiveBehaviorMultipleModalVM.SelectAll\n\n\t\t\tif(positiveBehaviorMultipleModalVM.SelectAll)\n\t\t\t{\n\t\t\t\tpositiveBehaviorMultipleModalVM.selectedStudents = positiveBehaviorMultipleModalVM.students;\n\t\t\t\tpositiveBehaviorMultipleModalVM.students.forEach(student => {\n\t\t\t\t\tstudent.isSelected = true;\n\t\t\t\t})\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpositiveBehaviorMultipleModalVM.selectedStudents = [];\n\t\t\t\tpositiveBehaviorMultipleModalVM.students.forEach(student => {\n\t\t\t\t\tstudent.isSelected = false;\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\n\t\tfunction savePositiveBehaviorForMultiple() {\n\t\t\tpositiveBehaviorMultipleModalVM.isSaving = true;\n\n var behaviorEventIncident = {\n behaviorEvent: {\n Date: moment(eventDate).format(\"YYYY-MM-DD\"),\n Time: moment(eventTime).format(\"HH:mm:ss\"),\n BehaviorLocationID: 5, // hardcoded to Classroom\n Notes: positiveBehaviorMultipleModalVM.notes,\n IsIncomplete: false,\n IsCourseSectionBehaviorEvent: false, // Always false for positive events\n CourseSectionGroupID: courseSectionGroupId,\n SpecialsCourseSectionID: specialsCourseSectionId,\n MeetingBlockTimeID: meetingBlockTimeId,\n SchoolID: schoolId,\n AcademicYearID: academicYearId,\n CreatedByStaffID: staffId,\n LastModifiedByStaffID: staffId,\n IsAdvancedFieldIncomplete: true\n },\n behaviorEventObservation:\n {\n BehaviorObservationID: positiveBehaviorMultipleModalVM.selectedObservation,\n CreatedByStaffID: staffId,\n LastModifiedByStaffID: staffId\n }\n ,\n behaviorEventParticipants: []\n };\n\n\t\t\tpositiveBehaviorMultipleModalVM.selectedStudents.forEach(s => {\n\t\t\t\tvar participant = {}\n\n\t\t\t\tparticipant.BehaviorParticipantTypeID = 1, // hardcoded to student\n\t\t\t\tparticipant.ParticipantStudentInSchoolID = s.studentInSchoolID,\n\t\t\t\tparticipant.BehaviorLevelID = 0, // hardcoded to \"positive behavior\"\n\t\t\t\tparticipant.BehaviorRoleID = 2, // hardcoded to participant\n\t\t\t\tparticipant.IncludeInParentEmail = true,\n\t\t\t\tparticipant.CreatedByStaffID = staffId,\n\t\t\t\tparticipant.LastModifiedByStaffID = staffId,\n\t\t\t\tparticipant.AcademicYearID = academicYearId,\n\t\t\t\tparticipant.SchoolID = schoolId\n\n\t\t\t\tbehaviorEventIncident.behaviorEventParticipants.push(participant)\n\t\t\t});\n\n\t\t\tvar PositiveBehaviorService = myNHA.GetApiService('Behavior','PositiveBehaviorService');\n\t\t\tPositiveBehaviorService.addPositiveBehavior(behaviorEventIncident).then(onSaveSuccess, onSaveFailure);\n\t\t}\n\n\t\tfunction next() {\n\t\t\tpositiveBehaviorMultipleModalVM.step1 = false;\n\t\t}\n\n\t\tfunction back() {\n\t\t\tpositiveBehaviorMultipleModalVM.step1 = true;\n\t\t}\n\n init();\n }\n})();\n","/**\n * positive-behavior-add.controller\n * @namespace behavior\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .controller('positiveBehaviorModalController', positiveBehaviorModalController);\n\n // protect against minification\n /* @ngInject */\n positiveBehaviorModalController.$inject = ['$state', '$uibModalInstance', 'student', 'courseSectionGroupId', 'specialsCourseSectionId',\n 'staffId', 'meetingBlockTimeId', 'userContextService', 'academicYearId', 'schoolId', 'positiveObservations', 'eventDate', 'eventTime', 'behaviorEventIncidentRepository',\n 'behaviorUserRoleService', 'behaviorStateManagementService', 'behaviorBehaviorListService', 'behaviorAlertService', 'observationRepository'];\n\n /**\n * @name positiveBehaviorModalController\n * @description Constructor for positive-behavior-add-modal.controller\n * @memberOf behavior\n */\n function positiveBehaviorModalController($state, $uibModalInstance, student, courseSectionGroupId, specialsCourseSectionId,\n staffId, meetingBlockTimeId, userContextService, academicYearId, schoolId, positiveObservations, eventDate, eventTime, behaviorEventIncidentRepository,\n behaviorUserRoleService, behaviorStateManagementService, behaviorBehaviorListService, behaviorAlertService, observationRepository) {\n\n // Controller as vm - see route configuration\n var positiveBehaviorModalVM = this;\n\n // Properties\n positiveBehaviorModalVM.courseSectionGroupId = courseSectionGroupId;\n positiveBehaviorModalVM.isBehaviorManager = $state.current.name === 'behavior-manager';\n positiveBehaviorModalVM.isLoading = false;\n positiveBehaviorModalVM.isWeeklyPositiveCount = !positiveBehaviorModalVM.isBehaviorManager;\n positiveBehaviorModalVM.meetingBlockTimeId = meetingBlockTimeId;\n positiveBehaviorModalVM.notes = \"\";\n positiveBehaviorModalVM.observations = positiveObservations || [];\n positiveBehaviorModalVM.observationAndActionParams = {\n academicYearID: academicYearId,\n schoolID: schoolId,\n behaviorLevelID: 0\n };\n positiveBehaviorModalVM.selectedObservation = null;\n positiveBehaviorModalVM.showError = false;\n positiveBehaviorModalVM.specialsCourseSectionId = specialsCourseSectionId;\n positiveBehaviorModalVM.staffId = null;\n positiveBehaviorModalVM.student = student;\n positiveBehaviorModalVM.isSaving = false;\n\n // Methods\n positiveBehaviorModalVM.cancel = cancel;\n positiveBehaviorModalVM.onBehaviorClick = onBehaviorClick;\n positiveBehaviorModalVM.save = save;\n\n // START Only needed to display indicators in sidebar\n $state.params.studentInSchoolId = student.studentInSchoolID;\n $state.params.isPositiveBehaviorAdd = true; // for security purposes\n\n function loadAppState() {\n return behaviorStateManagementService.getInitialValues($state.params).then(function(q) {\n positiveBehaviorModalVM = _.assign(positiveBehaviorModalVM, q);\n });\n }\n // END Only needed to display indicators in sidebar\n\n function init() {\n userContextService.ensureUserContext().then(function (context) {\n positiveBehaviorModalVM.staffId = context['http://schemas.mynha.com/SIS/Core/StaffID'];\n loadAppState();\n loadObservations();\n });\n }\n\n function onBehaviorClick(behaviorId) {\n positiveBehaviorModalVM.selectedObservation = behaviorId;\n }\n\n function loadObservations() {\n if (positiveBehaviorModalVM.observations.length === 0) {\n positiveBehaviorModalVM.isLoading = true;\n observationRepository.getAll(positiveBehaviorModalVM.observationAndActionParams).then(function (data) {\n positiveBehaviorModalVM.observations = _.orderBy(data, ['orderNumber']);\n positiveBehaviorModalVM.isLoading = false;\n });\n }\n }\n\n function cancel() {\n $uibModalInstance.dismiss();\n }\n\n function onSaveSuccess(saveEventIncident) {\n $uibModalInstance.close(saveEventIncident);\n }\n\n function onSaveFailure(error) {\n behaviorAlertService.goSwal(\"saveFailureWithMsg\", cancel, error.data.exceptionMessage);\n }\n\n function save() {\n positiveBehaviorModalVM.isSaving = true;\n\n var behaviorEventIncident = {\n behaviorEvent: {\n Date: moment(eventDate).format(\"YYYY-MM-DD\"),\n Time: moment(eventTime).format(\"HH:mm:ss\"),\n BehaviorLocationID: 5, // hardcoded to Classroom\n Notes: positiveBehaviorModalVM.notes,\n IsIncomplete: false,\n IsCourseSectionBehaviorEvent: false, // Always false for positive events\n CourseSectionGroupID: courseSectionGroupId,\n SpecialsCourseSectionID: specialsCourseSectionId,\n MeetingBlockTimeID: meetingBlockTimeId,\n SchoolID: schoolId,\n AcademicYearID: academicYearId,\n CreatedByStaffID: staffId,\n LastModifiedByStaffID: staffId,\n IsAdvancedFieldIncomplete: true\n },\n behaviorEventObservations: [\n {\n BehaviorObservationID: positiveBehaviorModalVM.selectedObservation,\n CreatedByStaffID: staffId,\n LastModifiedByStaffID: staffId\n }\n ],\n behaviorEventParticipant: {\n BehaviorParticipantTypeID: 1, // hardcoded to student\n ParticipantStudentInSchoolID: student.studentInSchoolID,\n BehaviorLevelID: 0, // hardcoded to \"positive behavior\"\n BehaviorRoleID: 2, // hardcoded to participant\n IncludeInParentEmail: true,\n CreatedByStaffID: staffId,\n LastModifiedByStaffID: staffId,\n AcademicYearID: academicYearId,\n SchoolID: schoolId\n }\n };\n behaviorEventIncidentRepository.set(behaviorEventIncident).then(onSaveSuccess, onSaveFailure);\n }\n\n init();\n }\n})();\n","/// \n/**\n * positive-behavior-add.controller\n * @namespace behavior\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .controller('PositiveBehaviorIncidentCtrl', PositiveBehaviorIncidentCtrl);\n\n // protect against minification\n /* @ngInject */\n PositiveBehaviorIncidentCtrl.$inject = ['observationRepository', '$state', '$window', 'userContextService', 'behaviorEventIncidentRepository',\n 'behaviorCache', 'behaviorStateManagementService', 'behaviorCourseSummaryRepository', 'behaviorBehaviorListService', 'behaviorUserRoleService',\n 'behaviorAlertService', 'apiSecurityService', 'BehaviorRestangular'];\n\n /**\n * @name PositiveBehaviorIncidentCtrl\n * @description Constructor for positive-behavior-add-modal.controller\n * @memberOf behavior\n */\n function PositiveBehaviorIncidentCtrl(observationRepository, $state, $window, userContextService, behaviorEventIncidentRepository,\n behaviorCache, behaviorStateManagementService, behaviorCourseSummaryRepository, behaviorBehaviorListService, behaviorUserRoleService,\n behaviorAlertService, apiSecurityService, BehaviorRestangular) {\n\n // Controller as vm - see route configuration\n var positiveBehaviorIncidentVM = this;\n\n // Properties associated to view model - sorted alphabetically\n // helps you instantly identify which members of the controller can be bound and used in the View\n positiveBehaviorIncidentVM.courseSectionGroupId = $state.params.courseSectionGroupId;\n positiveBehaviorIncidentVM.coreSubjectLevel1ID = null;\n positiveBehaviorIncidentVM.courseSectionSubjects = [];\n positiveBehaviorIncidentVM.hasWritePermissions = false;\n positiveBehaviorIncidentVM.incidentDate = moment().format(\"YYYY-MM-DD\");\n positiveBehaviorIncidentVM.isLoading = false;\n positiveBehaviorIncidentVM.isSaving = false;\n positiveBehaviorIncidentVM.isStudentRecord = $state.params.isStudentRecord;\n positiveBehaviorIncidentVM.meetingBlockTimeId = $state.params.meetingBlockTimeId;\n positiveBehaviorIncidentVM.notes = null;\n positiveBehaviorIncidentVM.observations = [];\n positiveBehaviorIncidentVM.previousIncident = null;\n positiveBehaviorIncidentVM.selectedObservation = null;\n positiveBehaviorIncidentVM.selectedObservations = [];\n positiveBehaviorIncidentVM.specialsCourseSectionId = $state.params.specialsCourseSectionId;\n positiveBehaviorIncidentVM.staffId = 0;\n positiveBehaviorIncidentVM.studentInSchoolId = $state.params.studentInSchoolId;\n\n // Navigation pass-thru methods - sorted alphabetically, linked directly to navigationManager method calls\n // helps you instantly identify which members of the controller can be bound and used in the View \n positiveBehaviorIncidentVM.onCancelClick = onCancelClick;\n positiveBehaviorIncidentVM.onSaveClick = onSaveClick;\n\n // All other methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the controller can be bound and used in the View \n positiveBehaviorIncidentVM.isAdd = isAdd;\n positiveBehaviorIncidentVM.isUpdate = isUpdate;\n positiveBehaviorIncidentVM.onObservationClick = onObservationClick;\n positiveBehaviorIncidentVM.toggleObservation = toggleObservation;\n positiveBehaviorIncidentVM.validateIncidentDate = validateIncidentDate;\n \n function init() {\n positiveBehaviorIncidentVM.isLoading = true;\n loadDataPermissionsForPage()\n .then(loadAppState)\n .then(verifyWritePermissions)\n .then(function() {\n if (isUpdate()) {\n return loadIncidentWithBehaviorEventID();\n }\n })\n .then(function() {\n loadAllFormData();\n });\n }\n\n function loadAppState() {\n return behaviorStateManagementService.getInitialValues($state.params).then(function(q) {\n positiveBehaviorIncidentVM = _.assign(positiveBehaviorIncidentVM, q);\n });\n }\n\n function verifyWritePermissions() {\n\n if ($state.params.isStudentRecord) {\n if (isUpdate()) {\n return apiSecurityService.isAccessAllowed(\"uisr_update_level_zero_two_three\", \"Get\", BehaviorRestangular).then(function (result) {\n positiveBehaviorIncidentVM.hasWritePermissions = result;\n });\n } else {\n return apiSecurityService.isAccessAllowed(\"uisr_add_level_zero_two_three\", \"Get\", BehaviorRestangular).then(function (result) {\n positiveBehaviorIncidentVM.hasWritePermissions = result;\n });\n }\n } else {\n return apiSecurityService.isAccessAllowed(\"ui_add_level_zero_two_three\", \"Get\").then(function(result) {\n positiveBehaviorIncidentVM.hasWritePermissions = result;\n });\n }\n }\n\n function loadDataPermissionsForPage() {\n return behaviorUserRoleService.loadDataPermissionsForPage($state).then(function (result) {\n !result ? $state.go('403') : positiveBehaviorIncidentVM.isLoading = false;\n });\n }\n\n function loadAllFormData() {\n if (positiveBehaviorIncidentVM.valuesLoadedProperly) {\n loadObservations();\n loadStaffId();\n if (!positiveBehaviorIncidentVM.isStudentRecord) { loadCourseSubjects(); }\n } else {\n behaviorAlertService.goSwal(\"loadFailure\", onCancelClick);\n }\n }\n\n function getObservationActionParams() {\n return {\n academicYearID: positiveBehaviorIncidentVM.academicYearId,\n schoolID: positiveBehaviorIncidentVM.schoolId,\n behaviorLevelID: positiveBehaviorIncidentVM.behaviorLevelId\n };\n }\n\n function loadObservations() {\n observationRepository.getAll(getObservationActionParams()).then(function (data) {\n var dataWithShortenedNames = _.map(data, function (obs) {\n if (obs.behaviorObservationName.length > 38) {\n obs.behaviorObservationName = obs.behaviorObservationName.substring(0, 35) + \"...\";\n }\n\n return obs;\n });\n\n positiveBehaviorIncidentVM.observations = _.orderBy(dataWithShortenedNames, ['orderNumber']);\n\n if (isUpdate()) { matchObservation(); }\n });\n }\n\n function loadStaffId() {\n return userContextService.ensureUserContext().then(function (context) {\n positiveBehaviorIncidentVM.staffId = context['http://schemas.mynha.com/SIS/Core/StaffID'];\n });\n }\n\n function loadCourseSubjects() { // for behavior module\n behaviorCourseSummaryRepository.getCourseSectionSubjects(positiveBehaviorIncidentVM.courseSectionGroupId).then(function (data) {\n positiveBehaviorIncidentVM.courseSectionSubjects = data;\n\n if (positiveBehaviorIncidentVM.courseSectionSubjects.length === 1) {\n positiveBehaviorIncidentVM.coreSubjectLevel1ID = positiveBehaviorIncidentVM.courseSectionSubjects[0].subjectLevel1ID;\n }\n\n positiveBehaviorIncidentVM.isLoading = false;\n }, function(error) {\n behaviorAlertService.goSwal(\"loadFailure\", onCancelClick);\n });\n }\n \n function loadIncidentWithBehaviorEventID() {\n return behaviorEventIncidentRepository.getSingleParticipantEventIncident(positiveBehaviorIncidentVM.behaviorEventId)\n .then(setFormValues, onDataLoadError);\n }\n\n function setFormValues(behaviorEvent) {\n positiveBehaviorIncidentVM.previousIncident = behaviorEvent;\n positiveBehaviorIncidentVM.notes = behaviorEvent.behaviorEvent.notes;\n positiveBehaviorIncidentVM.incidentDate = moment.utc(behaviorEvent.behaviorEvent.date).format('L');\n positiveBehaviorIncidentVM.coreSubjectLevel1ID = behaviorEvent.behaviorEvent.coreSubjectLevel1ID;\n positiveBehaviorIncidentVM.selectedObservation = behaviorEvent.behaviorEventObservations[0];\n positiveBehaviorIncidentVM.courseSectionGroupId = behaviorEvent.behaviorEvent.courseSectionGroupID;\n positiveBehaviorIncidentVM.meetingBlockTimeId = behaviorEvent.behaviorEvent.meetingBlockTimeID;\n }\n\n function matchObservation() {\n var obs = _(positiveBehaviorIncidentVM.observations).find({ behaviorObservationID: positiveBehaviorIncidentVM.selectedObservation.behaviorObservationID });\n\n positiveBehaviorIncidentVM.selectedObservation[\"behaviorObservationName\"] = obs.behaviorObservationName;\n }\n\n function matchCourse() {\n return _(positiveBehaviorIncidentVM.courseSectionSubjects).find({\n courseSectionGroupID: positiveBehaviorIncidentVM.previousIncident.behaviorEvent.courseSectionGroupID, \n meetingBlockTimeID: positiveBehaviorIncidentVM.previousIncident.behaviorEvent.meetingBlockTimeID\n });\n }\n\n function onDataLoadError() {\n behaviorAlertService.goSwal(\"loadFailure\", onCancelClick);\n }\n\n function onCountLoadError() {\n behaviorAlertService.goSwal(\"loadFailure\", onCancelClick);\n }\n \n function onObservationClick(observation) {\n if (positiveBehaviorIncidentVM.hasWritePermissions) {\n (positiveBehaviorIncidentVM.selectedObservation === observation) ? positiveBehaviorIncidentVM.selectedObservation = null : positiveBehaviorIncidentVM.selectedObservation = observation;\n }\n }\n\n function toggleObservation() {\n if (positiveBehaviorIncidentVM.hasWritePermissions) {\n positiveBehaviorIncidentVM.selectedObservation = null;\n }\n }\n\n function onCancelClick() {\n $window.history.back();\n }\n\n function onSaveSuccess(saveEventIncident) {\n $window.history.back();\n }\n\n function onSaveFailure(error) {\n positiveBehaviorIncidentVM.isLoading = false;\n behaviorAlertService.goSwal(\"saveFailureWithMsg\", onCancelClick, error.data.exceptionMessage);\n }\n\n function onSaveClick() {\n positiveBehaviorIncidentVM.isSaving = true;\n var behaviorEventIncident = \n {\n BehaviorEvent: \n {\n BehaviorEventID: isUpdate() ? positiveBehaviorIncidentVM.previousIncident.behaviorEvent.behaviorEventID : 0,\n Date: positiveBehaviorIncidentVM.incidentDate,\n Time: moment().format('HH:mm:ss'),\n BehaviorLocationID: 5, // hardcoded to Classroom\n Notes: positiveBehaviorIncidentVM.notes ? positiveBehaviorIncidentVM.notes : null,\n IsIncomplete: false,\n IsCourseSectionBehaviorEvent: false, // Always false for positive events\n CourseSectionGroupID: positiveBehaviorIncidentVM.courseSectionGroupId ? positiveBehaviorIncidentVM.courseSectionGroupId : null,\n MeetingBlockTimeID: positiveBehaviorIncidentVM.meetingBlockTimeId ? positiveBehaviorIncidentVM.meetingBlockTimeId : null,\n SpecialsCourseSectionID: positiveBehaviorIncidentVM.specialsCourseSectionId ? positiveBehaviorIncidentVM.specialsCourseSectionId : null,\n SchoolID: positiveBehaviorIncidentVM.schoolId,\n AcademicYearID: positiveBehaviorIncidentVM.academicYearId,\n CreatedByStaffID: isAdd() ? positiveBehaviorIncidentVM.staffId : positiveBehaviorIncidentVM.previousIncident.behaviorEvent.createdByStaffID,\n LastModifiedByStaffID: isUpdate() ? positiveBehaviorIncidentVM.staffId : null,\n IsAdvancedFieldIncomplete: true\n },\n BehaviorEventObservations: \n [{\n BehaviorEventObservationID: (isUpdate() && (positiveBehaviorIncidentVM.selectedObservation.behaviorObservationID === positiveBehaviorIncidentVM.previousIncident.behaviorEventObservations[0].behaviorObservationID)) ?\n positiveBehaviorIncidentVM.previousIncident.behaviorEventObservations[0].behaviorEventObservationID : 0,\n BehaviorEventID: isUpdate() ? positiveBehaviorIncidentVM.previousIncident.behaviorEvent.behaviorEventID : 0,\n BehaviorObservationID: positiveBehaviorIncidentVM.isStudentRecord ? positiveBehaviorIncidentVM.selectedObservation.behaviorObservationID : positiveBehaviorIncidentVM.selectedObservation,\n CreatedByStaffID: (isUpdate() && (positiveBehaviorIncidentVM.selectedObservation.behaviorObservationID === positiveBehaviorIncidentVM.previousIncident.behaviorEventObservations[0].behaviorObservationID)) ?\n positiveBehaviorIncidentVM.previousIncident.behaviorEventObservations[0].createdByStaffID :\n positiveBehaviorIncidentVM.staffId,\n LastModifiedByStaffID: isUpdate() ? positiveBehaviorIncidentVM.staffId : null\n }],\n BehaviorEventParticipant: \n {\n BehaviorEventParticipantID: isUpdate() ? positiveBehaviorIncidentVM.previousIncident.behaviorEventParticipant.behaviorEventParticipantID : 0,\n BehaviorEventID: isUpdate() ? positiveBehaviorIncidentVM.previousIncident.behaviorEvent.behaviorEventID : 0,\n BehaviorParticipantTypeID: 1, // hardcoded to student\n ParticipantStudentInSchoolID: $state.params.studentInSchoolId ? $state.params.studentInSchoolId : positiveBehaviorIncidentVM.studentInSchoolId,\n BehaviorLevelID: 0, // hardcoded to positive behavior\n BehaviorRoleID: 2, // hardcoded to participant\n IncludeInParentEmail: true,\n CreatedByStaffID: isAdd() ? positiveBehaviorIncidentVM.staffId : positiveBehaviorIncidentVM.previousIncident.behaviorEventParticipant.createdByStaffID,\n LastModifiedByStaffID: isUpdate() ? positiveBehaviorIncidentVM.staffId : null,\n SchoolID: positiveBehaviorIncidentVM.schoolId,\n AcademicYearID: positiveBehaviorIncidentVM.academicYearId\n },\n IsMobile: positiveBehaviorIncidentVM.isStudentRecord ? false : true\n };\n\n isAdd() ? behaviorEventIncidentRepository.set(behaviorEventIncident).then(onSaveSuccess, onSaveFailure) :\n behaviorEventIncidentRepository.put(behaviorEventIncident).then(onSaveSuccess, onSaveFailure);\n }\n\n function isAdd() {\n return positiveBehaviorIncidentVM.action === \"add\";\n }\n\n function isUpdate() {\n return positiveBehaviorIncidentVM.action === \"update\";\n }\n\n function validateIncidentDate() {\n return moment(positiveBehaviorIncidentVM.incidentDate).isValid();\n }\n\n init();\n }\n})();\n","/**\n * course-list.controller\n * @namespace gradebook\n */\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .controller('BehaviorSidebarCtrl', BehaviorSidebarCtrl);\n\n // protect against minification\n /* @ngInject */\n BehaviorSidebarCtrl.$inject = ['$state', '$stateParams', '$q', '$scope', '$controller',\n 'userContextService', 'enumService', '$location', 'matchmedia', 'ipCookie'];\n\n /**\n * @name CourseListController\n * @description Constructor for course-list.controller\n * @memberOf gradebook\n */\n function BehaviorSidebarCtrl($state, $stateParams, $q, $scope, $controller, \n userContextService, enumService, $location, matchmedia, ipCookie) {\n\n // inject Breadcrumb Controller to provide additional model data for breadcrumbs\n //$controller('breadcrumbController', { $scope: $scope });\n\n // Controller as vm - see route configuration\n var behaviorSidebarVM = this;\n\n matchmedia.onPhone(function (mediaQueryList) {\n behaviorSidebarVM.isPhone = matchmedia.isPhone();\n });\n\n // Properties associated to view model - sorted alphabetically\n // helps you instantly identify which members of the controller can be bound and used in the View \n \n\n // Navigation pass-thru methods - sorted alphabetically, linked directly to navigationManager method calls\n // helps you instantly identify which members of the controller can be bound and used in the View \n //courseListVM.openUrlForStaffManagementStaffDetails = navigationManager.openUrlForStaffManagementStaffDetails;\n\n // Controller methods associated to view model (init, reset, submit)\n behaviorSidebarVM.init = init;\n\n // All other methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the controller can be bound and used in the View \n \n\n // Initialize \n behaviorSidebarVM.init();\n\n //function getHrefForCourse(course) {\n // return navigationManager.getHrefForCourseGradebook({ schoolId: course.schoolID, markingPeriodId: course.markingPeriodID, academicYearId: course.academicYearID, staffId: course.staffID, courseSectionId: course.courseSectionID });\n //}\n\n \n\n /**\n * @name init\n * @description Initialize state of controller\n * @returns undefined\n * @memberOf gradebook-landing.controller\n */\n function init() {\n \n }\n\n \n }\n})();\n","(function () {\n 'use strict';\n\n angular\n .module('nha.behavior')\n .controller('StudentListCtrl', StudentListCtrl);\n\n // protect against minification\n /* @ngInject */\n StudentListCtrl.$inject = ['$state', '$scope', 'matchmedia', 'studentListService', 'userContextService', 'behaviorCourseSummaryRepository',\n 'ipCookie', '$location', '$q', '$uibModal', 'appSettings', 'behaviorEventIncidentRepository', 'getDataForBehaviorTeacherViewRepository',\n 'behaviorCache', '$cookies', '$window', '$rootScope', 'behaviorSessionCache', 'behaviorLocalCache', 'behaviorUserRoleService', 'behaviorAlertService',\n 'courseSectionGroupRepository', 'courseSectionRepository', 'toastr', 'courseSectionRosterOrderRepository', 'apiSecurityService', 'observationRepository'];\n\n /**\n * @name StudentListController\n * @description Constructor for student-list.controller\n * @memberOf behavior\n */\n function StudentListCtrl($state, $scope, matchmedia, studentListService, userContextService, behaviorCourseSummaryRepository,\n ipCookie, $location, $q, $uibModal, appSettings, behaviorEventIncidentRepository, getDataForBehaviorTeacherViewRepository,\n behaviorCache, $cookies, $window, $rootScope, behaviorSessionCache, behaviorLocalCache, behaviorUserRoleService, behaviorAlertService,\n courseSectionGroupRepository, courseSectionRepository, toastr, courseSectionRosterOrderRepository, apiSecurityService, observationRepository) {\n\n // ReSharper disable PossiblyUnassignedProperty\n var moment = window.moment;\n var _ = window._;\n\n // ReSharper restore PossiblyUnassignedProperty\n var studentListVM = this;\n\n // Used for the date-panel directive\n $scope.viewOptions = {\n endDate: $state.params.endDate ? moment($state.params.endDate, 'YYYY-MM-DD').toDate() : null,\n startDate: $state.params.startDate ? moment($state.params.startDate, 'YYYY-MM-DD').toDate() : null\n };\n\n userContextService.ensureUserContext().then(function (context) {\n studentListVM.staffId = context['http://schemas.mynha.com/SIS/Core/StaffID'];\n $scope.viewOptions.startDate = moment().toDate();\n $scope.viewOptions.endDate = moment().toDate();\n\n var path = \"/course/\" + $state.params.courseSectionGroupId + \"/\" + $state.params.specialsCourseSectionId + \"/\" + $state.params.startDate + \"/\" + $state.params.endDate + \"/\" + \"list\";\n $location.path(path).replace();\n });\n\n // Properties associated to view model - sorted alphabetically\n // helps you instantly identify which members of the controller can be bound and used in the View\n studentListVM.horizontalAttendanceMessagesNeeded = false;\n studentListVM.amClass = null;\n studentListVM.currentCourseName = null;\n studentListVM.datePanelOptions = { \"maxDate\": moment() };\n studentListVM.hasMultipleCourses = false;\n studentListVM.isAmPmClass = true;\n studentListVM.isMobileAm = false;\n studentListVM.isMobilePm = false;\n studentListVM.isPhone = false;\n studentListVM.isSpecial = $state.params.specialsCourseSectionId > 0;\n studentListVM.meetingBlockTimeName = null;\n studentListVM.negativeSelection = false;\n studentListVM.pmClass = null;\n studentListVM.positiveObservations = [];\n studentListVM.positiveSelection = false;\n studentListVM.previousCourseID = null;\n studentListVM.schedule = [];\n studentListVM.selectedMeetingBlockTimeId = null;\n studentListVM.selectedRow = null;\n studentListVM.showAmPmBlocks = true;\n studentListVM.showIndicators = false; // Set in loadSettings()\n studentListVM.showLevels = true; // Set in loadSettings()\n studentListVM.studentListLoading = true;\n studentListVM.svOptions = { containment: \".sv-container\" };\n studentListVM.viewIsFuture = false;\n\n // All other methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the controller can be bound and used in the View\n studentListVM.absentReason = absentReason;\n studentListVM.addNegativeIncident = addNegativeIncident;\n studentListVM.addPositiveIncident = addPositiveIncident;\n studentListVM.behaviorLevel = behaviorLevel;\n studentListVM.behaviorLevelColorUi = behaviorLevelColorUi;\n studentListVM.behaviorLevelUi = behaviorLevelUi;\n studentListVM.bspLineOffset = bspLineOffset;\n studentListVM.bspWidthPercent = bspWidthPercent;\n studentListVM.changeSorting = changeSorting;\n studentListVM.displayAbsentAlert = displayAbsentAlert;\n studentListVM.getDateRangeText = getDateRangeText;\n studentListVM.getStudentUrl = getStudentUrl;\n studentListVM.goToNextCourse = goToNextCourse;\n studentListVM.goToPreviousCourse = goToPreviousCourse;\n studentListVM.goToCourseList = goToCourseList;\n studentListVM.goToSchedule = goToSchedule;\n studentListVM.hasAttendanceRecord = hasAttendanceRecord;\n studentListVM.incompleteIncidentLevel = incompleteIncidentLevel;\n studentListVM.isGridMode = isGridMode;\n studentListVM.isInFuture = isInFuture;\n studentListVM.isInPast = isInPast;\n studentListVM.isInWeekView = isInWeekView;\n studentListVM.isPresent = isPresent;\n studentListVM.isToday = isToday;\n studentListVM.loadViewData = loadViewData;\n studentListVM.loadStudentData = loadStudentData;\n studentListVM.showGridView = showGridView;\n studentListVM.showListView = showListView;\n studentListVM.openNewModal = openNewModal;\n\t\tstudentListVM.openNewModalAllStudents = openNewModalAllStudents;\n studentListVM.studentWasPartiallyAbsent = studentWasPartiallyAbsent;\n studentListVM.swipedLeftToRight = swipedLeftToRight;\n studentListVM.swipedRightToLeft = swipedRightToLeft;\n studentListVM.updateOrderNumbers = updateOrderNumbers;\n studentListVM.startReorder = startReorder;\n studentListVM.viewOptionClick = viewOptionClick;\n studentListVM.noAttendanceTaken = noAttendanceTaken;\n\t\tstudentListVM.someAttendanceTaken = someAttendanceTaken;\n\t\tstudentListVM.emergencyRemoteLearningEnabled = false;\n\n // Initialize\n init();\n\n function init() {\n matchmedia.onPhone(function (mediaQueryList) {\n studentListVM.isPhone = matchmedia.isPhone();\n });\n\n studentListVM.viewIsFuture = moment($scope.viewOptions.startDate).startOf('day').isAfter(moment().startOf('day'));\n\n $q.all([\n loadDataPermissionsForPage(),\n checkForWritePermissions()\n ])\n .then(loadAll)\n .then(function () {\n studentListVM.studentListLoading = false;\n });\n }\n\n function checkForWritePermissions() {\n return apiSecurityService.isAccessAllowed(\"ui_add_level_zero_two_three\", \"Get\").then(function (result) {\n studentListVM.hasWritePermissions = result;\n });\n }\n\n function loadDataPermissionsForPage() {\n return behaviorUserRoleService.loadDataPermissionsForPage($state).then(function (result) {\n if (!result) {\n behaviorLocalCache.remove('behavior.lastCourseSelected.' + studentListVM.staffId);\n behaviorSessionCache.remove('behavior.lastStudentListView.' + studentListVM.staffId);\n $state.go('403');\n }\n });\n }\n\n // ------------------ Load Functions --------------------------\n\n function loadAll() {\n if (!studentListVM.isPhone) {\n $q.all([getCourseList()]).then(function (results) {\n results = results && results[0] ? results[0] : [];\n\n setupNextAndPrevCourse(results);\n });\n }\n\n loadCourseName();\n loadSettings();\n\n return loadViewData()\n .then(function (result) {\n checkForAmPm();\n });\n }\n\n function getCourseList() {\n return getCourseParameters()\n .then(function (result) {\n var q = result[0];\n if (!_.isEmpty(q)) {\n var pagingParams = {\n filterAsOdataString: \"AcademicYearID eq \" + q.academicYearID + \" and SchoolID eq \" + q.schoolID + \" and MarkingPeriodID eq \" + q.markingPeriodID\n };\n\n return loadCoursesCall(pagingParams);\n }\n });\n }\n\n function loadCoursesCall(pagingParams) {\n return behaviorCourseSummaryRepository.getAllLite(pagingParams);\n }\n\n function setupNextAndPrevCourse(courses) {\n var currentIndex = _.findIndex(courses, {\n 'courseSectionGroupID': $state.params.courseSectionGroupId\n });\n\n if (currentIndex >= 0) {\n studentListVM.Next = {\n courseSectionGroupID: currentIndex === (courses.length - 1) ? _.first(courses).courseSectionGroupID : courses[currentIndex + 1].courseSectionGroupID,\n courseSectionID: 0\n };\n studentListVM.Prev = {\n courseSectionGroupID: currentIndex === 0 ? _.last(courses).courseSectionGroupID : courses[currentIndex - 1].courseSectionGroupID,\n courseSectionID: 0\n };\n } else {\n studentListVM.Next = null;\n studentListVM.Prev = null;\n }\n }\n\n function loadCourseName() {\n if ($state.params.specialsCourseSectionId) {\n return courseSectionRepository.get($state.params.specialsCourseSectionId)\n .then(function (courseSection) {\n return courseSection.courseSectionSystemGeneratedName;\n })\n .then(updateCourseName);\n } else {\n return courseSectionGroupRepository.get($state.params.courseSectionGroupId)\n .then(function (courseSectionGroup) {\n return courseSectionGroup.courseSectionGroupName;\n })\n .then(updateCourseName);\n }\n }\n\n function updateCourseName(name) {\n studentListVM.currentCourseName = name;\n\n $scope.$emit('breadcrumb:update', {\n key: 'studentlist',\n value: name\n });\n }\n\n function loadStudentData() {\n studentListVM.studentListLoading = true;\n\n loadViewData().then(function () {\n studentListVM.studentListLoading = false;\n\t\t\t});\n }\n\n function loadViewData() {\n var csgID, scsID;\n\n if ($state.params.specialsCourseSectionId) {\n csgID = null;\n scsID = $state.params.specialsCourseSectionId;\n } else {\n csgID = $state.params.courseSectionGroupId;\n scsID = null;\n }\n\n var startDate = $scope.viewOptions.startDate,\n endDate = $scope.viewOptions.endDate;\n\n if (studentListVM.isInWeekView()) {\n endDate = moment(startDate).startOf('week').day(5).format('YYYY-MM-DD');\n }\n\n if (!csgID && !scsID) {\n return;\n }\n\n return getDataForBehaviorTeacherViewRepository\n .getData(csgID, scsID, startDate, endDate)\n .then(function (data) {\n var deferred = $q.defer();\n studentListVM.attendanceRecords = data.attendanceRecords;\n studentListVM.behaviorEvents = data.behaviorEvents;\n studentListVM.meetingBlocks = data.meetingBlocks;\n\n // we need these dates to be agnostic of browser timezone\n _.forEach(studentListVM.meetingBlocks, function (t) {\n t.date = moment.utc(t.date).format('YYYY-MM-DD');\n });\n\n // schedule\n var meetingBlocksToShow = getMeetingBlockTimeIDsToShow(data.meetingBlocks);\n studentListVM.schedule = _(data.meetingBlocks)\n .filter(function (mb) {\n return _.some(meetingBlocksToShow, function (meetingBlockToShow) {\n return meetingBlockToShow === mb.meetingBlockTimeID;\n });\n })\n .sortBy(function (i) {\n return i.meetingBlockTimeName;\n })\n .sortBy(function (i) {\n return moment(i.date).toDate();\n })\n .map(function (i, index) {\n i.displayName = moment(i.date).format('ddd ') + ((i.meetingBlockTimeName === \"AM\" || i.meetingBlockTimeName === \"PM\") && isCoreSubject() ? i.meetingBlockTimeName : \"\");\n i.displayNameForGrid = \"Behavior \" + i.meetingBlockTimeName;\n return i;\n })\n .value();\n\n _(studentListVM.schedule)\n .groupBy('date')\n .each(function (r) {\n // This property is used to style the border of the last period of day\n _.last(r).isLastPeriodForDay = true;\n });\n\n // The initially selected meeting block. It is either coming from cache or chosen based on whether it's a self-contained special\n studentListVM.selectedMeetingBlockTimeId = getInitialMeetingBlockTime(studentListVM.staffId, studentListVM.schedule);\n\n // students\n studentListVM.students = _(data.students).map(function (i) {\n i.fullName = i.lastName + ', ' + i.firstName;\n i.positiveBehaviorCount = getPositiveObservationCount(i.studentInSchoolID);\n i.removalEndDate = i.removalDuration ? moment(i.removalStartDate).add(i.removalDuration, 'days') : null;\n return i;\n })\n .sortBy(['orderNumber', 'fullName'])\n .value();\n\n _(studentListVM.schedule)\n .each(function (scheduleItem) {\n // This property is used\n scheduleItem.anyStudentWithAttendance = anyStudentsHaveAttendanceRecord(studentListVM.students, scheduleItem);\n });\n\n\t\t\t\t\tcheckEmergencyRemoteLearning(studentListVM.students[0]);\n\n // if there are less than 3 students, display attendance messages horizontally instead of vertically\n studentListVM.horizontalAttendanceMessagesNeeded = studentListVM.students.length < 3;\n\n studentListVM.originalStudentList = _.cloneDeep(studentListVM.students);\n loadPositiveObservations();\n\n deferred.resolve();\n return deferred.promise;\n });\n }\n\n function loadPositiveObservations() {\n var scheduleItem = _(studentListVM.schedule).filter({ courseSectionGroupID: $state.params.courseSectionGroupId }).first();\n\n if (scheduleItem) {\n var schoolId = scheduleItem.schoolID;\n var academicYearId = scheduleItem.academicYearID;\n\n var observationAndActionParams = {\n academicYearID: academicYearId,\n schoolID: schoolId,\n behaviorLevelID: 0\n };\n\n observationRepository.getAll(observationAndActionParams).then(function (data) {\n studentListVM.positiveObservations = _.orderBy(data, ['orderNumber']);\n });\n }\n }\n\n // Non view methods\n /*Using method to return href because SREF directive changes state when clicked before the $locationChangeStart event is fired. We use this for checking dirty.*/\n function showGridView() {\n if (studentListVM.isInWeekView())\n return;\n\n studentListVM.studentListLoading = true;\n var scheduleItem = _(studentListVM.schedule).find(function (scheduleItem) {\n return moment(scheduleItem.date).diff(moment($scope.viewOptions.startDate), 'days') === 0 &&\n scheduleItem.courseSectionGroupID &&\n scheduleItem.meetingBlockTimeID;\n });\n\n $state.go('behavior-students.grid').then(function () {\n behaviorSessionCache.put('behavior.lastStudentListView.' + studentListVM.staffId, $location.path());\n studentListVM.studentListLoading = false;\n });\n }\n\n /*Using method to return href because SREF directive changes state when clicked before the $locationChangeStart event is fired. We use this for checking dirty.*/\n function showListView() {\n studentListVM.studentListLoading = true;\n $state.go('behavior-students.list').then(function () {\n behaviorSessionCache.put('behavior.lastStudentListView.' + studentListVM.staffId, $location.path());\n studentListVM.studentListLoading = false;\n });\n }\n\n function goToSchedule(scheduleItem) {\n studentListVM.selectedMeetingBlockTimeId = scheduleItem.meetingBlockTimeID;\n }\n\n function getStudentAttendanceRecordsBasedOnMasterMeetingSchedules(student, scheduleItem) {\n var attendanceRecordsForStudent = [];\n\n var masterMeetingScheduleIdsForDate = _(studentListVM.meetingBlocks)\n .filter(function (mb) { return mb.date === scheduleItem.date; })\n .map('masterMeetingScheduleID')\n .value();\n\n _.each(masterMeetingScheduleIdsForDate, function (mmsId) {\n var studentAttendanceRecords = _.filter(studentListVM.attendanceRecords, function (ar) {\n return ar.masterMeetingScheduleID === mmsId && ar.studentInSchoolID === student.studentInSchoolID;\n });\n\n attendanceRecordsForStudent = _.concat(attendanceRecordsForStudent, studentAttendanceRecords);\n });\n\n return attendanceRecordsForStudent;\n }\n\n function absentReason(student, scheduleItem) {\n scheduleItem = scheduleItem || getScheduleFromMeetingBlock();\n\n if (!scheduleItem) { return \"\"; }\n\n var attendanceRecordsForStudent = _(getStudentAttendanceRecordsBasedOnMasterMeetingSchedules(student, scheduleItem))\n .filter(function (ar) { return ar.isAbsent && ar.description.length > 0; })\n .map('description')\n .value();\n\n return attendanceRecordsForStudent.length > 0 ? attendanceRecordsForStudent[0] : \"\";\n }\n\n function studentWasPartiallyAbsent(student, scheduleItem) {\n scheduleItem = scheduleItem || getScheduleFromMeetingBlock();\n\n var hasPresentRecord = false;\n var hasAbsentRecord = false;\n var attendanceRecordsForStudent = getStudentAttendanceRecordsBasedOnMasterMeetingSchedules(student, scheduleItem);\n\n _.each(attendanceRecordsForStudent, function (record) {\n if (record.isPresent && !hasPresentRecord) {\n hasPresentRecord = true;\n } else if (record.isAbsent && !hasAbsentRecord) {\n hasAbsentRecord = true;\n }\n });\n\n return hasPresentRecord && hasAbsentRecord;\n }\n\n function hasAttendanceRecord(student, scheduleItem) {\n if (!scheduleItem || scheduleItem.hasAcademicCancellation || scheduleItem.hasInstructionalCancellation || !student) { return false; }\n\n return getStudentAttendanceRecordsBasedOnMasterMeetingSchedules(student, scheduleItem).length > 0;\n }\n\n function anyStudentsHaveAttendanceRecord(students, scheduleItem) {\n if (!scheduleItem || scheduleItem.hasAcademicCancellation || scheduleItem.hasInstructionalCancellation) { return false; }\n var returned = false;\n\n for (var x = 0; x < students.length; x++) {\n var records = getStudentAttendanceRecordsBasedOnMasterMeetingSchedules(students[x], scheduleItem);\n\n if (records.length > 0) {\n returned = true;\n x = students.length;\n }\n }\n\n return returned;\n }\n\n function isPresent(student, scheduleItem) {\n scheduleItem = scheduleItem || getScheduleFromMeetingBlock();\n\n if (!scheduleItem || scheduleItem.hasAcademicCancellation || scheduleItem.hasInstructionalCancellation) { return false; }\n\n var numberOfAttendanceRecords = getStudentAttendanceRecordsBasedOnMasterMeetingSchedules(student, scheduleItem).length;\n\n var presentAttendanceRecordsForStudent = _(getStudentAttendanceRecordsBasedOnMasterMeetingSchedules(student, scheduleItem))\n .filter(function (ar) { return ar.isPresent && !ar.isInSchoolSuspension; })\n .value();\n\n return numberOfAttendanceRecords === 0 ? false : numberOfAttendanceRecords === presentAttendanceRecordsForStudent.length;\n }\n\n function behaviorLevel(student, scheduleItem) {\n\n if (!studentListVM.showLevels && !studentListVM.isPhone) { return 0; }\n\n scheduleItem = scheduleItem || getScheduleFromMeetingBlock();\n\n if (!scheduleItem) { return 0; }\n\n var dow = moment(scheduleItem.date).day();\n var behaviorEvents = _.filter(studentListVM.behaviorEvents, function (i) {\n return i.isPositive === false\n && !i.isIncomplete\n // Checks MeetingBlockTimeID or SpecialsCourseSectionID because Core classes are saved with mbtID and Specials are saved with csID\n && (i.meetingBlockTimeID === scheduleItem.meetingBlockTimeID || i.specialsCourseSectionID > 0)\n && i.studentInSchoolID === student.studentInSchoolID\n && moment.utc(i.date).day() === dow;\n });\n\n if (behaviorEvents.length) {\n return _(behaviorEvents).sortBy('behaviorLevelID').last().behaviorLevelID;\n }\n\n return 0;\n }\n\n function incompleteIncidentLevel(student, scheduleComponent) {\n\n var scheduleItem = scheduleComponent || getScheduleFromMeetingBlock();\n\n if (!scheduleItem) { return 0; }\n\n var dow = moment(scheduleItem.date).day();\n var behaviorEvents = _.filter(studentListVM.behaviorEvents, function (i) {\n return i.isPositive === false\n && i.isIncomplete\n // Checks MeetingBlockTimeID or SpecialsCourseSectionID because Core classes are saved with mbtID and Specials are saved with csID\n && (i.meetingBlockTimeID === scheduleItem.meetingBlockTimeID || i.specialsCourseSectionID > 0)\n && i.studentInSchoolID === student.studentInSchoolID\n && moment.utc(i.date).day() === dow;\n });\n\n if (behaviorEvents.length) {\n return _(behaviorEvents).sortBy('behaviorLevelID').last().behaviorLevelID;\n }\n\n return 0;\n }\n\n function behaviorLevelUi(student, scheduleItem) {\n var incompleteLevel = incompleteIncidentLevel(student, scheduleItem);\n\n if (incompleteLevel === 0) {\n var level = behaviorLevel(student, scheduleItem);\n\n return level === 0 ? null : level;\n } else {\n return incompleteLevel;\n }\n }\n\n function behaviorLevelColorUi(student, scheduleItem) {\n var returned = '';\n var incompleteLevel = incompleteIncidentLevel(student, scheduleItem);\n\n switch (incompleteLevel) {\n case 0:\n returned = 'green';\n break;\n case 2:\n returned = 'blueIncomplete';\n break;\n case 3:\n returned = 'redIncomplete';\n break;\n }\n\n if (returned === 'green') {\n var level = behaviorLevel(student, scheduleItem);\n\n switch (level) {\n case 0:\n returned = 'green';\n break;\n case 2:\n returned = 'blue';\n break;\n case 3:\n returned = 'red';\n break;\n }\n }\n\n return returned;\n }\n\n function getPositiveObservationCount(studentInSchoolId) {\n return _(studentListVM.behaviorEvents).filter({ isPositive: true, studentInSchoolID: studentInSchoolId }).size();\n }\n\n function isGridMode() {\n return $state.current.name === 'behavior-students.grid';\n }\n\n function getStudentUrl(studentInSchoolId) {\n return appSettings.studentManagementWebRootUrl + studentInSchoolId + '/behavior/overview';\n }\n\n function saveOrderByCourseSection() {\n var orderedStudents = _.map(studentListVM.students, function (student) {\n return {\n 'CourseSectionRosterID': student.specialsCourseSectionRosterID,\n 'OrderNumber': student.orderNumber,\n };\n });\n\n return courseSectionRosterOrderRepository.saveRosterOrders(orderedStudents).then(studentOrderSaveSuccess, studentOrderSaveFail);\n }\n\n function saveOrderByCourseSectionGroup() {\n var orderedStudents = _.map(studentListVM.students, function (student) {\n return {\n 'StudentOrderForCourseSectionGroupID': 0,\n 'OrderNumber': student.orderNumber,\n 'StudentInSchoolID': student.studentInSchoolID,\n 'CourseSectionGroupID': $state.params.courseSectionGroupId\n };\n });\n\n studentListService.updateStudentOrder(orderedStudents, { courseSectionGroupID: $state.params.courseSectionGroupId, date: $scope.viewOptions.startDate }).then(studentOrderSaveSuccess, studentOrderSaveFail);\n }\n\n function studentOrderSaveSuccess(results) {\n swal({ title: \"Success!\", text: \"Student ordering saved.\", timer: 3000, showConfirmButton: false });\n }\n\n function studentOrderSaveFail(error) {\n swal({ title: \"Error!\", text: \"Failed to save student order.\", timer: 3000, showConfirmButton: false });\n }\n\n var debouncedStudentOrderSave = _.debounce(studentListVM.isSpecial ? saveOrderByCourseSection : saveOrderByCourseSectionGroup, 5000);\n function updateOrderNumbers() {\n _.each(studentListVM.students, function (student, index) {\n student.orderNumber = index;\n });\n\n debouncedStudentOrderSave();\n }\n\n function startReorder(helper) {\n // keep the row's TDs the same width as the header\n helper\n .element.closest(\"table\").find(\"thead\").find(\"th\").each(function (index) {\n var width = $(this).outerWidth();\n helper.element.find('td').eq(index).css('min-width', width + 'px');\n });\n }\n\n function viewOptionClick(viewOption) {\n if (viewOption === 'indicators') { studentListVM.showIndicators = !studentListVM.showIndicators; }\n\n if (viewOption === 'levels') { studentListVM.showLevels = !studentListVM.showLevels; }\n\n updateSettings();\n }\n\n function isInWeekView() {\n return moment($scope.viewOptions.startDate).diff(moment($scope.viewOptions.endDate), 'day') !== 0;\n }\n\n\t\tfunction addNegativeIncident(student, scheduleItem) {\n\t\t\t// This check is here (as opposed to in the template) to allow clicking anywhere withing the element to trigger this function call\n if (studentListVM.hasWritePermissions) {\n scheduleItem = scheduleItem || getScheduleFromMeetingBlock();\n\n\t\t\t\tif ((!studentListVM.isPresent(student, scheduleItem) && !studentListVM.studentWasPartiallyAbsent(student, scheduleItem) && !studentListVM.emergencyRemoteLearningEnabled) || isInFuture(scheduleItem) || behaviorLevel(student, scheduleItem) === 3 || ((studentListVM.attendanceRecords.length === 0 || !studentListVM.hasAttendanceRecord(student, scheduleItem)) && !studentListVM.emergencyRemoteLearningEnabled)) {\n return;\n }\n\n behaviorCache.set('behavior.' + student.studentInSchoolID + '.student', student);\n behaviorCache.set('behavior.' + student.studentInSchoolID + '.level', getBehaviorLevelIdToEnter(student, scheduleItem));\n behaviorCache.set('behavior.' + student.studentInSchoolID + '.academicYearId', scheduleItem.academicYearID);\n behaviorCache.set('behavior.' + student.studentInSchoolID + '.schoolId', scheduleItem.schoolID);\n behaviorCache.set('behavior.' + studentListVM.staffId + '.meetingBlockTimeID', scheduleItem.meetingBlockTimeID);\n\n $state.go('level-two-three', {\n action: \"add\",\n studentInSchoolId: student.studentInSchoolID,\n behaviorLevelId: getBehaviorLevelIdToEnter(student, scheduleItem),\n courseSectionGroupId: $state.params.courseSectionGroupId,\n specialsCourseSectionId: $state.params.specialsCourseSectionId,\n meetingBlockTimeId: scheduleItem.meetingBlockTimeID,\n date: moment(scheduleItem.date).format('YYYY-MM-DD')\n });\n }\n }\n\n // Determine behavior level of event currently being entered\n function getBehaviorLevelIdToEnter(student, scheduleItem) {\n var currentBehaviorLevel = behaviorLevel(student, scheduleItem);\n switch (currentBehaviorLevel) {\n case 0:\n return 2;\n case 1:\n return 2;\n case 2:\n return 3;\n case 3:\n return 3;\n default:\n return 2;\n }\n }\n\n function addPositiveIncident(student) {\n var scheduleItem = _(studentListVM.schedule).find({ meetingBlockTimeID: studentListVM.selectedMeetingBlockTimeId });\n\n if (!studentListVM.isPresent(student, scheduleItem) || isInFuture(scheduleItem)) {\n return;\n }\n\n behaviorCache.set('behavior.' + student.studentInSchoolID + '.student', { fullName: student.fullName, studentId: student.studentID, positiveBehaviorCount: student.positiveBehaviorCount });\n behaviorCache.set('behavior.' + student.studentInSchoolID + '.academicYearId', scheduleItem.academicYearID);\n behaviorCache.set('behavior.' + student.studentInSchoolID + '.schoolId', scheduleItem.schoolID);\n behaviorCache.set('behavior.' + studentListVM.staffId + '.meetingBlockTimeID', scheduleItem.meetingBlockTimeID);\n\n $state.go('behavior-incident-positive', {\n courseSectionGroupId: $state.params.courseSectionGroupId,\n specialsCourseSectionId: $state.params.specialsCourseSectionId,\n meetingBlockTimeId: studentListVM.selectedMeetingBlockTimeId,\n studentInSchoolId: student.studentInSchoolID\n });\n }\n\n function changeSorting(expression) {\n studentListVM.sort = _.map(expression, function (crit) {\n return (crit.descending ? '-' : '') + crit.criteria;\n });\n }\n\n function bspWidthPercent(currentValue) {\n var max = bspMaxValue(currentValue);\n return (parseFloat(currentValue) / max * 100) + '%';\n }\n\n function bspLineOffset(currentValue) {\n var max = bspMaxValue(currentValue);\n\n return (10 / max * 80) + '%';\n }\n\n function bspMaxValue(currentValue) {\n return Math.max(Math.ceil(currentValue / 10) * 10, 20);\n }\n\n function isInFuture(scheduleItem) {\n scheduleItem = scheduleItem || getScheduleFromMeetingBlock();\n\n if (!scheduleItem) {\n return false;\n }\n\n return moment(scheduleItem.date).diff(moment().startOf('day'), 'days') > 0;\n }\n\n function isToday(scheduleItem) {\n scheduleItem = scheduleItem || getScheduleFromMeetingBlock();\n\n if (!scheduleItem) {\n return false;\n }\n\n return moment(scheduleItem.date).diff(moment().startOf('day'), 'days') === 0;\n }\n\n function isInPast(scheduleItem) {\n scheduleItem = scheduleItem || getScheduleFromMeetingBlock();\n\n if (!scheduleItem) {\n return false;\n }\n\n return moment(scheduleItem.date).diff(moment().startOf('day'), 'days') < 0;\n }\n\n function getScheduleFromMeetingBlock() {\n return _(studentListVM.schedule).filter({ meetingBlockTimeID: studentListVM.selectedMeetingBlockTimeId }).first();\n }\n\n function isCoreSubject() {\n return $state.params.specialsCourseSectionId === 0;\n }\n\n function isSelfContained(meetingBlocks) {\n return _(meetingBlocks).some(function (mb) {\n return mb.meetingBlockTimeName === \"AM\" || mb.meetingBlockTimeName === \"PM\";\n });\n }\n\n function getMeetingBlockTimeIDsToShow(meetingBlocks) {\n if (isSelfContained(meetingBlocks)) {\n return _(meetingBlocks)\n .filter(function (mb) {\n // Only show the AM marking period if it's a specials class\n return isCoreSubject() ? true : mb.meetingBlockTimeName === \"AM\";\n })\n .map('meetingBlockTimeID')\n .value();\n } else {\n return _(meetingBlocks)\n .groupBy(function (mb) { return moment(mb.date) })\n .map(function (mbByDate) {\n return _.minBy(mbByDate, 'meetingBlockTimeID').meetingBlockTimeID;\n })\n .value();\n }\n }\n\n function getInitialMeetingBlockTime(staffId, schedule) {\n var mbt = behaviorCache.get('behavior.' + staffId + '.meetingBlockTimeID');\n if (!mbt) {\n mbt = isSelfContained(schedule) && !isCoreSubject() ?\n _(schedule).filter({ meetingBlockTimeName: \"AM\" }).map('meetingBlockTimeID').first() :\n _(schedule).sortBy('meetingBlocktimeID').map('meetingBlockTimeID').first();\n }\n\n return mbt;\n }\n\n studentListVM.hasAcademicCancellation = function hasAcademicCancellation() {\n var scheduleItem = _(studentListVM.schedule).find({ meetingBlockTimeID: studentListVM.selectedMeetingBlockTimeId });\n if (scheduleItem) {\n return scheduleItem.hasAcademicCancellation;\n }\n return false;\n }\n\n function openNewModal(student) {\n // This check is here (as opposed to in the template) to allow clicking anywhere withing the element to trigger this function call\n if (studentListVM.hasWritePermissions) {\n var scheduleItem = _(studentListVM.schedule).filter({ courseSectionGroupID: $state.params.courseSectionGroupId }).first();\n if (!scheduleItem) {\n swal(\"Sorry, but you can not enter a positive behavior event for this time period.\", \"Please select a different time period.\");\n return;\n\t\t\t\t}\n\t\t\t\tif (studentListVM.emergencyRemoteLearningEnabled) {\n\t\t\t\t\tif (isInWeekView() && !studentHasAttendanceRecordsForWeek(student)) {\n\t\t\t\t\t\tbehaviorAlertService.goSwal(\"warningWithMsg\", null, \"Student has no Present attendance records for this week. Please try another week.\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n if (isInFuture(scheduleItem)) { return; }\n\n var saveInfo = getPositiveBehaviorEventSaveInfo(student);\n\n var modalInstance = $uibModal.open({\n templateUrl: appSettings.behaviorWebRootUrl + 'app/components/positive-behavior-add/desktop/positive-behavior-add-modal.html',\n controller: 'positiveBehaviorModalController',\n controllerAs: 'positiveBehaviorModalVM',\n size: 'xlg',\n resolve: {\n student: function () {\n return student;\n },\n courseSectionGroupId: function () {\n return $state.params.courseSectionGroupId;\n },\n specialsCourseSectionId: function () {\n return $state.params.specialsCourseSectionId;\n },\n meetingBlockTimeId: function () {\n return saveInfo.meetingBlockTimeId;\n },\n staffId: function () {\n return studentListVM.staffId;\n },\n academicYearId: function () {\n return scheduleItem.academicYearID;\n },\n schoolId: function () {\n return scheduleItem.schoolID;\n },\n positiveObservations: function () {\n return studentListVM.positiveObservations;\n },\n eventDate: function () {\n return saveInfo.date;\n },\n eventTime: function () {\n return saveInfo.time;\n }\n }\n });\n\n modalInstance.result.then(function (saveEventIncident) {\n var studentParticipant = saveEventIncident.behaviorEventParticipant;\n\n if (studentParticipant) {\n _.forEach(studentListVM.students, function (student) {\n if (student.studentInSchoolID === studentParticipant.participantStudentInSchoolID) {\n student.positiveBehaviorCount++;\n }\n });\n }\n });\n }\n }\n\n function openNewModalAllStudents() {\n if (studentListVM.hasWritePermissions) {\n var scheduleItem = _(studentListVM.schedule).filter({ courseSectionGroupID: $state.params.courseSectionGroupId }).first();\n if (!scheduleItem) {\n swal(\"Sorry, but you can not enter a positive behavior event for this time period.\", \"Please select a different time period.\");\n return;\n\t\t\t\t}\n\t\t\t\tif (studentListVM.emergencyRemoteLearningEnabled) {\n\t\t\t\t\tif (isInWeekView() && !studentHasAttendanceRecordsForWeek(student)) {\n\t\t\t\t\t\tbehaviorAlertService.goSwal(\"warningWithMsg\", null, \"Student has no Present attendance records for this week. Please try another week.\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n if (isInFuture(scheduleItem)) { return; }\n\n var saveInfo = getPositiveBehaviorEventSaveInfo(studentListVM.students[0]);\n var modalInstance = $uibModal.open({\n templateUrl: appSettings.behaviorWebRootUrl + 'app/components/positive-behavior-add-multiple/positive-behavior-add-multiple-modal.html',\n controller: 'positiveBehaviorMultipleModalController',\n controllerAs: 'positiveBehaviorMultipleModalVM',\n size: 'xlg',\n resolve: {\n students: function () {\n return studentListVM.students;\n },\n courseSectionGroupId: function () {\n return $state.params.courseSectionGroupId;\n },\n specialsCourseSectionId: function () {\n return $state.params.specialsCourseSectionId;\n },\n meetingBlockTimeId: function () {\n return saveInfo.meetingBlockTimeId;\n },\n staffId: function () {\n return studentListVM.staffId;\n },\n academicYearId: function () {\n return scheduleItem.academicYearID;\n },\n schoolId: function () {\n return scheduleItem.schoolID;\n },\n positiveObservations: function () {\n return studentListVM.positiveObservations;\n },\n eventDate: function () {\n return saveInfo.date;\n },\n eventTime: function () {\n return saveInfo.time;\n }\n }\n });\n }\n }\n\n function getPositiveBehaviorEventSaveInfo(student) {\n var date = moment(),\n time = moment(),\n meetingBlockTimeId = studentListVM.selectedMeetingBlockTimeId;\n\n var today = moment().format('YYYY-MM-DD');\n var startDate = moment($scope.viewOptions.startDate).format('YYYY-MM-DD');\n var endDate = moment($scope.viewOptions.endDate).format('YYYY-MM-DD');\n\n var isWeekView = moment(endDate).diff(startDate, 'days') > 0;\n var isCurrentWeek = isWeekView && (moment(today).isBetween(startDate, endDate) || moment(startDate).isSame(today) || moment(endDate).isSame(today));\n var isPastWeek = isWeekView && moment(today).isAfter(endDate);\n var isPastDay = !isWeekView && moment(startDate).isBefore(today);\n\n if (isCurrentWeek) {\n meetingBlockTimeId = getMeetingBlockForToday();\n } else if (isPastDay) {\n date = moment($scope.viewOptions.startDate);\n time = moment().endOf('day');\n } else if (isPastWeek) {\n var ar = getLastAttendanceRecordTakenForTheWeek(student);\n\n if (ar) {\n meetingBlockTimeId = getMeetingBlockByAttendanceRecord(ar);\n date = moment(ar.date);\n }\n\n time = moment().endOf('day');\n }\n\n return { date: date, time: time, meetingBlockTimeId: meetingBlockTimeId };\n }\n\n function getMeetingBlockByAttendanceRecord(ar) {\n if (!ar) {\n return;\n }\n\n var schedule = _(studentListVM.schedule).find({ 'masterMeetingScheduleID': ar.masterMeetingScheduleID });\n\n return schedule ? schedule.meetingBlockTimeID : null;\n }\n\n function getMeetingBlockForToday() {\n // Find a meeting block that meets today.\n var schedule = _(studentListVM.schedule)\n .find(function (item) {\n return moment(item.date).isSame(moment(), 'day');\n });\n\n return schedule ? schedule.meetingBlockTimeID : null;\n }\n\n function getLastAttendanceRecordTakenForTheWeek(student) {\n var lastDateForTheWeek =\n _.head(\n _.orderBy(\n _.filter(studentListVM.attendanceRecords, function (ar) {\n return ar.studentInSchoolID === student.studentInSchoolID && ar.isPresent;\n }), ['date'], ['desc']));\n\n return lastDateForTheWeek;\n }\n\n function studentHasAttendanceRecordsForWeek(student) {\n var lastDateForTheWeek = getLastAttendanceRecordTakenForTheWeek(student);\n\n if (!lastDateForTheWeek) {\n return false;\n }\n\n return true;\n }\n\n function checkForAmPm() {\n if (studentListVM.schedule.length === 2) {\n studentListVM.amClass = _.filter(studentListVM.schedule, function (item) { return item.meetingBlockTimeName === \"AM\"; });\n studentListVM.pmClass = _.filter(studentListVM.schedule, function (itemTwo) { return itemTwo.meetingBlockTimeName === \"PM\"; });\n }\n\n if (!studentListVM.amClass || !studentListVM.pmClass || studentListVM.amClass.length === 0 || studentListVM.pmClass === 0) {\n studentListVM.isAmPmClass = false;\n }\n }\n\n function getCourseParameters() {\n return behaviorCourseSummaryRepository.getCourseParameters($state.params.courseSectionGroupId, $state.params.startDate);\n }\n\n function swipedLeftToRight(index, student) {\n if (studentListVM.isPresent(student) && !studentListVM.viewIsFuture) {\n if (studentListVM.positiveSelection) {\n studentListVM.positiveSelection = false;\n studentListVM.selectedRowNegative = null;\n studentListVM.selectedRowPositive = null;\n } else if (!studentListVM.negativeSelection) {\n studentListVM.negativeSelection = true;\n studentListVM.selectedRowNegative = index;\n }\n } else if (studentListVM.viewIsFuture) {\n displayFutureAlert();\n } else {\n studentListVM.displayAbsentAlert();\n }\n }\n\n function swipedRightToLeft(index, student) {\n if (studentListVM.isPresent(student) && !studentListVM.viewIsFuture) {\n if (studentListVM.negativeSelection) {\n studentListVM.negativeSelection = false;\n studentListVM.selectedRowNegative = null;\n studentListVM.selectedRowPositive = null;\n } else if (!studentListVM.positiveSelection) {\n studentListVM.positiveSelection = true;\n studentListVM.selectedRowPositive = index;\n }\n } else if (studentListVM.viewIsFuture) {\n displayFutureAlert();\n } else {\n studentListVM.displayAbsentAlert();\n }\n }\n\n // Absent student selected\n function displayAbsentAlert() {\n swal(\"Student Is Absent / Class Not In Session\", \"Behavior event cannot be recorded.\", \"error\");\n }\n\n function displayFutureAlert() {\n swal(\"Future Date\", \"Behavior event cannot be recorded on a future date.\", \"error\");\n }\n\n function goToNextCourse() {\n var url = '/course/' + studentListVM.Next.courseSectionGroupID + '/'\n + studentListVM.Next.courseSectionID + '/'\n + $state.params.startDate + '/'\n + $state.params.endDate + '/'\n + (isGridMode() ? 'grid' : 'list');\n studentListVM.go(url);\n }\n\n function goToPreviousCourse() {\n var url = '/course/' + studentListVM.Prev.courseSectionGroupID + '/'\n + studentListVM.Prev.courseSectionID + '/'\n + $state.params.startDate + '/'\n + $state.params.endDate + '/'\n + (isGridMode() ? 'grid' : 'list');\n studentListVM.go(url);\n }\n\n function goToCourseList() {\n behaviorLocalCache.remove('behavior.lastCourseSelected.' + studentListVM.staffId);\n $state.go('behavior-courses');\n }\n\n function getDateRangeText() {\n return moment($scope.viewOptions.startDate).diff($scope.viewOptions.endDate, 'days') === 0 ?\n moment($scope.viewOptions.startDate).format(\"l\") :\n moment($scope.viewOptions.startDate).format(\"l\") + \" - \" + moment($scope.viewOptions.endDate).format(\"l\");\n }\n\n function updateSettings() {\n var key = 'behavior.studentSettings.' + studentListVM.staffId;\n var settings = {\n showIndicators: studentListVM.showIndicators,\n showLevels: studentListVM.showLevels\n };\n\n ipCookie(key, settings);\n }\n\n function loadSettings() {\n var key = 'behavior.studentSettings.' + studentListVM.staffId;\n var settings = ipCookie(key);\n\n if (settings) {\n studentListVM.showIndicators = settings.showIndicators;\n studentListVM.showLevels = settings.showLevels;\n }\n }\n\n function noAttendanceTaken(student, scheduleItem) {\n var hasAttendanceRecord = studentListVM.hasAttendanceRecord(student, scheduleItem);\n return (!hasAttendanceRecord\n && !scheduleItem.anyStudentWithAttendance\n && !scheduleItem.hasAcademicCancellation\n && !scheduleItem.hasInstructionalCancellation\n );\n }\n\n function someAttendanceTaken(student, scheduleItem, index) {\n var hasAttendanceRecord = studentListVM.hasAttendanceRecord(student, scheduleItem) || studentListVM.hasAttendanceRecord(studentListVM.filteredStudents[index - 1], scheduleItem);\n return (!hasAttendanceRecord\n && scheduleItem.anyStudentWithAttendance\n && !scheduleItem.hasAcademicCancellation\n && !scheduleItem.hasInstructionalCancellation\n );\n\t\t}\n\n\t\tfunction checkEmergencyRemoteLearning(student) {\n\t\t\tstudentListService.checkEmergencyRemoteLearningEnabled(student.studentInSchoolID, studentListVM.datePanelOptions.maxDate._d).then(function (emergencyRemoteLearningEnabled) {\n\t\t\t\tstudentListVM.emergencyRemoteLearningEnabled = emergencyRemoteLearningEnabled;\n\t\t\t});\n\t\t}\n\n studentListVM.go = function (path) {\n $location.path(path);\n }\n }\n})();","(function () {\n 'use strict';\n\n angular.module('nha.behavior')\n .directive('studentPositiveBehaviorCount',\n ['$timeout', '$parse', 'appSettings', 'behaviorBehaviorListService', function ($timeout, $parse, appSettings, behaviorBehaviorListService) {\n return {\n restrict: 'EA',\n templateUrl: appSettings.behaviorWebRootUrl + 'app/directives/studentPositiveBehaviorCount/student-positive-behavior-count.html',\n scope: {\n studentInSchoolId: '=',\n isWeeklyCount: '=',\n courseSectionGroupId: '=?',\n specialsCourseSectionId: '=?',\n meetingBlockTimeId: '=?'\n },\n controller: ['$scope', 'behaviorBehaviorListService', function ($scope, behaviorBehaviorListService) {\n //log($scope.studentInSchoolId, $scope.isWeeklyCount, $scope.courseSectionGroupId, $scope.specialsCourseSectionId, $scope.meetingBlockTimeId);\n\n if (!$scope.studentInSchoolId) {\n return;\n }\n\n var parameters = {\n $select: 'BehaviorEventID,BehaviorLevelID,MeetingBlockTimeID,Date,CourseSectionGroupID,SpecialsCourseSectionID',\n $filter: \"BehaviorLevelID eq 0\"\n }\n\n if ($scope.isWeeklyCount) {\n var startOfWeek = moment().startOf('week').format(\"[datetime]'YYYY-MM-DDT00:00.000'\");\n var endOfWeek = moment().endOf('week').format(\"[datetime]'YYYY-MM-DDT23:59.000'\");\n parameters.$filter += \" and Date le \" + endOfWeek + \" and Date ge \" + startOfWeek\n }\n \n behaviorBehaviorListService.getAllForStudent(parameters, null, $scope.studentInSchoolId)\n .then(function (results) {\n var count = _(results)\n .filter(function (event) {\n var hasScsId = $scope.specialsCourseSectionId && $scope.specialsCourseSectionId > 0;\n var hasCsgId = $scope.courseSectionGroupId && $scope.courseSectionGroupId > 0;\n\n if (hasScsId) {\n return event.specialsCourseSectionID === $scope.specialsCourseSectionId;\n } else if (hasCsgId) {\n return event.courseSectionGroupID === $scope.courseSectionGroupId;\n } else {\n return true;\n }\n }).size();\n\n $scope.positiveTotal = count;\n });\n }]\n }\n }]\n );\n})();","(function () {\n 'use strict';\n angular.module('nha.behavior')\n\t\t.directive('suspExpDurationParser', [function () {\n\t\t return {\n\t\t restrict: 'A',\n\t\t require: 'ngModel',\n\t\t link: function (scope, element, attr, ngModel) {\n\n\t\t ngModel.$parsers.push(parser);\n\n\t\t function parser(text) {\n\t\t //log('From suspExpDuration $parsers: old value', text);\n\t\t var parsedText = '';\n\n\t\t if (text && text[0] === '.') {\n\t\t // Handle .5 case\n\t\t parsedText = text.length === 1 ? text : \".5\";\n\t\t } else {\n // Handle everything else\n\t\t var textAsInt = parseInt(text, 10);\n\t\t parsedText = _.isNaN(textAsInt) ? '' : Math.abs(textAsInt).toString();\n\t\t }\n\n\t\t //log('From suspExpDuration $parsers: new value', parsedText);\n\n\t\t ngModel.$setViewValue(parsedText);\n\t\t ngModel.$render();\n\n\t\t return parsedText;\n\t\t }\n\t\t }\n\t\t }\n\t\t}]);\n})();","(function () {\n 'use strict';\n angular.module('nha.behavior')\n\t\t.filter('firstLastDisplayName', function () {\n\t\t return function (names, searchTerm) {\n\t\t var filtered = [];\n \n\t\t if (!searchTerm || searchTerm.length === 0) {\n\t\t return names;\n\t\t } else {\n\t\t var search = searchTerm.toLowerCase();\n\n\t\t _.forEach(names, function (name) {\n\t\t var firstName = name.firstName.toLowerCase();\n\t\t var lastName = name.lastName.toLowerCase();\n\t\t var displayName = (name.displayName || \"\").toLowerCase();\n\n\t\t var splitSearch = _.take(search.split(' '), 2);\n\t\t var searchFirstSection = splitSearch[0] || null;\n\t\t var searchSecondSection = splitSearch[1] || null;\n\t\t var hasTwoSearchSections = !!searchSecondSection;\n\n\t\t var doesMatchDisplayName = _.startsWith(displayName, searchFirstSection) || _.startsWith(displayName, searchSecondSection);\n\n\t\t var isFirstSearchTermMatch = _.startsWith(firstName, searchFirstSection) || _.startsWith(lastName, searchFirstSection);\n\t\t var isSecondSearchTermMatch = _.startsWith(firstName, searchSecondSection) || _.startsWith(lastName, searchSecondSection);\n\n\t\t if (doesMatchDisplayName) {\n\t\t filtered.push(name);\n\t\t } else if (hasTwoSearchSections && isFirstSearchTermMatch && isSecondSearchTermMatch) {\n\t\t filtered.push(name);\n\t\t } else if (isFirstSearchTermMatch) {\n\t\t filtered.push(name);\n\t\t }\n\t\t });\n\t\t }\n\n\t\t return filtered;\n\t\t }\n\t\t});\n})();","(function () {\n 'use strict';\n\n angular.module('nha.behavior').controller('MainCtrl', MainCtrl);\n MainCtrl.$inject = ['$scope', '$rootScope'];\n\n function MainCtrl($scope, $rootScope) { //$scope, userContextService, appSettings) {\n $scope.breadcrumbs = {};\n $scope.sidebarOpen = true; // This will be bound using the ps-open attribute\n $rootScope.$on('breadcrumb:update', setBreadcrumb);\n\n function setBreadcrumb(event, data) {\n $scope.breadcrumbs[data.key] = data.value;\n }\n\n function init() {\n // Static breadcrumbs\n $scope.breadcrumbs.courselist = 'Courses';\n $scope.breadcrumbs.studentlist = 'Loading...';\n }\n\n $scope.toggleSidebarState = function() {\n $scope.sidebarOpen = !$scope.sidebarOpen;\n };\n\n init();\n }\n})();","(function () {\n\t'use strict';\n\n\tangular.module('nha.behavior').config(config);\n\n\tconfig.$inject = ['$stateProvider'];\n\n\tfunction config($stateProvider) {\n\t\t$stateProvider\n .state('main', {\n \turl: '/',\n \ttemplateUrl: 'app/main/main.html',\n \tcontroller: 'MainCtrl',\n controllerAs: 'MainVM',\n \tncyBreadcrumb: {\n \t\tskip: true\n \t} \n });\n\t}\n\n})();","/**\n * behavior-action.repository\n * @namespace behavior \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('actionRepository', actionRepository);\n\n // protect against minification\n /* @ngInject */\n actionRepository.$inject = ['baseService', 'BehaviorRestangular'];\n\n /**\n * @name assignmentTypeSummaryRepository\n * @description Constructor for action.repository\n * @memberOf behavior\n */\n function actionRepository(baseService, BehaviorRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getAll = getAll;\n\n return service;\n\n /**\n * @name getAll\n * @description retrieves all behavior actions\n * @returns List List of objects containing actionTypeSummary properties\n * @memberOf action.repository\n */\n function getAll(params) {\n var oDataParameters = params ? _utils.getODataRequest({\n filter: {\n BehaviorLevelID: String(params.behaviorLevelID),\n AcademicYearID: params.academicYearID,\n SchoolID: params.schoolID\n }\n }) : null;\n\n return baseService.getList('behaviorAction', oDataParameters, true, true, BehaviorRestangular);\n }\n }\n})();","/**\n * behavior-alert.service\n * @namespace behavior \n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('behaviorAlertService', behaviorAlertService);\n\n // protect against minification\n /* @ngInject */\n behaviorAlertService.$inject = ['$state'];\n\n /**\n * @name behaviorAlertService\n * @description Constructor for behavior-alert.service\n * @memberOf behavior\n */\n function behaviorAlertService($state) {\n\n var service = this;\n\n service.goSwal = goSwal;\n\n return service;\n\n function goSwal(type, callback, msg) {\n\n switch (type) {\n case \"saveSuccess\":\n saveSuccess(callback);\n break;\n case \"saveSuccessWithMsg\":\n saveSuccessWithMsg(callback, msg);\n break;\n case \"updateSuccess\":\n updateSuccess(callback);\n break;\n case \"saveFailure\":\n saveFailure(callback);\n break;\n case \"updateFailure\":\n updateFailure(callback);\n break;\n case \"saveFailureWithMsg\":\n saveFailureWithMsg(callback, msg);\n break;\n case \"loadFailure\":\n loadFailure(callback);\n break;\n case \"retrievalFailure\":\n retrievalFailure(callback);\n break;\n case \"permissionsFailure\":\n permissionsFailure();\n break;\n case \"dirtyForm\":\n dirtyForm(callback);\n break;\n case \"warningWithMsg\":\n warningWithMsg(callback, msg);\n break;\n case \"validationFailure\":\n validationFailure(msg);\n break;\n default:\n break;\n }\n }\n\n function saveSuccess(callback) {\n swal({\n title: \"Success!\",\n text: \"Save was successful.\",\n type: 'success',\n showCancelButton: false,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'Done',\n closeOnConfirm: true\n }, function (isConfirmed) {\n if (isConfirmed === true) {\n if (callback) { callback(); }\n }\n });\n }\n\n function saveSuccessWithMsg(callback, msg) {\n swal({\n title: \"Success!\",\n text: msg,\n type: 'success',\n showCancelButton: false,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'Done',\n closeOnConfirm: true\n }, function (isConfirmed) {\n if (isConfirmed === true) {\n if (callback) { callback(); }\n }\n });\n }\n\n function updateSuccess(callback) {\n swal({\n title: \"Success!\",\n text: \"Update was successful.\",\n type: 'success',\n showCancelButton: false,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'Done',\n closeOnConfirm: true\n }, function (isConfirmed) {\n if (isConfirmed === true) {\n if (callback) { callback(); }\n }\n });\n }\n\n function saveFailure(callback) {\n swal({\n title: \"Error!\",\n text: \"Save was not successful. Please try again.\",\n type: 'warning',\n showCancelButton: false,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'Done',\n closeOnConfirm: true\n }, function (isConfirmed) {\n if (isConfirmed === true) {\n if (callback) { callback(); }\n }\n });\n }\n\n function updateFailure(callback) {\n swal({\n title: \"Error!\",\n text: \"Update was not successful. Please try again.\",\n type: 'warning',\n showCancelButton: false,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'Done',\n closeOnConfirm: true\n }, function (isConfirmed) {\n if (isConfirmed === true) {\n if (callback) { callback(); }\n }\n });\n }\n\n function saveFailureWithMsg(callback, msg) {\n swal({\n title: \"Error!\",\n text: msg,\n type: 'warning',\n showCancelButton: false,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'Done',\n closeOnConfirm: true\n }, function (isConfirmed) {\n if (isConfirmed === true) {\n if (callback) { callback(); }\n }\n });\n }\n\n function loadFailure(callback) {\n swal({\n title: \"Error!\",\n text: \"We encountered an error loading the content for this page. Please try again.\",\n type: 'warning',\n showCancelButton: false,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'Done',\n closeOnConfirm: true\n }, function (isConfirmed) {\n if (isConfirmed === true) {\n if (callback) { callback(); }\n }\n });\n }\n\n function permissionsFailure() {\n swal({\n title: \"Not Authorized!\",\n text: \"We're sorry, but you are not authorized to access this page. Please contact your administrator if you believe you are incorrectly receiving this message.\",\n type: 'info',\n showCancelButton: false,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'Done',\n closeOnConfirm: true\n }, function (isConfirmed) {\n if (isConfirmed === true) {\n $state.go('403');\n }\n });\n }\n\n function dirtyForm(callback) {\n swal({\n title: \"Are you sure?\",\n text: \"Any data you have entered will be lost.\",\n type: 'warning',\n showCancelButton: true,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'Yes',\n closeOnConfirm: true\n }, function (isConfirmed) {\n if (isConfirmed === true) {\n if (callback) { callback(); }\n }\n });\n }\n\n function retrievalFailure(callback) {\n swal({\n title: \"Error Retrieving Incident\",\n text: \"Sorry, we couldn't retrieve this incident. Please try again.\",\n type: 'error',\n showCancelButton: false,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'Done',\n closeOnConfirm: true\n }, function (isConfirmed) {\n if (isConfirmed === true) {\n if (callback) { callback(); }\n }\n });\n }\n\n function warningWithMsg(callback, msg) {\n swal({\n title: \"Warning!\",\n text: msg,\n type: 'warning',\n showCancelButton: false,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'Done',\n closeOnConfirm: true\n }, function (isConfirmed) {\n if (isConfirmed === true) {\n if (callback) { callback(); }\n }\n });\n }\n\n function validationFailure(msg) {\n swal(\"Required fields not completed\", msg);\n }\n }\n})();","/**\n * behavior-attendance.repository\n * @namespace behavior \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('behaviorAttendanceRepository', behaviorAttendanceRepository);\n\n // protect against minification\n /* @ngInject */\n behaviorAttendanceRepository.$inject = ['baseService', 'BehaviorRestangular'];\n\n /**\n * @name behaviorAttendanceRepository\n * @description Constructor for behavior-attendance.repository\n * @memberOf behavior\n */\n function behaviorAttendanceRepository(baseService, BehaviorRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.checkIfStudentWasPresentForClass = checkIfStudentWasPresentForClass;\n service.checkIfStudentWasPresentForClassWithoutCourseInfo = checkIfStudentWasPresentForClassWithoutCourseInfo;\n\n return service;\n\n function checkIfStudentWasPresentForClass(studentInSchoolID, schoolID, date, time, courseSectionGroupID, meetingBlockTimeID, specialsCourseSectionID) {\n var parameters = {\n studentInSchoolID: studentInSchoolID,\n schoolID: schoolID,\n date: date,\n time: time,\n courseSectionGroupID: courseSectionGroupID ? courseSectionGroupID : null,\n meetingBlockTimeID: meetingBlockTimeID ? meetingBlockTimeID : null,\n specialsCourseSectionID: specialsCourseSectionID ? specialsCourseSectionID : null\n };\n return baseService.getList('behaviorAttendance/checkIfStudentWasPresentForClass/', parameters, false, true, BehaviorRestangular);\n }\n\n function checkIfStudentWasPresentForClassWithoutCourseInfo(studentInSchoolID, date) {\n var parameters = {\n studentInSchoolID: studentInSchoolID,\n date: date\n };\n return baseService.getList('behaviorAttendance/checkIfStudentWasPresentForClassWithoutCourseInfo/', parameters, false, true, BehaviorRestangular);\n }\n }\n})();","/**\n * behavior-attribute.repository\n * @namespace behavior \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n angular\n .module('nha.behavior')\n .service('behaviorAttributeRepository', behaviorAttributeRepository);\n\n behaviorAttributeRepository.$inject = ['baseService', 'BehaviorRestangular'];\n\n\n function behaviorAttributeRepository(baseService, BehaviorRestangular) {\n\n var service = this;\n service.getForStudentInSchool = getForStudentInSchool;\n service.setForStudentInSchool = setForStudentInSchool;\n\n return service;\n\n function getForStudentInSchool(studentInSchoolId) {\n //var oDataParameters = _utils.getODataRequest({ filter: { StudentInSchoolID: studentInSchoolId } });\n return BehaviorRestangular.all('studentBehaviorAttribute/getforstudentinschool').get(studentInSchoolId);\n }\n\n function setForStudentInSchool(studentInSchoolId, isRequired) {\n var entity = {\n StudentBehaviorAttributeID: 0,\n StudentInSchoolID: studentInSchoolId,\n IsAdvancedBehaviorEntryRequired: isRequired\n };\n return BehaviorRestangular.all('studentBehaviorAttribute/setforstudentinschool').post(entity);\n }\n }\n})();","(function () {\n 'use strict';\n\n angular.module('nha.behavior').service('behaviorBehaviorListService', behaviorBehaviorListService);\n\n behaviorBehaviorListService.$inject = ['baseService', 'BehaviorRestangular', 'CoreRestangular'];\n\n function behaviorBehaviorListService(baseService, behaviorRestangular, coreRestangular) {\n var parameters = {};\n var service = {\n getAllForStudent: getAllForStudent,\n getLookupForBehaviorList: getLookupForBehaviorList,\n deleteBehaviorParticipantEvent: deleteBehaviorParticipantEvent,\n getCurrentAnnualTotal: getCurrentAnnualTotal\n };\n\n service.defaultSortOrder = [{ criteria: 'Date', descending: true }];\n\n return service;\n\n // methods\n\n function getLookupForBehaviorList(studentInSchoolID) {\n var parameters = {\n studentInSchoolID: studentInSchoolID\n };\n return baseService.getList('/behaviorevent/getLookupForBehaviorList', parameters, false, true, behaviorRestangular);\n }\n\n function getAllForStudent(parameters, filters, studentInSchoolId) {\n if (parameters !== null) {\n parameters.studentInSchoolID = studentInSchoolId;\n } else {\n parameters = {\n studentInSchoolID: studentInSchoolId\n };\n }\n\n setFilters(parameters, filters, null);\n\n parameters = setSortOrder(parameters, parameters.sortOrder, service.defaultSortOrder);\n\n delete parameters.sortOrder;\n\n return baseService.getList('/behaviorevent/getAllEventsForStudent', parameters, false, true, behaviorRestangular);\n }\n\n function setFilters(parameters, filters, searchText) {\n log(filters);\n\n if (filters) {\n var oDataFilter = {};\n\n // custom filters\n if (filters.BehaviorLevels) {\n var columns = _.map(filters.BehaviorLevels.items, 'columnName');\n _.forEach(columns, function (column) {\n oDataFilter[column] = new _utils.FilterOption();\n oDataFilter[column].booleanOperator = 'or';\n oDataFilter[column].comparer = \"gt\";\n oDataFilter[column].key = column;\n oDataFilter[column].value = 0;\n });\n }\n\n if (!_.isEmpty(oDataFilter)) {\n angular.extend(parameters, _utils.getODataRequest({ filter: oDataFilter }));\n }\n\n if (searchText) {\n var searchParameter = '(';\n _.forEach(service.textSearchFields, function (searchField) {\n searchParameter += 'substringof(\\'' + searchText + '\\', ' + searchField + ') or ';\n });\n searchParameter = searchParameter.slice(0, searchParameter.length - 4);\n searchParameter += ')';\n parameters.$filter += ' and ' + searchParameter;\n }\n\n }\n }\n\n function setSortOrder(parameters, sortSetting, sortDefault) {\n var sort = sortSetting === null ? sortDefault : sortSetting;\n var sortString = '';\n\n if (sort) {\n for (var i = 0; i < sort.length; i++) {\n sortString += sort[i].criteria + (sort[i].descending ? ' desc' : '');\n if (i + 1 < sort.length) {\n sortString += ', ';\n }\n }\n\n parameters.$orderby = sortString;\n }\n\n return parameters;\n }\n\n function deleteBehaviorParticipantEvent(itemToDelete) {\n var behaviorEventParticipantId;\n\n if (typeof (itemToDelete) === 'object' && itemToDelete.hasOwnProperty('behaviorEventId')) {\n behaviorEventParticipantId = itemToDelete.behaviorEventParticipantId;\n } else if (typeof (itemToDelete) === 'number' || typeof (itemToDelete) === 'string') {\n behaviorEventParticipantId = itemToDelete;\n }\n\n return behaviorRestangular.one('behaviorEventParticipant/' + behaviorEventParticipantId).remove();\n }\n\n function getCurrentAnnualTotal(studentInSchoolId, isPositive) {\n var parameters = {\n studentInSchoolID: studentInSchoolId,\n isPositive: isPositive\n };\n return baseService.getList('/behaviorevent/getCurrentAnnualTotal', parameters, false, true, behaviorRestangular);\n }\n };\n})();","/**\n * behavior-blue-red-incident-common.service\n * @namespace behavior \n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('behaviorBlueRedIncidentCommon', behaviorBlueRedIncidentCommon);\n\n // protect against minification\n /* @ngInject */\n behaviorBlueRedIncidentCommon.$inject = ['behaviorBehaviorListService'];\n\n /**\n * @name behaviorBlueRedIncidentCommon\n * @description Common code for level 2/3 incidents shared between mobile and desktop\n * @memberOf behavior\n */\n function behaviorBlueRedIncidentCommon(behaviorBehaviorListService) {\n\n var service = this;\n\n service.loadBehaviorEventsForStudent = loadBehaviorEventsForStudent;\n service.anyIncompleteEvents = anyIncompleteEvents;\n service.getHighestLevelEventForDate = getHighestLevelEventForDate;\n\n return service;\n\n function loadBehaviorEventsForStudent(studentInSchoolId) {\n var params = {\n $select: 'BehaviorEventID,MeetingBlockTimeID,Date,Time,BehaviorLevelID,CourseSectionGroupID,SpecialsCourseSectionID,IsIncomplete',\n $filter: \"BehaviorLevelID gt 0\"\n };\n \n return behaviorBehaviorListService.getAllForStudent(params, null, studentInSchoolId);\n }\n\n function anyIncompleteEvents(studentsEvents, meetingBlockTimeId, specialsCourseSectionId, incidentDate, isSpecial) {\n var momentIncidentDate = moment.isMoment(incidentDate) ? incidentDate : moment(incidentDate, 'L');\n\n var anyIncomplete = _(studentsEvents)\n .some(function (event) {\n return event.isIncomplete &&\n // Checks MeetingBlockTimeID or SpecialsCourseSectionID because Core classes are saved with mbtID and Specials are saved with csID\n (event.meetingBlockTimeID === meetingBlockTimeId || event.specialsCourseSectionID > 0) &&\n moment(event.date).diff(moment(incidentDate), 'day') === 0 &&\n (event.behaviorLevelID === 2 || event.behaviorLevelID === 3)\n });\n\n return anyIncomplete;\n }\n\n function getHighestLevelEventForDate(studentsEvents, meetingBlockTimeId, specialsCourseSectionId, incidentDate, isSpecial) {\n var momentIncidentDate = moment.isMoment(incidentDate) ? incidentDate : moment(incidentDate, 'L');\n\n var todaysEvents = _.filter(studentsEvents, function (event) {\n // Checks MeetingBlockTimeID or SpecialsCourseSectionID because Core classes are saved with mbtID and Specials are saved with csID\n return (event.meetingBlockTimeID === meetingBlockTimeId || event.specialsCourseSectionID > 0) &&\n isValidCourseSectionOrCourseSectionGroup(event, specialsCourseSectionId, isSpecial) &&\n moment(event.date).diff(moment(incidentDate), 'day') === 0 &&\n (event.behaviorLevelID === 2 || event.behaviorLevelID === 3);\n });\n\n //log(todaysEvents);\n if (todaysEvents.length > 0) {\n //var highestLevel = Math.max.apply(Math, todaysEvents.map(function (e) { return e.behaviorLevelID; }));\n return _(todaysEvents).orderBy('behaviorLevelID', 'desc').first();\n }\n }\n\n function isValidCourseSectionOrCourseSectionGroup(event, specialsCourseSectionId, isSpecial) {\n // Checks an events specialsCourseSectionID based whether it's a special or not\n if (isSpecial) {\n return event.specialsCourseSectionID === specialsCourseSectionId;\n } else {\n return event.specialsCourseSectionID === null;\n }\n }\n }\n})();","(function () {\n 'use strict';\n\n angular.module('nha.behavior').service('behaviorDirtyCheckService', behaviorDirtyCheckService);\n\n behaviorDirtyCheckService.$inject = [];\n\n function behaviorDirtyCheckService() {\n var ctor = {};\n\n ctor.isFormDirty = function(form) {\n \n if (!form.$dirty) { return false; }\n\n var array = [];\n\n for (var prop in form) {\n if (_.startsWith(prop, '$') || _.startsWith(prop, 'modified') || _.startsWith(prop, 'reset')) {\n array.push(prop);\n }\n }\n\n var filteredForm = _.omit(form, array);\n\n return _.some(filteredForm, { '$dirty': true });\n };\n\n return ctor;\n }\n})();","/**\n * behavior-document.repository\n * @namespace behavior \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('behaviorDocumentRepository', behaviorDocumentRepository);\n\n // protect against minification\n /* @ngInject */\n behaviorDocumentRepository.$inject = ['baseService', 'BehaviorRestangular', '$http', 'appSettings'];\n\n /**\n * @name behaviorDocumentRepository\n * @description Constructor for behavior-document.repository\n * @memberOf behavior\n */\n function behaviorDocumentRepository(baseService, BehaviorRestangular, $http, appSettings) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.addBehaviorDocument = addBehaviorDocument;\n service.addBehaviorDocuments = addBehaviorDocuments;\n service.deleteBehaviorDocuments = deleteBehaviorDocuments;\n service.deleteBehaviorDocumentById = deleteBehaviorDocumentById;\n service.getAllDocDetails = getAllDocDetails;\n service.getDocumentById = getDocumentById;\n\n return service;\n\n /**\n * @name addBehaviorDocument\n */\n function addBehaviorDocument(document) {\n return BehaviorRestangular.all('behaviorDocument').customPOST(document);\n }\n\n /**\n * @name addBehaviorDocuments\n */\n function addBehaviorDocuments(documents) {\n return BehaviorRestangular.all('behaviorDocument/postAll').post(documents);\n }\n\n /**\n * @name deleteBehaviorDocuments\n * @info This will delete info from all 3 document tables\n */\n function deleteBehaviorDocuments(documents) {\n return BehaviorRestangular.all('behaviorDocument/deleteMultiple').get(documents);\n }\n\n /**\n * @name deleteBehaviorDocumentById\n * @info This will delete info from all 3 document tables, but it will also delete \n * the related entry in the BehaviorEventParticipantDocuments table (from Phoenix DB)\n */\n function deleteBehaviorDocumentById(id) {\n return BehaviorRestangular.all('behaviorDocument/deleteById').get(id);\n }\n\n /**\n * @name getAllDocDetailsByID \n * @info This will get all the information for a given document from tables:\n * BehaviorDocument, BehaviorDocumentMeta, and BehaviorDocumentVersion\n */\n function getAllDocDetails(docs) {\n return BehaviorRestangular.all('behaviorDocument/getAllDocDetails').get(docs);\n }\n\n /**\n * @name getDocumentById\n */\n function getDocumentById(id) {\n \n return $http.get(appSettings.behaviorServicesRootUrl + \"behaviorDocument/view/\" + id, { responseType: \"arraybuffer\" });\n }\n }\n})();","(function () {\n 'use strict';\n\n angular.module('nha.behavior')\n .service('behaviorEventIncidentRepository', ['repositoryFactory', 'BehaviorRestangular', 'baseService',\n function (repositoryFactory, BehaviorRestangular, baseService) {\n\n var repo = new repositoryFactory('behaviorEventIncident', BehaviorRestangular);\n\n repo.deleteBehaviorParticipantEvent = deleteBehaviorParticipantEvent;\n repo.endLevelFourIncident = endLevelFourIncident;\n repo.getMostRecentLevelFourIncidentWithStudentInSchoolID = getMostRecentLevelFourIncidentWithStudentInSchoolID;\n repo.getSingleParticipantEventIncident = getSingleParticipantEventIncident;\n repo.isWithinAcademicSchoolYear = isWithinAcademicSchoolYear;\n repo.GetSchoolStartEndTime = GetSchoolStartEndTime;\n repo.put = put;\n repo.set = set;\n repo.verifyCourseInSession = verifyCourseInSession;\n repo.getProjectedReturnDate = getProjectedReturnDate;\n\t\t\t repo.saveDocumentParticipants = saveDocumentParticipants;\n\n\t\t\t\tfunction saveDocumentParticipants(documentParticipants) {\n\t\t\t\t\treturn BehaviorRestangular.all('behaviorEventIncident/document-participants').post(documentParticipants);\r\n\t\t\t\t}\n\n function endLevelFourIncident(incidentDetails) {\n return BehaviorRestangular.all('behaviorEventIncident/endLevelFourIncident').post(incidentDetails);\n }\n\n function getMostRecentLevelFourIncidentWithStudentInSchoolID(studentInSchoolID) {\n return BehaviorRestangular.all('behaviorEventIncident/getMostRecentLevelFourIncidentWithStudentInSchoolID').get(studentInSchoolID);\n }\n\n function getSingleParticipantEventIncident(behaviorEventID) {\n return BehaviorRestangular.all('behaviorEventIncident/getSingleParticipantEventIncident').get(behaviorEventID);\n }\n\n function isWithinAcademicSchoolYear(validationParams) {\n return BehaviorRestangular.all('behaviorEventIncident/isWithinAcademicSchoolYear/')\n .all(validationParams.SchoolID)\n .all(validationParams.AcademicYearID)\n .all(validationParams.Date)\n .getList();\n }\n\n function GetSchoolStartEndTime(schoolID, academicYearID) {\n return BehaviorRestangular\n .one('behaviorEventIncident/getSchoolStartEndTime')\n .one('schoolId', schoolID)\n .one('academicYearId', academicYearID)\n .get();\n }\n\n function put(updatedIncident) {\n return BehaviorRestangular.all(this.endpoint).customPUT(updatedIncident);\n }\n\n function set(behaviorEventIncident) {\n return BehaviorRestangular.all(this.endpoint).customPOST(behaviorEventIncident);\n }\n\n function deleteBehaviorParticipantEvent(behaviorEventParticipantId) {\n return BehaviorRestangular.one('behaviorEventIncident/' + behaviorEventParticipantId).remove();\n }\n\n function verifyCourseInSession(isSpecial, date, time, courseSectionGroupId, meetingBlockTimeId, courseSectionId) {\n var parameters = {\n isSpecial: isSpecial,\n date: date,\n time: time,\n courseSectionGroupId: courseSectionGroupId,\n meetingBlockTimeId: meetingBlockTimeId,\n courseSectionId: courseSectionId\n };\n return baseService.getList('/behaviorEventIncident/verifyCourseInSession', parameters, false, true, BehaviorRestangular);\n }\n\n function getProjectedReturnDate(academicYearID, schoolID, eventDate, startDate, startTime, duration) {\n var parameters = {\n academicYearID: academicYearID,\n schoolID: schoolID,\n eventDate: eventDate, \n startDate: startDate,\n startTime: startTime,\n duration: duration\n };\n return baseService.getSingle('behaviorEventIncident/getProjectedReturnDate', parameters, false, true, BehaviorRestangular);\n }\n\n return repo;\n }\n ]);\n})();","(function () {\n 'use strict';\n\n angular.module('nha.behavior')\n .service('behaviorEventMultipleParticipantIncidentRepository', ['repositoryFactory', 'BehaviorRestangular', 'baseService',\n function (repositoryFactory, BehaviorRestangular, baseService) {\n\n var repo = new repositoryFactory('behaviorEventMultipleParticipantIncident', BehaviorRestangular);\n\n repo.get = get;\n repo.put = put;\n repo.set = set;\n\n function get(behaviorEventID) {\n return BehaviorRestangular.all(this.endpoint).customGET(behaviorEventID);\n }\n\n function put(updatedIncident) {\n return BehaviorRestangular.all(this.endpoint).customPUT(updatedIncident);\n }\n\n function set(behaviorEventIncident) {\n return BehaviorRestangular.all(this.endpoint).customPOST(behaviorEventIncident);\n }\n\n return repo;\n }\n ]);\n})();","(function () {\n 'use strict';\n\n angular.module('nha.behavior')\n .service('behaviorEventRepository', ['repositoryFactory', 'BehaviorRestangular', 'baseService',\n function (repositoryFactory, BehaviorRestangular, baseService) {\n var repo = new repositoryFactory('BehaviorEvent', BehaviorRestangular);\n\n repo.set = set;\n\n function set(behaviorEvent) {\n return BehaviorRestangular.all(this.endpoint).customPOST(behaviorEvent);\n }\n\n return repo;\n }\n ]);\n})();","/**\n * behavior-intervention.repository\n * @namespace behavior \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('interventionRepository', interventionRepository);\n\n // protect against minification\n /* @ngInject */\n interventionRepository.$inject = ['baseService', 'BehaviorRestangular'];\n\n /**\n * @name assignmentTypeSummaryRepository\n * @description Constructor for intervention.repository\n * @memberOf behavior\n */\n function interventionRepository(baseService, BehaviorRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getAll = getAll;\n service.getByLevel = getByLevel;\n return service;\n\n /**\n * @name getAll\n * @description retrieves all behavior interventions\n * @returns List List of objects containing interventionTypeSummary properties\n * @memberOf intervention.repository\n */\n function getAll() {\n return baseService.getList('behaviorIntervention', null, true, true, BehaviorRestangular);\n }\n\n function getByLevel(level) {\n var oDataParameters = _utils.getODataRequest({ filter: { BehaviorLevelID: String(level) } });\n return baseService.getList('behaviorIntervention', oDataParameters, true, true, BehaviorRestangular);\n }\n }\n})();","/**\n * behavior-level.repository\n * @namespace behavior \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('levelRepository', levelRepository);\n\n // protect against minification\n /* @ngInject */\n levelRepository.$inject = ['baseService', 'BehaviorRestangular'];\n\n /**\n * @name assignmentTypeSummaryRepository\n * @description Constructor for level.repository\n * @memberOf behavior\n */\n function levelRepository(baseService, BehaviorRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getAll = getAll;\n service.getByLevel = getByLevel;\n\n return service;\n\n /**\n * @name getAll\n * @description retrieves all behavior levels\n * @returns List List of objects containing levelTypeSummary properties\n * @memberOf level.repository\n */\n function getAll() {\n return baseService.getList('behaviorLevel', null, true, true, BehaviorRestangular);\n }\n\n function getByLevel(level) {\n var oDataParameters = _utils.getODataRequest({ filter: { BehaviorLevelID: String(level) } });\n return baseService.getList('behaviorLevel', oDataParameters, true, true, BehaviorRestangular);\n }\n }\n})();","/**\n * behavior-location.repository\n * @namespace behavior \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('locationRepository', locationRepository);\n\n // protect against minification\n /* @ngInject */\n locationRepository.$inject = ['baseService', 'BehaviorRestangular'];\n\n /**\n * @name assignmentTypeSummaryRepository\n * @description Constructor for location.repository\n * @memberOf behavior\n */\n function locationRepository(baseService, BehaviorRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getAll = getAll;\n\n return service;\n\n /**\n * @name getAll\n * @description retrieves all behavior locations\n * @returns List List of objects containing locationTypeSummary properties\n * @memberOf location.repository\n */\n function getAll() {\n return baseService.getList('behaviorlocation', null, true, true, BehaviorRestangular);\n }\n }\n})();","/**\n * behavior-motivation.repository\n * @namespace behavior \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('motivationRepository', motivationRepository);\n\n // protect against minification\n /* @ngInject */\n motivationRepository.$inject = ['baseService', 'BehaviorRestangular'];\n\n /**\n * @name assignmentTypeSummaryRepository\n * @description Constructor for motivation.repository\n * @memberOf behavior\n */\n function motivationRepository(baseService, BehaviorRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getAll = getAll;\n service.getByLevel = getByLevel;\n\n return service;\n\n /**\n * @name getAll\n * @description retrieves all behavior motivations\n * @returns List List of objects containing motivationTypeSummary properties\n * @memberOf motivation.repository\n */\n function getAll() {\n return baseService.getList('behaviorMotivation', null, true, true, BehaviorRestangular);\n }\n\n function getByLevel(level) {\n var oDataParameters = _utils.getODataRequest({ filter: { BehaviorLevelID: String(level) } });\n return baseService.getList('behaviorMotivation', oDataParameters, true, true, BehaviorRestangular);\n }\n }\n})();","/**\n * behavior-observation.repository\n * @namespace behavior \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('observationRepository', observationRepository);\n\n // protect against minification\n /* @ngInject */\n observationRepository.$inject = ['baseService', 'BehaviorRestangular'];\n\n /**\n * @name assignmentTypeSummaryRepository\n * @description Constructor for observation.repository\n * @memberOf behavior\n */\n function observationRepository(baseService, BehaviorRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getAll = getAll;\n service.getFrequentlySelected = getFrequentlySelected;\n\n return service;\n\n /**\n * @name getAll\n * @description retrieves all behavior observations\n * @returns List List of objects containing observationTypeSummary properties\n * @memberOf observation.repository\n */\n function getAll(params) {\n var oDataParameters = params ? _utils.getODataRequest({\n filter: {\n BehaviorLevelID: String(params.behaviorLevelID),\n AcademicYearID: params.academicYearID,\n SchoolID: params.schoolID\n }\n }) : null;\n\n return baseService.getList('behaviorObservation', oDataParameters, true, true, BehaviorRestangular);\n }\n\n function getFrequentlySelected(studentInSchoolID) {\n return BehaviorRestangular.all('behaviorObservation/getFrequentlySelected').get(studentInSchoolID);\n }\n }\n})();","(function () {\n 'use strict';\n\n angular.module('nha.behavior').service('behaviorOverviewService', behaviorOverviewService);\n\n behaviorOverviewService.$inject = ['baseService', 'BehaviorRestangular', 'CoreRestangular'];\n\n function behaviorOverviewService(baseService, behaviorRestangular, coreRestangular) {\n\n var service = {\n getDataForNegativeBehaviorChart: getDataForNegativeBehaviorChart,\n getDataForPositiveBehaviorChart: getDataForPositiveBehaviorChart,\n getBSPProgressCount: getBSPProgressCount,\n getCourseSections: getCourseSections,\n getHistoryTimelineData: getHistoryTimelineData,\n getDataForTimelineBehaviorChart: getDataForTimelineBehaviorChart,\n getSchoolAcademicDates: getSchoolAcademicDates,\n getBehaviorRemovals: getBehaviorRemovals\n };\n\n return service;\n\n // methods\n function getHistoryTimelineData (studentInSchoolId, academicYear){\n var parameters = {\n studentInSchoolId: studentInSchoolId,\n academicYear: academicYear\n };\n return baseService.getList('/behaviorevent/getAllEventsForStudentByYear', parameters, false, true, behaviorRestangular);\n }\n\n function getDataForNegativeBehaviorChart(studentInSchoolId, startDate, endDate) {\n var parameters = {\n studentInSchoolId: studentInSchoolId,\n startDate: moment(startDate).format('YYYY-MM-DD'),\n endDate: moment(endDate).format('YYYY-MM-DD')\n };\n return baseService.getList('/behaviorevent/getDataForNegativeBehaviorChart', parameters, false, true, behaviorRestangular);\n }\n\n function getDataForTimelineBehaviorChart(studentInSchoolId, startDate, endDate) {\n var parameters = {\n studentInSchoolId: studentInSchoolId,\n startDate: moment(startDate).format('YYYY-MM-DD'),\n endDate: moment(endDate).format('YYYY-MM-DD')\n };\n return baseService.getList('/behaviorevent/getDataForTimelineBehaviorChart', parameters, false, true, behaviorRestangular);\n }\n\n function getDataForPositiveBehaviorChart(studentInSchoolId, startDate, endDate, courseSectionGroupId, courseSectionId, meetingBlockTimeId) {\n var parameters = {\n studentInSchoolId: studentInSchoolId,\n startDate: moment(startDate).format('YYYY-MM-DD'),\n endDate: moment(endDate).format('YYYY-MM-DD'),\n courseSectionGroupID: courseSectionGroupId,\n courseSectionID: courseSectionId,\n meetingBlockTimeID: meetingBlockTimeId\n };\n return baseService.getList('/behaviorevent/getDataForPositiveBehaviorChart', parameters, false, true, behaviorRestangular);\n }\n\n function getBSPProgressCount(studentInSchoolId) {\n var parameters = {\n studentInSchoolId: studentInSchoolId\n };\n return baseService.getList('/student/getBSPProgressCount', parameters, false, true, behaviorRestangular);\n }\n\n function getCourseSections(studnetInSchoolId) {\n return baseService.getList('/coursesection/GetByStudentInSchool/' + studnetInSchoolId, {}, false, true, coreRestangular);\n }\n\n function getSchoolAcademicDates(studentInSchoolId) {\n var parameters = {\n studentInSchoolID: studentInSchoolId\n };\n return baseService.getList('/behaviorOverview/getSchoolAcademicDates', parameters, false, true, behaviorRestangular);\n }\n\n function getBehaviorRemovals(studentInSchoolId) {\n var parameters = {\n studentInSchoolID: studentInSchoolId\n };\n return baseService.getList('/behaviorOverview/getBehaviorRemovals', parameters, false, true, behaviorRestangular);\n }\n };\n})();","/**\n * behavior-participant-type.repository\n * @namespace behavior \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('participantTypeRepository', participantTypeRepository);\n\n // protect against minification\n /* @ngInject */\n participantTypeRepository.$inject = ['baseService', 'BehaviorRestangular'];\n\n /**\n * @name assignmentTypeSummaryRepository\n * @description Constructor for participantType.repository\n * @memberOf behavior\n */\n function participantTypeRepository(baseService, BehaviorRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getAll = getAll;\n\n return service;\n\n /**\n * @name getAll\n * @description retrieves all behavior participantTypes\n * @returns List List of objects containing participantTypeTypeSummary properties\n * @memberOf participantType.repository\n */\n function getAll() {\n return baseService.getList('behaviorParticipantType', null, true, true, BehaviorRestangular);\n }\n }\n})();","/**\n * behavior-role.repository\n * @namespace behavior \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('roleRepository', roleRepository);\n\n // protect against minification\n /* @ngInject */\n roleRepository.$inject = ['baseService', 'BehaviorRestangular'];\n\n /**\n * @name assignmentTypeSummaryRepository\n * @description Constructor for role.repository\n * @memberOf behavior\n */\n function roleRepository(baseService, BehaviorRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getAll = getAll;\n service.getByBehaviorLevel = getByBehaviorLevel;\n\n return service;\n\n /**\n * @name getAll\n * @description retrieves all behavior roles\n * @returns List List of objects containing roleTypeSummary properties\n * @memberOf role.repository\n */\n function getAll() {\n return baseService.getList('behaviorRole', null, true, true, BehaviorRestangular);\n }\n\n function getByBehaviorLevel(level) {\n var parameters = { behaviorLevel: level };\n return baseService.getList('getByBehaviorLevel', parameters, true, true, BehaviorRestangular);\n }\n }\n})();","/**\n * behavior-user-role.service\n * @namespace behavior \n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('behaviorUserRoleService', behaviorUserRoleService);\n\n // protect against minification\n /* @ngInject */\n behaviorUserRoleService.$inject = ['userContextService', 'baseService', '$q', 'schoolService', '$window', 'personSearchService',\n 'behaviorCourseSummaryRepository', 'apiSecurityService', 'dataSecurityService', 'BehaviorRestangular'];\n\n /**\n * @name behaviorUserRoleService\n * @description Constructor for behavior-user-role.service\n * @memberOf behavior\n */\n function behaviorUserRoleService(userContextService, baseService, $q, schoolService, $window, personSearchService,\n behaviorCourseSummaryRepository, apiSecurityService, dataSecurityService, BehaviorRestangular) {\n\n var service = this;\n\n service.isMoreThanATeacher = isMoreThanATeacher;\n service.loadDataPermissionsForPage = loadDataPermissionsForPage;\n\n return service;\n\n /* @name : loadDataPermissionsForPage()\n * @description : verify if a user has access to view the current page's data\n * i.e. - is it their school? is it their course/students? or is it someone else's?\n * @returns : boolean - to specify if they can view the page\n */\n function loadDataPermissionsForPage(state) {\n var deferred = baseService.q.defer();\n var courseSectionGroupId = state.params.courseSectionGroupID || state.params.courseSectionGroupId || null;\n var courseSectionId = state.params.specialsCourseSectionID || state.params.specialsCourseSectionId || 0;\n var sisId = state.params.studentInSchoolId || state.params.studentId || state.params.studentInSchoolID || null;\n\n userContextService.ensureUserContext().then(function(context) {\n\n var staffId = context['http://schemas.mynha.com/SIS/Core/StaffID'];\n\n schoolService.getSchoolsForUser().then(function(usersSchools) {\n // No schools user\n if (usersSchools.length === 0 || !usersSchools) {\n deferred.resolve(false);\n return;\n }\n schoolService.getSchools().then(function(allSchools) {\n // Super user\n if (usersSchools.length === allSchools.length) {\n deferred.resolve(true);\n return;\n }\n // All other users\n if ((_.includes(state.current.name, 'behavior-students') || _.includes(state.current.name, 'incident') || _.includes(state.current.name, 'level')) && courseSectionGroupId) {\n\n getCourseDetailsForSecurity(courseSectionGroupId, courseSectionId).then(function (details) {\n\n hasSchoolMatch(usersSchools, details) ? deferred.resolve(checkIfStaffIdMatchesACourse(staffId, details)) : deferred.resolve(false);\n });\n\n } else if ((_.includes(state.current.name, 'incident') || _.includes(state.current.name, 'level') || state.params.isPositiveBehaviorAdd || _.includes(state.current.name, 'overview') || _.includes(state.current.name, 'behaviorlist')) && !courseSectionGroupId) {\n\n personSearchService.studentSearchByID(sisId).then(function(student) {\n\n var studentSchoolArray = _(student).map(function(cs) {\n return { schoolID: cs.schoolID };\n }).value();\n\n if (hasSchoolMatch(usersSchools, studentSchoolArray)) {\n\n // Any employee that has a school match with the student should be able to add a behavior event via the Student Record as of 10/22/2018\n if (state.params.isStudentRecord === true) {\n deferred.resolve(true);\n } else {\n getUserCoursesForSecurity(staffId, student[0].academicYearID, student[0].schoolID).then(function (courses) {\n\n behaviorCourseSummaryRepository.getCoursesByStudent(true, false, sisId, student[0].academicYearID, student[0].schoolID, moment().format('YYYY-MM-DD')).then(function (studentCourses) {\n\n apiSecurityService.isAccessAllowed(\"accessAllStudentsInSchool\", \"Get\", BehaviorRestangular).then(function (result) {\n\n result ? deferred.resolve(result) : deferred.resolve(checkIfStudentIsInTeachersClass(courses, studentCourses));\n });\n });\n });\n }\n } else {\n deferred.resolve(false);\n }\n });\n }\n });\n });\n });\n return deferred.promise;\n }\n\n function checkIfStaffIdMatchesACourse(staffId, details) {\n var filteredCourses = _.filter(details, { staffID: parseInt(staffId) });\n return (filteredCourses.length > 0 || isMoreThanATeacher()) ? true : false;\n }\n\n function checkIfStudentIsInTeachersClass(courses, studentCourses) {\n var matched = false;\n\n var studentsCourses = _(studentCourses).map(function(cs) {\n return {\n courseSectionGroupID: cs.courseSectionGroupID,\n courseSectionID: cs.courseSectionID\n };\n }).value();\n\n _.forEach(courses, function(q) {\n if (!matched) {\n matched = _.some(studentsCourses, { 'courseSectionGroupID': q.courseSectionGroupID, 'courseSectionID': q.courseSectionID });\n }\n });\n\n return matched;\n }\n\n function isMoreThanATeacher() {\n var deferred = baseService.q.defer();\n\n apiSecurityService.isAccessAllowed(\"accessAllStudentsInSchool\", \"Get\", BehaviorRestangular).then(function (result) {\n deferred.resolve(result);\n });\n\n return deferred.promise;\n }\n\n function hasSchoolMatch(userSchools, otherSchools) {\n var usersSchoolIDs = _.map(userSchools, 'schoolID');\n var otherSchoolsIDs = _.map(otherSchools, 'schoolID');\n var matches = _.intersection(usersSchoolIDs, otherSchoolsIDs);\n return matches.length > 0;\n }\n\n function getCourseDetailsForSecurity(courseSectionGroupId, courseSectionId) {\n return BehaviorRestangular.all('courseSummary/getCourseDetailsForSecurity')\n .all(courseSectionGroupId)\n .all(courseSectionId)\n .getList();\n }\n\n function getUserCoursesForSecurity(staffId, academicYearId, schoolId) {\n return BehaviorRestangular.all('courseSummary/getUserCoursesForSecurity')\n .all(staffId)\n .all(academicYearId)\n .all(schoolId)\n .getList();\n }\n }\n})();","(function () {\n 'use strict';\n\n angular.module('nha.behavior').service('behaviorCache', behaviorCache);\n\n behaviorCache.$inject = [];\n\n function behaviorCache() {\n var internalDictionary = {};\n var ctor = {};\n\n ctor.get = function (key) {\n return internalDictionary[key];\n };\n\n ctor.set = function (key, value) {\n internalDictionary[key] = value;\n };\n\n ctor.destroy = function (key) {\n delete internalDictionary[key];\n };\n\n ctor.exists = function (key) {\n return internalDictionary.hasOwnProperty(key);\n };\n\n ctor.clear = function () {\n internalDictionary = {};\n };\n\n ctor.debug = function () {\n log(internalDictionary);\n }\n\n return ctor;\n }\n})();","(function () {\n 'use strict';\n\n angular.module('nha.behavior').service('behaviorLocalCache', behaviorLocalCache);\n\n behaviorLocalCache.$inject = ['DSCacheFactory'];\n\n function behaviorLocalCache(DSCacheFactory) {\n\n var cacheService = !DSCacheFactory.get('behaviorLocalCache') ?\n DSCacheFactory('behaviorLocalCache', { storageMode: (window.localStorage ? 'localStorage' : 'memory') }) :\n DSCacheFactory.get('behaviorLocalCache');\n\n return cacheService;\n }\n})();","(function () {\n 'use strict';\n\n angular.module('nha.behavior').service('behaviorSessionCache', behaviorSessionCache);\n\n behaviorSessionCache.$inject = ['DSCacheFactory'];\n\n function behaviorSessionCache(DSCacheFactory) {\n\n var cacheService = !DSCacheFactory.get('behaviorSessionCache') ? \n DSCacheFactory('behaviorSessionCache', { storageMode: (window.localStorage ? 'sessionStorage' : 'memory') }) :\n DSCacheFactory.get('behaviorSessionCache');\n\n return cacheService;\n }\n})();","/**\n * courseSummary.repository\n * @namespace gradebook \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('courseSummaryFilterCountsRepository', courseSummaryFilterCountsRepository);\n\n // protect against minification\n /* @ngInject */\n courseSummaryFilterCountsRepository.$inject = ['baseService', 'BehaviorRestangular'];\n\n /**\n * @name behaviorCourseSummaryRepository\n * @description Constructor for courseSummary.repository\n * @memberOf gradebook\n */\n function courseSummaryFilterCountsRepository(baseService, gradebookRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n service.setFilters = setFilters;\n service.getCourseSummaryFilterCounts = getCourseSummaryFilterCounts;\n\n return service;\n\n function getCourseSummaryFilterCounts(pagingParameters) {\n var apiParameters = {};\n apiParameters.searchText = pagingParameters.searchText;\n\n service.setFilters(apiParameters, pagingParameters.filters, pagingParameters.searchText);\n\n return baseService.getList('courseSummaryFilterCounts', apiParameters, true, true, gradebookRestangular);\n }\n\n function setFilters(parameters, filters) {\n if (filters) {\n var oDataFilter = {};\n\n _utils.updateODataFilterWithNHAFilter(filters, 'AcademicYear', 'AcademicYearID', oDataFilter);\n _utils.updateODataFilterWithNHAFilter(filters, 'School', 'SchoolID', oDataFilter);\n _utils.updateODataFilterWithNHAFilter(filters, 'GradeLevel', 'GradeLevelID', oDataFilter);\n _utils.updateODataFilterWithNHAFilter(filters, 'MarkingPeriod', 'MarkingPeriodID', oDataFilter);\n _utils.updateODataFilterWithNHAFilter(filters, 'Wing', 'WingID', oDataFilter);\n _utils.updateODataFilterWithNHAFilter(filters, 'Staff', 'StaffID', oDataFilter);\n \n if (!_.isEmpty(oDataFilter)) {\n angular.extend(parameters, _utils.getODataRequest({ filter: oDataFilter }));\n }\n }\n }\n }\n})();","/**\n * courseSummary.repository\n * @namespace behavior \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('behaviorCourseSummaryRepository', behaviorCourseSummaryRepository);\n\n // protect against minification\n /* @ngInject */\n behaviorCourseSummaryRepository.$inject = ['baseService', 'BehaviorRestangular'];\n\n /**\n * @name behaviorCourseSummaryRepository\n * @description Constructor for courseSummary.repository\n * @memberOf gradebook\n */\n function behaviorCourseSummaryRepository(baseService, behaviorRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n service.pageSize = 20;\n service.defaultSortOrder = [{ criteria: 'GradeDisplayOrder', descending: false },\n { criteria: 'StaffNameLastFirst', descending: false },\n { criteria: 'FirstMeetingBlockOrder', descending: false },\n { criteria: 'CourseSubjectDisplayName', descending: false }\n ];\n\n service.loadedCount = 0;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getAll = getAll;\n service.getAllForMobile = getAllForMobile;\n service.getAllLite = getAllLite;\n service.getByAcademicYearAndSchool = getByAcademicYearAndSchool;\n service.getCourseTimes = getCourseTimes;\n service.getSimilar = getSimilar;\n service.setFilters = setFilters;\n service.setSortOrder = setSortOrder;\n service.toTitleCase = toTitleCase;\n service.getCourseSectionSubjects = getCourseSectionSubjects;\n service.getCourseSectionGroupCourseSections = getCourseSectionGroupCourseSections;\n service.getCoursesByStudent = getCoursesByStudent;\n service.getCourseName = getCourseName;\n service.getCourseParameters = getCourseParameters;\n service.moreExist = true;\n\n return service;\n\n /**\n * @name getByAcademicYearAndSchool\n * @description retrieves courseSummary from storage\n * @returns List List of objects containing behaviorCourseSummaryRepository properties\n * @memberOf courseSummary.repository\n */\n function getByAcademicYearAndSchool(academicYearID, schoolID, markingPeriodID) {\n var oDataParameters = _utils.getODataRequest({ filter: { MarkingPeriodID: markingPeriodID, AcademicYearID: academicYearID, SchoolID: schoolID } });\n return baseService.getList('courseSummary', oDataParameters, false, true, behaviorRestangular);\n }\n\n function toTitleCase(str) {\n return str.replace(/\\w\\S*/g, function (txt) {\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\n });\n }\n\n /**\n * @name getAll\n * @description retrieves courseSummary from storage\n * @returns List List of objects containing behaviorCourseSummaryRepository properties\n * @memberOf courseSummary.repository\n */\n function getAll(pagingParameters) {\n var apiParameters = {};\n apiParameters.append = pagingParameters.append;\n apiParameters.searchText = pagingParameters.searchText;\n\n if (!apiParameters.append) {\n service.loadedCount = 0;\n service.moreExist = true;\n }\n\n service.setFilters(apiParameters, pagingParameters.filters);\n service.setSortOrder(apiParameters, pagingParameters.sortOrder, service.defaultSortOrder);\n\n apiParameters.$top = service.pageSize;\n apiParameters.$skip = service.loadedCount;\n\n if (pagingParameters.filters.Staff) {\n return baseService.getList('courseSummary/getAllWithSelectedStaffFilter', apiParameters, true, true, behaviorRestangular).then(function (results) {\n return shapeCourseResults(results);\n });\n } else {\n return baseService.getList('courseSummary', apiParameters, true, true, behaviorRestangular).then(function (results) {\n return shapeCourseResults(results);\n });\n }\n }\n\n function getAllForMobile(pagingParameters) {\n var apiParameters = {};\n apiParameters.append = pagingParameters.append;\n apiParameters.searchText = pagingParameters.searchText;\n\n if (!pagingParameters.append) {\n service.loadedCount = 0;\n service.moreExist = true;\n }\n\n service.setFilters(apiParameters, pagingParameters.filters, null);\n service.setSortOrder(apiParameters, pagingParameters.sortOrder, service.defaultSortOrder);\n\n apiParameters.$top = service.pageSize;\n apiParameters.$skip = service.loadedCount;\n\n return baseService.getList('courseSummary/getAllForMobile', apiParameters, true, true, behaviorRestangular).then(function (results) {\n service.loadedCount += results.length;\n\n if (results.length < service.pageSize) {\n service.moreExist = false;\n }\n\n // Replace staff name with \"title case\" format\n if (results) {\n _.forEach(results, function (course) {\n course.staffName = service.toTitleCase(course.staffName);\n });\n }\n\n return results;\n });\n }\n \n function getAllLite(pagingParameters) {\n var apiParameters = {};\n apiParameters.searchText = pagingParameters.searchText;\n \n if (pagingParameters.filterAsOdataString) {\n apiParameters.$filter = pagingParameters.filterAsOdataString;\n } else {\n service.setFilters(apiParameters, pagingParameters.filters);\n }\n\n service.setSortOrder(apiParameters, pagingParameters.sortOrder, service.defaultSortOrder);\n apiParameters.$select = 'CourseSectionGroupID';\n\n service.setSortOrder(apiParameters, pagingParameters.sortOrder, service.defaultSortOrder);\n\n if (_.includes(pagingParameters.filterAsOdataString, 'StaffID')) {\n return baseService.getList('courseSummary/getAllWithSelectedStaffFilter', apiParameters, true, true, behaviorRestangular).then(function (results) {\n return results;\n });\n } else {\n return baseService.getList('courseSummary', apiParameters, true, true, behaviorRestangular).then(function (results) {\n return results;\n });\n }\n }\n\n function getSimilar(academicYearId, course) {\n var oDataParameters = _utils.getODataRequest({ filter: { AcademicYearID: academicYearId, SchoolSubjectLevel1ID: course.schoolSubjectLevel1ID, CourseSubjectDisplayName: course.courseSubjectDisplayName } });\n return baseService.getList('courseSummary', oDataParameters, false, true, behaviorRestangular);\n }\n\n function setFilters(parameters, filters) {\n if (filters) {\n var oDataFilter = {};\n\n _utils.updateODataFilterWithNHAFilter(filters, 'AcademicYear', 'AcademicYearID', oDataFilter);\n _utils.updateODataFilterWithNHAFilter(filters, 'School', 'SchoolID', oDataFilter);\n _utils.updateODataFilterWithNHAFilter(filters, 'GradeLevel', 'GradeLevelID', oDataFilter);\n _utils.updateODataFilterWithNHAFilter(filters, 'MarkingPeriod', 'MarkingPeriodID', oDataFilter);\n _utils.updateODataFilterWithNHAFilter(filters, 'Wing', 'WingID', oDataFilter);\n _utils.updateODataFilterWithNHAFilter(filters, 'Staff', 'StaffID', oDataFilter);\n \n angular.extend(parameters, _utils.getODataRequest({ filter: oDataFilter }));\n }\n\n return parameters;\n }\n\n function setSortOrder(parameters, sortSetting, sortDefault) {\n var sort = !_.isEmpty(sortSetting) ? sortSetting : sortDefault;\n\n var sortString = '';\n\n if (sort) {\n for (var i = 0; i < sort.length; i++) {\n sortString += sort[i].criteria + (sort[i].descending ? ' desc' : '');\n if (i + 1 < sort.length) {\n sortString += ', ';\n }\n }\n\n parameters.$orderby = sortString;\n }\n }\n\n function shapeCourseResults(results) {\n service.loadedCount += results.length;\n\n if (results.length < service.pageSize) {\n service.moreExist = false;\n }\n\n // Replace staff name with \"title case\" format\n if (results) {\n _.forEach(results, function (course) {\n course.staffName = service.toTitleCase(course.staffName);\n });\n }\n\n return results;\n }\n\n function getCourseSectionSubjects(courseSectionGroupId) {\n return behaviorRestangular.all('courseSummary/getCourseSectionSubjects').get(courseSectionGroupId);\n }\n\n function getCoursesByStudent(isUserRoleSvc, isForStudentRecordIncidentEntry, studentInSchoolID, academicYearID, schoolID, date, params) {\n return behaviorRestangular.all('courseSummary/getCoursesByStudent')\n .all(isUserRoleSvc)\n .all(isForStudentRecordIncidentEntry)\n .all(studentInSchoolID)\n .all(academicYearID)\n .all(schoolID)\n .all(date)\n .getList();\n }\n\n function getCourseSectionGroupCourseSections(courseSectionGroup) {\n \n return behaviorRestangular.all('courseSummary/getCourseSectionGroupCourseSections/')\n .all(courseSectionGroup.courseSectionGroupID)\n .all(courseSectionGroup.markingPeriodID)\n .all(courseSectionGroup.meetingBlockTimeID)\n .all(courseSectionGroup.staffID)\n .all(courseSectionGroup.academicYearID)\n .getList();\n }\n\n function getCourseName(courseSectionGroupID, meetingBlockTimeID, academicYearID) {\n return behaviorRestangular.all('courseSummary/getCourseName')\n .all(courseSectionGroupID)\n .all(meetingBlockTimeID)\n .all(academicYearID)\n .getList();\n }\n\n function getCourseParameters(courseSectionGroupID, startDate) {\n return behaviorRestangular.all('courseSummary/getCourseParameters')\n .all(courseSectionGroupID)\n .all(startDate)\n .getList();\n }\n\n function getCourseTimes(courseSectionGroupID) {\n return behaviorRestangular.all('courseSummary/getCourseTimes').get(courseSectionGroupID);\n }\n }\n})();","(function () {\n 'use strict';\n\n angular.module('nha.behavior').service('courseService', courseService);\n\n courseService.$inject = ['baseService', 'BehaviorRestangular'];\n\n function courseService(baseService, behaviorRestangular) {\n var ctor = {};\n\n //ctor.resource = baseService.resource(baseService.appSettings.attendanceServicesRootUrl + 'CourseFilterCounts', null, {\n // update: {\n // method: 'PUT' // this method issues a PUT request\n // }\n //});\n\n ctor.getCourses = function(parameters, filters) {\n if (!parameters) {\n parameters = {};\n }\n\n ctor.setParametersBasedOnFilters(parameters, filters);\n var deferred = baseService.q.defer();\n\n var cachedData = baseService.cache.getByObjectKey(parameters);\n if (cachedData) {\n deferred.resolve(cachedData);\n } else {\n var promise = baseService.getList('CourseSummary', parameters, false, true, behaviorRestangular); // ctor.resource.get(parameters).$promise;\n promise.then(function(data) {\n\n // cache it!\n baseService.cache.putByObjectKey(parameters, data);\n deferred.resolve(data);\n });\n\n }\n\n return deferred.promise;\n };\n\n ctor.setParametersBasedOnFilters = function(parameters, filters) {\n if (filters) {\n var oDataFilter = {};\n\n //OData filter parameters\n if (filters.AcademicYear) {\n var selectedYear = _.find(filters.AcademicYear.items, { 'selected': true });\n\n if (selectedYear) {\n oDataFilter.AcademicYearID = selectedYear.id;\n } else {\n //Default to current year\n oDataFilter.AcademicYearID = moment().get('year');\n }\n }\n\n if (filters.School) {\n var selectedSchool = _.find(filters.School.items, { 'selected': true });\n\n if (selectedSchool) {\n oDataFilter.SchoolID = selectedSchool.id;\n } else {\n oDataFilter.SchoolID = 1;\n }\n }\n\n if (filters.MarkingPeriod) {\n var selectedMarkingPeriod = _.find(filters.MarkingPeriod.items, { 'selected': true });\n\n if (selectedMarkingPeriod) {\n oDataFilter.MarkingPeriodID = selectedMarkingPeriod.id;\n }\n }\n\n if (filters.GradeLevel) {\n var selectedGradeLevels = _.filter(filters.GradeLevel.items, { 'selected': true });\n\n if (selectedGradeLevels.length > 0) {\n var ids = _.map(selectedGradeLevels, 'id');\n\n oDataFilter.gradeLevelFilter = new _utils.FilterOption();\n oDataFilter.gradeLevelFilter.key = 'GradeLevelID';\n oDataFilter.gradeLevelFilter.value = ids;\n oDataFilter.gradeLevelFilter.booleanOperator = 'or';\n oDataFilter.gradeLevelFilter.comparer = 'eq';\n }\n }\n\n\n if (filters.Staff) {\n var selectedTeachers = _.filter(filters.Staff.items, { 'selected': true });\n\n if (selectedTeachers.length > 0) {\n var ids = _.map(selectedTeachers, 'id');\n\n oDataFilter.teacherFilter = new _utils.FilterOption();\n oDataFilter.teacherFilter.key = 'StaffID';\n oDataFilter.teacherFilter.value = ids;\n oDataFilter.teacherFilter.booleanOperator = 'or';\n oDataFilter.teacherFilter.comparer = 'eq';\n }\n }\n\n if (!_.isEmpty(oDataFilter)) {\n angular.extend(parameters, _utils.getODataRequest({ filter: oDataFilter }));\n }\n }\n };\n\n ctor.shapeCourseDataForDropdown = function (data) {\n var courses = [];\n\n courses = _(data).map(function (cs) {\n return {\n courseSectionSystemGeneratedName: cs.courseSectionSystemGeneratedName,\n uniqueId: \"\".concat(cs.meetingBlockTimeID, cs.courseSectionGroupID, cs.courseSectionID),\n meetingBlockTimeName: cs.meetingBlockTimeName,\n courseSectionGroupID: cs.courseSectionGroupID,\n meetingBlockTimeID: cs.meetingBlockTimeID,\n courseSectionID: cs.courseSectionID,\n subjectLevel1ID: cs.subjectLevel1ID,\n subjectTypeID: cs.subjectTypeID,\n isHomeroom: cs.isHomeroom,\n courseSubjectDisplayName: cs.courseSubjectDisplayName,\n courseSectionGroupName: cs.courseSectionGroupName,\n isSpecial: cs.isSpecial\n };\n }).value();\n\n // shape the data for dropdown\n if (courses.length > 0) {\n\n var cores = _.filter(courses, function (q) { return q.subjectTypeID === 1 || q.subjectTypeID === 4 });\n var specials = _.filter(courses, function (q) { return q.subjectTypeID === 2 || q.subjectTypeID === 3 });\n\n courses = [];\n\n // core\n _.forEach(cores, function (core) {\n\n if (core.meetingBlockTimeName === 'AM' || core.meetingBlockTimeName === 'PM') {\n\n core.meetingBlockTimeName = core.courseSectionGroupName + ' ' + core.meetingBlockTimeName;\n\n if ((_.some(courses, {'meetingBlockTimeID': core.meetingBlockTimeID})) === false) {\n courses.push(core);\n }\n } else {\n core.meetingBlockTimeName = core.courseSectionSystemGeneratedName;\n\n if ((_.some(courses, {'courseSectionGroupID': core.courseSectionGroupID})) === false) {\n courses.push(core);\n }\n }\n });\n\n // special\n _.forEach(specials, function (special) {\n special.meetingBlockTimeName = special.courseSectionGroupName + ' ' + special.courseSubjectDisplayName;\n\n if ((_.some(courses, { 'courseSectionID': special.courseSectionID })) === false) {\n courses.push(special);\n }\n });\n }\n\n return courses;\n }\n \n return ctor;\n };\n\n})();","/**\n * behavior-observation.repository\n * @namespace behavior \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('getDataForBehaviorTeacherViewRepository', getDataForBehaviorTeacherViewRepository);\n\n // protect against minification\n /* @ngInject */\n getDataForBehaviorTeacherViewRepository.$inject = ['baseService', 'BehaviorRestangular'];\n\n /**\n * @name assignmentTypeSummaryRepository\n * @description Constructor for observation.repository\n * @memberOf behavior\n */\n function getDataForBehaviorTeacherViewRepository(baseService, BehaviorRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getData = getData;\n\n return service;\n\n /**\n * @name getAll\n * @description retrieves all behavior observations\n * @returns List List of objects containing observationTypeSummary properties\n * @memberOf observation.repository\n */\n function getData(courseSectionGroupId, specialsCourseSectionId, startDate, endDate) {\n var params = {\n courseSectionGroupID: courseSectionGroupId,\n specialsCourseSectionID: specialsCourseSectionId,\n startDate: startDate,\n endDate: endDate\n };\n\n return baseService.getList('getDataForBehaviorTeacherView', params, false, false, BehaviorRestangular);\n }\n }\n})();","/**\n * courseSummary.repository\n * @namespace gradebook \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('managerListFilterCountsRepository', managerListFilterCountsRepository);\n\n // protect against minification\n /* @ngInject */\n managerListFilterCountsRepository.$inject = ['baseService', 'BehaviorRestangular'];\n\n /**\n * @name managerListFilterCountsRepository\n * @description Constructor for managerListFilterCounts.repository\n * @memberOf behavoir\n */\n function managerListFilterCountsRepository(baseService, gradebookRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n service.getStudentsInSchoolFilterCounts = getStudentsInSchoolFilterCounts;\n\n return service;\n\n function getStudentsInSchoolFilterCounts(selectedFilters, searchText) {\n var apiParameters = getParameters(selectedFilters, searchText);\n return baseService.getList('student/getStudentsInSchoolFilterCounts', apiParameters, true, true, gradebookRestangular);\n }\n\n function getParameters(filters, searchText) {\n var parameters = {};\n\n if (filters) {\n parameters.academicYearId = getFilterId('AcademicYear', filters);\n parameters.schoolId = getFilterId('School', filters);\n parameters.gradeLevelIds = getAllFilterIds('GradeLevel', filters);\n parameters.homeroomIds = getAllFilterIds('Homeroom', filters);\n parameters.behaviorLevelIds = getAllFilterIds('BehaviorLevels', filters);\n parameters.requireBSP = getFilterByColumnName('BehaviorSupportPlan', 'RequiringBSP', filters);\n parameters.upcomingBSP = getFilterByColumnName('BehaviorSupportPlan', 'UpcomingBSP', filters);\n parameters.activeBSP = getFilterByColumnName('BehaviorSupportPlan', 'ActiveBSP', filters);\n parameters.isSpecialEd = getFilterByColumnName('SpecialServices', 'IsSpecialEd', filters);\n parameters.isSection504 = getFilterByColumnName('SpecialServices', 'IsSection504', filters);\n parameters.searchText = searchText;\n }\n\n return parameters;\n }\n\n function getAllFilterIds(filterName, filters) {\n if (filters[filterName]) {\n var selected = _.filter(filters[filterName].items, { 'selected': true });\n\n if (selected) {\n var ids = _.map(selected, 'id');\n return ids;\n }\n }\n\n return [];\n }\n\n function getFilterId(filterName, filters) {\n if (filters[filterName]) {\n var selected = _.find(filters[filterName].items, { 'selected': true });\n\n return selected ? selected.id : null;\n }\n\n return null;\n }\n\n function getFilterByColumnName(filterName, columnName, filters) {\n if (filters[filterName]) {\n var filter = _.find(filters[filterName].items, { 'columnName': columnName });\n\n return filter ? filter.selected : null;\n }\n\n return null;\n }\n\n function setFilters(parameters, filters, searchText) {\n log(filters);\n\n if (filters) {\n var oDataFilter = {};\n\n _utils.updateODataFilterWithNHAFilter(filters, 'AcademicYear', 'AcademicYearID', oDataFilter);\n _utils.updateODataFilterWithNHAFilter(filters, 'School', 'SchoolID', oDataFilter);\n _utils.updateODataFilterWithNHAFilter(filters, 'GradeLevel', 'GradeLevelID', oDataFilter);\n\n // custom filters\n if (filters.BehaviorLevels) {\n var columns = _.map(filters.BehaviorLevels.items, 'columnName');\n _.forEach(columns, function (column) {\n oDataFilter[column] = new _utils.FilterOption();\n oDataFilter[column].booleanOperator = 'or';\n oDataFilter[column].comparer = \"gt\";\n oDataFilter[column].key = column;\n oDataFilter[column].value = 0;\n });\n }\n\n if (filters.BehaviorSupportPlan) {\n var columns = _.map(filters.BehaviorSupportPlan.items, 'columnName');\n _.forEach(columns, function (column) {\n oDataFilter[column] = new _utils.FilterOption();\n oDataFilter[column].booleanOperator = 'or';\n oDataFilter[column].comparer = \"eq\";\n oDataFilter[column].key = column;\n oDataFilter[column].value = true;\n });\n }\n\n if (!_.isEmpty(oDataFilter)) {\n angular.extend(parameters, _utils.getODataRequest({ filter: oDataFilter }));\n }\n\n if (filters.SpecialServices) {\n var columns = _.map(filters.SpecialServices.items, 'columnName');\n\n if (columns.length && parameters.$filter) parameters.$filter += ' and (';\n _.forEach(columns, function (column) {\n parameters.$filter += column + ' eq true';\n if (_.last(columns) !== column) parameters.$filter += ' or ';\n });\n if (columns.length) parameters.$filter += ')';\n }\n\n if (filters.Homeroom) {\n // OData query for any HomeroomStaffIDs that have been checked in the filters\n parameters.$filter = parameters.$filter += ' and HomeroomStaffIDs/any(x: x eq ' + _(filters.Homeroom.items).map('id').join(' or x eq ') + ')';\n }\n\n if (searchText) {\n var searchParameter = '(';\n _.forEach(service.textSearchFields, function (searchField) {\n searchParameter += 'substringof(\\'' + searchText + '\\', ' + searchField + ') or ';\n });\n searchParameter = searchParameter.slice(0, searchParameter.length - 4);\n searchParameter += ')';\n parameters.$filter += ' and ' + searchParameter;\n }\n\n }\n }\n }\n})();","/**\n * mime-types.repository\n * @namespace behavior \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('mimeTypesRepository', mimeTypesRepository);\n\n // protect against minification\n /* @ngInject */\n mimeTypesRepository.$inject = ['baseService', 'BehaviorRestangular'];\n\n /**\n * @name mimeTypesRepository\n * @description Constructor for mime-types.repository\n * @memberOf behavior\n */\n function mimeTypesRepository(baseService, BehaviorRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getMimeTypeID = getMimeTypeID;\n\n return service;\n\n /**\n * @name getMimeType\n */\n function getMimeTypeID(type) {\n var oDataParameters = _utils.getODataRequest({ filter: { MimeTypeName: type } });\n return baseService.getList('mimeType', oDataParameters, true, true, BehaviorRestangular);\n }\n }\n})();","/**\n * person-search.repository\n * @namespace behavior \n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('personSearchService', personSearchService);\n\n // protect against minification\n /* @ngInject */\n personSearchService.$inject = ['baseService', 'BehaviorRestangular'];\n\n /**\n * @name personSearchService\n * @description Constructor for person-search.service\n * @memberOf behavior\n */\n function personSearchService(baseService, BehaviorRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.studentSearch = studentSearch;\n service.studentSearchByID = studentSearchByID;\n service.staffSearch = staffSearch;\n service.staffSearchByID = staffSearchByID;\n service.parentSearch = parentSearch;\n service.parentSearchByID = parentSearchByID;\n\n return service;\n\n /**\n * @name studentSearch\n * @param name: name of person\n */\n function studentSearch(name, schoolId, academicYearId) {\n var oDataParameters = buildODataParameters({ name: name, schoolId: schoolId, academicYearId: academicYearId });\n\n return baseService.getList('studentSearch', oDataParameters, true, true, BehaviorRestangular);\n }\n\n /**\n * @name studentSearchByID\n * @param id\n */\n function studentSearchByID(id) {\n var oDataParameters = _utils.getODataRequest({ filter: { PersonID: id } });\n\n return baseService.getList('studentSearch', oDataParameters, true, true, BehaviorRestangular);\n }\n\n /**\n * @name staffSearch\n * @param name: name of person\n */\n function staffSearch(name, schoolId) {\n var oDataParameters = buildODataParameters({ name: name, schoolId: schoolId});\n\n return baseService.getList('staffSearch', oDataParameters, true, true, BehaviorRestangular);\n }\n\n /**\n * @name staffSearchByID\n * @param id\n */\n function staffSearchByID(id) {\n var params = { staffID: id };\n\n return baseService.getList('staffSearchById', params, true, true, BehaviorRestangular);\n }\n\n /**\n * @name parentSearch\n * @param name: name of person\n */\n function parentSearch(name, schoolId, academicYearId) {\n var oDataParameters = buildODataParameters({ name: name, schoolId: schoolId, academicYearId: academicYearId });\n\n return baseService.getList('parentSearch', oDataParameters, true, true, BehaviorRestangular);\n }\n\n /**\n * @name parentSearchByID\n * @param id\n */\n function parentSearchByID(id) {\n var oDataParameters = _utils.getODataRequest({ filter: { PersonID: id } });\n\n return baseService.getList('parentSearch', oDataParameters, true, true, BehaviorRestangular);\n }\n\n function buildODataParameters(params) {\n var oDataParameters = _utils.getODataRequest({ top: 10, filter: {} });\n\n var filters = [];\n var firstName = getFirstName(params.name);\n var lastName = getLastName(params.name);\n\n if (firstName && lastName) {\n filters.push(\"startswith(FirstName, '\" + firstName + \"') eq true\");\n filters.push(\"startswith(LastName, '\" + lastName + \"') eq true\");\n } else if (firstName && !lastName) {\n filters.push(\"(startswith(FirstName, '\" + firstName + \"') eq true or startswith(LastName, '\" + firstName + \"') eq true)\");\n }\n \n if (params.schoolId) {\n filters.push(\"SchoolID eq \" + params.schoolId);\n }\n\n if (params.academicYearId) {\n filters.push(\"AcademicYearID eq \" + params.academicYearId);\n }\n\n oDataParameters.$filter = filters.join(' and ');\n\n return oDataParameters;\n }\n\n function getLastName(name) {\n var names = name.split(' ');\n return names.length > 1 && _(names).last().length ? _(names).last() : null;\n }\n\n function getFirstName(name) {\n var names = name.split(' ');\n var firstName = _(names).first();\n\n return firstName.length ? firstName : null;\n }\n }\n})();","/** create the Behavior Api */\r\n(function (w) {\r\n\t/** check for the myNHA global */\r\n\tif (w['myNHA'] !== undefined) {\r\n\t\t/** set gradebook var */\r\n\t\tvar myNHA = w['myNHA'];\r\n\r\n\t\t/** define the Behavior Api */\r\n\t\tvar PositiveBehaviorService = myNHA.ApiServiceFactory('behaviorApiRootUrl', 'positiveBehavior');\r\n\r\n\t\t/** add the addPositiveBehavior method */\r\n\t\tPositiveBehaviorService.getPositiveBehavior = function() {\r\n\t\t\treturn PositiveBehaviorService.get('positive-behavior/');\r\n\t\t};\r\n\r\n\t\t/** add the addPositiveBehavior method */\r\n\t\tPositiveBehaviorService.addPositiveBehavior = function(behaviorEventIncident) {\r\n\t\t\treturn PositiveBehaviorService.post('add-multiple-positive-behavior/', behaviorEventIncident);\r\n\t\t};\r\n\r\n\t\t/** add the service to the myNHA global */\r\n\t\tmyNHA.RegisterApiService('Behavior', 'PositiveBehaviorService', PositiveBehaviorService);\r\n\t}\r\n})(window);","/**\n * rule.service\n * @namespace behavior \n * @remarks '.repository' is a sub-classification of service, including exclusively webAPI calls (CRUD+Special); one file per webAPI endpoint\n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('ruleService', ruleService);\n\n // protect against minification\n /* @ngInject */\n ruleService.$inject = [];\n\n /**\n * @name assignmentTypeSummaryRepository\n * @description Constructor for rule.service\n * @memberOf behavior\n */\n function ruleService() {\n\n /*jshint validthis: true */\n var service = this,\n rules = {};\n\n // List of rules\n rules.SpecificObservedBehavior = SpecificObservedBehavior;\n rules.ActiveSpecialEducationOr504 = ActiveSpecialEducationOr504;\n rules.ActiveSpecialEducation = ActiveSpecialEducation;\n rules.WeaponOrIncendiary = WeaponOrIncendiary;\n rules.SeclusionRestraint = SeclusionRestraint;\n rules.ActiveSpecialEdAndSpecificObservedBehavior = ActiveSpecialEdAndSpecificObservedBehavior;\n\n // List of services\n service.evaluate = evaluate;\n service.debug = debug;\n\n function SpecificObservedBehavior(selectedBehaviorObservationName) {\n var rule = this;\n return selectedBehaviorObservationName === rule.parameters;\n }\n\n function ActiveSpecialEducationOr504(studentIepStatus, student504Status) {\n var rule = this;\n var parameters = _(rule.parameters).split(\",\").map(_.trim).value();\n\n var ruleIepParameterValue = parameters[0];\n var rule504ParameterValue = parameters[1];\n return studentIepStatus == ruleIepParameterValue || student504Status == rule504ParameterValue;\n }\n\n function ActiveSpecialEducation(studentIepStatus) {\n var rule = this;\n var parameters = _(rule.parameters).split(\",\").map(_.trim).value();\n\n var ruleIepParameterValue = parameters[0];\n return studentIepStatus == ruleIepParameterValue;\n }\n\n function WeaponOrIncendiary(selectedBehaviorObservationName) {\n var rule = this;\n return rule.parameters.split(',').indexOf(selectedBehaviorObservationName) >= 0;\n }\n\n function SeclusionRestraint(isSeclusionOrRestraintChecked) {\n var rule = this;\n return isSeclusionOrRestraintChecked;\n }\n\n function ActiveSpecialEdAndSpecificObservedBehavior(studentIepStatus, selectedBehaviorObservationName) {\n var rule = this;\n var ruleParams = _(rule.parameters).split(\"|\").map(_.trim).value();\n\n var ruleParamActiveIep = ruleParams[0] ? ruleParams[0] : null;\n var ruleParamObservedBehaviors = ruleParams[1] ? _.tail(ruleParams) : null;\n\n return ruleParamActiveIep == studentIepStatus && _.includes(ruleParamObservedBehaviors, selectedBehaviorObservationName);\n }\n\n function evaluate() {\n var args = [];\n Array.prototype.push.apply(args, arguments);\n var rule = args.shift();\n return rules[rule.ruleName].apply(rule, args);\n }\n\n function debug() {\n //log(\"Usage: call 'ruleService.evaluate(rule, param1, param2, ...)\");\n //log(\"Functions\", service);\n //log(\"Rules\", rules);\n }\n\n return service;\n }\n})();","/**\n * state-behavior-question-answer.service\n * @namespace behavior \n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('stateBehaviorQuestionAnswerService', stateBehaviorQuestionAnswerService);\n\n // protect against minification\n /* @ngInject */\n stateBehaviorQuestionAnswerService.$inject = ['baseService', 'BehaviorRestangular'];\n\n /**\n * @name stateBehaviorQuestionAnswerService\n * @description Constructor for state-behavior-question-answer.service\n * @memberOf behavior\n */\n function stateBehaviorQuestionAnswerService(baseService, BehaviorRestangular) {\n\n /*jshint validthis: true */\n var service = this;\n\n // Service methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the service can be used \n service.getObservationQuestionAnswer = getObservationQuestionAnswer;\n service.getActionQuestionAnswer = getActionQuestionAnswer;\n service.getStateNameBySchoolId = getStateNameBySchoolId;\n service.getSchoolStaffList = getSchoolStaffList;\n\n return service;\n\n /**\n * @name GetObservationQuestionAnswer\n * @param name: Get Questions and Answers for a particilar observation and state\n */\n function getObservationQuestionAnswer(stateId) {\n var params = { stateId: stateId };\n\n return baseService.getList('stateQuestionAnswer/getObservationQuestionAnswer', params, false, false, BehaviorRestangular);\n }\n\n /**\n * @name GetActionQuestionAnswer\n * @param name: Get Questions and Answers for a particilar action and state\n */\n function getActionQuestionAnswer(stateId, behaviorLevelId) {\n var params = { stateId: stateId, behaviorLevelId: behaviorLevelId };\n\n return baseService.getList('stateQuestionAnswer/getActionQuestionAnswer', params, true, true, BehaviorRestangular);\n }\n \n /**\n * @name GetStateNameBySchoolId\n * @param name: Get the school state's name using the schoolId\n */\n function getStateNameBySchoolId(schoolId) {\n var params = { schoolId: schoolId };\n\n return baseService.getList('stateQuestionAnswer/getStateNameBySchoolId', params, true, true, BehaviorRestangular);\n }\n\n /**\n * @name GetSchoolStaffList\n * @param name: Get the school's staff list using the schoolId and academicYearId\n */\n function getSchoolStaffList(schoolId, academicYearId) {\n var params = {\n schoolId: schoolId,\n academicYearId: academicYearId\n };\n\n return baseService.getList('stateQuestionAnswer/getSchoolStaffList', params, true, true, BehaviorRestangular);\n }\n }\n})();","/**\n * state-management.service\n * @namespace behavior \n*/\n(function () {\n 'use strict';\n\n // define one component per file (single responsibility)\n angular\n .module('nha.behavior')\n .service('behaviorStateManagementService', behaviorStateManagementService);\n\n // protect against minification\n /* @ngInject */\n behaviorStateManagementService.$inject = ['baseService', 'BehaviorRestangular', '$state', '$stateParams', '$q', 'behaviorCache', 'studentListService'];\n\n /**\n * @name behaviorStateManagementService\n * @description Constructor for state-management.service\n * @memberOf behavior\n */\n function behaviorStateManagementService(baseService, gradebookRestangular, $state, $stateParams, $q, behaviorCache, studentListService) {\n\n /*jshint validthis: true */\n var service = this;\n\n service.getInitialValues = getInitialValues;\n\n return service;\n\n function validateValues(returned) {\n var keys = _.keys(returned);\n var valueArray = [];\n\n _.forEach(keys, function(key) {\n var value = null;\n value = returned[key];\n if (value === null || typeof value === 'undefined') { valueArray.push(value); }\n });\n\n return valueArray.length === 0;\n }\n\n function getInitialValues(params) {\n\n var returned = {};\n\n var paramsKeys = _.keys(params);\n\n _.forEach(paramsKeys, function (key) {\n\n params[key] ? returned[key] = params[key] : returned[key] = null;\n\n // check for behavior levels of zero (positive behavior)\n if (key === 'behaviorLevelId' && params[key] === 0 && !returned[key]) { returned[key] = 0; }\n\n // check for specialsCourseSectionID of zero\n if (key === 'specialsCourseSectionId' && params[key] === 0 && !returned[key]) { returned[key] = 0; }\n\n // check for null date\n if (key === 'date' && !params[key] && !returned[key]) { returned[key] = new Date(); }\n });\n\n var deferred = baseService.q.defer();\n\n // TODO Disabling use of cache for now as the cache does not contain all needed student information (such as student indicators).\n var cachedStudent = null; // behaviorCache.get('behavior.' + params.studentInSchoolId + '.student');\n\n if (cachedStudent) {\n\n returned.student = cachedStudent;\n\n behaviorCache.get('behavior.' + returned.studentInSchoolId + '.academicYearId') ? returned.academicYearId = behaviorCache.get('behavior.' + returned.studentInSchoolId + '.academicYearId') : returned.academicYearId = returned.student.academicYearID;\n\n behaviorCache.get('behavior.' + returned.studentInSchoolId + '.schoolId') ? returned.schoolId = behaviorCache.get('behavior.' + returned.studentInSchoolId + '.schoolId') : returned.schoolId = returned.student.schoolID;\n\n returned.valuesLoadedProperly = validateValues(returned);\n\n deferred.resolve(returned);\n \n } else { // if we don't have a student object in cache, go get one\n\n var studentInSchoolId = returned.studentInSchoolId || returned.studentId;\n var sisIndicatorsPromise = studentListService.getStudentsIndicators(studentInSchoolId);\n\n sisIndicatorsPromise.then(function (data) {\n returned.student = data[0] ? data[0] : null;\n\n returned.student ? returned.academicYearId = returned.student.academicYearID : returned.academicYearId = null;\n\n returned.student ? returned.schoolId = returned.student.schoolID : returned.schoolId = null;\n\n returned.studentInSchoolId = studentInSchoolId;\n\n returned.valuesLoadedProperly = validateValues(returned);\n\n deferred.resolve(returned);\n });\n }\n\n return deferred.promise;\n }\n }\n})();","(function () {\n 'use strict';\n\n angular.module('nha.behavior').service('studentListService', studentListService);\n\n studentListService.$inject = ['baseService', 'AttendanceRestangular', 'BehaviorRestangular'];\n\n function studentListService(baseService, attendanceRestangular, behaviorRestangular) {\n var ctor = {};\n var selectedStudent;\n\n ctor.defaultSortOrder = [{ criteria: 'LastName', descending: true },\n { criteria: 'FirstName', descending: false }];\n\n ctor.pageSize = 100;\n\n ctor.getCourseSectionMeetingSchedule = function (parameters) {\n if (!parameters) {\n parameters = {};\n }\n\n var deferred = baseService.q.defer();\n baseService.getList('CourseSectionMeetingSchedule', parameters, false, true, attendanceRestangular).then(function (data) {\n // cache it!\n baseService.cache.putByObjectKey(parameters, data);\n\n deferred.resolve(data);\n });\n\n return deferred.promise;\n };\n\n ctor.updateStudentOrder = function (studentOrders, parameters) {\n //Remove student list cache so next time viewing the page the order is up to date.\n baseService.cache.destroyByObjectKey(parameters);\n\n return attendanceRestangular.all('StudentOrderForCourseSectionGroup').post(studentOrders);\n };\n\n ctor.setParametersBasedOnFilters = function (parameters, filters) {\n if (filters) {\n var oDataFilter = {};\n\n //OData filter parameters\n if (filters.AcademicYear) {\n var selectedYear = _.find(filters.AcademicYear.items, { 'selected': true });\n\n if (selectedYear) {\n parameters.academicYearID = selectedYear.id;\n }\n else {\n //Default to current year\n parameters.academicYearID = moment().get('year');\n }\n }\n\n if (filters.School) {\n var selectedSchool = _.find(filters.School.items, { 'selected': true });\n\n if (selectedSchool) {\n oDataFilter.SchoolID = selectedSchool.id;\n }\n else {\n oDataFilter.SchoolID = 1;\n }\n }\n\n if (filters.GradeLevel) {\n var selectedGradeLevels = _.filter(filters.GradeLevel.items, { 'selected': true });\n\n if (selectedGradeLevels.length > 0) {\n var ids = _.map(selectedGradeLevels, 'id');\n\n oDataFilter.gradeLevelFilter = new _utils.FilterOption();\n oDataFilter.gradeLevelFilter.key = 'GradeLevelID';\n oDataFilter.gradeLevelFilter.value = ids;\n oDataFilter.gradeLevelFilter.booleanOperator = 'or';\n oDataFilter.gradeLevelFilter.comparer = 'eq';\n }\n }\n\n if (filters.AttendanceCode) {\n var selectedItems = _.filter(filters.AttendanceCode.items, { 'selected': true });\n\n if (selectedItems.length > 0) {\n var ids = _.map(selectedItems, 'id');\n\n parameters.attendanceCodeGroupIDs = ids;\n }\n }\n\n if (filters.Homeroom) {\n var selectedItems = _.filter(filters.Homeroom.items, { 'selected': true });\n\n if (selectedItems.length > 0) {\n var ids = _.map(selectedItems, 'id');\n\n oDataFilter.homeRoomStaffFilter = new _utils.FilterOption();\n oDataFilter.homeRoomStaffFilter.key = 'HomeroomStaffID';\n oDataFilter.homeRoomStaffFilter.value = ids;\n oDataFilter.homeRoomStaffFilter.booleanOperator = 'or';\n oDataFilter.homeRoomStaffFilter.comparer = 'eq';\n }\n }\n\n if (filters.Staff) {\n var selectedTeachers = _.filter(filters.Staff.items, { 'selected': true });\n\n if (selectedTeachers.length > 0) {\n var ids = _.map(selectedTeachers, 'id');\n\n oDataFilter.teacherFilter = new _utils.FilterOption();\n oDataFilter.teacherFilter.key = 'StaffId';\n oDataFilter.teacherFilter.value = ids;\n oDataFilter.teacherFilter.booleanOperator = 'or';\n oDataFilter.teacherFilter.comparer = 'eq';\n }\n }\n\n //if (filters.MarkingPeriod) {\n // var selectedMarkingPeriod = _.find(filters.MarkingPeriod.items, { 'selected': true });\n\n // if (selectedMarkingPeriod) {\n // oDataFilter.MarkingPeriodID = selectedMarkingPeriod.id;\n // }\n //}\n\n if (!_.isEmpty(oDataFilter)) {\n angular.extend(parameters, _utils.getODataRequest({ filter: oDataFilter }));\n }\n }\n };\n\n ctor.getBehaviorEvents = function (academidYearId, studentInSchoolId, level) {\n var parameters = {\n studentInSchoolId: studentInSchoolId,\n academicYearId: academidYearId,\n level: level\n };\n\n return baseService.getList('Student/GetBehaviorEvents', parameters, false, true, behaviorRestangular);\n }\n\n ctor.checkIfStudentGuardianHasEmailAndCanBeContacted = function(studentInSchoolId) {\n var parameters = { studentInSchoolId: studentInSchoolId };\n\n return baseService.getList('Student/CheckIfStudentGuardianHasEmailAndCanBeContacted', parameters, false, false, behaviorRestangular);\n }\n\n ctor.getStudentsForManager = function (parameters, filters) {\n setFilters(parameters, filters, null);\n log(\"SORT ORDER:\", parameters.sortOrder);\n parameters = setSortOrder(parameters, parameters.sortOrder, ctor.defaultSortOrder);\n\n return baseService.getList('Student/GetStudentsInSchool', parameters, false, true, behaviorRestangular);\n }\n\n ctor.getStudentsIndicators = function (studentInSchoolID) {\n var oDataParams = _utils.getODataRequest({ filter: { StudentInSchoolID: studentInSchoolID } });\n\n if (!oDataParams.$filter) return;\n\n return baseService.getList('Student/getStudentsIndicators', oDataParams, true, true, behaviorRestangular);\n }\n\n ctor.searchStudentsIndicators = function (name, schoolId, academicYearId) {\n var oDataParams = buildODataParametersForStudentSearch({ name: name, schoolId: schoolId, academicYearId: academicYearId });\n\n return baseService.getList('Student/getStudentsIndicators', oDataParams, true, true, behaviorRestangular);\n }\n\n ctor.getObservationsForLevel4Event = function (studentInSchoolId, schoolId, academicYear) {\n var deferred = baseService.q.defer();\n\n var parameters = {\n studentInSchoolId: studentInSchoolId,\n schoolId: schoolId,\n academicYear: academicYear\n };\n\n baseService.getList('Student/getObservationsForLevel4Event', parameters, false, true, behaviorRestangular).then(function (data) {\n deferred.resolve(data);\n });\n\n return deferred.promise;\n\n }\n\n ctor.getTenTwentyCount = function (studentInSchoolId) {\n var deferred = baseService.q.defer();\n\n var parameters = {\n studentInSchoolID: studentInSchoolId\n };\n\n baseService.getList('Student/getTenTwentyCount', parameters, false, true, behaviorRestangular).then(function (data) {\n deferred.resolve(data);\n });\n\n return deferred.promise;\n }\n\n function setSortOrder(parameters, sortSetting, sortDefault) {\n var sort = sortSetting === null ? sortDefault : sortSetting;\n var sortString = '';\n\n if (sort) {\n for (var i = 0; i < sort.length; i++) {\n sortString += sort[i].criteria + (sort[i].descending ? ' desc' : '');\n if (i + 1 < sort.length) {\n sortString += ', ';\n }\n }\n\n parameters.$orderby = sortString;\n }\n\n return parameters;\n }\n\n ctor.isStudentActiveIep = function(studentID) {\n var deferred = baseService.q.defer();\n\n var oDataParams = _utils.getODataRequest({ filter: { StudentID: studentID } });\n\n baseService.getList('student/getSpecialEdStudentView', oDataParams, false, true, behaviorRestangular).then(function(data) {\n deferred.resolve(data);\n });\n\n return deferred.promise;\n };\n\n ctor.getSchoolIDBySisID = function(studentInSchoolId) {\n var deferred = baseService.q.defer();\n\n var parameters = {\n studentInSchoolID: studentInSchoolId\n };\n\n baseService.getList('Student/getSchoolIDBySisID', parameters, false, true, behaviorRestangular).then(function (data) {\n deferred.resolve(data);\n });\n\n return deferred.promise;\n\t\t}\n\n\t\tctor.checkEmergencyRemoteLearningEnabled = function (studentInSchoolId, date) {\n\t\t\tvar parameters = { studentInSchoolId: studentInSchoolId, date: date };\n\n\t\t\treturn baseService.getList('Student/checkEmergencyRemoteLearning', parameters, false, false, behaviorRestangular);\n\t\t}\n\n function setFilters(parameters, filters, searchText) {\n log(filters);\n\n if (filters) {\n var oDataFilter = {};\n\n _utils.updateODataFilterWithNHAFilter(filters, 'AcademicYear', 'AcademicYearID', oDataFilter);\n _utils.updateODataFilterWithNHAFilter(filters, 'School', 'SchoolID', oDataFilter);\n _utils.updateODataFilterWithNHAFilter(filters, 'GradeLevel', 'GradeLevelID', oDataFilter);\n\n // custom filters\n if (filters.BehaviorLevels) {\n var columns = _.map(filters.BehaviorLevels.items, 'columnName');\n _.forEach(columns, function (column) {\n oDataFilter[column] = new _utils.FilterOption();\n oDataFilter[column].booleanOperator = 'or';\n oDataFilter[column].comparer = \"gt\";\n oDataFilter[column].key = column;\n oDataFilter[column].value = 0;\n });\n }\n\n if (!_.isEmpty(oDataFilter)) {\n angular.extend(parameters, _utils.getODataRequest({ filter: oDataFilter }));\n }\n\n if (searchText) {\n var searchParameter = '(';\n _.forEach(service.textSearchFields, function (searchField) {\n searchParameter += 'substringof(\\'' + searchText + '\\', ' + searchField + ') or ';\n });\n searchParameter = searchParameter.slice(0, searchParameter.length - 4);\n searchParameter += ')';\n parameters.$filter += ' and ' + searchParameter;\n }\n\n\n if (filters.SpecialServices) {\n var columns = _.map(filters.SpecialServices.items, 'columnName');\n\n if (columns.length && parameters.$filter) parameters.$filter += ' and (';\n _.forEach(columns, function (column) {\n parameters.$filter += column + ' eq true';\n if (_.last(columns) !== column) parameters.$filter += ' or ';\n });\n if (columns.length) parameters.$filter += ')';\n }\n\n if (filters.BehaviorSupportPlan) {\n var columns = _.map(filters.BehaviorSupportPlan.items, 'columnName');\n\n if (columns.length && parameters.$filter) parameters.$filter += ' and (';\n _.forEach(columns, function (column) {\n parameters.$filter += column + ' eq true';\n if (_.last(columns) !== column) parameters.$filter += ' or ';\n });\n if (columns.length) parameters.$filter += ')';\n }\n\n if (filters.Homeroom) {\n // OData query for any HomeroomStaffIDs that have been checked in the filters\n parameters.$filter = parameters.$filter += ' and HomeroomStaffIDs/any(x: x eq ' + _(filters.Homeroom.items).map('id').join(' or x eq ') + ')';\n }\n }\n }\n\n function buildODataParametersForStudentSearch(params) {\n var oDataParameters = _utils.getODataRequest({ top: 10, filter: {} });\n\n var filters = [];\n var firstName = getFirstName(params.name);\n var lastName = getLastName(params.name);\n\n if (firstName && lastName) {\n filters.push(\"startswith(FirstName, '\" + firstName + \"') eq true\");\n filters.push(\"startswith(LastName, '\" + lastName + \"') eq true\");\n } else if (firstName && !lastName) {\n filters.push(\"(startswith(FirstName, '\" + firstName + \"') eq true or startswith(LastName, '\" + firstName + \"') eq true)\");\n }\n\n if (params.schoolId) {\n filters.push(\"SchoolID eq \" + params.schoolId);\n }\n\n if (params.academicYearId) {\n filters.push(\"AcademicYearID eq \" + params.academicYearId);\n }\n\n filters.push(\"(Status eq 'AC' or Status eq 'E' or Status eq 'RE' or Status eq 'W' or Status eq 'G')\");\n\n oDataParameters.$filter = filters.join(' and ');\n\n return oDataParameters;\n }\n\n function getLastName(name) {\n var names = name.split(' ');\n return names.length > 1 && _(names).last().length ? _(names).last() : null;\n }\n\n function getFirstName(name) {\n var names = name.split(' ');\n var firstName = _(names).first();\n\n return firstName.length ? firstName : null;\n\t\t}\n\n return ctor;\n }\n})();","(function () {\n \"use strict\";\n\n var app = angular\n .module('flexcalendar', ['pascalprecht.translate'])\n .directive('flexCalendar', flexCalendar);\n\n var defaultTranslation = angular\n .module('flexcalendar.defaultTranslation', ['flexcalendar'])\n .config(defaultTranslationConfig);\n\n defaultTranslationConfig.$inject = ['$translateProvider'];\n\n function defaultTranslationConfig($translateProvider) {\n $translateProvider.translations('en', {\n JANUARY: 'January',\n FEBRUARY: 'February',\n MARCH: 'March',\n APRIL: 'April',\n MAI: 'May',\n JUNE: 'June',\n JULY: 'July',\n AUGUST: 'August',\n SEPTEMBER: 'September',\n OCTOBER: 'October',\n NOVEMBER: 'November',\n DECEMBER: 'December',\n\n SUNDAY: 'Sunday',\n MONDAY: 'Monday',\n TUESDAY: 'Tuesday',\n WEDNESDAY: 'Wednesday',\n THURSDAY: 'Thurday',\n FRIDAY: 'Friday',\n SATURDAY: 'Saturday'\n });\n $translateProvider.preferredLanguage('en');\n $translateProvider.useSanitizeValueStrategy('escape');\n }\n\n function flexCalendar() {\n\n var template =\n '
' +\n '
' +\n '
' +\n '
{{ selectedMonth | translate }} {{selectedYear}}
' +\n '
' +\n '
' +\n '
' +\n '
{{ day }}
' +\n '
' +\n '
' +\n '
' +\n '
{{day.day}}
' +\n '
' +\n '
' +\n '
';\n\n var directive = {\n restrict: 'E',\n scope: {\n options: '=?',\n events: '=?'\n },\n template: template,\n controller: Controller\n };\n\n return directive;\n\n }\n\n Controller.$inject = ['$scope', '$filter', '$rootScope'];\n\n function Controller($scope, $filter, $rootScope) {\n $scope.currentPopover = null;\n $scope.days = [];\n $scope.options = $scope.options || {};\n $scope.events = $scope.events || [];\n $scope.options.dayNamesLength = $scope.options.dayNamesLength || 1;\n $scope.options.mondayIsFirstDay = $scope.options.mondayIsFirstDay || false;\n\n $scope.popoverTemplateUrl = 'calendar-popover-content.html';\n\n $scope.calendarId = _.uniqueId();\n $scope.onClick = onClick;\n $scope.allowedPrevMonth = allowedPrevMonth;\n $scope.allowedNextMonth = allowedNextMonth;\n $scope.weekDays = weekDays;\n $scope.isDefaultDate = isDefaultDate;\n $scope.prevMonth = prevMonth;\n $scope.nextMonth = nextMonth;\n $scope.setCurrentPopover = setCurrentPopover;\n $scope.getDayClass = getDayClass;\n\n $scope.arrowPrevClass = \"visible\";\n $scope.arrowNextClass = \"visible\";\n\n var $translate = $filter('translate');\n\n var MONTHS = ['JANUARY', 'FEBRUARY', 'MARCH', 'APRIL', 'MAI', 'JUNE', 'JULY', 'AUGUST', 'SEPTEMBER', 'OCTOBER', 'NOVEMBER', 'DECEMBER'];\n var WEEKDAYS = ['SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY'];\n\n if ($scope.options.mondayIsFirstDay) {\n var sunday = WEEKDAYS.shift();\n WEEKDAYS.push(sunday);\n }\n\n if ($scope.options.minDate) {\n $scope.options.minDate = new Date($scope.options.minDate);\n }\n\n if ($scope.options.maxDate) {\n $scope.options.maxDate = new Date($scope.options.maxDate);\n }\n\n if ($scope.options.disabledDates) {\n createMappedDisabledDates();\n }\n\n if ($scope.events) {\n createMappedEvents();\n }\n\n registerEvents();\n\n function createMappedDisabledDates() {\n if (!$scope.options.disabledDates) return;\n $scope.mappedDisabledDates = $scope.options.disabledDates.map(function (date) {\n return new Date(date);\n });\n }\n\n function setCurrentPopover(index) {\n $rootScope.$on('popover-open', function (ctx, openningCalendarId) {\n if (openningCalendarId !== $scope.calendarId) {\n $scope.currentPopover = null;\n }\n });\n\n $rootScope.$emit('popover-open', $scope.calendarId);\n if ($scope.currentPopover === index) {\n $scope.currentPopover = null;\n } else {\n $scope.currentPopover = index;\n }\n }\n\n function createMappedEvents() {\n $scope.mappedEvents = $scope.events.map(function (obj) {\n obj.date = moment(obj.date).toDate();\n return obj;\n });\n }\n\n function registerEvents() {\n var prevMonthEvent = $scope.options.prevMonthEvent || 'flexcalendar:prevMonthEvent';\n $scope.$on(prevMonthEvent, prevMonth);\n\n var nextMonthEvent = $scope.options.nextMonthEvent || 'flexcalendar:nextMonthEvent';\n $scope.$on(nextMonthEvent, nextMonth);\n }\n\n $scope.$watch('options.defaultDate', function () {\n calculateSelectedDate();\n });\n\n $scope.$watch('options.disabledDates', function () {\n if ($scope.options.disabledDates) {\n createMappedDisabledDates();\n calculateDisabledDates();\n }\n });\n\n $scope.$watch('events', function () {\n createMappedEvents();\n calculateWeeks();\n });\n\n $scope.$watch('weeks', function (weeks) {\n var filteredEvents = [];\n angular.forEach(weeks, function (week) {\n angular.forEach(week, function (day) {\n if (day && day.event) {\n angular.forEach(day.event, function (event) {\n filteredEvents.push(event);\n });\n }\n });\n });\n if ('function' === typeof $scope.options.filteredEventsChange) {\n $scope.options.filteredEventsChange(filteredEvents);\n }\n });\n\n $scope.$watch('selectedYear', function (year, previousYear) {\n if (year !== previousYear) calculateWeeks();\n });\n $scope.$watch('selectedMonth', function (month, previousMonth) {\n if (month !== previousMonth) calculateWeeks();\n });\n\n /////////////////\n\n function onClick(date, index, domEvent) {\n if (!date || date.disabled) {\n return;\n }\n $scope.options.defaultDate = date.date;\n if (date.event.length && $scope.options.eventClick) {\n $scope.options.eventClick(date, domEvent);\n }\n\n $scope.options.dateClick(date, domEvent);\n }\n\n function bindEvent(date) {\n if (!date || !$scope.mappedEvents) {\n return;\n }\n date.event = [];\n $scope.mappedEvents.forEach(function (event) {\n if (date.date.getFullYear() === event.date.getFullYear() && date.date.getMonth() === event.date.getMonth() && date.date.getDate() === event.date.getDate()) {\n date.event.push(event);\n }\n });\n }\n\n function allowedDate(date) {\n if (!$scope.options.minDate && !$scope.options.maxDate) {\n return true;\n }\n var currDate = date.date;\n if ($scope.options.minDate && (currDate < $scope.options.minDate)) {\n return false;\n }\n if ($scope.options.maxDate && (currDate > $scope.options.maxDate)) {\n return false;\n }\n return true;\n }\n\n function disabledDate(date) {\n if (!$scope.mappedDisabledDates) return false;\n for (var i = 0; i < $scope.mappedDisabledDates.length; i++) {\n if (date.year === $scope.mappedDisabledDates[i].getFullYear() && date.month === $scope.mappedDisabledDates[i].getMonth() && date.day === $scope.mappedDisabledDates[i].getDate()) {\n return true;\n break;\n }\n }\n }\n\n function allowedPrevMonth() {\n var prevYear = null;\n var prevMonth = null;\n if (!$scope.options.minDate) {\n return true;\n }\n var currMonth = MONTHS.indexOf($scope.selectedMonth);\n if (currMonth === 0) {\n prevYear = ($scope.selectedYear - 1);\n prevMonth = 11;\n } else {\n prevYear = $scope.selectedYear;\n prevMonth = (currMonth - 1);\n }\n if (prevYear < $scope.options.minDate.getFullYear()) {\n return false;\n }\n if (prevYear === $scope.options.minDate.getFullYear()) {\n if (prevMonth < $scope.options.minDate.getMonth()) {\n return false;\n }\n }\n return true;\n }\n\n function allowedNextMonth() {\n var nextYear = null;\n var nextMonth = null;\n if (!$scope.options.maxDate) {\n return true;\n }\n var currMonth = MONTHS.indexOf($scope.selectedMonth);\n if (currMonth === 11) {\n nextYear = ($scope.selectedYear + 1);\n nextMonth = 0;\n } else {\n nextYear = $scope.selectedYear;\n nextMonth = (currMonth + 1);\n }\n if (nextYear > $scope.options.maxDate.getFullYear()) {\n return false;\n }\n if (nextYear === $scope.options.maxDate.getFullYear()) {\n if (nextMonth > $scope.options.maxDate.getMonth()) {\n return false;\n }\n }\n return true;\n }\n\n function calculateWeeks() {\n $scope.weeks = [];\n var week = null;\n var daysInCurrentMonth = new Date($scope.selectedYear, MONTHS.indexOf($scope.selectedMonth) + 1, 0).getDate();\n\n for (var day = 1; day < daysInCurrentMonth + 1; day += 1) {\n var date = new Date($scope.selectedYear, MONTHS.indexOf($scope.selectedMonth), day);\n var dayNumber = new Date($scope.selectedYear, MONTHS.indexOf($scope.selectedMonth), day).getDay();\n if ($scope.options.mondayIsFirstDay) {\n dayNumber = (dayNumber + 6) % 7;\n }\n week = week || [null, null, null, null, null, null, null];\n week[dayNumber] = {\n year: $scope.selectedYear,\n month: MONTHS.indexOf($scope.selectedMonth),\n day: day,\n date: date,\n _month: date.getMonth() + 1\n };\n\n if (allowedDate(week[dayNumber])) {\n if ($scope.mappedEvents) {\n bindEvent(week[dayNumber]);\n }\n } else {\n week[dayNumber].disabled = true;\n }\n\n if (week[dayNumber] && disabledDate(week[dayNumber])) {\n week[dayNumber].disabled = true;\n }\n\n if (dayNumber === 6 || day === daysInCurrentMonth) {\n $scope.weeks.push(week);\n week = undefined;\n }\n }\n\n $scope.sixWeekMonth = $scope.weeks.length === 6;\n\n (!$scope.allowedPrevMonth()) ? $scope.arrowPrevClass = \"hidden\" : $scope.arrowPrevClass = \"visible\";\n (!$scope.allowedNextMonth()) ? $scope.arrowNextClass = \"hidden\" : $scope.arrowNextClass = \"visible\";\n }\n\n function calculateSelectedDate() {\n if ($scope.options.defaultDate) {\n $scope.options._defaultDate = new Date($scope.options.defaultDate);\n } else {\n $scope.options._defaultDate = new Date();\n }\n\n $scope.selectedYear = $scope.options._defaultDate.getFullYear();\n $scope.selectedMonth = MONTHS[$scope.options._defaultDate.getMonth()];\n $scope.selectedDay = $scope.options._defaultDate.getDate();\n }\n\n function calculateDisabledDates() {\n if (!$scope.mappedDisabledDates || $scope.mappedDisabledDates.length === 0) return;\n for (var i = 0; i < $scope.mappedDisabledDates.length; i++) {\n $scope.mappedDisabledDates[i] = new Date($scope.mappedDisabledDates[i]);\n }\n calculateWeeks();\n }\n\n function weekDays(size) {\n return WEEKDAYS.map(function (name) {\n return $translate(name).slice(0, size);\n });\n }\n\n function isDefaultDate(date) {\n if (!date) {\n return;\n }\n var result = date.year === $scope.options._defaultDate.getFullYear() &&\n date.month === $scope.options._defaultDate.getMonth() &&\n date.day === $scope.options._defaultDate.getDate();\n return result;\n }\n\n function prevMonth() {\n if (!$scope.allowedPrevMonth()) {\n return;\n }\n var currIndex = MONTHS.indexOf($scope.selectedMonth);\n if (currIndex === 0) {\n $scope.selectedYear -= 1;\n $scope.selectedMonth = MONTHS[11];\n } else {\n $scope.selectedMonth = MONTHS[currIndex - 1];\n }\n var month = {\n name: $scope.selectedMonth,\n index: currIndex - 1,\n _index: currIndex + 2\n };\n $scope.options.changeMonth(month, $scope.selectedYear);\n }\n\n function nextMonth() {\n if (!$scope.allowedNextMonth()) {\n return;\n }\n var currIndex = MONTHS.indexOf($scope.selectedMonth);\n if (currIndex === 11) {\n $scope.selectedYear += 1;\n $scope.selectedMonth = MONTHS[0];\n } else {\n $scope.selectedMonth = MONTHS[currIndex + 1];\n }\n var month = {\n name: $scope.selectedMonth,\n index: currIndex + 1,\n _index: currIndex + 2\n };\n $scope.options.changeMonth(month, $scope.selectedYear);\n }\n\n function getDayClass(day) {\n if (!day || !day.event || day.event.length === 0) {\n return '';\n }\n\n return day.event.map(function (e) {\n return e.eventClass || '';\n }).join(' ');\n }\n\n }\n\n})();","angular.module(\"nha.behavior\")\n .directive(\"behaviorHistory\", [\"appSettings\", '$state', function (appSettings, $state) {\n return {\n restrict: \"E\",\n scope: {\n records: \"=\"\n },\n templateUrl: appSettings.behaviorWebRootUrl + \"/app/studentRecord/directives/behaviorHistory/historyTimeline.html\",\n link: function (scope, el, attrs) {\n scope.currentPopover = null;\n\n scope.historyTimelineItemWidth = (1 / parseFloat(scope.records.length) * 100) + \"%\";\n \n scope.popoverTemplateUrl = 'popover-content.html';\n\n scope.setCurrentPopover = function(index) {\n scope.currentPopover = index;\n };\n }\n }\n }]);\n ","(function () {\n 'use strict';\n\n angular.module('nha.behavior')\n .directive('addParticipant',\n ['$timeout', '$parse', 'appSettings', 'behaviorBehaviorListService', function ($timeout, $parse, appSettings, behaviorBehaviorListService) {\n return {\n restrict: 'E',\n templateUrl: appSettings.behaviorWebRootUrl + 'app/studentRecord/directives/level-five-six-participant/add-participant.html',\n scope: false,\n controller: [\n '$q', '$state', '$stateParams', 'behaviorCache', '$window', 'fileReaderFactory', 'toastr',\n '$scope', '$timeout', 'participantTypeRepository', 'roleRepository', 'motivationRepository', 'interventionRepository',\n 'actionRepository', 'levelRepository', 'personSearchService', 'stateBehaviorQuestionAnswerService',\n 'ruleService', 'studentListService', 'behaviorAlertService', 'behaviorEventIncidentRepository', 'screenFieldUsageRepository', 'genderRepository', 'raceRepository',\n function (\n $q, $state, $stateParams, behaviorCache, $window, fileReaderFactory, toastr,\n $scope, $timeout, participantTypeRepository, roleRepository, motivationRepository, interventionRepository,\n actionRepository, levelRepository, personSearchService, stateBehaviorQuestionAnswerService,\n ruleService, studentListService, behaviorAlertService, behaviorEventIncidentRepository, screenFieldUsageRepository, genderRepository, raceRepository\n ) {\n // ReSharper disable PossiblyUnassignedProperty\n var moment = window.moment;\n var _ = window._;\n\n // Controller as vm - see route configuration\n var levelFiveSixVM = $scope.levelFiveSixVM;\n levelFiveSixVM.addParticipantVM = this;\n\n if (!levelFiveSixVM.academicYearId) {\n $state.go('^');\n }\n\n // Properties associated to view model - sorted alphabetically\n // helps you instantly identify which members of the controller can be bound and used in the View\n levelFiveSixVM.addParticipantVM.actions = [];\n levelFiveSixVM.addParticipantVM.behaviorLevels = [];\n levelFiveSixVM.addParticipantVM.behaviorRoles = [];\n levelFiveSixVM.addParticipantVM.genders = [];\n levelFiveSixVM.addParticipantVM.races = [];\n levelFiveSixVM.addParticipantVM.isActionCollapsed = false;\n levelFiveSixVM.addParticipantVM.isInterventionCollapsed = true;\n levelFiveSixVM.addParticipantVM.isLoading = true;\n levelFiveSixVM.addParticipantVM.isMotivationCollapsed = true;\n levelFiveSixVM.addParticipantVM.isStateQuestionAnswerCollapsed = false;\n levelFiveSixVM.addParticipantVM.interventions = [];\n levelFiveSixVM.addParticipantVM.levelHasChanged = false;\n levelFiveSixVM.addParticipantVM.motivations = [];\n levelFiveSixVM.addParticipantVM.restraintPopoverName = 'restraintPopover';\n levelFiveSixVM.addParticipantVM.seclusionPopoverName = 'seclusionPopover';\n levelFiveSixVM.addParticipantVM.participant = {\n selectedParticipantType: null,\n otherParticipantAge: null,\n otherParticipantRace: null,\n otherParticipantIsHispanic: null,\n otherParticipantSex: null,\n selectedPerson: null,\n selectedRole: null,\n selectedLevel: null,\n notes: '',\n isPendingLevel6: false,\n isRestraint: false,\n isSecluded: false,\n restartBspCount: false,\n selectedActions: [],\n selectedInterventions: [],\n selectedMotivations: [],\n selectedStateQuestions: [],\n isSpecialEd: false,\n isSection504: false,\n maxExpulsionDuration: null\n };\n levelFiveSixVM.addParticipantVM.participantTypes = [];\n levelFiveSixVM.addParticipantVM.dynamicFormFields = null;\n levelFiveSixVM.addParticipantVM.searchPersons = [];\n levelFiveSixVM.addParticipantVM.searchText = '';\n levelFiveSixVM.addParticipantVM.stateName = \"\";\n levelFiveSixVM.addParticipantVM.stateQuestions = [];\n levelFiveSixVM.addParticipantVM.statesWithUniqueMinMaxDurations = [\"New York\", \"Wisconsin\"]; // hard-coded until P2 Behavior DB restructuring - Workfront Ref #64972/67297\n\n var widgetPositioning = {\n horizontal: 'auto',\n vertical: 'bottom'\n };\n\n function getActionDateEntryOptions(action) {\n return {\n widgetPositioning: widgetPositioning,\n defaultDate: !_.isEmpty(action) && !_.isEmpty(action.actionStartDate) ? action.actionStartDate : levelFiveSixVM.incidentDate,\n minDate: levelFiveSixVM.incidentDate,\n daysOfWeekDisabled: [0, 6]\n };\n }\n\n function getActionTimeEntryOptions(action) {\n return {\n widgetPositioning: widgetPositioning,\n format: 'LT',\n defaultDate: !_.isEmpty(action) && !_.isEmpty(action.actionStartTime) ? moment(action.actionStartTime) : null\n };\n }\n\n // Navigation pass-thru methods - sorted alphabetically, linked directly to navigationManager method calls\n // helps you instantly identify which members of the controller can be bound and used in the View \n levelFiveSixVM.addParticipantVM.onActionChecked = onActionChecked;\n levelFiveSixVM.addParticipantVM.onActionStartDateChange = onActionStartDateChange;\n levelFiveSixVM.addParticipantVM.onActionStartTimeChange = onActionStartTimeChange;\n levelFiveSixVM.addParticipantVM.onActionDurationChange = onActionDurationChange;\n levelFiveSixVM.addParticipantVM.onBehaviorLevelChange = onBehaviorLevelChange;\n levelFiveSixVM.addParticipantVM.onBehaviorRoleChange = onBehaviorRoleChange;\n levelFiveSixVM.addParticipantVM.onBoardDecisionDateChange = onBoardDecisionDateChange;\n levelFiveSixVM.addParticipantVM.onInterventionChecked = onInterventionChecked;\n levelFiveSixVM.addParticipantVM.onIsRestraintChange = onIsRestraintChange;\n levelFiveSixVM.addParticipantVM.onIsSeclusionChange = onIsSeclusionChange;\n levelFiveSixVM.addParticipantVM.onMotivationChecked = onMotivationChecked;\n levelFiveSixVM.addParticipantVM.onParticipantTypeChange = onParticipantTypeChange;\n levelFiveSixVM.addParticipantVM.onPendingLevel6Change = onPendingLevel6Change;\n levelFiveSixVM.addParticipantVM.onPersonSelect = onPersonSelect;\n levelFiveSixVM.addParticipantVM.onRemoveClick = onRemoveClick;\n levelFiveSixVM.addParticipantVM.onStateQuestionAnswerChange = onStateQuestionAnswerChange;\n levelFiveSixVM.addParticipantVM.onTypeAheadBlur = onTypeAheadBlur;\n levelFiveSixVM.addParticipantVM.recalculateReturnDate = recalculateReturnDate;\n\n // Controller methods associated to view model (init, reset, submit)\n levelFiveSixVM.addParticipantVM.onCancelClick = onCancelClick;\n levelFiveSixVM.addParticipantVM.onSaveClick = onSaveClick;\n levelFiveSixVM.addParticipantVM.getDynamicFormFieldRequired = getDynamicFormFieldRequired;\n\n // All other methods - sorted alphabetically, matching sorted implementations below\n // helps you instantly identify which members of the controller can be bound and used in the View \n levelFiveSixVM.addParticipantVM.actionsFilter = actionsFilter;\n levelFiveSixVM.addParticipantVM.anyStateQuestions = anyStateQuestions;\n levelFiveSixVM.addParticipantVM.getActionDateEntryOptions = getActionDateEntryOptions;\n levelFiveSixVM.addParticipantVM.getActionTimeEntryOptions = getActionTimeEntryOptions;\n levelFiveSixVM.addParticipantVM.getMaxDuration = getMaxDuration;\n levelFiveSixVM.addParticipantVM.getMinDuration = getMinDuration;\n levelFiveSixVM.addParticipantVM.isEditParticipant = isEditParticipant;\n levelFiveSixVM.addParticipantVM.validateNameField = validateNameField;\n levelFiveSixVM.addParticipantVM.showQuestionFilter = showQuestionFilter;\n levelFiveSixVM.addParticipantVM.staffDropdownSingleValueChanged = staffDropdownSingleValueChanged;\n levelFiveSixVM.addParticipantVM.staffDropdownMultipleValueChanged = staffDropdownMultipleValueChanged;\n levelFiveSixVM.addParticipantVM.dropdownMultipleValueChanged = dropdownMultipleValueChanged;\n levelFiveSixVM.addParticipantVM.onStaffTypeaheadBlur = onStaffTypeaheadBlur;\n levelFiveSixVM.addParticipantVM.searchStaff = searchStaff;\n\n // Initialize \n init();\n\n // ------------------ On Change / Event functions --------------------------\n function onCancelClick() {\n levelFiveSixVM.isAddingAParticipant = false; // collapse add participant window\n levelFiveSixVM.isEditingAParticipant = false; // collapse edit participant window\n }\n\n function onRemoveClick() {\n levelFiveSixVM.participants.splice(levelFiveSixVM.participantIndex, 1);\n onCancelClick();\n }\n\n function saveParticipant() {\n // Make sure the values in the action and state question forms are being recorded on the participant object\n //log('saveParticipant(), entry, participant: ', levelFiveSixVM.addParticipantVM.participant);\n\n updateParticipantWithCheckedActions();\n updateParticipantWithStateQuestions();\n\n //log('saveParticipant(), after checkedActions and stateQuestions updates, participant: ', levelFiveSixVM.addParticipantVM.participant);\n\n var actionsForUi = levelFiveSixVM.getActionsForUi(levelFiveSixVM.addParticipantVM.participant);\n\n levelFiveSixVM.addParticipantVM.participant.levelFiveUi = {\n fullName: levelFiveSixVM.addParticipantVM.participant.selectedPerson.name || levelFiveSixVM.addParticipantVM.participant.selectedPerson,\n role: levelFiveSixVM.getRoleNameById(levelFiveSixVM.addParticipantVM.behaviorRoles, levelFiveSixVM.addParticipantVM.participant.selectedRole),\n level: levelFiveSixVM.getLevelforUi(levelFiveSixVM.addParticipantVM.participant),\n actionTaken: actionsForUi ? _.map(actionsForUi, 'name') : null,\n actionStartDate: actionsForUi ? _.map(actionsForUi, 'startDate') : null,\n actionEndDate: actionsForUi ? _.map(actionsForUi, 'endDate') : null,\n duration: actionsForUi ? _.map(actionsForUi, 'duration') : null,\n\n\n // Student only fields\n studentInSchoolId: levelFiveSixVM.addParticipantVM.participant.selectedPerson.personID,\n studentId: levelFiveSixVM.addParticipantVM.participant.selectedPerson.studentID,\n activeBSP: levelFiveSixVM.addParticipantVM.participant.selectedPerson.activeBSP,\n isSpecialEd: levelFiveSixVM.addParticipantVM.participant.selectedPerson.isSpecialEd,\n isSection504: levelFiveSixVM.addParticipantVM.participant.selectedPerson.isSection504,\n isInSchoolSuspended: levelFiveSixVM.addParticipantVM.participant.selectedPerson.isInSchoolSuspended,\n isOutOfSchoolSuspended: levelFiveSixVM.addParticipantVM.participant.selectedPerson.isOutOfSchoolSuspended,\n isLongTermSuspended: levelFiveSixVM.addParticipantVM.participant.selectedPerson.isLongTermSuspended,\n isExpelled: levelFiveSixVM.addParticipantVM.participant.selectedPerson.isExpelled\n };\n\n if (isEditParticipant()) {\n levelFiveSixVM.participants.splice(levelFiveSixVM.participantIndex, 1, levelFiveSixVM.addParticipantVM.participant);\n } else {\n levelFiveSixVM.participants.push(levelFiveSixVM.addParticipantVM.participant);\n }\n }\n\n function onSaveClick() {\n if (isFormValid()) {\n var actionDatesToCheckPromises = _(levelFiveSixVM.addParticipantVM.participant.selectedActions)\n .filter({ 'formChecked': true, isStartDateRequired: true })\n .map(function (action) {\n return behaviorEventIncidentRepository.isWithinAcademicSchoolYear({\n SchoolID: levelFiveSixVM.schoolId,\n AcademicYearID: levelFiveSixVM.academicYearId,\n Date: moment(action.actionStartDate).format('YYYY-MM-DD')\n });\n })\n .value();\n\n $q.all(actionDatesToCheckPromises)\n .then(function (results) {\n var flatResults = _.flatten(results);\n var hasActionDatesOutsideAcademicYear = _.some(flatResults, function (result) {\n return result == false;\n });\n\n if (hasActionDatesOutsideAcademicYear) {\n behaviorAlertService.goSwal(\"warningWithMsg\", null, \"Action date(s) must be within Academic Year. Please correct and try again.\");\n } else {\n saveParticipant();\n levelFiveSixVM.checkForAnyLevelSixParticipantsOnParticipantSave(levelFiveSixVM.participants);\n levelFiveSixVM.isAddingAParticipant = false; // collapse add participant window\n levelFiveSixVM.isEditingAParticipant = false; // collapse edit participant window\n }\n });\n } else {\n behaviorAlertService.goSwal(\"validationFailure\", null, \"Please complete required fields before saving\");\n }\n }\n\n function onParticipantTypeChange() {\n // Reset dependent fields\n resetRoleField();\n resetNameField();\n resetLevelField();\n resetEventParticipantOptionFields();\n\n // Prepare next field to be filled out\n loadBehaviorRoles();\n }\n\n function onBehaviorRoleChange() {\n // Prepare next field to be filled out\n if (levelFiveSixVM.isOffenderOrParticipant(levelFiveSixVM.addParticipantVM.participant)) {\n if (levelFiveSixVM.isBehaviorAdd() || (!levelFiveSixVM.addParticipantVM.participant.selectedLevel && !levelFiveSixVM.addParticipantVM.participant.isPendingLevel6)) {\n // Select level 5 if it's the only option and they're not pending level 6\n levelFiveSixVM.addParticipantVM.participant.selectedLevel = 5;\n loadLevels();\n onBehaviorLevelChange();\n }\n } else {\n // Participant is a Witness or Victim\n resetLevelField();\n resetEventParticipantOptionFields();\n resetParticipantCheckboxFields();\n\n cleanParticipantData();\n }\n }\n\n function onBehaviorLevelChange() {\n levelFiveSixVM.addParticipantVM.levelHasChanged = true;\n if (levelFiveSixVM.addParticipantVM.participant.isPendingLevel6 && levelFiveSixVM.addParticipantVM.participant.selectedLevel === 6) {\n levelFiveSixVM.addParticipantVM.participant.isPendingLevel6 = false;\n }\n\n if (levelFiveSixVM.isOffenderOrParticipant(levelFiveSixVM.addParticipantVM.participant)) {\n // Prepare next field to be filled out\n loadBehaviorLevelDependentFields();\n }\n }\n\n function onActionStartDateChange(action) {\n $timeout(function () {\n if (action.isDecisionDateRequired) {\n validateBoardDecisionDate();\n }\n else if (action.isReturnDateRequired) {\n //log('onActionStartDateChange - calling recalc', action);\n recalculateReturnDate(action);\n }\n }, 50);\n\n }\n\n function onActionStartTimeChange(action) {\n //log('onActionStartTimeChange. action:', action);\n if (action.isReturnDateRequired && action.actionDuration < 1) {\n $timeout(function () {\n recalculateReturnDate(action);\n }, 50);\n }\n }\n\n function onBoardDecisionDateChange(action) {\n if (!levelFiveSixVM.addParticipantVM.actionsLoading) {\n $timeout(function () {\n validateBoardDecisionDate();\n //log('onBoardDecisionDateChange - calling recalc', action);\n recalculateReturnDate(action);\n }, 50);\n }\n }\n\n function onStateQuestionAnswerChange() {\n levelFiveSixVM.addParticipantVM.form.stateQuestionAnswers.$setValidity(\n 'unanswered',\n true\n );\n\n showHideStateQuestions();\n }\n\n function onActionDurationChange(action) {\n if (!levelFiveSixVM.addParticipantVM.actionsLoading) {\n action.excessDays = 0; //reset for revalidation\n $timeout(function () {\n validateActionDuration();\n if (action.isReturnDateRequired) {\n //log('onActionDurationChange - calling recalc', action);\n recalculateReturnDate(action);\n }\n }, 50);\n }\n }\n\n var updateParticipantWithCheckedMotivations = updateParticipantWithCheckedOptions(levelFiveSixVM.addParticipantVM.motivations, levelFiveSixVM.addParticipantVM.participant.selectedMotivations);\n var updateParticipantWithCheckedInterventions = updateParticipantWithCheckedOptions(levelFiveSixVM.addParticipantVM.interventions, levelFiveSixVM.addParticipantVM.participant.selectedInterventions);\n var updateParticipantWithCheckedActions = updateParticipantWithCheckedOptions(levelFiveSixVM.addParticipantVM.actions, levelFiveSixVM.addParticipantVM.participant.selectedActions);\n\n function onMotivationChecked(motivation) {\n /* No longer required - WF #184703\n validateEventParticipantOptionsSelectedCount(addParticipantVM.form.motivations.$name, addParticipantVM.motivations); */\n\n updateParticipantWithCheckedMotivations();\n }\n\n function onInterventionChecked(intervention) {\n /* No longer required - WF #184703\n validateEventParticipantOptionsSelectedCount(addParticipantVM.form.interventions.$name, addParticipantVM.interventions); */\n\n updateParticipantWithCheckedInterventions();\n }\n\n function onActionChecked(checkedAction) {\n // Checks to make sure the user has at least one action selected\n validateEventParticipantOptionsSelectedCount(levelFiveSixVM.addParticipantVM.form.actions.$name, levelFiveSixVM.addParticipantVM.actions);\n\n // if checkedAction is ISS/OSS/EXP, deselect currently selected ISS/OSS/EXP\n unCheckPreviousIssOssExp(checkedAction);\n\n showHideStateQuestions();\n\n checkedAction.checkedTimestamp = moment().toDate();\n updateParticipantWithCheckedActions();\n }\n\n function onPendingLevel6Change() {\n if (!levelFiveSixVM.addParticipantVM.participant.isPendingLevel6 && levelFiveSixVM.addParticipantVM.participant.selectedLevel !== 6) {\n _(levelFiveSixVM.addParticipantVM.actions)\n .filter('isPendingLevel6')\n .each(function (action) {\n action.formChecked = false;\n });\n }\n }\n\n function onIsSeclusionChange() {\n showHideStateQuestions();\n }\n\n function onIsRestraintChange() {\n showHideStateQuestions();\n }\n\n function unCheckPreviousIssOssExp(checkedAction) {\n // Check if the checked action is In School, Out Of School, or Expulsion \n if (!isActionIssOssLtsExp(checkedAction)) return;\n\n _(levelFiveSixVM.addParticipantVM.actions)\n .filter(function (action) {\n return action.formChecked === true &&\n action.behaviorActionID != checkedAction.behaviorActionID &&\n isActionIssOssLtsExp(action);\n })\n .each(function (action) {\n action.formChecked = false;\n });\n }\n\n function isActionIssOssLtsExp(action) {\n return action.isInSchoolSuspension || action.isOutOfSchoolSuspension || action.isExpulsion || action.isLongTermSuspension;\n }\n\n function getDynamicFormFieldRequired(fieldName) {\n var retVal = levelFiveSixVM.addParticipantVM.dynamicFormFields.find(function (val) {\n return val.fieldName = fieldName;\n });\n\n if (!retVal) {\n return false;\n }\n else {\n return retVal.fieldDisplayOptionID == 1\n }\n }\n\n // ------------------ Field Reset functions --------------------------\n function resetParticipantCheckboxFields() {\n levelFiveSixVM.addParticipantVM.participant.isPendingLevel6 = false;\n levelFiveSixVM.addParticipantVM.participant.isRestraint = false;\n levelFiveSixVM.addParticipantVM.participant.isSecluded = false;\n levelFiveSixVM.addParticipantVM.participant.restartBspCount = false;\n }\n\n function resetEventParticipantOptionFields() {\n levelFiveSixVM.addParticipantVM.actions.length = 0;\n levelFiveSixVM.addParticipantVM.interventions.length = 0;\n levelFiveSixVM.addParticipantVM.motivations.length = 0;\n levelFiveSixVM.addParticipantVM.stateQuestions.length = 0;\n }\n\n function resetRoleField() {\n levelFiveSixVM.addParticipantVM.participant.selectedRole = null;\n levelFiveSixVM.addParticipantVM.behaviorRoles.length = 0;\n }\n\n function resetNameField() {\n levelFiveSixVM.addParticipantVM.participant.selectedPerson = null;\n levelFiveSixVM.addParticipantVM.searchPersons.length = 0;\n }\n\n function resetLevelField() {\n levelFiveSixVM.addParticipantVM.behaviorLevels.length = 0;\n }\n\n // ------------------ Data load functions --------------------------\n function loadParticipantTypes() {\n return participantTypeRepository.getAll().then(function (results) {\n levelFiveSixVM.addParticipantVM.participantTypes = results;\n });\n }\n\n function loadDynamicFormFields() {\n var params = { 'businessApplicationId': 15, 'screenId': 21, 'academicYearId': levelFiveSixVM.academicYearId, 'schoolId': levelFiveSixVM.schoolId }\n return screenFieldUsageRepository.getAll(params).then(function (results) {\n levelFiveSixVM.addParticipantVM.dynamicFormFields = results.filter(function (val) {\n return val.fieldDisplayOptionID != 3; // 3=hide\n });\n });\n }\n\n function loadGenders() {\n return genderRepository.getGenders().then(function (results) {\n levelFiveSixVM.addParticipantVM.genders = results\n });\n }\n\n function loadRaces() {\n return raceRepository.getRaces().then(function (results) {\n levelFiveSixVM.addParticipantVM.races = results\n });\n }\n\n function loadBehaviorRoles() {\n return roleRepository.getAll().then(function (results) {\n\n if (levelFiveSixVM.isParticipantTypeStudent(levelFiveSixVM.addParticipantVM.participant.selectedParticipantType)) {\n levelFiveSixVM.addParticipantVM.behaviorRoles = results;\n } else {\n levelFiveSixVM.addParticipantVM.behaviorRoles = _.filter(results, function (role) {\n return levelFiveSixVM.isWitnessOrVictim(role.behaviorRoleID);\n });\n }\n });\n }\n\n function loadLevels() {\n var value = 5;\n\n if (levelFiveSixVM.addParticipantVM.participant.isPendingLevel6 || levelFiveSixVM.addParticipantVM.participant.selectedLevel === 6) {\n value = 6;\n }\n\n return levelRepository.getAll().then(function (results) {\n levelFiveSixVM.addParticipantVM.behaviorLevels = _(results)\n .filter(function (l) { return l.behaviorLevelID === 5 || l.behaviorLevelID === value })\n .value();\n });\n }\n\n function loadMotivations() {\n if (!levelFiveSixVM.addParticipantVM.participant.selectedLevel) return;\n\n return motivationRepository.getByLevel(levelFiveSixVM.addParticipantVM.participant.selectedLevel).then(function (results) {\n levelFiveSixVM.addParticipantVM.motivations.length = 0;\n Array.prototype.push.apply(levelFiveSixVM.addParticipantVM.motivations, results);\n });\n }\n\n function loadInterventions() {\n if (!levelFiveSixVM.addParticipantVM.participant.selectedLevel) return;\n\n return interventionRepository.getByLevel(levelFiveSixVM.addParticipantVM.participant.selectedLevel).then(function (results) {\n levelFiveSixVM.addParticipantVM.interventions.length = 0;\n Array.prototype.push.apply(levelFiveSixVM.addParticipantVM.interventions, results);\n });\n }\n\n function loadActions() {\n var observationActionParams = levelFiveSixVM.getObservationActionParams();\n\n if (levelFiveSixVM.addParticipantVM.participant.selectedLevel) { observationActionParams.behaviorLevelID = levelFiveSixVM.addParticipantVM.participant.selectedLevel; }\n\n return actionRepository.getAll(observationActionParams).then(function (results) {\n levelFiveSixVM.addParticipantVM.actionsLoading = true;\n levelFiveSixVM.addParticipantVM.actions.length = 0;\n Array.prototype.push.apply(levelFiveSixVM.addParticipantVM.actions, results);\n $timeout(function () {\n levelFiveSixVM.addParticipantVM.actionsLoading = false;\n }, 700);\n });\n }\n\n function loadStateNameBySchoolId() {\n return stateBehaviorQuestionAnswerService.getStateNameBySchoolId(levelFiveSixVM.schoolId).then(function (stateName) {\n levelFiveSixVM.addParticipantVM.stateName = stateName;\n });\n }\n\n function loadSchoolStaffList() {\n return stateBehaviorQuestionAnswerService.getSchoolStaffList(levelFiveSixVM.schoolId, levelFiveSixVM.academicYearId).then(function (results) {\n levelFiveSixVM.addParticipantVM.schoolStaffList = _.sortBy(results, ['lastName', 'firstName']);\n //log('schoolStaffList after sort', levelFiveSixVM.addParticipantVM.schoolStaffList);\n });\n }\n\n function loadStateQuestionAnswers() {\n if (!levelFiveSixVM.addParticipantVM.participant.selectedLevel) return;\n\n return stateBehaviorQuestionAnswerService.getActionQuestionAnswer(levelFiveSixVM.stateID, levelFiveSixVM.addParticipantVM.participant.selectedLevel).then(function (results) {\n levelFiveSixVM.addParticipantVM.stateQuestions.length = 0;\n\n var seclusionRestraintOrderIndex = 0;\n var modifiedResults = _(results)\n .orderBy(['orderNumber'], ['desc'])\n .map(function (qa) {\n qa.answerDataType = qa.answerDataType ? qa.answerDataType.toLowerCase() : null;\n qa.selectedAnswer = null;\n qa.enabled = false;\n\n // This is to order the seclusion restrain questions properly. Should probably get moved to DB.\n if (qa.behaviorActionID === null) {\n qa.orderNumber = --seclusionRestraintOrderIndex;\n }\n\n return qa;\n }).value();\n\n Array.prototype.push.apply(levelFiveSixVM.addParticipantVM.stateQuestions, modifiedResults);\n });\n }\n\n function loadBehaviorLevelDependentFields() {\n var initialActions = _.cloneDeep(levelFiveSixVM.addParticipantVM.actions);\n var initialInterventions = _.clone(levelFiveSixVM.addParticipantVM.interventions);\n var initialMotivations = _.clone(levelFiveSixVM.addParticipantVM.motivations);\n var initialStateQuestions = _.clone(levelFiveSixVM.addParticipantVM.stateQuestions);\n\n $q.all([\n loadActions(),\n loadMotivations(),\n loadInterventions(),\n loadStateQuestionAnswers(),\n loadSchoolStaffList()\n ]).then(function () {\n if (levelFiveSixVM.addParticipantVM.levelHasChanged) {\n matchParticipantActionsMotivationsInterventionsQuestions(levelFiveSixVM.addParticipantVM.actions, initialActions, levelFiveSixVM.addParticipantVM.participant.selectedActions, 'Action', 'actions');\n matchParticipantActionsMotivationsInterventionsQuestions(levelFiveSixVM.addParticipantVM.interventions, initialInterventions, levelFiveSixVM.addParticipantVM.participant.selectedInterventions, 'Intervention', 'interventions');\n matchParticipantActionsMotivationsInterventionsQuestions(levelFiveSixVM.addParticipantVM.motivations, initialMotivations, levelFiveSixVM.addParticipantVM.participant.selectedMotivations, 'Motivation', 'motivations');\n matchParticipantActionsMotivationsInterventionsQuestions(levelFiveSixVM.addParticipantVM.stateQuestions, initialStateQuestions, levelFiveSixVM.addParticipantVM.participant.selectedStateQuestions, 'StateBehaviorActionQuestion', 'stateQuestions');\n\n levelFiveSixVM.addParticipantVM.levelHasChanged = false;\n }\n\n _.forEach(levelFiveSixVM.addParticipantVM.stateQuestions, function (q) {\n if (q.answerDataType === 'staffdropdownsinglevalue') {\n q.schoolStaffList = _.cloneDeep(levelFiveSixVM.addParticipantVM.schoolStaffList);\n //q.textDisplay = \"Select one...\";\n }\n\n if (q.answerDataType === 'staffdropdownmultiplevalue') {\n q.schoolStaffList = _.cloneDeep(levelFiveSixVM.addParticipantVM.schoolStaffList);\n q.textDisplay = \"Select all that apply...\";\n }\n });\n\n\n //log('loadBehaviorLevelDependentFields - calling updates, participant: ', levelFiveSixVM.addParticipantVM.participant);\n updateFromParticipantSelectedOptions(levelFiveSixVM.addParticipantVM.actions, levelFiveSixVM.addParticipantVM.participant.selectedActions, 'behaviorActionID');\n updateFromParticipantSelectedOptions(levelFiveSixVM.addParticipantVM.motivations, levelFiveSixVM.addParticipantVM.participant.selectedMotivations, 'behaviorMotivationID');\n updateFromParticipantSelectedOptions(levelFiveSixVM.addParticipantVM.interventions, levelFiveSixVM.addParticipantVM.participant.selectedInterventions, 'behaviorInterventionID');\n //updateFromParticipantSelectedOptions(addParticipantVM.stateQuestions, addParticipantVM.participant.selectedStateQuestions, 'stateBehaviorActionQuestionID');\n //log('loadBehaviorLevelDependentFields, participant & selectedStateQuestions: ', levelFiveSixVM.addParticipantVM.participant, levelFiveSixVM.addParticipantVM.participant.selectedStateQuestions);\n updateFromParticipantSelectedActionQuestionResults(levelFiveSixVM.addParticipantVM.stateQuestions, levelFiveSixVM.addParticipantVM.participant.selectedStateQuestions);\n showHideStateQuestions();\n });\n }\n\n $scope.searchPerson = function (name) {\n var params = [name],\n searchFn;\n\n var selectedTypeName = levelFiveSixVM.getParticipantTypeName(levelFiveSixVM.addParticipantVM.participantTypes, levelFiveSixVM.addParticipantVM.participant);\n\n if (selectedTypeName === \"Other\") {\n return;\n }\n\n switch (selectedTypeName) {\n case 'Student':\n searchFn = studentListService.searchStudentsIndicators;\n params.push(levelFiveSixVM.schoolId);\n params.push(levelFiveSixVM.academicYearId);\n break;\n case 'Guardian':\n searchFn = personSearchService.parentSearch;\n params.push(levelFiveSixVM.schoolId);\n params.push(levelFiveSixVM.academicYearId);\n break;\n case 'Staff':\n searchFn = personSearchService.staffSearch;\n params.push(levelFiveSixVM.schoolId);\n break;\n default:\n return;\n }\n\n return searchFn.apply(null, params).then(onSuccessfullPersonSearch);\n };\n\n function onSuccessfullPersonSearch(results) {\n levelFiveSixVM.addParticipantVM.isNameTypeaheadLoading = false;\n return _(results)\n .filter(function (r) {\n var searchResultPersonId = r.studentInSchoolID || r.personID;\n\n var personHasBeenAddedToIncident = _.some(levelFiveSixVM.participants, function (participant) {\n return participant.selectedPerson.personID === searchResultPersonId;\n });\n\n return !personHasBeenAddedToIncident;\n })\n .map(function (r) {\n r.name = r.firstName + ' ' + r.lastName;\n\n if (r.studentInSchoolID) {\n r.personID = r.studentInSchoolID;\n }\n\n return r;\n })\n .value();\n }\n\n function onPersonSelect($item, $model, $label, $event) {\n if (levelFiveSixVM.isParticipantTypeStudent(levelFiveSixVM.addParticipantVM.participant.selectedParticipantType) && $item) {\n levelFiveSixVM.addParticipantVM.participant.isSpecialEd = $item.isSpecialEd;\n levelFiveSixVM.addParticipantVM.participant.isSection504 = $item.isSection504;\n }\n }\n\n function onTypeAheadBlur() {\n validateNameField();\n\n if (levelFiveSixVM.addParticipantVM.form.nameField.$invalid) {\n levelFiveSixVM.addParticipantVM.participant.selectedPerson = '';\n }\n }\n\n function recalculateReturnDate(action) {\n var actionFormId = 'actionControl_' + action.behaviorActionID;\n //log('recalculateReturnDate called action: ', action, addParticipantVM.actionsLoading);\n\n if (!levelFiveSixVM.addParticipantVM.actionsLoading && action.isReturnDateRequired && levelFiveSixVM.addParticipantVM.form[actionFormId].$valid) {\n //log('recalculateReturnDate called action: ', action, addParticipantVM.actionsLoading);\n if (((action.isDecisionDateRequired && action.boardDecisionDate) || (!action.isDecisionDateRequired && action.actionStartDate)) && action.actionDuration && action.actionStartTime && !levelFiveSixVM.addParticipantVM.participant.isPendingLevel6) {\n //var startDate = action.isDecisionDateRequired ? moment(action.boardDecisionDate).format('YYYY-MM-DD') : moment(action.actionStartDate).format('YYYY-MM-DD');\n // https://nhaschools.my.workfront.com/task/view?ID=5a7df4080094f8e7d4d7e39a4044da3d\n var startDate = moment(action.actionStartDate).format('YYYY-MM-DD');\n var schoolId = levelFiveSixVM.schoolId;\n var academicYearId = levelFiveSixVM.academicYearId;\n var eventDate = moment(levelFiveSixVM.incidentDate).format('YYYY-MM-DD');\n var startTime = moment(action.actionStartTime).format('HH:mm:ss')\n var duration = parseFloat(action.actionDuration);\n\n if (duration >= action.minDuration) {\n behaviorEventIncidentRepository.getProjectedReturnDate(academicYearId, schoolId, eventDate, startDate, startTime, duration).then(function (result) {\n if (result.returnDate) {\n action.returnDate = action.actionEndDate = moment(result.returnDate).format('MM/DD/YYYY');\n } else {\n action.returnDate = action.actionEndDate = null;\n }\n action.isContinuingInNextAY = result.isContinuingInNextAY;\n if (result.stateID === 36) {\n action.actionDaysExtendedInNextAY = action.isExpulsion ? result.daysContinuingInNextAY : 0; //suspensions won't carry over to next year in Ohio, expulsions will\n action.excessDays = action.isExpulsion || action.isPendingLevel6 ? 0 : result.daysContinuingInNextAY; //used for OH to trigger duration error messaging for (L5/L6 - not L5-pending 6) suspensions only\n }\n else {\n action.actionDaysExtendedInNextAY = result.daysContinuingInNextAY;\n action.excessDays = 0;\n }\n\n validateActionDuration(); //new message tied to action.excessDays needs to be reevaluated.\n\n if (action.isContinuingInNextAY) {\n var msg = '';\n\n if (result.stateID === 36 && (action.isLongTermSuspension || action.isOutOfSchoolSuspension)) {\n msg = \"The student's projected return date extends into the next academic year. State law prohibits continuing suspensions into a new academic year. There are only \"\n + (action.actionDuration - action.excessDays).toString() + \" days left in the current academic year.\";\n }\n else {\n msg = \"Student is expected to return in the next academic year. Student will have \"\n + action.actionDaysExtendedInNextAY.toString()\n + (action.isExpulsion ? \" expulsion\" : \" suspension\")\n + \" days remaining in the new year.\";\n }\n\n swal({\n title: \"Warning!\",\n text: msg,\n type: 'warning',\n showCancelButton: false,\n confirmButtonColor: '#DD6B55',\n confirmButtonText: 'OK',\n closeOnConfirm: true\n });\n }\n });\n }\n }\n }\n }\n\n // ------------------ Form validation functions --------------------------\n function setFormDirty() {\n levelFiveSixVM.addParticipantVM.form.typeField.$setDirty();\n levelFiveSixVM.addParticipantVM.form.nameField.$setDirty();\n levelFiveSixVM.addParticipantVM.form.roleField.$setDirty();\n levelFiveSixVM.addParticipantVM.form.levelField.$setDirty();\n\n levelFiveSixVM.addParticipantVM.form.participantNotes.$setDirty();\n levelFiveSixVM.addParticipantVM.form.motivations.$setDirty();\n levelFiveSixVM.addParticipantVM.form.interventions.$setDirty();\n levelFiveSixVM.addParticipantVM.form.actions.$setDirty();\n }\n\n function isFormValid() {\n setFormDirty();\n\n // Each of these will set the form field to $invalid == true AND show validation messages...\n validateNameField();\n\n validateEventParticipantOptionsSelectedCount(levelFiveSixVM.addParticipantVM.form.actions.$name, levelFiveSixVM.addParticipantVM.actions);\n\n /* No longer required - WF #184703\n validateEventParticipantOptionsSelectedCount(addParticipantVM.form.motivations.$name, addParticipantVM.motivations);\n validateEventParticipantOptionsSelectedCount(addParticipantVM.form.interventions.$name, addParticipantVM.interventions); */\n\n validateSelectedActions();\n validateStateQuestions();\n\n // Check if all fields are valid\n var validity = levelFiveSixVM.addParticipantVM.form.typeField.$valid &&\n levelFiveSixVM.addParticipantVM.form.nameField.$valid &&\n levelFiveSixVM.addParticipantVM.form.roleField.$valid &&\n levelFiveSixVM.addParticipantVM.form.levelField.$valid &&\n levelFiveSixVM.addParticipantVM.form.participantNotes.$valid;\n\n // potentially hidden dynamic form fields\n var dynamicFields = [levelFiveSixVM.addParticipantVM.form.ageField, levelFiveSixVM.addParticipantVM.form.raceField, levelFiveSixVM.addParticipantVM.form.ethnicityField, levelFiveSixVM.addParticipantVM.form.sexField]\n dynamicFields.forEach(function (val) {\n // might be null\n if (val) {\n validity = validity && val.$valid;\n }\n });\n\n if (levelFiveSixVM.isOffenderOrParticipant(levelFiveSixVM.addParticipantVM.participant)) {\n validity = levelFiveSixVM.addParticipantVM.form.motivations.$valid &&\n levelFiveSixVM.addParticipantVM.form.interventions.$valid &&\n levelFiveSixVM.addParticipantVM.form.actions.$valid &&\n isAllActionDurationValid() &&\n levelFiveSixVM.addParticipantVM.form.stateQuestionAnswers.$valid;\n }\n\n return validity;\n }\n\n function validateStateQuestions() {\n var isValid = levelFiveSixVM.areAllStateQuestionsAnswered(levelFiveSixVM.addParticipantVM.stateQuestions);\n\n levelFiveSixVM.addParticipantVM.form.stateQuestionAnswers.$setValidity(\n 'unanswered',\n isValid\n );\n }\n\n function validateNameField() {\n // Validates the case of a participant being of type Other or something else.\n var isValid = !_.isEmpty(levelFiveSixVM.addParticipantVM.participant.selectedPerson) &&\n ((levelFiveSixVM.isParticipantTypeOther(levelFiveSixVM.addParticipantVM.participant.selectedParticipantType) && levelFiveSixVM.addParticipantVM.participant.selectedPerson.length > 0) ||\n levelFiveSixVM.addParticipantVM.participant.selectedPerson.name === levelFiveSixVM.addParticipantVM.form.nameField.$viewValue);\n\n levelFiveSixVM.addParticipantVM.form.nameField.$setValidity(\n 'nameError',\n isValid\n );\n }\n\n // Validate that at least one option has been selected.\n function validateEventParticipantOptionsSelectedCount(formFieldName, eventParticipantOptions) {\n levelFiveSixVM.addParticipantVM.form[formFieldName].$setValidity(\n 'selectionError',\n _(eventParticipantOptions).filter({ 'formChecked': true }).size() > 0\n );\n }\n\n function validateSelectedActions() {\n updateParticipantWithCheckedActions();\n validateActionDuration();\n validateBoardDecisionDate();\n\n var actionDateTimeValid = _(levelFiveSixVM.addParticipantVM.participant.selectedActions)\n .filter({ 'formChecked': true, isStartDateRequired: true, isStartTimeRequired: false })\n .every(isActionDateValid);\n\n actionDateTimeValid = actionDateTimeValid && _(levelFiveSixVM.addParticipantVM.participant.selectedActions)\n .filter({ 'formChecked': true, isStartTimeRequired: true })\n .every(isActionDateTimeValid);\n\n levelFiveSixVM.addParticipantVM.form.actions.$setValidity(\n 'actionBadDateTime',\n actionDateTimeValid\n );\n }\n\n function validateBoardDecisionDate() {\n _(levelFiveSixVM.addParticipantVM.actions)\n .filter({ 'formChecked': true, isDecisionDateRequired: true })\n .each(function (action) {\n var actionFormId = 'actionControl_' + action.behaviorActionID;\n\n levelFiveSixVM.addParticipantVM.form[actionFormId].$setValidity(\n 'actionBoardDecisionDateInvalid',\n isBoardDecisionDateValid(action)\n );\n\n levelFiveSixVM.addParticipantVM.form[actionFormId].$setValidity(\n 'actionBoardDecisionDateFuture',\n isBoardDecisionDateNotInFuture(action)\n );\n });\n }\n\n function validateActionDuration() {\n _(levelFiveSixVM.addParticipantVM.actions)\n .filter({ 'formChecked': true, isDurationRequired: true })\n .each(function (action) {\n var actionFormId = 'actionControl_' + action.behaviorActionID;\n\n levelFiveSixVM.addParticipantVM.form[actionFormId].$setValidity(\n 'actionDurationUnderMin',\n isMinDurationValid(action)\n );\n\n levelFiveSixVM.addParticipantVM.form[actionFormId].$setValidity(\n 'actionDurationOverMax',\n isMaxDurationValid(action)\n );\n\n levelFiveSixVM.addParticipantVM.form[actionFormId].$setValidity(\n 'actionOhioDurationTooLong',\n (action.excessDays || 0) < 1\n );\n });\n }\n\n function isAllActionDurationValid() {\n return _(levelFiveSixVM.addParticipantVM.actions)\n .filter({ 'formChecked': true, isDurationRequired: true })\n .every(function (action) {\n var actionFormId = 'actionControl_' + action.behaviorActionID;\n\n return levelFiveSixVM.addParticipantVM.form[actionFormId].$valid;\n });\n }\n\n function isBoardDecisionDateValid(action) {\n if (action.actionStartDate && action.boardDecisionDate) {\n return moment(action.actionStartDate).isSameOrBefore(moment(action.boardDecisionDate), 'day')\n }\n return true;\n }\n\n function isBoardDecisionDateNotInFuture(action) {\n if (action.boardDecisionDate) {\n return moment(action.boardDecisionDate).isSameOrBefore(moment(), 'day');\n }\n return true;\n }\n\n function isMinDurationValid(action) {\n if (!action) {\n return false;\n }\n\n var duration = parseFloat(action.actionDuration);\n\n var minDuration = getMinDuration(action);\n\n return !_.isNaN(duration) && duration >= minDuration;\n }\n\n function isMaxDurationValid(action) {\n if (!action) {\n return false;\n }\n\n var duration = parseFloat(action.actionDuration);\n\n var maxDuration = getMaxDuration(action);\n\n return !_.isNaN(duration) && duration <= maxDuration;\n }\n\n function getMinDuration(action) {\n if (action.isInSchoolSuspension || action.isOutOfSchoolSuspension || action.isLongTermSuspension) {\n return getMinOrMaxDuration(action, \"min\");\n } else {\n return levelFiveSixVM.addParticipantVM.participant.isPendingLevel6 && action.maxDuration ? action.maxDuration + 1 : 0.5;\n }\n }\n\n function getMaxDuration(action) {\n if (action.isInSchoolSuspension || action.isOutOfSchoolSuspension || action.isLongTermSuspension) {\n return getMinOrMaxDuration(action, \"max\");\n } else {\n return !levelFiveSixVM.addParticipantVM.participant.isPendingLevel6 && action.maxDuration ? action.maxDuration : 999;\n }\n }\n\n function getMinOrMaxDuration(action, typeOfDuration) {\n // Special logic for ISS and OSS - Workfront Ref #64972/67297\n if (_.includes(levelFiveSixVM.addParticipantVM.statesWithUniqueMinMaxDurations, levelFiveSixVM.addParticipantVM.stateName)) {\n if (action.behaviorLevelID === 5) {\n if (levelFiveSixVM.addParticipantVM.participant.isPendingLevel6) {\n return 5;\n } else {\n return typeOfDuration === \"min\" ? (action.minDuration || 0.5) : (action.maxDuration || 6);\n }\n } else if (action.behaviorLevelID === 6) {\n return typeOfDuration === \"min\" ? (action.minDuration || 6) : (action.maxDuration || levelFiveSixVM.addParticipantVM.participant.maxExpulsionDuration);\n }\n } else {\n if (action.behaviorLevelID === 5) {\n if (levelFiveSixVM.addParticipantVM.participant.isPendingLevel6) {\n return 10;\n } else {\n return typeOfDuration === \"min\" ? (action.minDuration || 0.5) : (action.maxDuration || 10);\n }\n } else if (action.behaviorLevelID === 6) {\n return typeOfDuration === \"min\" ? (action.minDuration || 11) : (action.maxDuration || levelFiveSixVM.addParticipantVM.participant.maxExpulsionDuration);\n }\n }\n }\n\n function isActionDateValid(action) {\n if (!action.actionStartDate) {\n return false;\n }\n\n // A positive diff means the actions startTime is before incidentTime\n var actionDate = moment(action.actionStartDate);\n\n var incidentDate = moment(levelFiveSixVM.incidentDate);\n\n return actionDate && moment(actionDate).diff(incidentDate, 'day') >= 0;\n }\n\n function isActionDateTimeValid(action) {\n if (!action.actionStartTime) {\n return false;\n }\n\n // A positive diff means the actions startTime is before incidentTime\n var actionDateTime = moment(action.actionStartDate)\n .set({ hour: moment(action.actionStartTime).hour(), minute: moment(action.actionStartTime).minute() });\n\n var incidentDateTime = moment(levelFiveSixVM.incidentDate)\n .set({ hour: moment(levelFiveSixVM.incidentTime).hour(), minute: moment(levelFiveSixVM.incidentTime).minute() });\n\n return (actionDateTime && incidentDateTime) && moment(actionDateTime).diff(incidentDateTime, 'minute') >= 0;\n }\n\n function isEditParticipant() {\n return levelFiveSixVM.isEditingAParticipant;\n }\n\n /**\n * @name init\n * @description Initialize state of controller\n * @returns undefined\n */\n function init() {\n // Setup participant\n if (isEditParticipant()) {\n cloneParticipant(levelFiveSixVM.participants[levelFiveSixVM.participantIndex]);\n } else {\n levelFiveSixVM.addParticipantVM.participant.selectedParticipantType = 1;\n levelFiveSixVM.addParticipantVM.participant.selectedRole = 1;\n levelFiveSixVM.addParticipantVM.participant.selectedLevel = 5;\n }\n\n if (levelFiveSixVM.isFirstParticipant()) {\n studentListService.getStudentsIndicators(levelFiveSixVM.originalStudent.studentInSchoolID)\n .then(function (result) {\n var student = result[0];\n\n if (!student) return;\n\n levelFiveSixVM.addParticipantVM.participant.selectedPerson = student;\n levelFiveSixVM.addParticipantVM.participant.selectedPerson.name = student.firstName + ' ' + student.lastName;\n levelFiveSixVM.addParticipantVM.participant.selectedPerson.personID = student.studentInSchoolID;\n levelFiveSixVM.addParticipantVM.participant.isSpecialEd = student.isSpecialEd;\n levelFiveSixVM.addParticipantVM.participant.isSection504 = student.isSection504;\n levelFiveSixVM.addParticipantVM.participant.maxExpulsionDuration = student.maxExpulsionDuration;\n });\n }\n\n var queries = [loadParticipantTypes(), loadBehaviorRoles(), loadStateNameBySchoolId(), loadDynamicFormFields(), loadGenders(), loadRaces()];\n\n if (levelFiveSixVM.addParticipantVM.participant.selectedPerson && levelFiveSixVM.addParticipantVM.participant.selectedPerson.personID) {\n queries.push(onPersonSelect());\n }\n\n if (levelFiveSixVM.addParticipantVM.participant.selectedLevel) {\n queries.push(loadLevels());\n queries.push(loadBehaviorLevelDependentFields());\n }\n\n $q.all(queries).then(function () {\n levelFiveSixVM.addParticipantVM.isLoading = false;\n });\n }\n\n // ------------------ State Question / Answer functions --------------------------\n function showHideStateQuestions() {\n var now = moment();\n var effectiveDate = moment(levelFiveSixVM.incidentDate) || moment({\n year: now.year(),\n month: now.month(),\n day: now.date()\n });\n var checkedActions = _(levelFiveSixVM.addParticipantVM.actions)\n .filter({ 'formChecked': true })\n .map('behaviorActionID')\n .value();\n\n var allSelectedAnswers = _(levelFiveSixVM.addParticipantVM.stateQuestions)\n .filter(function (q) {\n return (checkedActions.indexOf(q.behaviorActionID) >= 0 || _.isNull(q.behaviorActionID)) &&\n q.selectedAnswer && q.answerDataType !== \"dropdownmultiplevalue\";\n })\n .map(function (q) { return _.parseInt(q.selectedAnswer) })\n .value();\n\n var multiValueDropdownAnsweredQuestions = _.filter(levelFiveSixVM.addParticipantVM.stateQuestions, function (q) {\n return (checkedActions.indexOf(q.behaviorActionID) >= 0 || _.isNull(q.behaviorActionID)) &&\n _.size(q.selected) > 0 && q.answerDataType === \"dropdownmultiplevalue\";\n });\n if (_.size(multiValueDropdownAnsweredQuestions) > 0) {\n _.each(multiValueDropdownAnsweredQuestions, function (q) {\n _.each(q.selected, function (s) {\n allSelectedAnswers.push(s.stateBehaviorActionAnswerID);\n });\n });\n }\n\n\n _(levelFiveSixVM.addParticipantVM.stateQuestions)\n .each(function (question) {\n // Disable all\n question.enabled = false;\n question.active = moment(question.startDate) <= effectiveDate && (_.isNull(question.endDate) || moment(question.endDate) >= effectiveDate);\n _.each(question.answers, function (answer) {\n answer.active = moment(answer.startDate) <= effectiveDate && (_.isNull(answer.endDate) || moment(answer.endDate) >= effectiveDate);\n });\n });\n\n _(levelFiveSixVM.addParticipantVM.stateQuestions)\n .filter(function (question) {\n // Filter questions to keep all that have their action selected and is a \"root question\" or it's parent question has been selected\n return (isActionIdOfQuestionSelected(question, checkedActions) && isRootQuestion(question)) ||\n isParentAnswerOfQuestionSelection(question, allSelectedAnswers);\n })\n .filter(evaluateRules)\n .each(function (question) {\n var notDuplicateQuestion = isNotDuplicateQuestion(question);\n //log('Enabling or Disable Question:', question.question, '- ID:', question.stateBehaviorActionQuestionID, '- isNotDuplicateQuestion', notDuplicateQuestion);\n question.enabled = notDuplicateQuestion;\n });\n }\n\n function showQuestionFilter(qa) {\n return qa.enabled === true && qa.active === true;\n }\n\n function staffDropdownSingleValueChanged(qa, item) {\n if (!qa.selected) {\n qa.textDisplay = \"Select one...\";\n } else {\n qa.textDisplay = item.displayName;\n }\n }\n\n function staffDropdownMultipleValueChanged(qa) {\n var selected = _.filter(qa.schoolStaffList, { selected: true });\n qa.selected = selected;\n setTextDisplay(qa);\n }\n\n function dropdownMultipleValueChanged(qa) {\n var selected = _.filter(qa.answers, { selected: true });\n qa.selected = selected;\n\n setTextDisplay(qa);\n\n levelFiveSixVM.addParticipantVM.form.stateQuestionAnswers.$setValidity(\n 'unanswered',\n true\n );\n\n showHideStateQuestions();\n }\n\n\t\t\t\t\t\t\tfunction onStaffTypeaheadBlur(question) {\n\t\t\t\t\t\t\t\tif (question.selected && question.selected.staffID) {\n\t\t\t\t\t\t\t\t\tquestion.staffID = question.selected.staffID;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tquestion.selected = null;\n\t\t\t\t\t\t\t\t\tquestion.staffID = null;\n\t\t\t\t\t\t\t\t}\n }\n\n function searchStaff(question, name) {\n question.isStaffTypeaheadLoading = true;\n question.searchStaff = [];\n\t\t\t\t\t\t\t\tvar results = _.filter(question.schoolStaffList, function (s) {\n\t\t\t\t\t\t\t\t\treturn _.startsWith(s.firstName.toLowerCase(), name.toLowerCase()) || _.startsWith(s.lastName.toLowerCase(), name.toLowerCase());\n });\n\n question.searchStaff = _.map(_.orderBy(results, ['lastName', 'firstName'], ['asc', 'asc']), function (r) {\n return { displayName: r.displayName, staffID: r.staffID }\n });\n\n question.isStaffTypeaheadLoading = false;\n\n return question.searchStaff;\n }\n\n function isActionIdOfQuestionSelected(question, checkedActions) {\n var returnValue = checkedActions.indexOf(question.behaviorActionID) >= 0 || !question.behaviorActionID;\n //log('Question:', question.question, '- ID:', question.stateBehaviorActionQuestionID, '- Fn Name: isActionIdOfQuestionSelected', '- Return Value:', returnValue);\n return returnValue;\n }\n\n function isRootQuestion(question) {\n var returnValue = question.parentStateBehaviorActionAnswerID === null;\n //log('Question:', question.question, '- ID:', question.stateBehaviorActionQuestionID, '- Fn Name: isRootQuestion', '- Return Value:', returnValue);\n return returnValue;\n }\n\n function isParentAnswerOfQuestionSelection(question, allSelectedAnswers) {\n var returnValue = allSelectedAnswers.indexOf(question.parentStateBehaviorActionAnswerID) >= 0;\n //log('Question:', question.question, '- ID:', question.stateBehaviorActionQuestionID, '- Fn Name: isParentAnswerOfQuestionSelection', '- Return Value:', returnValue);\n return returnValue;\n }\n\n function isNotDuplicateQuestion(question) {\n var returnValue = !_(levelFiveSixVM.addParticipantVM.stateQuestions)\n .filter(function (x) { x.enabled === true && x.active === true; })\n .some(function (questionCheck) {\n return questionCheck.question === question.question &&\n questionCheck.stateBehaviorActionQuestionID !== question.stateBehaviorActionQuestionID;\n });\n\n //log('Question:', question.question, '- ID:', question.stateBehaviorActionQuestionID, '- Fn Name: isNotDuplicateQuestion', '- Return Value:', returnValue);\n return returnValue;\n }\n\n function evaluateRules(question) {\n if (!question.rule) return true;\n\n var returnValue,\n selectedBehavior,\n selectedBehaviors;\n\n switch (question.rule.ruleName) {\n case \"ActiveSpecialEducationOr504\": {\n returnValue = ruleService.evaluate(question.rule, levelFiveSixVM.addParticipantVM.participant.isSpecialEd, levelFiveSixVM.addParticipantVM.participant.isSection504);\n //log('Question:', question.question, '- ID:', question.stateBehaviorActionQuestionID, '- Fn Name: evaluateRules- ActiveSpecialEducationOr504', '- Return Value:', returnValue);\n break;\n }\n case \"ActiveSpecialEducation\": {\n returnValue = ruleService.evaluate(question.rule, levelFiveSixVM.addParticipantVM.participant.isSpecialEd);\n //log('Question:', question.question, '- ID:', question.stateBehaviorActionQuestionID, '- Fn Name: evaluateRules- ActiveSpecialEducation', '- Return Value:', returnValue);\n break;\n }\n case \"WeaponOrIncendiary\": {\n if (levelFiveSixVM.isOhioSchool) {\n selectedBehaviors = _.intersection(levelFiveSixVM.observations, levelFiveSixVM.selectedObservedBehaviors);\n if (selectedBehaviors.length > 0) {\n _.each(selectedBehaviors, function (obs) {\n if (!returnValue) {\n returnValue = ruleService.evaluate(question.rule, obs.behaviorObservationName);\n }\n });\n } else {\n returnValue = ruleService.evaluate(question.rule, '');\n }\n } else {\n selectedBehavior = _.find(levelFiveSixVM.observations, { behaviorObservationID: levelFiveSixVM.selectedObservedBehavior });\n returnValue = ruleService.evaluate(question.rule, selectedBehavior ? selectedBehavior.behaviorObservationName : '');\n }\n //log('Question:', question.question, '- ID:', question.stateBehaviorActionQuestionID, '- Fn Name: evaluateRules- WeaponOrIncendiary', '- Return Value:', returnValue);\n break;\n }\n case \"SpecificObservedBehavior\": {\n if (levelFiveSixVM.isOhioSchool) {\n selectedBehaviors = _.intersection(levelFiveSixVM.observations, levelFiveSixVM.selectedObservedBehaviors);\n if (selectedBehaviors.length > 0) {\n _.each(selectedBehaviors, function (obs) {\n if (!returnValue) {\n returnValue = ruleService.evaluate(question.rule, obs.behaviorObservationName);\n }\n });\n } else {\n returnValue = ruleService.evaluate(question.rule, '');\n }\n } else {\n selectedBehavior = _.find(levelFiveSixVM.observations, { behaviorObservationID: levelFiveSixVM.selectedObservedBehavior });\n returnValue = ruleService.evaluate(question.rule, selectedBehavior ? selectedBehavior.behaviorObservationName : '');\n }\n //log('Question:', question.question, '- ID:', question.stateBehaviorActionQuestionID, '- Fn Name: evaluateRules- SpecificObservedBehavior', '- Return Value:', returnValue);\n break;\n }\n case \"SeclusionRestraint\": {\n returnValue = ruleService.evaluate(question.rule, levelFiveSixVM.addParticipantVM.participant.isRestraint || levelFiveSixVM.addParticipantVM.participant.isSecluded);\n //log('Question:', question.question, '- ID:', question.stateBehaviorActionQuestionID, '- Fn Name: evaluateRules- SeclusionRestraint', '- Return Value:', returnValue);\n break;\n }\n case \"ActiveSpecialEdAndSpecificObservedBehavior\": {\n if (levelFiveSixVM.isOhioSchool) {\n selectedBehaviors = _.intersection(levelFiveSixVM.observations, levelFiveSixVM.selectedObservedBehaviors);\n if (selectedBehaviors.length > 0) {\n _.each(selectedBehaviors, function (obs) {\n if (!returnValue) {\n returnValue = ruleService.evaluate(question.rule, obs.behaviorObservationName);\n }\n });\n } else {\n returnValue = ruleService.evaluate(question.rule, '');\n }\n } else {\n selectedBehavior = _.find(levelFiveSixVM.observations, { behaviorObservationID: levelFiveSixVM.selectedObservedBehavior });\n returnValue = ruleService.evaluate(question.rule, selectedBehavior ? selectedBehavior.behaviorObservationName : '');\n }\n //log('Question:', question.question, '- ID:', question.stateBehaviorActionQuestionID, '- Fn Name: evaluateRules- SeclusionRestraint', '- Return Value:', returnValue);\n break;\n }\n }\n\n return returnValue || false;\n }\n\n // ------------------ Helper functions --------------------------\n function updateParticipantWithCheckedOptions(eventParticipantOptions, selectedEventParticipantOptions) {\n return function () {\n var allSelectedOptions = _(eventParticipantOptions).filter({ 'formChecked': true }).value();\n\n selectedEventParticipantOptions.length = 0;\n Array.prototype.push.apply(selectedEventParticipantOptions, allSelectedOptions);\n };\n }\n\n function updateParticipantWithStateQuestions() {\n var allEnabledQuestions = _(levelFiveSixVM.addParticipantVM.stateQuestions).filter({ 'enabled': true }).value();\n\n levelFiveSixVM.addParticipantVM.participant.selectedStateQuestions.length = 0;\n Array.prototype.push.apply(levelFiveSixVM.addParticipantVM.participant.selectedStateQuestions, allEnabledQuestions);\n //log('updateParticipantWithStateQuestions, participant, allEnabledQuestions', levelFiveSixVM.addParticipantVM.participant, allEnabledQuestions);\n }\n\n function updateFromParticipantSelectedOptions(eventParticipantOptions, selectedEventParticipantOptions, idName) {\n _.each(eventParticipantOptions, function (option) {\n var findFilter = {};\n findFilter[idName] = option[idName];\n var selectedOption = _(selectedEventParticipantOptions).find(findFilter);\n\n if (selectedOption) {\n _.extend(option, selectedOption);\n }\n });\n }\n\n function updateFromParticipantSelectedActionQuestionResults(stateQuestions, selectedResults) {\n //log('updateFromParticipantSelectedActionQuestionResults called', stateQuestions, selectedResults);\n _.each(stateQuestions, function (question) {\n var resultsForQuestion = _.filter(selectedResults, { stateBehaviorActionQuestionID: question.stateBehaviorActionQuestionID });\n if (_.size(resultsForQuestion) > 0) {\n switch (question.answerDataType) {\n case 'dropdownmultiplevalue':\n if (!question.selected) {\n question.selected = [];\n }\n _.each(resultsForQuestion, function (rfq) {\n if (rfq.selectedAnswer) {\n var matchingAnswer = _.find(question.answers, { stateBehaviorActionAnswerID: rfq.selectedAnswer });\n if (matchingAnswer) {\n matchingAnswer.selected = true;\n question.selected.push(matchingAnswer);\n }\n } else if (rfq.selected) {\n _.each(rfq.selected, function (a) {\n var matchingAnswer = _.find(question.answers, { stateBehaviorActionAnswerID: a.stateBehaviorActionAnswerID });\n if (matchingAnswer) {\n matchingAnswer.selected = true;\n question.selected.push(matchingAnswer);\n }\n });\n }\n });\n setTextDisplay(question);\n break;\n case 'staffdropdownmultiplevalue':\n if (!question.selected) {\n question.selected = [];\n }\n _.each(resultsForQuestion, function (rfq) {\n if (rfq.staffID) {\n var matchingStaff = findMatchingStaff(rfq, question);\n if (matchingStaff) {\n var staffAlreadySelected = _.find(question.selected, function (selectedStaff) {\n return selectedStaff.staffID === matchingStaff.staffID;\n });\n if (!staffAlreadySelected) {\n matchingStaff.selected = true;\n question.textDisplay = matchingStaff.displayName;\n question.selected.push(matchingStaff);\n }\n }\n } else if (rfq.selected) {\n _.each(rfq.selected, function (s) {\n var matchingStaff = findMatchingStaff(s, question);\n if (matchingStaff) {\n var staffAlreadySelected = _.find(question.selected, function (selectedStaff) {\n return selectedStaff.staffID === matchingStaff.staffID;\n });\n if (!staffAlreadySelected) {\n matchingStaff.selected = true;\n question.textDisplay = matchingStaff.displayName;\n question.selected.push(matchingStaff);\n }\n }\n });\n }\n });\n setTextDisplay(question);\n break;\n case 'staffdropdownsinglevalue':\n var rfq = _.head(resultsForQuestion);\n //log('staffdropdownsinglevalue rfq=', rfq);\n var matchingStaff = findMatchingStaff(rfq, question);\n if (matchingStaff) {\n matchingStaff.selected = true;\n question.staffID = matchingStaff.staffID;\n question.selected = matchingStaff;\n question.textDisplay = matchingStaff.displayName;\n }\n break;\n default: //all others \n var selectedOption = _.head(resultsForQuestion);\n if (selectedOption) {\n _.extend(question, selectedOption);\n }\n }\n }\n });\n }\n\n function findMatchingStaff(rfq, question) {\n var matchingStaff = null;\n if (rfq.staffID) {\n matchingStaff = _.find(question.schoolStaffList, { staffID: rfq.staffID });\n } else if (rfq.selected) {\n var selected = _.isArray(rfq.selected) ? _.head(rfq.selected) : rfq.selected;\n matchingStaff = _.find(question.schoolStaffList, { staffID: selected.staffID });\n }\n return matchingStaff;\n }\n\n function setTextDisplay(question) {\n var selections = _.size(question.selected);\n if (selections === 0) {\n question.textDisplay = \"Select all that apply...\";\n } else if (selections === 1) {\n question.textDisplay = \"1 selection\";\n } else {\n question.textDisplay = selections + \" selections\";\n }\n }\n\n function anyStateQuestions() {\n return _(levelFiveSixVM.addParticipantVM.stateQuestions).some(function (x) { return x.enabled === true && x.active === true; });\n }\n\n function cleanParticipantData() {\n if (levelFiveSixVM.isParticipantWitnessOrVictim(levelFiveSixVM.addParticipantVM.participant)) {\n levelFiveSixVM.addParticipantVM.participant.selectedActions.length = 0;\n levelFiveSixVM.addParticipantVM.participant.selectedInterventions.length = 0;\n levelFiveSixVM.addParticipantVM.participant.selectedMotivations.length = 0;\n levelFiveSixVM.addParticipantVM.participant.selectedStateQuestions.length = 0;\n }\n }\n\n function cloneParticipant(participant) {\n // This special clone is necessary because lodash clone will not clone moment objects properly.\n levelFiveSixVM.addParticipantVM.participant = _.cloneDeepWith(participant, function (value) {\n\n var clonedVal = _.cloneDeep(value);\n\n clonedVal.selectedStateQuestions = value.selectedStateQuestions.map(function (qa) {\n if (moment.isMoment(qa.answerText)) {\n qa.answerText = moment(_.clone(qa.answerText));\n }\n return qa;\n });\n\n clonedVal.selectedActions = value.selectedActions.map(function (action) {\n if (action.actionStartDate) {\n action.actionStartDate = moment(action.actionStartDate).clone();\n }\n if (action.actionEndDate) {\n action.actionEndDate = moment(action.actionEndDate).clone();\n }\n if (action.actionStartTime) {\n action.actionStartTime = moment(action.actionStartTime)\n .set({ year: action.actionStartDate.year(), month: action.actionStartDate.month(), date: action.actionStartDate.date() }).toDate();\n }\n\n if (action.boardDecisionDate) {\n action.boardDecisionDate = moment(action.boardDecisionDate).clone();\n }\n\n if (action.returnDate) {\n action.returnDate = moment(action.returnDate).clone().format('MM/DD/YYYY');\n }\n\n action.isContinuingInNextAY = action.isReturnDateRequired && action.actionDaysExtendedInNextAY || 0 > 0;\n\n return action;\n });\n\n return clonedVal;\n });\n }\n\n function matchParticipantActionsMotivationsInterventionsQuestions(newArray, initialArray, participantArray, itemName, arrayName) {\n\n var name = \"\";\n var id = \"\";\n\n if (itemName !== \"StateBehaviorActionQuestion\") {\n name = 'behavior' + itemName + 'Name';\n id = 'behavior' + itemName + 'ID';\n } else {\n name = 'question';\n id = itemName + 'ID';\n }\n\n _.forEach(participantArray, function (p) {\n var item = _.find(initialArray, _.matchesProperty(id, p[id]));\n if (item) { p[name] = item[name]; }\n });\n\n _.forEach(participantArray, function (a) {\n var item = _.find(newArray, _.matchesProperty(name, a[name]));\n if (item) { a[id] = item[id]; }\n });\n }\n\n function actionsFilter(action) {\n return !action.isPendingLevel6 || (action.isPendingLevel6 && levelFiveSixVM.addParticipantVM.participant.isPendingLevel6);\n }\n }\n ]\n };\n }]\n );\n})();\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n__webpack_require__(8573);\n// This entry module is referenced by other modules so it can't be inlined\n__webpack_require__(6859);\n__webpack_require__(1146);\n__webpack_require__(5784);\n__webpack_require__(3855);\n__webpack_require__(598);\n__webpack_require__(4923);\n__webpack_require__(6374);\n__webpack_require__(1194);\n__webpack_require__(2586);\n__webpack_require__(7826);\n__webpack_require__(3560);\n__webpack_require__(6045);\n__webpack_require__(7767);\n__webpack_require__(9367);\n__webpack_require__(6025);\n__webpack_require__(401);\n__webpack_require__(9828);\n__webpack_require__(7792);\n__webpack_require__(2767);\n__webpack_require__(4473);\n__webpack_require__(1923);\n__webpack_require__(8589);\n__webpack_require__(9933);\n__webpack_require__(2537);\n__webpack_require__(5122);\n__webpack_require__(182);\n__webpack_require__(7694);\n__webpack_require__(3840);\n__webpack_require__(8790);\n__webpack_require__(8889);\n__webpack_require__(2613);\n__webpack_require__(2604);\n__webpack_require__(2497);\n__webpack_require__(4809);\n__webpack_require__(1540);\n__webpack_require__(43);\n__webpack_require__(2647);\n__webpack_require__(6552);\n__webpack_require__(5169);\n__webpack_require__(1868);\n__webpack_require__(701);\n__webpack_require__(8674);\n__webpack_require__(5893);\n__webpack_require__(6582);\n__webpack_require__(2683);\n__webpack_require__(4349);\n__webpack_require__(4291);\n__webpack_require__(2373);\n__webpack_require__(2649);\n__webpack_require__(9970);\n__webpack_require__(365);\n__webpack_require__(5482);\n__webpack_require__(3890);\n__webpack_require__(4322);\n__webpack_require__(3747);\n__webpack_require__(8903);\n__webpack_require__(18);\n__webpack_require__(5429);\n__webpack_require__(68);\n__webpack_require__(2684);\n__webpack_require__(6680);\n__webpack_require__(3605);\nvar __webpack_exports__ = __webpack_require__(8050);\n"],"names":["runTranslate","$translate","key","storageKey","storage","fallbackFromIncorrectStorageValue","preferred","preferredLanguage","angular","isString","use","put","displayName","get","$STORAGE_KEY","$windowProvider","$translateSanitizationProvider","pascalprechtTranslateOverrider","$preferredLanguage","$languageKeyAliases","$fallbackLanguage","$fallbackWasString","$uses","$nextLang","$storageFactory","$storagePrefix","$missingTranslationHandlerFactory","$interpolationFactory","$loaderFactory","$loaderOptions","$notFoundIndicatorLeft","$notFoundIndicatorRight","loaderCache","$translationTable","$availableLanguageKeys","$storageKey","$interpolatorFactories","$cloakClassName","$postCompilingEnabled","$forceAsyncReloadEnabled","directivePriority","statefulFilter","uniformLanguageTagResolver","languageTagResolver","tag","split","join","java","temp","parts","length","toLowerCase","toUpperCase","bcp47","getFirstBrowserLanguage","isFunction","getLocale","i","language","nav","$get","navigator","browserLanguagePropertyKeys","isArray","languages","locale","indexOf","array","searchElement","len","trim","this","toString","replace","negotiateLocale","alias","avail","lowercase","n","push","langKeyAlias","hasWildcardKey","hasExactKey","Object","prototype","hasOwnProperty","call","slice","translations","langKey","translationTable","isObject","extend","flatObject","cloakClassName","name","data","path","result","prevKey","keyWithPath","val","concat","addInterpolation","factory","useMessageFormatInterpolation","useInterpolation","useSanitizeValueStrategy","value","useStrategy","setupPreferredLanguage","translationNotFoundIndicator","indicator","translationNotFoundIndicatorLeft","translationNotFoundIndicatorRight","fallbackLanguage","fallbackStack","Error","useUrlLoader","url","options","useLoader","useStaticFilesLoader","loaderFactory","useLocalStorage","useStorage","useCookieStorage","storageFactory","storagePrefix","prefix","useMissingTranslationHandlerLog","useMissingTranslationHandler","usePostCompiling","forceAsyncReload","uniformLanguageTag","standard","determinePreferredLanguage","fn","registerAvailableLanguageKeys","languageKeys","aliases","useLoaderCache","cache","undefined","priority","state","$log","$injector","$rootScope","$q","Storage","fallbackIndex","startFallbackIteration","defaultInterpolator","pendingLoader","interpolatorHashMap","langPromises","translationId","interpolateParams","interpolationId","defaultTranslationText","translationIds","results","promises","translate","deferred","defer","regardless","resolve","then","promise","c","all","translateAll","apply","promiseToWaitFor","index","promiseResolved","determineTranslation","reject","applyNotFoundIndicators","useLanguage","$emit","setLocale","eachInterpolator","interpolator","id","forEach","loadAsync","loaderOptions","$http","onLoaderSuccess","table","onLoaderError","eachInterpolationFactory","interpolatorFactory","getInterpolationIdentifier","getFallbackTranslation","Interpolator","onResolve","translation","substr","interpolate","getTranslationTable","getFallbackTranslationInstant","translateByHandler","resultString","resolveForFallbackLanguage","fallbackLanguageIndex","resolveForFallbackLanguageInstant","missingTranslationHandlerTranslation","fallbackTranslation","_translationId","determineTranslationInstant","fallbackTranslationInstant","useFallbackLanguage","langKeyPosition","proposedLanguage","aliasedKey","clearNextLangAndPromise","isPostCompilingEnabled","isForceAsyncReloadEnabled","refresh","oneTranslationsLoaded","tables","loadingKeys","allTranslationsLoaded","tableData","instant","isUndefined","possibleLangKeys","j","d","possibleLangKey","versionInfo","equals","processAsyncResult","fallbackLanguageId","$translateDefaultInterpolation","$interpolate","$translateSanitization","$translateInterpolator","string","interpolationParams","sanitize","interpolatedText","translateDirective","$compile","$parse","restrict","scope","compile","tElement","tAttr","translateValuesExist","translateValues","translateInterpolation","translateValueExist","outerHTML","match","interpolateRegExp","startSymbol","endSymbol","watcherRegExp","iElement","iAttr","preText","postText","observeElementTranslation","_unwatchOld","isDefined","interpolateMatches","text","$parent","watcherMatches","$watch","newValue","updateTranslations","observeAttributeTranslation","translateAttr","$observe","attr","initInterpolationParams","firstAttributeChangedEvent","defaultText","observeValueAttribute","attrName","attributeName","updateTranslation","applyTranslation","successful","html","globallyEnabled","locallyDefined","translateCompile","locallyEnabled","contents","$attr","translateDefault","unbind","$on","translateCloakDirective","applyCloak","addClass","removeCloak","removeClass","removeListener","translateCloak","translateFilterFactory","translateFilter","interpolation","$stateful","$translationCache","$cacheFactory","module","run","$inject","provider","$sanitize","strategies","currentStrategy","hasConfiguredStrategy","hasShownNoStrategyConfiguredWarning","mode","htmlSanitizeValue","escape","htmlEscapeValue","sanitizeParameters","mapInterpolationParameters","escapeParameters","escaped","addStrategy","strategyName","strategyFunction","removeStrategy","strategy","self","applyStrategies","selectedStrategies","selectedStrategy","showNoStrategyConfiguredWarning","warn","has","arguments","element","iteratee","propertyValue","propertyKey","isNumber","constant","directive","filter","exports","modules","basePath","lazyLoad","HIGHCHART","HIGHSTOCK","p","list","$window","window","location","protocol","lazyload","readyQueue","loading","ready","callback","thisArg","Highcharts","jQuery","unshift","doWork","$apply","e","s","shift","loadScript","document","createElement","type","src","onload","getElementsByTagName","appendChild","arr","find","prependMethod","obj","method","func","original","args","Array","deepExtend","destination","source","property","highchartsNG","highchartsNGUtils","$timeout","seriesId","axisNames","chartTypeMap","updateZoom","axis","modelAxis","extremes","getExtremes","currentMin","dataMin","currentMax","dataMax","setExtremes","detachedsetExtremes","processExtremes","chart","axisName","chartOptionsWithoutEasyOptions","visible","getChartType","config","chartType","useHighStocks","res","template","disableDataWatch","link","attrs","prevSeriesOptions","processSeries","series","ids","setIds","changed","ensureIds","chartSeries","setVisible","setData","copy","update","addSeries","noData","chartContainsData","hideLoading","showLoading","remove","initChart","destroy","mergedOptions","defaultOptions","events","title","subtitle","credits","plotOptions","enabled","xAxis","yAxis","renderTo","thisChart","min","max","trigger","size","width","height","getMergedOptions","getHighcharts","$watchCollection","newSeries","oldSeries","redraw","newTitle","setTitle","newSubtitle","show","hide","oldChartType","newAxes","oldAxes","axisIndex","newOptions","oldOptions","newSize","oldSize","setSize","chartWidth","chartHeight","reflow","ex","oldLink","$document","elt","from","Number","Math","ceil","floor","scrolling","on","event","attributes","getNamedItem","nodeValue","$eval","targetId","parentNode","getIds","originalEvent","target","ngDropoverId","which","fromDocument","triggerMap","getTriggers","triggerEvent","ngDropoverConfig","positions","$positionDropover","triggerEventsMap","logError","message","console","log","ngDropoverOptions","elm","dropoverContents","handlers","transition","duration","isLink","unsetTriggers","triggerObj","off","toggle","open","close","positionContents","offX","offY","oldDisplay","parseInt","horizontalOffset","verticalOffset","getStyle","css","positionElements","position","left","top","closer","isOpen","addEventListener","handler","$broadcast","dropoverObj","ret","fromContents","preventDefault","markEvent","groupId","querySelector","append","t","transitions","propertyCheck","style","parseFloat","getTransitions","propertyName","removeEventListener","children","querySelectorAll","classList","className","l","stripPrefix","substring","setPositionClass","init","bind","closeAll","controller","$scope","$element","$attrs","$id","openListener","closeListener","toggleListener","closeAllListener","documentClickListener","info","closeOnClickOff","el","cssprop","currentStyle","getComputedStyle","isStaticPositioned","elBCR","offset","offsetParentBCR","offsetParentEl","docDomEl","offsetParent","parentOffsetEl","clientTop","scrollTop","clientLeft","scrollLeft","boundingClientRect","getBoundingClientRect","prop","pageYOffset","documentElement","pageXOffset","hostEl","targetEl","positionStr","appendToBody","hostElPos","targetElWidth","targetElHeight","targetElPos","positionStrParts","pos0","pos1","shiftWidth","center","right","shiftHeight","bottom","triggerOptions","action","$stateProvider","$urlRouterProvider","$locationProvider","$breadcrumbProvider","$sceDelegateProvider","$compileProvider","RestangularProvider","appSettings","resourceUrlWhitelist","environment","debugInfoEnabled","setOptions","templateUrl","coreWebRootUrl","otherwise","html5Mode","hashPrefix","setBaseUrl","behaviorServicesRootUrl","$location","stateTransitionSecurityCheck","userContextService","ensureUserContext","user","TagManagerService","setupUserID","attachStateChangeListener","pageTitleAppName","defaultPageTitle","toState","toParams","fromState","fromParams","_utils","enableScrollToTopOnStateChangeSuccess","_ng","moduleInit","ncyBreadcrumb","label","parent","controllerAs","security","requiredResource","api","authorization","resolveAuthorization","onEnter","$state","behaviorWebRootUrl","params","behaviorLevelId","views","CourseListCtrl","$stateParams","$controller","behaviorCourseSummaryRepository","courseSummaryFilterCountsRepository","matchmedia","behaviorSessionCache","behaviorUserRoleService","courseListVM","updateFilterCounts","updatedItems","filterItems","_","each","filterItem","updatedItem","item","count","loadFilterCounts","disableFilterCounts","filterConfig","countsLoading","getCourseSummaryFilterCounts","getPagingParams","filterCounts","setFilterCounts","filters","pagingParameters","sortOrder","searchText","selectedFilters","loadCourseSections","courseSectionGroup","specialsAreLoading","primaryStaffId","staffID","getCourseSectionGroupCourseSections","showFilteredSpecials","some","filteredByStaffId","currentCourseSections","course","staffNameLastFirst","Staff","items","isSelfContainedCourse","every","timeAndPeriod","period","periodName","onPhone","mediaQueryList","isPhone","allFieldsSelected","blockName","courses","coursesAppendLoading","coursesLoading","expandedCourseSectionGroupID","initialFiltersLoaded","initialLoad","isTeacher","markingPeriod","moreCoursesExist","startDate","moment","format","isMoreThanATeacher","context","staffId","filterStaffId","initFilters","setupFilterChangeListener","changeSorting","expression","loadCourses","formatTimeString","time24","tmpArr","currentYearOnly","persist","hideOnMobile","includeNoneOption","isCollapsed","defaultId","savedFilterConfig","isEmpty","map","applyCachedFilterConfig","courseCount","getAllForMobile","courseSectionID","courseSectionGroupID","meetingBlockTimeID","academicYearID","matched","getCourseName","returned","isSpecial","courseSectionSystemGeneratedName","isHomeroom","csgId","mtbId","csName","duplicatedCourses","r","drop","pullAll","loadCourseDataMobile","preventDoubleInfiniteScroll","noMoreCoures","getAll","filteredCoursesForStaffSelection","cloneDeep","forRemoval","q","order","currentObject","moreExist","loadCourseDataDesktop","openUrlForStaffManagementStaffDetails","openUrl","staffManagementWebRootUrl","counts","typeName","AcademicYear","School","GradeLevel","MarkingPeriod","searchTextChanged","showCourseSections","LevelFiveSixCtrl","enumService","locationRepository","stateRepository","observationRepository","actionRepository","behaviorEventIncidentRepository","behaviorCache","personSearchService","schoolService","apiSecurityService","behaviorEventMultipleParticipantIncidentRepository","stateBehaviorQuestionAnswerService","studentListService","roleRepository","behaviorStateManagementService","behaviorRestangular","behaviorDirtyCheckService","behaviorAlertService","levelFiveSixVM","getObservationActionParams","behaviorLevelID","academicYearId","schoolID","schoolId","isBehaviorUpdate","hasLevelSixParticipant","loadActions","actions","loadObservations","observations","loadStateQuestionAnswers","getObservationQuestionAnswer","stateID","stateQuestions","modifiedResults","qa","answerDataType","selectedAnswer","active","isOhioSchool","groupedResults","groupBy","groupNumber","newArray","group","question","orderNumber","onSaveSuccess","saveEventIncident","isLoading","goSwal","goToPreviousScreen","onSaveFailure","error","exceptionMessage","onDataLoadError","onObservedBehaviorChange","clearAllStateQuestions","onStateQuestionAnswerChange","form","stateQuestionAnswers","$setValidity","matchStateQuestions","showHideStateQuestions","setFormDirty","incidentDate","$setDirty","incidentTime","referredBy","selectedObservations","observedBehavior","isIncidentFormValid","isValid","validateReferredByField","validateIncidentDateTime","validateMultiSelectObservedBehaviors","selectedObservedBehavior","validity","$valid","maximumObservationsLimitReached","hasSelectedAnObservationRequiringNotes","selectedObservedBehaviors","obs","o","behaviorObservationID","isValidDate","isMoment","isNotWeekendDate","day","isValidPastActionDate","participants","flatten","isStartDateRequired","actionStartDate","diff","$pristine","clonedIncidentTime","isValidIncidentTime","isIncidentTimeBeforeAllActionTimes","isNotInFuture","createMomentWithSetDate","getTime","isStartTimeRequired","actionStartTime","schoolStartTime","schoolEndTime","warnTimeNotBetweenSchoolStartEndTime","isAfter","isBefore","selectedReferredBy","isPlainObject","personID","checkForCorrectNumberOfSelectedBehaviors","observationArray","pluckedObservation","selectedObservedBehaviorArray","selectedObservation","behaviorObservationPlaceholder","noObservationsSelected","buildBehaviorEventParticipantView","participant","behaviorEventParticipantView","BehaviorEventParticipant","BehaviorEventParticipantID","BehaviorEventID","AcademicYearID","SchoolID","BehaviorParticipantTypeID","selectedParticipantType","ParticipantStudentInSchoolID","selectedPerson","ParticipantGuardianID","ParticipantStaffID","ParticipantOther","ParticipantOtherAge","otherParticipantAge","ParticipantOtherRaceId","otherParticipantRace","ParticipantOtherIsHispanic","otherParticipantIsHispanic","ParticipantOtherGenderId","otherParticipantSex","BehaviorLevelID","selectedLevel","BehaviorRoleID","selectedRole","IncludeInParentEmail","ActionsPriorToBehavior","StudentGainFromBehavior","Notes","notes","IsPendingLevel6","isPendingLevel6","IsRestraint","isRestraint","IsSecluded","isSecluded","RestartBspCount","restartBspCount","CreatedByStaffID","BehaviorEventParticipantMotivations","buildEventParticipantOptions","selectedMotivations","buildBehaviorEventParticipantMotivation","BehaviorEventParticipantInterventions","selectedInterventions","buildBehaviorEventParticipantIntervention","BehaviorEventParticipantActions","selectedActions","buildBehaviorEventParticipantAction","StateBehaviorActionResults","buildParticipantStateBehaviorActionResultViews","previousIncidentParticipant","previousIncident","BehaviorEventParticipantViews","bep","behaviorEventParticipant","participantStudentInSchoolID","participantGuardianID","participantStaffID","behaviorParticipantTypeID","behaviorEventParticipantID","behaviorEventId","behaviorEventParticipantMotivations","motivation","behaviorMotivationID","BehaviorEventParticipantMotivationID","behaviorEventParticipantMotivationID","behaviorEventParticipantInterventions","intervention","behaviorInterventionID","BehaviorEventParticipantInterventionID","behaviorEventParticipantInterventionID","stateBehaviorActionResults","actionResult","ar","StateBehaviorActionResult","StateBehaviorActionResultID","stateBehaviorActionResult","stateBehaviorActionResultID","buildFn","formChecked","BehaviorMotivationID","BehaviorInterventionID","BehaviorEventParticipantActionID","BehaviorActionID","behaviorActionID","ActionStartDate","ActionEndDate","actionEndDate","ActionStartTime","ActionDuration","actionDuration","BoardDecisionDate","boardDecisionDate","ReturnDate","returnDate","ActionDaysExtendedInNextAY","actionDaysExtendedInNextAY","IsActionPermanent","buildStateBehaviorObservationResult","StateBehaviorObservationQuestionID","stateBehaviorObservationQuestionID","StateBehaviorObservationAnswerID","AnswerText","answerText","selectedStateQuestions","instanceNumber","selected","selection","view","IsSpecialEducationStudentRecievingInstructionFromCertifiedTeacher","isCertifiedTeacherQuestion","IsSpecialEducationStudentInterfacingWithGeneralEducationStudents","isGeneralEducationQuestion","IsSpecialEducationStudentReceivingServices","isSpecialEducationStudentReceivingServicesQuestion","StateBehaviorActionQuestionID","stateBehaviorActionQuestionID","StateBehaviorActionAnswerID","InstanceNumber","StaffID","stateBehaviorActionAnswerID","selectedStaff","formatAnswerText","buildStateBehaviorActionResultView","answerTextTime","answerTextDate","now","effectiveDate","year","month","date","isNull","endDate","answers","isRootQuestion","hasSatisfyingParentAnswer","clearStateQuestion","parentStateBehaviorObservationQuestionID","parentStateBehaviorObservationQuestionId","parentQuestion","hasParentQuestion","questionIgnoresParentsAnswer","parentStateBehaviorObservationAnswerID","questionsParentHasMatchingAnswer","showAnswerTextInput","schoolStaffList","displayText","validateStateQuestionsAndAnswers","saveButtonHasBeenClicked","validateAnswerText","validateSelectedAnswer","validateAnswerTextDate","validateAnswerTextTime","validateStaffDropDownSingleAnswer","validateStaffDropDownMultipleAnswer","showFieldError","setFormValues","behaviorEvent","previousEvent","previousObservations","behaviorEventObservations","previousParticipants","behaviorEventParticipantViews","previousStateBehaviorObservationResults","stateBehaviorObservationResults","participantView","swal","showCancelButton","confirmButtonColor","confirmButtonText","closeOnConfirm","isConfirmed","BehaviorEvent","BehaviorEventObservations","StateBehaviorObservationResults","behaviorEventParticipantActions","utc","time","toDate","selectedLocation","behaviorLocationID","referredByStaffID","isReferredByTypaheadLoading","staffSearchByID","firstName","lastName","checkForAnyLevelSixParticipants","observationName","behaviorObservationName","clone","stateBehaviorObservationAnswerID","loadParticipantUiValues","getStudentsIndicators","student","parentSearchByID","fullName","last","participantOther","getLevelforUi","level","buildParticipantStateSelectedQuestions","rawMapping","buildSelectedStateActionQuestionsFromSavedData","getParticipantId","buildParticipantSelectedOptionsFromSavedData","selectedEventParticipantOptions","option","answerTextDateTime","levelFiveSixTemplateUrl","dateEntryOptions","maxDate","daysOfWeekDisabled","useCurrent","isAddingAParticipant","isEditingAParticipant","isStateQuestionAnswerCollapsed","isParticipantSectionCollapsed","isReadOnly","originalStudent","primaryAction","school","searchPersons","staticMomentObjectForTimeZone","timeEntryOptions","uiParticipants","studentInSchoolId","onCancelClick","isFormDirty","onSaveClick","obsId","obsIds","isObservedBullying","partFormValid","isBullying","participantsField","studentInSchoolID","validateOriginalStudent","isOffenderOrParticipant","validateOneOffenderOrParticipant","incidentFormValid","stateQuestionsFormValid","areAllStateQuestionsAnswered","validateStateQuestions","isFormValid","incident","Date","Time","BehaviorLocationID","ReferredByStaffID","IsCourseSectionBehaviorEvent","IsIncomplete","IsAdvancedFieldIncomplete","BehaviorObservationID","x","isBehaviorAdd","set","onAddParticipant","onEditClick","participantIndex","onIncidentDateChanged","onTrashClick","splice","onTypeAheadBlur","$invalid","showQuestionFilter","anyStateQuestions","previousParticipantViews","checkForAnyLevelSixParticipantsOnParticipantSave","currentLevel","oldObservationText","oldObservationNames","oldObservationId","oldStateQuestions","f","matchedObs","observation","found","answerString","answer","newAnswerId","refreshFormValues","getActionsForUi","returnedActions","returnedAction","behaviorActionName","getEnabledCount","questions","enabledAndActive","getParticipantTypeName","participantTypes","behaviorParticipantTypeName","getRoleNameById","roles","roleId","role","behaviorRoleID","getRoleById","behaviorRoleName","getStudentUrl","studentManagementWebRootUrl","isFirstParticipant","isParticipantTypeOther","isParticipantTypeStudent","isParticipantWitnessOrVictim","isWitnessOrVictim","onLoadFailure","idColumnName","isTextEntry","getInitialValues","assign","loadDataPermissionsForPage","go","isAccessAllowed","behaviorRoles","participantUiValues","updatedParticipant","studentID","isSpecialEd","isSection504","maxExpulsionDuration","participantOtherAge","participantOtherGenderId","participantOtherIsHispanic","participantOtherRaceId","actionsForUi","roleName","levelFiveUi","actionTaken","studentId","activeBSP","isInSchoolSuspended","isOutOfSchoolSuspended","isExpelled","setParticipantViewValuesFromPreviousIncident","locations","GetSchoolStartEndTime","startTime","endTime","$setPristine","searchPerson","staffSearch","specialEdStudentAndActionParticipantFactory","fieldName","a","includes","isStudentRecord","years","months","LevelFourCtrl","$uibModal","behaviorDocumentRepository","$sce","BehaviorRestangular","levelFourVM","checkForReadOnly","loadSchoolForTimezone","documentSaveMethod","isInitialBspOrBip","supportingDocumentation","BehaviorDocument","behaviorDocumentID","addBehaviorDocuments","docData","doc","docModel","DocumentDate","BehaviorDocumentID","behaviorDocument","behaviorEventParticipantDocuments","saveDocumentParticipants","returndData","reason","deleteBehaviorDocuments","returnedData","onDocumentSaveFailure","setCommonFormValuesFromReturnedIncident","mostRecentBspOrBip","BehaviorEventParticipantDocuments","parentAttended","bspMeetingAttendedByParent","includeInParentEmail","isBspEnded","isbspEnded","bspEndDate","bspEndReason","revisionReason","bspRevisionReason","isUpdatingARevision","docIds","getAllDocDetails","docResult","docEntity","BehaviorDocumentMeta","behaviorDocumentMeta","BehaviorDocumentVersion","behaviorDocumentVersion","createDate","docIssue","isSaving","loadIep","isStudentActiveIep","isActiveIep","hasSelectedAnObservation","showTooltipBase","$event","elementSelector","settings","$","y","tip","appendTo","body","stopPropagation","bodyClickHandler","tipClickHandler","onClose","not","validateIncidentDate","originalDate","isDateToday","checkIfDateTodayAndTimeBeforeFivePm","validateIncidentTime","isValidTime","isTimeSelectedInFuture","add","studentGuardianCanBeEmailed","sameDayAndBeforeFivePmCutoff","timeZone","currentTimeInSchoolTz","tz","timeZoneName","fiveOClockEST","behaviorActionId","behaviorIncident","bspAction","bspActions","bspMeetingDate","bspMeetingTime","documentsForDeletion","dateForDocument","documentImage","isActionPermanent","isBehaviorActionLoading","isBehaviorCollapsed","isBip","isBsp","isBspCollapsed","isRevisedBspOrBip","isUpdatedBspOrBip","isValidActionDate","observationSearchText","selectedDocument","tooltipDescription","tooltipName","incidentForm","newObs","oldObs","intersection","checkIfRevisingUpdatingCreatingOrEnding","getMostRecentLevelFourIncidentWithStudentInSchoolID","revisionIncident","revisisionIncident","getSingleParticipantEventIncident","originalObservations","dataWithShortenedNames","examples","orderBy","allActions","previousActionID","actionItems","setActionDetails","getObservationsForLevel4Event","mostRecentBspOrBipActionID","mostRecentBspOrBipAction","isIntervention","revisionAction","setIncidentRevisionData","checkIfStudentGuardianHasEmailAndCanBeContacted","isWithinAcademicSchoolYear","isWithinAcademicYear","model","documents","behaviorEventID","LastModifiedByStaffID","BSPMeetingDate","BSPMeetingTime","BSPMeetingAttendedByParent","BSPRevisionReason","BSPMeetingNotes","mostRecentAction","IsBSPEnded","BSPEndDate","isBSPEnded","BSPEndReason","createdByStaffID","RestartBSPCount","tempOne","behaviorEventObservationID","tempThree","tempTwo","deleteBehaviorDocumentById","IsMobile","StudentInSchoolID","Reason","endLevelFourIncident","getDocument","getDocumentById","response","blob","Blob","headers","filename","RegExp","extension","msSaveOrOpenBlob","trustAsResourceUrl","URL","createObjectURL","anchorStr","versionId","eq","click","onDocumentClick","BehaviorDocumentVersionData","onIncidentUpdateFailure","onObservationClick","without","setPlanType","showObservationDetails","$new","descFull","showObservationName","nameFull","uploadFile","validateDate","UploadFileModalCtrl","$uibModalInstance","fileReaderFactory","toastr","mimeTypesRepository","uploadFileModalVM","dismiss","byteArray","description","mimeType","mimeTypeID","file","fileRaw","fileDataUrl","fileMimeType","fileMimeTypeID","Deferred","isComplete","Title","Description","Filename","fileName","MimeTypeID","IsCurrent","FileExtension","Keyword","getFileByteArray","getFileMimeType","readFile","fileToRead","dataUrlField","readAsDataUrl","retrieveFileValues","warning","getMimeTypeID","LevelTwoThreeDesktopCtrl","courseService","motivationRepository","interventionRepository","behaviorEventRepository","behaviorAttributeRepository","behaviorBehaviorListService","behaviorBlueRedIncidentCommon","behaviorAttendanceRepository","levelTwoThreeDesktopVM","loadAllFormData","valuesLoadedProperly","loadMotivations","loadInterventions","getForStudentInSchool","isAdvancedBehaviorEntryRequired","setIncidentMode","isAdvancedFormRequired","getTenTwentyCount","incidentsInLast20Days","isUpdatedLevelTwoIncident","isInitialLevelTwoIncident","isUpdatedLevelThreeIncident","isInitialLevelThreeIncident","loadStudentCourseAndMeetingBlocks","setPreviouslySelectedCourseSectionAndMeetingBlock","loadLocations","validateEventEntry","allStudentEvents","checkIncompleteAndConflictingEvents","loadBehaviorEventsForStudent","meetingBlockTimeId","specialsCourseSectionId","selectedCourseIsSpecial","anyIncompleteEvents","cancelButtonText","closeOnCancel","history","back","todaysHighestEvent","highestLevel","transitionToLevel","previousIncidentInSameMeetingBlockTime","hour","minute","checkForValidBehaviorLevel","getHighestLevelEventForDate","onCourseSectionGroupAndMeetingBlockSelection","selectedStudentCourseAndMeetingBlock","selectedCourseAndMeeting","studentCourseAndMeetingBlocks","uniqueId","courseSectionGroupId","coreSubjectLevel1ID","subjectLevel1ID","checkingForExistingEvents","verifyCourseInSession","courseNotInSessionForDateTimeSelected","checkIfStudentWasPresentForClass","checkIfStudentWasPresentForClassWithoutCourseInfo","wasPresent","studentWasPresent","attendanceCodeEquivalencyID","storedValue","current","reload","incidentMode","getCourseSectionSubjects","courseSectionSubjects","behaviorLocationName","first","previousActions","getByLevel","previousMotivations","motivations","m","previousInterventions","interventions","isStudentCourseAndMeetingBlocksLoading","getCoursesByStudent","$select","shapeCourseDataForDropdown","courseListDisabled","incidentLocation","incidentNotes","incidentSubject","studentActionsPriorToObservedBehavior","whatDidStudentGainFromBehavior","studentCourseAndMeetingBlock","hasSelectedAtLeastOne","validateObservation","subjectIsValid","validateMotivation","validateInterventions","isNotesFieldRequired","incidentTimeWithDate","isAfterPreviousIncidentInSameMeetingBlockTime","hasSelectedThreeOrLess","setCreatedAndModifiedID","lastStudentListPath","onSaveSuccessAndAddLevelThree","saveData","onSaveSuccessFn","onSaveFailureFn","behaviorEventIncident","isInitial","CourseSectionGroupID","SpecialsCourseSectionID","MeetingBlockTimeID","includeEmail","CoreSubjectLevel1ID","buildBehaviorEventIncidentFromView","disableIsSaving","isSavingSpinner","isSavingAndAddLevel3Spinner","previousParticipant","specialsCourseSectionID","actionsPriorToBehavior","studentGainFromBehavior","incidentDateOptions","interventionSearchText","isActionsollapsed","isInterventionCollapsed","isMotivationCollapsed","exists","courseName","courseSubjectDisplayName","save","saveAndAddLevelThree","cancelClickPropogation","nodeName","isNotesRequired","isOther","isTileSelected","tileGroup","tile","contains","containsPreviousObservationActionInterventionOrMotivation","onDateChange","onTimeChange","toggleSelectedTile","removeTileFromView","union","closeTooltip","openToolTip","LevelTwoThreeMobileCtrl","levelTwoThreeMobileVM","loadUserPermissions","hasWritePermissions","loadAppState","obsResults","unfilteredObservations","getFrequentlySelected","freqSelectedResults","fObs","frequentlySelectedObservations","uniq","firstThreeActions","incidentIsSaving","isIncomplete","goBack","isAlreadySelectedObservation","isAlreadySelectedAction","verifyMostBasicInfoForSaving","tabs","behaviorLocations","observationAndActionParams","otherActionClicked","notesText","otherActionText","timeForDisplaying","queries","dateTimeLocationComplete","observationNotesComplete","actionNotesComplete","observationFields","actionFields","buildBehaviorEventIncident","isTabVisible","tabName","tab","navigateToTab","selectedTab","onActionClick","LevelTwoThreeCtrl","levelTwoThreeVM","desktopUrl","mobileUrl","isTablet","isPortrait","onTablet","EndLevelFourModalCtrl","endLevelFourModalVM","isEndDateInCurrentAcademicYear","isValidEndDate","complete","validateEndDate","validationParams","ManagerCtrl","ipCookie","managerListFilterCountsRepository","behaviorOverviewService","levelZeroTwoThree","levelFour","levelFiveSix","managerVM","parameters","bspMaxValue","currentValue","removalsMaxValue","idex","buildCacheAndGo","stateLevelString","loadStudents","positiveCountAltered","allStudentsLoaded","studentsLoading","studentAppendLoading","$skip","pageSize","$top","isLoadingFilterCounts","getStudentsInSchoolFilterCounts","Homeroom","BehaviorSupportPlan","SpecialServices","BehaviorLevels","sort","getStudentsForManager","inSchoolSuspendedEndDate","inSchoolSuspendedStartDate","inSchoolSuspendedDuration","outOfSchoolSuspendedEndDate","outOfSchoolSuspendedStartDate","outOfSchoolSuspendedDuration","bspStartDate","sisCurrentMasterStatusID","students","canReviseLevelFour","canWriteLevelZeroTwoThree","canWriteLevelFour","canWriteLevelFive","hasUpdatePermissions","incidentLevelSelected","numberOfIncidents","positiveObservations","selectedYearForPositiveObs","selectedSchoolForPositiveObs","showIndicators","indicators","positive","level2","level3","level4","level5","level6","bsp","removals","removalDayCount","incidentCount","lastRemovalDate","lastRemovalUserName","specialEdDocumentationFulfilled","sortNameGroupModel","criteria","descending","addLevelFiveIncident","addLevelFourIncident","addLevelTwoIncident","addLevelThreeIncident","addPositiveModal","eventDate","eventTime","bspLineOffset","bspWidthPercent","bspTypeName","succeededToEndBspOrBipMessage","failedToEndBspOrBipMessage","getStudentBehaviorListUrl","getBehaviorEventUpdateLink","editLevelTwoThree","editLevelFour","editLevelFiveSix","reviseLevelFour","show10in20Tooltip","currentTarget","showRemovalsTooltip","getBehaviorRemovals","showAddTooltip","showBspTooltip","showIssTooltip","showLevelTooltip","numIncidents","behaviorEventsLoading","academidYearId","getBehaviorEvents","behaviorEvents","showOssTooltip","show504Tooltip","showSeTooltip","viewOptionClick","removalsLineOffset","removalsWidthPercent","zeroTwoThree","four","rFour","five","isHidden","hideSelection","columnName","reloadNeeded","loadPositiveObservations","positiveBehaviorMultipleModalController","positiveBehaviorMultipleModalVM","cancel","isSelected","positiveBehaviorCount","isBehaviorManager","isWeeklyPositiveCount","showError","selectedStudents","SelectAll","step1","onBehaviorClick","behaviorId","selectStudent","studentInListAlready","selectAllStudents","savePositiveBehaviorForMultiple","behaviorEventObservation","behaviorEventParticipants","myNHA","GetApiService","addPositiveBehavior","next","isPositiveBehaviorAdd","positiveBehaviorModalController","positiveBehaviorModalVM","PositiveBehaviorIncidentCtrl","positiveBehaviorIncidentVM","isAdd","isUpdate","BehaviorEventObservationID","toggleObservation","BehaviorSidebarCtrl","behaviorSidebarVM","StudentListCtrl","getDataForBehaviorTeacherViewRepository","$cookies","behaviorLocalCache","courseSectionGroupRepository","courseSectionRepository","courseSectionRosterOrderRepository","studentListVM","updateCourseName","currentCourseName","loadViewData","csgID","scsID","viewOptions","isInWeekView","startOf","getData","attendanceRecords","meetingBlocks","schedule","mbt","meetingBlocksToShow","isSelfContained","mb","isCoreSubject","meetingBlockTimeName","mbByDate","minBy","meetingBlockToShow","sortBy","displayNameForGrid","isLastPeriodForDay","selectedMeetingBlockTimeId","isPositive","removalEndDate","removalDuration","removalStartDate","scheduleItem","anyStudentWithAttendance","hasAcademicCancellation","hasInstructionalCancellation","getStudentAttendanceRecordsBasedOnMasterMeetingSchedules","anyStudentsHaveAttendanceRecord","checkEmergencyRemoteLearningEnabled","datePanelOptions","_d","emergencyRemoteLearningEnabled","checkEmergencyRemoteLearning","horizontalAttendanceMessagesNeeded","originalStudentList","attendanceRecordsForStudent","masterMeetingScheduleIdsForDate","mmsId","studentAttendanceRecords","masterMeetingScheduleID","behaviorLevel","showLevels","getScheduleFromMeetingBlock","dow","incompleteIncidentLevel","scheduleComponent","isGridMode","studentOrderSaveSuccess","timer","showConfirmButton","studentOrderSaveFail","amClass","hasMultipleCourses","isAmPmClass","isMobileAm","isMobilePm","negativeSelection","pmClass","positiveSelection","previousCourseID","selectedRow","showAmPmBlocks","studentListLoading","svOptions","containment","viewIsFuture","absentReason","isAbsent","addNegativeIncident","isPresent","studentWasPartiallyAbsent","isInFuture","hasAttendanceRecord","getBehaviorLevelIdToEnter","addPositiveIncident","behaviorLevelColorUi","behaviorLevelUi","incompleteLevel","crit","displayAbsentAlert","getDateRangeText","goToNextCourse","Next","goToPreviousCourse","Prev","goToCourseList","goToSchedule","isInPast","numberOfAttendanceRecords","presentAttendanceRecordsForStudent","isInSchoolSuspension","isToday","loadStudentData","showGridView","showListView","openNewModal","studentHasAttendanceRecordsForWeek","saveInfo","getPositiveBehaviorEventSaveInfo","studentParticipant","openNewModalAllStudents","hasPresentRecord","hasAbsentRecord","record","swipedLeftToRight","selectedRowNegative","selectedRowPositive","displayFutureAlert","swipedRightToLeft","updateOrderNumbers","debouncedStudentOrderSave","startReorder","helper","closest","outerWidth","viewOption","noAttendanceTaken","someAttendanceTaken","filteredStudents","getCourseParameters","pagingParams","getAllLite","loadCoursesCall","filterAsOdataString","markingPeriodID","currentIndex","findIndex","courseSection","courseSectionGroupName","itemTwo","debounce","orderedStudents","specialsCourseSectionRosterID","saveRosterOrders","updateStudentOrder","today","isWeekView","isCurrentWeek","isBetween","isSame","isPastWeek","isPastDay","endOf","getLastAttendanceRecordTakenForTheWeek","getMeetingBlockByAttendanceRecord","head","isWeeklyCount","$filter","startOfWeek","endOfWeek","getAllForStudent","hasScsId","hasCsgId","positiveTotal","require","ngModel","$parsers","parsedText","textAsInt","isNaN","abs","$setViewValue","$render","names","searchTerm","filtered","search","splitSearch","take","searchFirstSection","searchSecondSection","hasTwoSearchSections","doesMatchDisplayName","startsWith","isFirstSearchTermMatch","isSecondSearchTermMatch","MainCtrl","breadcrumbs","sidebarOpen","toggleSidebarState","courselist","studentlist","skip","baseService","oDataParameters","getODataRequest","String","getList","service","msg","saveSuccess","saveSuccessWithMsg","updateSuccess","saveFailure","updateFailure","saveFailureWithMsg","loadFailure","retrievalFailure","dirtyForm","warningWithMsg","validationFailure","setForStudentInSchool","isRequired","entity","StudentBehaviorAttributeID","IsAdvancedBehaviorEntryRequired","post","coreRestangular","oDataFilter","columns","column","FilterOption","booleanOperator","comparer","searchParameter","textSearchFields","searchField","setFilters","sortSetting","sortDefault","sortString","$orderby","setSortOrder","defaultSortOrder","getLookupForBehaviorList","deleteBehaviorParticipantEvent","itemToDelete","behaviorEventParticipantId","one","getCurrentAnnualTotal","studentsEvents","todaysEvents","isValidCourseSectionOrCourseSectionGroup","ctor","$dirty","filteredForm","omit","addBehaviorDocument","customPOST","docs","responseType","repositoryFactory","repo","incidentDetails","updatedIncident","endpoint","customPUT","courseSectionId","getProjectedReturnDate","getSingle","documentParticipants","customGET","levelRepository","getDataForNegativeBehaviorChart","getDataForPositiveBehaviorChart","getBSPProgressCount","getCourseSections","studnetInSchoolId","getHistoryTimelineData","academicYear","getDataForTimelineBehaviorChart","getSchoolAcademicDates","participantTypeRepository","getByBehaviorLevel","dataSecurityService","sisId","getSchoolsForUser","usersSchools","getSchools","allSchools","getCourseDetailsForSecurity","details","hasSchoolMatch","checkIfStaffIdMatchesACourse","studentSearchByID","studentSchoolArray","cs","getUserCoursesForSecurity","studentCourses","studentsCourses","checkIfStudentIsInTeachersClass","userSchools","otherSchools","usersSchoolIDs","otherSchoolsIDs","internalDictionary","DSCacheFactory","storageMode","localStorage","gradebookRestangular","updateODataFilterWithNHAFilter","apiParameters","loadedCount","shapeCourseResults","staffName","toTitleCase","getByAcademicYearAndSchool","MarkingPeriodID","getCourseTimes","getSimilar","SchoolSubjectLevel1ID","schoolSubjectLevel1ID","CourseSubjectDisplayName","str","txt","charAt","isUserRoleSvc","isForStudentRecordIncidentEntry","setParametersBasedOnFilters","cachedData","getByObjectKey","putByObjectKey","selectedYear","selectedSchool","selectedMarkingPeriod","selectedGradeLevels","gradeLevelFilter","selectedTeachers","teacherFilter","subjectTypeID","cores","specials","core","special","getFilterId","gradeLevelIds","getAllFilterIds","homeroomIds","behaviorLevelIds","requireBSP","getFilterByColumnName","upcomingBSP","getParameters","filterName","MimeTypeName","studentSearch","buildODataParameters","PersonID","parentSearch","getFirstName","w","PositiveBehaviorService","ApiServiceFactory","getPositiveBehavior","RegisterApiService","ruleService","rules","selectedBehaviorObservationName","studentIepStatus","student504Status","ruleIepParameterValue","rule504ParameterValue","isSeclusionOrRestraintChecked","ruleParams","ruleParamActiveIep","ruleParamObservedBehaviors","tail","evaluate","rule","ruleName","debug","stateId","getActionQuestionAnswer","getStateNameBySchoolId","getSchoolStaffList","paramsKeys","keys","valueArray","validateValues","attendanceRestangular","studentOrders","destroyByObjectKey","selectedItems","AttendanceCode","attendanceCodeGroupIDs","homeRoomStaffFilter","oDataParams","getLastName","StudentID","defaultTranslationConfig","$translateProvider","JANUARY","FEBRUARY","MARCH","APRIL","MAI","JUNE","JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER","SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY","Controller","currentPopover","days","dayNamesLength","mondayIsFirstDay","popoverTemplateUrl","calendarId","onClick","domEvent","disabled","defaultDate","eventClick","dateClick","allowedPrevMonth","prevYear","prevMonth","minDate","currMonth","MONTHS","selectedMonth","getFullYear","getMonth","allowedNextMonth","nextYear","nextMonth","weekDays","WEEKDAYS","isDefaultDate","_defaultDate","getDate","setCurrentPopover","ctx","openningCalendarId","getDayClass","eventClass","arrowPrevClass","arrowNextClass","sunday","createMappedDisabledDates","disabledDates","mappedDisabledDates","createMappedEvents","mappedEvents","bindEvent","allowedDate","currDate","disabledDate","calculateWeeks","weeks","week","daysInCurrentMonth","dayNumber","getDay","_month","sixWeekMonth","currIndex","_index","changeMonth","prevMonthEvent","nextMonthEvent","registerEvents","selectedDay","calculateDisabledDates","filteredEvents","filteredEventsChange","previousYear","previousMonth","records","historyTimelineItemWidth","screenFieldUsageRepository","genderRepository","raceRepository","addParticipantVM","behaviorLevels","genders","races","isActionCollapsed","levelHasChanged","restraintPopoverName","seclusionPopoverName","dynamicFormFields","stateName","statesWithUniqueMinMaxDurations","widgetPositioning","horizontal","vertical","onBehaviorLevelChange","loadBehaviorLevelDependentFields","onActionChecked","checkedAction","validateEventParticipantOptionsSelectedCount","$name","isActionIssOssLtsExp","unCheckPreviousIssOssExp","checkedTimestamp","updateParticipantWithCheckedActions","onActionStartDateChange","isDecisionDateRequired","validateBoardDecisionDate","isReturnDateRequired","recalculateReturnDate","onActionStartTimeChange","onActionDurationChange","actionsLoading","excessDays","validateActionDuration","onBehaviorRoleChange","loadLevels","resetLevelField","resetEventParticipantOptionFields","onBoardDecisionDateChange","onInterventionChecked","updateParticipantWithCheckedInterventions","onIsRestraintChange","onIsSeclusionChange","onMotivationChecked","updateParticipantWithCheckedMotivations","onParticipantTypeChange","loadBehaviorRoles","onPendingLevel6Change","onPersonSelect","onRemoveClick","validateNameField","nameField","typeField","roleField","levelField","participantNotes","actionDateTimeValid","isActionDateValid","isActionDateTimeValid","validateSelectedActions","ageField","raceField","ethnicityField","sexField","isDurationRequired","actionFormId","actionDatesToCheckPromises","flatResults","allEnabledQuestions","isLongTermSuspended","isEditParticipant","saveParticipant","getDynamicFormFieldRequired","retVal","fieldDisplayOptionID","actionsFilter","getActionDateEntryOptions","getActionTimeEntryOptions","getMaxDuration","getMinDuration","staffDropdownSingleValueChanged","textDisplay","staffDropdownMultipleValueChanged","setTextDisplay","dropdownMultipleValueChanged","onStaffTypeaheadBlur","searchStaff","isStaffTypeaheadLoading","cloneDeepWith","clonedVal","isContinuingInNextAY","getGenders","getRaces","updateParticipantWithCheckedOptions","isOutOfSchoolSuspension","isExpulsion","isLongTermSuspension","seclusionRestraintOrderIndex","observationActionParams","initialActions","initialInterventions","initialMotivations","initialStateQuestions","selectedResults","matchParticipantActionsMotivationsInterventionsQuestions","updateFromParticipantSelectedOptions","resultsForQuestion","rfq","matchingAnswer","matchingStaff","findMatchingStaff","selectedOption","onSuccessfullPersonSearch","isNameTypeaheadLoading","searchResultPersonId","$item","$model","$label","minDuration","daysContinuingInNextAY","$viewValue","formFieldName","eventParticipantOptions","isSameOrBefore","isBoardDecisionDateValid","isBoardDecisionDateNotInFuture","isMinDurationValid","maxDuration","isMaxDurationValid","getMinOrMaxDuration","typeOfDuration","actionDate","actionDateTime","incidentDateTime","checkedActions","allSelectedAnswers","multiValueDropdownAnsweredQuestions","isActionIdOfQuestionSelected","parentStateBehaviorActionAnswerID","isParentAnswerOfQuestionSelection","evaluateRules","notDuplicateQuestion","questionCheck","isNotDuplicateQuestion","returnValue","selectedBehavior","selectedBehaviors","allSelectedOptions","idName","findFilter","selections","initialArray","participantArray","itemName","arrayName","matchesProperty","searchFn","selectedTypeName","searchStudentsIndicators","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""}