diff --git a/.babelrc b/.babelrc index 43249f435..bb8820014 100644 --- a/.babelrc +++ b/.babelrc @@ -1,3 +1,4 @@ { - "presets": ["@babel/react", "@babel/env"] + "presets": ["@babel/react", "@babel/env"], + "plugins": [["@babel/plugin-proposal-decorators", {}], ["@babel/plugin-proposal-class-properties", {}]] } \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json index c65d8925f..bf2d9d426 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -3,7 +3,7 @@ "extends": ["standard", "prettier", "prettier/standard"], "root": true, "parserOptions": { - "ecmaVersion": 5 + "ecmaVersion": 2015 }, "env": { "browser": true, diff --git a/.gitignore b/.gitignore index 5bae0e95c..8641f1b58 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,7 @@ config.json import.csv /src/mailer/templates/promo/ *.pem +/public/js/ /public/uploads/tickets/ /public/uploads/users/ coverage.html diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..95e21b1bb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM node:10.10-alpine + +RUN mkdir -p /usr/src/trudesk +WORKDIR /usr/src/trudesk + +COPY . /usr/src/trudesk + +RUN apk add --no-cache --update bash make gcc g++ python mongodb-tools + +RUN npm install -g yarn && \ + yarn install --production=false --prefer-offline && \ + npm rebuild bcrypt node-sass --build-from-source && \ + yarn run build && \ + yarn install --production --prefer-offline && \ + apk del make gcc g++ python + +EXPOSE 8118 + +CMD [ "/bin/bash", "/usr/src/trudesk/startup.sh" ] \ No newline at end of file diff --git a/app.js b/app.js index a1b1dcf21..aa1cfc396 100644 --- a/app.js +++ b/app.js @@ -10,6 +10,7 @@ ======================================================================== **/ +var _ = require('lodash') var async = require('async') var path = require('path') var fs = require('fs') @@ -19,6 +20,8 @@ var pkg = require('./package.json') var ws = require('./src/webserver') // `var memory = require('./src/memory'); +var isDocker = process.env.TRUDESK_DOCKER || false + global.forks = [] nconf.argv().env() @@ -84,7 +87,6 @@ if (!process.env.FORK) { } var configFile = path.join(__dirname, '/config.json') - var configExists if (nconf.get('config')) { @@ -93,33 +95,14 @@ if (nconf.get('config')) { configExists = fs.existsSync(configFile) -if (process.env.HEROKU) { - // Build Config for Heroku - var configHeroku = { - url: 'http://localhost:8118', - port: '8118' - } - - winston.info('Creating heroku config file...') - var config = JSON.stringify(configHeroku, null, 4) - - if (configExists) { - fs.unlinkSync(configFile) - } - - fs.writeFileSync(configFile, config) - - start() -} - -if (nconf.get('install') || (!configExists && !process.env.HEROKU)) { +function launchInstallServer () { ws.installServer(function () { return winston.info('Trudesk Install Server Running...') }) } -if (!nconf.get('setup') && !nconf.get('install') && !nconf.get('upgrade') && !nconf.get('reset') && configExists) { - start() +if (nconf.get('install') || (!configExists && !isDocker)) { + launchInstallServer() } function loadConfig () { @@ -133,7 +116,7 @@ function loadConfig () { } function start () { - loadConfig() + if (!isDocker) loadConfig() var _db = require('./src/database') @@ -150,11 +133,7 @@ function start () { }) } -function dbCallback (err, db) { - if (err) { - return start() - } - +function launchServer (db) { ws.init(db, function (err) { if (err) { winston.error(err) @@ -163,6 +142,12 @@ function dbCallback (err, db) { async.series( [ + function (next) { + require('./src/settings/defaults').init(next) + }, + function (next) { + require('./src/permissions').register(next) + }, function (next) { require('./src/socketserver')(ws) return next() @@ -184,23 +169,23 @@ function dbCallback (err, db) { winston.debug('Starting MailCheck...') mailCheck.init(settings) }) + } else { + return next() } - - return next() }) }, function (next) { - require('./src/settings/defaults').init(next) + require('./src/migration').run(next) }, function (next) { winston.debug('Building dynamic sass...') require('./src/sass/buildsass').build(next) }, - function (next) { - // Start Task Runners - require('./src/taskrunner') - return next() - }, + // function (next) { + // // Start Task Runners + // require('./src/taskrunner') + // return next() + // }, function (next) { // var pm2 = require('pm2'); // pm2.connect(true, function(err) { @@ -237,9 +222,23 @@ function dbCallback (err, db) { if (process.env.MEMORYLIMIT) { memLimit = process.env.MEMORYLIMIT } + + var env = { FORK: 1, NODE_ENV: global.env } + if (isDocker) { + var envDocker = { + TD_MONGODB_SERVER: process.env.TD_MONGODB_SERVER, + TD_MONGODB_PORT: process.env.TD_MONGODB_PORT, + TD_MONGODB_USERNAME: process.env.TD_MONGODB_USERNAME, + TD_MONGODB_PASSWORD: process.env.TD_MONGODB_PASSWORD, + TD_MONGODB_DATABASE: process.env.TD_MONGODB_DATABASE + } + + env = _.merge(env, envDocker) + } + var n = fork(path.join(__dirname, '/src/cache/index.js'), { execArgv: ['--max-old-space-size=' + memLimit], - env: { FORK: 1, NODE_ENV: global.env } + env: env }) global.forks.push({ name: 'cache', fork: n }) @@ -258,8 +257,33 @@ function dbCallback (err, db) { } ], function () { - winston.info('trudesk Ready') + ws.listen(function () { + winston.info('trudesk Ready') + }) } ) }) } + +function dbCallback (err, db) { + if (err) { + return start() + } + + if (isDocker) { + var s = require('./src/models/setting') + s.getSettingByName('installed', function (err, installed) { + if (err) return start() + + if (!installed) { + return launchInstallServer() + } else { + return launchServer(db) + } + }) + } else { + return launchServer(db) + } +} + +if (!nconf.get('install') && (configExists || isDocker)) start() diff --git a/gruntfile.js b/gruntfile.js index b96b1a4d4..22607a76c 100644 --- a/gruntfile.js +++ b/gruntfile.js @@ -20,7 +20,7 @@ module.exports = function (grunt) { watch: { web: { - files: ['*.js', 'src/**/*.js', 'plugins/**/*.js', '!src/public/**/*.js'], + files: ['*.js', 'src/**/*.js', 'plugins/**/*.js', '!src/public/**/*.js', '!src/client/**/*.js'], tasks: ['express:web'], options: { nospawn: true, diff --git a/mobile/index.html b/mobile/index.html index 71392122d..5ae6f191f 100644 --- a/mobile/index.html +++ b/mobile/index.html @@ -51,7 +51,7 @@
- +
diff --git a/mobile/js/app.js b/mobile/js/app.js deleted file mode 100644 index 3755ee5cb..000000000 --- a/mobile/js/app.js +++ /dev/null @@ -1,270 +0,0 @@ -// Ionic trudesk App - -// angular.module is a global place for creating, registering and retrieving Angular modules -// 'trudesk' is the name of this angular module example (also set in a attribute in index.html) -// the 2nd parameter is an array of 'requires' -// 'trudesk.services' is found in services.js -// 'trudesk.controllers' is found in controllers.js -angular.module('underscore', []) -.factory('_', ['$window', function($window) { - return $window._; -}]); - -angular.module('snackbar', []) -.factory('Snackbar', ['$window', function($window) { - return $window.Snackbar; -}]); - -angular.module('trudesk', [ - 'ionic', - 'ngCordova', - 'ngStorage', - 'underscore', - 'trudesk.controllers', - 'trudesk.services', - 'fileOnChange', - 'angular-peity', - 'snackbar', - 'ngCropper', - 'monospaced.elastic', - 'angularMoment', - 'jett.ionic.filter.bar', - 'angular.img' - ]) - -.run(function($ionicPlatform, $rootScope, $location, $localStorage, $state, $http) { - if ($localStorage.accessToken) { - $http.defaults.headers.common.accesstoken = $localStorage.accessToken; - } else { - $http.defaults.headers.common.accesstoken = ''; - } - - $ionicPlatform.ready(function() { - // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard - // for form inputs) - if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) { - cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); - cordova.plugins.Keyboard.disableScroll(true); - } - - // Lock screen in Portrait if on anything but iPad - if (!ionic.Platform.isIPad()) { - if (window.screen) { - window.screen.orientation.lock('portrait'); - } - } else { - if (window.screen) { - window.screen.orientation.unlock(); - } - } - - if (window.StatusBar) { - // org.apache.cordova.statusbar required - window.StatusBar.styleLightContent(); - } - - var notificationOpenedCallback = function(jsonData) { - if (jsonData.notification.payload && jsonData.notification.payload.additionalData) { - var ticketUid = jsonData.notification.payload.additionalData.ticketUid; - if (ticketUid) { -// console.log('Moving to ticket: ' + ticketUid); - $state.go('tab.tickets') - setTimeout(function() { - return $state.go('tab.tickets-details', { ticketuid: ticketUid}) - }, 850); - } - } - }; - - if (window.plugins && window.plugins.OneSignal) { - window.plugins.OneSignal - .startInit("f8e19190-b53b-4b72-bac8-210e7f31bebb") - .handleNotificationOpened(notificationOpenedCallback) - .endInit(); - } - - $rootScope.$on('$stateChangeStart', function(event, next, current) { - if ($location.url() !== '/login' && ($localStorage.accessToken == undefined || $localStorage.server == undefined)) { - return $location.path('/login'); - } - }); - - setTimeout(function() { - angular.element(document.querySelector('#loader')).addClass('hide'); - }, 900); - }); -}) - -.filter('htmlToPlaintext', function() -{ - return function(text) - { - text = text ? String(text).replace(/<[^>]+>/gm, '') : ''; - text = text ? String(text).replace(/&/gm, '&') : ''; - text = text ? String(text).replace(/"/gm, '"') : ''; - text = text ? String(text).replace(/'/gm, '\'') : ''; - return text; - }; -}) - -.filter('removeHTMLTags', function() { - return function(text) { - return text ? String(text).replace(/<[^>]+>/gm, ' ') : ''; - }; -}) - -.filter('nl2br', ['$filter', - function($filter) { - return function(data) { - if (!data) return data; - return data.replace(/\n\r?/g, '
'); - } - } -]) - -.filter('sanitize', ['$sce', function($sce) { - return function(htmlCode) { - return $sce.trustAsHtml(htmlCode); - } -}]) - -.filter('currentdate',['$filter', function($filter) { - return function() { - return $filter('date')(new Date(), 'M/dd/yy h:mm a'); - }; -}]) - -.filter('statusMap', function() { - return function(s) { - var status; - switch (s) { - case 0: - status = 'New'; - break; - case 1: - status = 'Open'; - break; - case 2: - status = 'Pending'; - break; - case 3: - status = 'Closed'; - break; - } - - return status; - } -}) - -.filter('assigneeMap', function() { - return function(a) { - if (a === undefined || a === null) { - return 'No Assignee'; - } else { - return a; - } - } -}) - -//Conversation Stuff -.filter('conversationFrom', function() { - return function(p, loggedInUser) { - var final; - for(var i = 0; i < p.length; i++) { - if (p[i].username != loggedInUser.username) - final = p[i]; - } - - return final; - } -}) - -.config(function($stateProvider, $urlRouterProvider) { - ionic.Platform.setPlatform('ios'); - // Ionic uses AngularUI Router which uses the concept of states - // Learn more here: https://github.com/angular-ui/ui-router - // Set up the various states which the app can be in. - // Each state's controller can be found in controllers.js - $stateProvider - - //Login - .state('login', { - url: '/login', - templateUrl: 'templates/login.html', - controller: 'LoginCtrl' - }) - - // setup an abstract state for the tabs directive - .state('tab', { - url: '/tab', - abstract: true, - templateUrl: 'templates/tabs.html' - }) - - // Each tab has its own nav history stack: - - .state('tab.dash', { - url: '/dash', - views: { - 'tab-dash': { - templateUrl: 'templates/tab-dash.html', - controller: 'DashCtrl' - } - } - }) - - .state('tab.tickets', { - url: '/tickets', - views: { - 'tab-tickets': { - templateUrl: 'templates/tab-tickets.html', - controller: 'TicketsCtrl' - } - } - }) - - .state('tab.tickets-details', { - url: '/tickets/:ticketuid', - views: { - 'tab-tickets': { - templateUrl: 'templates/ticket-detail.html', - controller: 'TicketsDetailCtrl' - } - } - }) - - .state('tab.messages', { - url: '/messages', - views: { - 'tab-messages': { - templateUrl: 'templates/tab-messages.html', - controller: 'MessagesCtrl' - } - } - }) - - .state('tab.messages-conversation', { - url: '/messages/:conversationid', - views: { - 'tab-messages': { - templateUrl: 'templates/conversation.html', - controller: 'ConversationCtrl', - controllerAs: 'ConversationCtrl' - } - } - }) - - .state('tab.account', { - url: '/account', - views: { - 'tab-account': { - templateUrl: 'templates/tab-account.html', - controller: 'AccountCtrl' - } - } - }); - - // if none of the above states are matched, use this as the fallback - $urlRouterProvider.otherwise('/login'); - -}); diff --git a/mobile/js/controllers.js b/mobile/js/controllers.js deleted file mode 100644 index ab7fca8aa..000000000 --- a/mobile/js/controllers.js +++ /dev/null @@ -1,14 +0,0 @@ -(function() { - return angular.module('trudesk.controllers', [ - 'trudesk.controllers.login', - 'trudesk.controllers.dashboard', - 'trudesk.controllers.tickets', - 'trudesk.controllers.ticketDetails', - 'trudesk.controllers.accounts', - 'trudesk.controllers.messages', - 'trudesk.controllers.messages.conversation', - - 'trudesk.controllers.imgCrop', - 'trudesk.controllers.graphs' - ]); -})() diff --git a/mobile/js/controllers/accounts.js b/mobile/js/controllers/accounts.js deleted file mode 100644 index bbe37e343..000000000 --- a/mobile/js/controllers/accounts.js +++ /dev/null @@ -1,106 +0,0 @@ -angular.module('trudesk.controllers.accounts', []) -.controller('AccountCtrl', function($q, $scope, $state, $http, $timeout, $localStorage, $ionicHistory, $ionicActionSheet, $ionicModal, $cordovaCamera, Camera, Users, Upload) { - - $scope.server = $localStorage.server; - - $ionicModal.fromTemplateUrl('templates/modals/modal-imgcrop.html', { - scope: $scope, - animation: 'slide-in-up' - }).then(function(modal) { - $scope.imgcropModal = modal; - }); - - ionic.on('$trudesk.showCropper', function() { - $scope.imgcropModal.show(); - }); - - ionic.on('$trudesk.hideCropper', function() { - $scope.imgcropModal.hide(); - }); - - $scope.showActionSheet = function(event) { - if (!ionic.Platform.isWebView()) return; - var sheet = $ionicActionSheet.show({ - buttons: [ - { text: 'Take Photo' }, - { text: 'Open Photo Library' } - ], - titleText: 'Account Picture', - cancelText: 'Cancel', - cancel: function() { - - }, - buttonClicked: function(index) { - switch (index) { - case 0: - $scope.openCamera(); - return true; - case 1: - $scope.openPhotoLibrary(); - return true - default: - return true; - } - } - }); - }; - - $scope.openCamera = function() { - Camera.open().then(function(fileURL) { - ionic.trigger('$trudesk.imgcrop.setImage', {image: window.Ionic.WebView.convertFileSrc(fileURL)}); - ionic.trigger('$trudesk.imgcrop.showCropper', {}); - $scope.imgcropModal.show(); - }); - }; - - $scope.openPhotoLibrary = function() { - Camera.library().then(function(fileURL) { - ionic.trigger('$trudesk.imgcrop.setImage', {image: window.Ionic.WebView.convertFileSrc(fileURL)}); - ionic.trigger('$trudesk.imgcrop.showCropper', {}); - $scope.imgcropModal.show(); - }); - - ionic.on('$trudesk.account.updateImage', function(data) { - $scope.updateAccountImage(); - }); - }; - - $scope.logout = function($event) { - $event.preventDefault(); - $http.get('/logout/', { - timeout: 2000 - }).then(function successCallback(response) { - - }, function errorCallback(response) { - - }).finally(function() { - ionic.trigger('$trudesk.clearLoginForm', {}); - $localStorage.server = undefined; - $localStorage.accessToken = undefined; - $http.defaults.headers.common.accesstoken = $localStorage.accessToken; - if (window.plugins && window.plugins.OneSignal) - window.plugins.OneSignal.setSubscription(false); - $ionicHistory.clearCache(); - return $state.go('login'); - }); - }; - - $scope.updateAccountImage = function() { - $localStorage.loggedInUser = null; - Users.getLoggedInUser().then(function(user) { - $scope.loggedInUser = user; - if (user.image) - $scope.accountProfile = '/uploads/users/' + $scope.loggedInUser.image + '?time=' + new Date().getTime(); - else - $scope.accountProfile = '/uploads/users/defaultProfile.jpg'; - }, function(err) { - console.log(err); - }); - }; - - $scope.$on('$ionicView.beforeEnter', function() { - if (!$scope.accountProfile) - $scope.accountProfile = '/uploads/users/defaultProfile.jpg'; - $scope.updateAccountImage(); - }); -}); diff --git a/mobile/js/controllers/conversation.js b/mobile/js/controllers/conversation.js deleted file mode 100644 index dabe485c7..000000000 --- a/mobile/js/controllers/conversation.js +++ /dev/null @@ -1,323 +0,0 @@ -angular.module('trudesk.controllers.messages.conversation', []).controller('ConversationCtrl', function ( - $rootScope, $scope, $state, $stateParams, $localStorage, $ionicListDelegate, $ionicNavBarDelegate, $ionicModal, - $ionicPopup, $ionicPopover, $ionicActionSheet, $ionicLoading, $ionicScrollDelegate, $ionicHistory, $interval, $timeout, $q, moment, WebSocket, Messages, Users) { - - $ionicNavBarDelegate.showBackButton(true); - - var viewScroll = $ionicScrollDelegate.$getByHandle('userMessageScroll'); - - //Vars - $scope.server = $localStorage.server; - $scope.isUserOnline = Users.isUserOnline; - $scope.onlineUsers = {}; - $scope.message = { - body: '' - }; - $scope.messages = []; - $scope.partnerTyping = false; - - $ionicPopover.fromTemplateUrl('templates/popover/popover-messages-conversation.html', { - scope: $scope - }).then(function (popover) { - $scope.popover = popover; - }); - - //Private - var txtInput; // gets set in $ionicView.enter - var typingTimer = null; - var partnerTypingTimer = null; - var isTyping = false; - - //EVENTS - $scope.$on('$ionicView.beforeEnter', function () { - ensureLogin($localStorage, $state); - $scope.server = $localStorage.server; - Users.getLoggedInUser().then(function (user) { - $scope.loggedInUser = user; - $scope.getConversation(); - }, function (err) { - console.log(err); - }).then(function () { - window.addEventListener('native.keyboardshow', onKeyboardShow); - window.addEventListener('native.keyboardhide', onKeyboardHide); - window.addEventListener('$trudesk.converstation.chatmessage', onChatMessage); - window.addEventListener('$trudesk.conversation.updateusers', onUpdateUsers); - // ionic.on('$trudesk.conversation.chatmessage', onChatMessage, window); - ionic.on('$trudesk.conversation.usertyping', onPartnerTyping, window); - ionic.on('$trudesk.conversation.userstoptyping', onPartnerStopTyping, window); - // ionic.on('$trudesk.conversation.updateusers', onUpdateUsers, window); - }).then(function() { - $timeout(function() { - WebSocket.updateUsers(); - }, 0); - }); - }); - - $scope.$on('$ionicView.enter', function () { - txtInput = angular.element(document.body.querySelector('#message-textarea')); - }); - - $scope.$on('$stateChangeStart', function (e) { - window.removeEventListener('native.keyboardshow', onKeyboardShow); - window.removeEventListener('native.keyboardhide', onKeyboardHide); - window.removeEventListener('$trudesk.conversation.chatmessage', onChatMessage); - - ionic.off('$trudesk.conversation.usertyping', onPartnerTyping, window); - ionic.off('$trudesk.conversation.userstoptyping', onPartnerStopTyping, window); - window.removeEventListener('$trudesk.conversation.updateusers', onUpdateUsers); - - stopTyping(); - typingTimer = undefined; - partnerTypingTimer = undefined; - }); - - function scrollBottom() { - $timeout(function () { - viewScroll.scrollBottom(); - }, 10); - } - - function onKeyboardShow(e) { - scrollBottom(); - } - - function onKeyboardHide(e) { - scrollBottom(); - } - - function onPartnerTyping(data) { - if ($scope.partnerTyping) { - clearTimeout(partnerTypingTimer); - partnerTypingTimer = setTimeout(cancelPartnerTyping, 15000); - return; - } - - $scope.partnerTyping = true; - scrollBottom(); - - if (partnerTypingTimer == undefined) - partnerTypingTimer = setTimeout(cancelPartnerTyping, 15000); - } - - function onPartnerStopTyping(data) { - $timeout(function () { - $scope.partnerTyping = false; - }, 0); - } - - function cancelPartnerTyping() { - $timeout(function () { - $scope.partnerTyping = false; - partnerTypingTimer = undefined; - }, 0); - }; - - function onChatMessage(data) { - var m = { - _id: data.detail.messageId, - createdAt: new Date().toISOString(), - owner: data.detail.fromUser, - body: data.detail.message - }; - - $timeout(function () { - $scope.messages.push(m); - - if (viewScroll != undefined) - scrollBottom(); - }, 0); - } - - function onUpdateUsers(data) { - $timeout(function () { - $scope.onlineUsers = data.detail; - }, 0); - } - - - //IF CACHE-VIEW="FALSE" THIS IS NEEDED TO REMOVE THE LISTENER - // var TIMER = $interval(function() { - // if ($ionicHistory.currentView().stateName != 'tab.messages-conversation') { - // console.log('OFF CONVERSATION'); - // ionic.off('$trudesk.conversation.chatmessage', onChatMessage, window); - // $interval.cancel(TIMER); - // return; - // } - // }); - - $scope.getConversation = function () { - if ($scope.page == undefined) - $scope.page = 0; - - return Messages.getConversation($stateParams.conversationid, $scope.page).then(function (response) { - $scope.conversation = response.data.conversation; - - //Set partner ID - for (var i = 0; i < $scope.conversation.participants.length; i++) { - if ($scope.conversation.participants[i].username != $scope.loggedInUser.username) - $scope.conversation.partner = $scope.conversation.participants[i]; - } - - if (_.size(response.data.messages) < 1) { - $scope.hasMore = false; - return; - } - - if ($scope.page == 0) - $scope.messages = response.data.messages.reverse(); - else { - var a = $scope.messages; - if (_.size(a) > 0) - $scope.messages = _.uniq(_.union(a, response.data.messages), false, function(i, k, a){ return i._id }); - $scope.messages = _.sortBy($scope.messages, function(message){ - return message.createdAt; - }); - } - - if (_.size(response.data.messages) < 10) { - $scope.hasMore = false; - } - }, function (err) { - console.log(err); - }).then(function () { - $timeout(function () { - if ($scope.page == 0) - scrollBottom(); - else - $timeout(function () { - viewScroll.scrollBy(0, 150, true); - }); - - $scope.page++; - $scope.$broadcast('scroll.infiniteScrollComplete'); - }, 0); - }); - }; - - $scope.$on('elastic:resize', function (event, element, oldHeight, newHeight) { - $('.message-textbox').css('max-height', newHeight + 'px').css('height', newHeight + 'px'); - element.css('max-height', newHeight - 1 + 'px'); - if (newHeight >= 100) { - element.css('max-height', '99px'); - element.css({ - 'bottom': '5px' - }); - $('.message-textbox').css('max-height', '105px').css('height', '105px'); - } else { - element.css({ - bottom: '0' - }); - } - }); - - $scope.chatTyping = function (event) { - if ((event.shiftKey & event.keyCode === 13) || (event.keyCode === 13 && ionic.Platform.isWebView())) { - return; - } - if (event.keyCode === 13 && !ionic.Platform.isWebView()) { - //Send - event.preventDefault(); - return $scope.sendChatMessage(); - } - - if (isTyping) { - clearTimeout(typingTimer); - typingTimer = setTimeout(stopTyping, 5000); - return; - } - - isTyping = true; - - if (typingTimer == undefined) - typingTimer = setTimeout(stopTyping, 5000); - WebSocket.startTyping($scope.conversation._id, $scope.conversation.partner._id, $localStorage.loggedInUser._id); - }; - - function partnerTyping(data) { - $timeout(function () { - partnerTyping = true; - }, 0); - }; - - // Functions - function stopTyping() { - typingTimer = undefined; - isTyping = false; - if ($scope.conversation === undefined) return; - WebSocket.stopTyping($scope.conversation._id, $scope.conversation.partner._id); - } - // this keeps the keyboard open on a device only after sending a message, it is non obtrusive - function keepKeyboardOpen() { - txtInput.one('blur', function () { - txtInput[0].focus(); - }); - } - - $scope.shouldShowDate = function (date) { - var now = moment(); - var dMoment = moment(date); - var timeDiff = now.diff(dMoment, 'minutes'); - if (timeDiff > 60) - return true; - else - return false; - }; - - - //Loading more messages on Scrolling - $scope.canFetchMoreMessages = function() { - if ($scope.hasMore === undefined) - $scope.hasMore = true; - - return $scope.hasMore; - }; - - $scope.loadMore = function () { - console.log('loading more'); - i++; - if (i > 10) - $scope.hasMore = false; - - if ($scope.conversation !== undefined) { - for (var j = 0; j < 11; j++) { - var message = { - createdAt: new Date(), - body: 'here', - owner: $localStorage.loggedInUser, - _id: Math.random() - }; - $scope.conversation.messages.unshift(message); - } - } - - $timeout(function () { - viewScroll.scrollBy(0, 150, true); - }); - $timeout(function () { - $scope.$broadcast('scroll.infiniteScrollComplete'); - }, 3000); - }; - - - $scope.sendChatMessage = function () { - if (_.isEmpty($scope.message.body)) return false; - $scope.message.ownerId = $scope.loggedInUser._id; - var scopeMessageClone = _.clone($scope.message); - $scope.message.body = ''; - Messages.sendMessage($scope.conversation._id, scopeMessageClone).then(function (response) { - - var message = response.data.message; - WebSocket.send($scope.conversation._id, $scope.conversation.partner._id, $scope.loggedInUser._id, message._id, message.body); - stopTyping(); - keepKeyboardOpen(); - scrollBottom(); - }, function (err) { - console.log(err); - }); - }; -}); - -function ensureLogin($localStorage, $state) { - if ($localStorage.server === undefined || $localStorage.accessToken === undefined) - return $state.go('login'); -} diff --git a/mobile/js/controllers/dashboard.js b/mobile/js/controllers/dashboard.js deleted file mode 100644 index 7138c006f..000000000 --- a/mobile/js/controllers/dashboard.js +++ /dev/null @@ -1,47 +0,0 @@ -angular.module('trudesk.controllers.dashboard', []).controller('DashCtrl', function($http, $scope, $state, $location, $ionicNavBarDelegate, $localStorage, Tickets) { - var path = $location.path(); - if (path.indexOf('dashboard') === -1) - $ionicNavBarDelegate.showBackButton(false); - else - $ionicNavBarDelegate.showBackButton(true); - - $scope.totalTickets = 0; - $scope.timespans = [ - {label: '30 Days', value: 30}, - {label: '60 Days', value: 60}, - {label: '90 Days', value: 90}, - {label: '180 Days', value: 180}, - {label: '365 Days', value: 365} - ]; - - $scope.selectedTimespan = 30; - - $scope.barChart = [5,3,9,6,5,9,7]; - $scope.lineChart = [5,3,9,6,5,9,7,3,5,2]; - - function getStats(timespan) { - Tickets.ticketStats(timespan).then(function successCallback(response) { - $scope.totalTickets = response.data.ticketCount ? response.data.ticketCount : 0; - var closedCount = Number(response.data.closedCount); - $scope.closedPercent = Math.round((closedCount / $scope.totalTickets) * 100); - $scope.closedPercent = isNaN($scope.closedPercent) ? '--' : $scope.closedPercent; - $scope.closedPercentPie = $scope.closedPercent + '/100'; - $scope.ticketAvg = response.data.ticketAvg ? response.data.ticketAvg : 0; - }); - } - - getStats(30); - $scope.timespanChange = function($event) { - $scope.selectedTimespan = this.selectedTimespan; - getStats($scope.selectedTimespan); - }; - - $scope.$on('$ionicView.enter', function() { - if (window.StatusBar) - window.StatusBar.styleLightContent(); - }); - - $scope.$on('$ionicView.beforeEnter', function() { - ensureLogin($localStorage, $state); - }); -}) diff --git a/mobile/js/controllers/graph.js b/mobile/js/controllers/graph.js deleted file mode 100644 index e37bee61a..000000000 --- a/mobile/js/controllers/graph.js +++ /dev/null @@ -1,64 +0,0 @@ -angular.module('trudesk.controllers.graphs', []).controller('GraphCtrl', function($scope, $http, _, Graphs) { - $scope.renderGraphs = function() { - Graphs.topGroups().then(function successCallback(response) { - var arr = []; - if (_.size(response.data.items) < 1) { - response.data.items = [{name: 'No Data', count: 1}]; - } - - arr = _.map(response.data.items, function(v, k) { - return [v.name, v.count]; - }); - - var colors = [ - '#e74c3c', - '#3498db', - '#9b59b6', - '#34495e', - '#1abc9c', - '#2ecc71', - '#03A9F4', - '#00BCD4', - '#009688', - '#4CAF50', - '#FF5722', - '#CDDC39', - '#FFC107', - '#00E5FF', - '#E040FB', - '#607D8B' - ]; - - colors = _.shuffle(colors); - - var c = _.object(_.map(arr, function(v,i) { - return v[0]; - }), colors); - - c3.generate({ - bindto: '#topGroupsChart', - size: { - height: 150, - width: 315 - }, - data: { - columns: arr, - type: 'pie', - colors: c - }, - tooltip: { - show: false - }, - pie: { - label: { - format: function(v, r, id) { - return ''; - } - } - } - }) - }, function errorCallback(err) { - console.error(err); - }); - }; -}); diff --git a/mobile/js/controllers/imgCrop.js b/mobile/js/controllers/imgCrop.js deleted file mode 100644 index f086daa0f..000000000 --- a/mobile/js/controllers/imgCrop.js +++ /dev/null @@ -1,61 +0,0 @@ -angular.module('trudesk.controllers.imgCrop', []) -.controller('imgCrop', function($scope, $state, $timeout, $localStorage, $cordovaCamera, Cropper, Camera, Upload, Users) { - $scope.options = { - maximize: true, - aspectRatio: 1 / 1, - checkImageOrigin: true, - rotatable: true, - //zoomable: false, - viewMode: 1, - dragMode: 'move', - checkOrientation: true - }; - - $scope.cropper = {}; - $scope.cropperProxy = 'cropper.first'; - - Users.getLoggedInUser().then(function(user) { - $scope.loggedInUser = user; - }, function(error) { - console.log(error); - }); - - $scope.showEvent = 'showCropper'; - $scope.hideEvent = 'hideCropper'; - - function showCropper() { $scope.$broadcast($scope.showEvent); } - function hideCropper() { $scope.$broadcast($scope.hideEvent); } - - $scope.close = function() { - ionic.trigger('$trudesk.hideCropper', {}); - }; - - $scope.save = function() { - if (!$scope.cropper.first) return; - var canvas = $scope.cropper.first('getCroppedCanvas', {width: 256, height: 256}); - - var image = canvas.toDataURL(); - Upload.profilePicture(image).then(function(response) { - ionic.trigger('$trudesk.account.updateImage', {image: response.user.image}); - }, function(err) { - console.log(err); - }).finally(function() { - $scope.close(); - }); - - }; - - ionic.on('$trudesk.imgcrop.showCropper', function() { - $timeout(function() { - hideCropper(); - showCropper(); - }, 0); - }); - - ionic.on('$trudesk.imgcrop.setImage', function(data) { - if (data.detail === undefined || data.detail.image === undefined) return console.log('Invalid data.detail.image'); - // hideCropper(); - $scope.o = data.detail.image; - // showCropper(); - }); -}); diff --git a/mobile/js/controllers/login.js b/mobile/js/controllers/login.js deleted file mode 100644 index 52a805753..000000000 --- a/mobile/js/controllers/login.js +++ /dev/null @@ -1,124 +0,0 @@ -angular.module('trudesk.controllers.login', []).controller('LoginCtrl', function($http, $scope, $state, $localStorage, $ionicLoading, $ionicPopup) { - // if (window.StatusBar) { - // // org.apache.cordova.statusbar required - // window.StatusBar.styleDefault(); - // } - - $ionicLoading.show({ - templateUrl: 'templates/modals/modal-loading.html', - noBackdrop: true, - duration: 1200 - }); - - $scope.auth = { - server: '', - username: '', - password: '' - }; - - $scope.invalid = { - server: false, - username: false, - password: false - }; - - function showError(err) { - var alertPopup = $ionicPopup.alert({ - title: 'Error', - template: err, - okType: 'button-assertive' - }); - - alertPopup.then(function() { - - }); - } - - $scope.login = function(loginForm) { - if (loginForm.$valid) { - $scope.invalid.server = false; - $scope.invalid.username = false; - $scope.invalid.password = false; - $ionicLoading.show({ - templateUrl: 'templates/modals/modal-loading.html', - noBackdrop: true - }); - $scope.auth.server = $scope.auth.server.replace(/^https?:\/\//,''); - $http.post('/api/v1/login', { - 'username': $scope.auth.username, - 'password': $scope.auth.password - }).then(function successCallback(response) { - if (response.data.success === false) { - showError(response.data.error); - } else if (response.data.accessToken !== undefined) { - $localStorage.server = ''; - $localStorage.username = $scope.auth.username; - $localStorage.accessToken = response.data.accessToken; - $localStorage.loggedInUser = response.data.user; - - $http.defaults.headers.common.accesstoken = $localStorage.accessToken; - - //OneSignal - if (window.plugins && window.plugins.OneSignal) { - window.plugins.OneSignal.setSubscription(true); - window.plugins.OneSignal.sendTags({host: $localStorage.server, user: $localStorage.loggedInUser._id}); - } - - $http.get('/api/v1/roles', { - headers: { - 'accesstoken': $localStorage.accessToken - } - }).then(function successCallback(response) { - $localStorage.roles = response.data; - }, function errorCallback(response) { - console.log('Error', response); - }).then(function() { - $state.go('tab.dash'); - }); - } - }, function errorCallback(response) { - console.error(response); - switch (response.status) { - case -1: - showError('Could not connect. Please check server and try again.'); - break; - case 401: - showError('Invalid Username / Password'); - break; - default: - showError('Could not connect. Please check server and try again.'); - - } - }).then(function finalCallback() { - setTimeout(function(){ - $ionicLoading.hide(); - }, 500); - }); - } else { - $scope.invalid.server = loginForm.server.$invalid; - $scope.invalid.username = loginForm.username.$invalid; - $scope.invalid.password = loginForm.password.$invalid - } - }; - - ionic.on('$trudesk.clearLoginForm', function() { - $scope.auth.server = ''; - $scope.auth.username = ''; - $scope.auth.password = ''; - }); - - $scope.$on('$ionicView.enter', function() { - setTimeout(function() { - if ($localStorage.server !== undefined && $localStorage.accessToken !== undefined) { - return $state.go('tab.dash'); // Change this for default page to load when logged in. - } - - if (window.StatusBar) - window.StatusBar.styleDefault(); - - angular.element(document).find('ion-view').removeClass('hide'); - if (window.plugins && window.plugins.OneSignal) - window.plugins.OneSignal.setSubscription(false); - }, 600); - }); -}); diff --git a/mobile/js/controllers/messages.js b/mobile/js/controllers/messages.js deleted file mode 100644 index c0082d8b2..000000000 --- a/mobile/js/controllers/messages.js +++ /dev/null @@ -1,193 +0,0 @@ -angular.module('trudesk.controllers.messages', []).controller('MessagesCtrl', function ( - $scope, $state, $stateParams, $localStorage, $ionicListDelegate, $ionicNavBarDelegate, $ionicModal, - $ionicPopup, $ionicActionSheet, $ionicLoading, $ionicScrollDelegate, $ionicFilterBarConfig, $ionicFilterBar, $timeout, $q, WebSocket, Messages, Users) { - - $ionicNavBarDelegate.showBackButton(true); - $ionicFilterBarConfig.theme = 'dark'; - - //Modals - $ionicModal.fromTemplateUrl('templates/modals/modal-messages-newconversation.html', { - scope: $scope, - animation: 'slide-in-up' - }).then(function (modal) { - $scope.newConversation = modal; - }); - - $scope.server = $localStorage.server; - - //Socket.io - $scope.socket = WebSocket; - $scope.recentConversations = []; - $scope.isUserOnline = Users.isUserOnline; - $scope.onlineUsers = []; - $scope.userList = []; - - //EVENTS - $scope.$on('$ionicView.beforeEnter', function () { - ensureLogin($localStorage, $state); - $scope.server = $localStorage.server; - Users.getLoggedInUser().then(function (user) { - $scope.loggedInUser = user; - }, function (err) { - console.log(err); - }).then(function () { - ionic.on('$trudesk.conversation.updateusers', onUpdateUsers, window); - $timeout(function () { - $scope.loadRecentConversations(); - }, 0); - }); - }); - - $scope.$on("$ionicView.enter", function (scopes, states) { - - }); - - $scope.$on('$stateChangeStart', function (e) { - ionic.off('$trudesk.conversation.updateusers', onUpdateUsers, window); - }); - - // Functions - $scope.loadRecentConversations = function () { - Messages.getRecent().then(function (response) { - //Success - $scope.recentConversations = response.data.conversations; - $scope.showRecentConversations = _.size($scope.recentConversations) >= 1; - }, function (err) { - console.log(err); - $scope.showRecentConversations = false; - }); - }; - - $scope.showNewConversation = function () { - $scope.getUserList().then(function () { - $scope.newConversation.show(); - }); - }; - - $scope.hideNewConversation = function () { - if (filterBarInstance) { - filterBarInstance(); - filterBarInstance = null; - } - - $scope.newConversation.hide(); - }; - - $scope.startConversation = function (userId) { - Messages.startConversation(userId).then(function (response) { - var convoId = response.data.conversation._id; - if (convoId === undefined) { - $scope.showSnackbar('Invalid Conversation Id', true); - } else { - if ($scope.newConversation !== undefined) - $scope.hideNewConversation(); - return $state.go('tab.messages-conversation', { - conversationid: convoId - }); - } - }, function (error) { - $scope.showSnackbar(error, true); - console.log(error); - }); - }; - - $scope.deleteConversation = function(convoId) { - Messages.deleteConversation(convoId).then(function (response) { - if (response.data.success) { - var convo = _.find($scope.recentConversations, function(obj) { return obj._id.toString() === convoId.toString()}); - var idx = $scope.recentConversations.indexOf(convo); - if (idx !== -1) - $scope.recentConversations.splice(idx, 1); - } - }, function (error) { - $scope.showSnackbar(error, true); - console.log(error); - }).finally(function() { - //check for 0 recent Convo, and load the last; - $timeout(function () { - $scope.loadRecentConversations(); - }, 0); - }); - }; - - $scope.getUserList = function () { - return Users.getUsers().then(function (res) { - var list = res.data.users; - for (var i = 0; i < list.length; i++) { - if (list[i].username === $localStorage.loggedInUser.username) - list.splice(i, 1); - else { - delete list[i].__v; - delete list[i].accessToken; - delete list[i].deleted; - delete list[i].groups; - delete list[i].iOSDeviceTokens; - delete list[i].lastOnline; - delete list[i].preferences; - delete list[i].role; - delete list[i].title; - } - - } - - $scope.userList = list; - }, function (err) { - $scope.showSnackbar(err, true); - console.log(err); - }); - }; - - var filterBarInstance; - $scope.showFilterBar = function () { - filterBarInstance = $ionicFilterBar.show({ - items: $scope.userList, - container: '.modal', - debounce: true, - delay: 100, - update: function (filteredItems, filterText) { - $scope.userList = filteredItems; - } - }); - }; - - $scope.showSnackbar = function (text, error) { - if (_.isUndefined(error)) error = false; - - var textColor = '#FFFFFF'; - - if (error) - textColor = '#ef473a'; - - Snackbar.show({ - text: text, - showAction: false, - duration: 3000, - textColor: textColor - }); - }; - - function onUpdateUsers(data) { - $timeout(function () { - $scope.onlineUsers = data.detail; - delete $scope.onlineUsers[$scope.loggedInUser.username]; - $ionicScrollDelegate.$getByHandle('activeUsersScroll').resize(); - }, 0); - } - - $scope.isEmpty = function (items) { - var bar; - for (bar in items) { - if (items.hasOwnProperty(bar)) { - return false; - } - } - - return true; - } - -}); - -function ensureLogin($localStorage, $state) { - if ($localStorage.server === undefined || $localStorage.accessToken === undefined) - return $state.go('login'); -} diff --git a/mobile/js/controllers/ticketDetails.js b/mobile/js/controllers/ticketDetails.js deleted file mode 100644 index 9ebe652d3..000000000 --- a/mobile/js/controllers/ticketDetails.js +++ /dev/null @@ -1,310 +0,0 @@ -angular.module('trudesk.controllers.ticketDetails', []).controller('TicketsDetailCtrl', function( - $scope, $state, $stateParams, $ionicHistory, $ionicNavBarDelegate, $localStorage, $ionicModal, $ionicPopover, $ionicActionSheet, Tickets, Users) { - - $ionicNavBarDelegate.showBackButton(true); - - $scope.showSnackbar = function(text, error) { - if (_.isUndefined(error)) error = false; - - var textColor = '#FFFFFF'; - - if (error) - textColor = '#ef473a'; - - Snackbar.show({ - text: text, - showAction: false, - duration: 3000, - textColor: textColor - }); - }; - - $scope.server = $localStorage.server; - $scope.loggedInUser = undefined; - $scope.commentModalForm = { - comment: '' - }; - $scope.noteModalForm = { - note: '' - }; - - $scope.isSupport = ($localStorage.loggedInUser.role === 'admin' || $localStorage.loggedInUser.role === 'mod' || $localStorage.loggedInUser.role === 'support'); - - $ionicModal.fromTemplateUrl('templates/modals/modal-ticket-details.html', { - scope: $scope, - animation: 'slide-in-up' - }).then(function(modal) { - $scope.ticketDetailModal = modal; - }); - - $ionicModal.fromTemplateUrl('templates/modals/modal-addComment.html', { - scope: $scope, - animation: 'slide-in-up' - }).then(function(modal) { - $scope.addCommentModal = modal; - }); - - $ionicModal.fromTemplateUrl('templates/modals/modal-addNote.html', { - scope: $scope, - animation: 'slide-in-up' - }).then(function(modal) { - $scope.addNoteModal = modal; - }); - - $ionicModal.fromTemplateUrl('templates/modals/modal-ticket-setAssignee.html', { - scope: $scope, - animation: 'slide-in-up', - focusFirstInput: true - }).then(function(modal) { - $scope.setAssigneeModal = modal; - }); - - Tickets.get($stateParams.ticketuid).then(function successCallback(response) { - $scope.ticket = response.data.ticket; - if ($scope.ticket.assignee) $scope.selectedAssignee = $scope.ticket.assignee._id; - if ($scope.ticket.owner.image === undefined) $scope.ticket.owner.image = 'defaultProfile.jpg'; - $scope.hasAssignee = 'hide'; - if ($scope.ticket.assignee !== undefined) $scope.hasAssignee = 'show'; - if ($scope.ticket.assignee !== undefined && $scope.ticket.assignee.image === undefined) $scope.ticket.assignee.image = 'defaultProfile.jpg'; - - if ($scope.isSupport) - $scope.ticket.commentsMerged = _.sortBy(_.union($scope.ticket.comments, $scope.ticket.notes), 'date'); - else - $scope.ticket.commentsMerged = $scope.ticket.comments; - }); - - Users.getAssignees().then(function successCallback(response) { - $scope.assignees = response.data.users; - }, function errorCallback(response) { - console.log(response); - }); - - //Right Nav Popover - $scope.popover = $ionicPopover.fromTemplateUrl('templates/popover/popover-ticket-details.html', { - scope: $scope - }).then(function(popover) { - $scope.popover = popover; - }); - - $scope.showStatusActionSheet = function() { - $scope.popover.hide(); - $ionicActionSheet.show({ - buttons: [ - { text: 'Open' }, - { text: 'Pending' }, - { text: 'Closed' } - ], - titleText: 'Set Ticket Status', - cancelText: 'Cancel', - cancel: function() { - return true; - }, - buttonClicked: function(index) { - switch (index) { - case 0: - var reqTicket = {_id: $scope.ticket._id}; - reqTicket.status = 1; - Tickets.update(reqTicket).then(function successCallback(response) { - $scope.ticket.status = 1; - $scope.showSnackbar('Ticket status set to Open'); - }, function errorCallback(response) { - console.log(response); - }); - return true; - case 1: - var reqTicket = {_id: $scope.ticket._id}; - reqTicket.status = 2; - Tickets.update(reqTicket).then(function successCallback(response) { - $scope.ticket.status = 2; - $scope.showSnackbar('Ticket status set to Pending'); - }, function errorCallback(response) { - console.log(response); - }); - return true; - case 2: - var reqTicket = {_id: $scope.ticket._id}; - reqTicket.status = 3; - $scope.ticket.status = 3; - Tickets.update(reqTicket).then(function successCallback(response) { - ionic.trigger('$trudesk.refreshTickets', {}); - $scope.popover.hide(); - $ionicHistory.goBack(); - }, function errorCallback(response) { - console.log(response); - }); - return true; - default: - return true; - } - } - }); - }; - - $scope.setAssigneeChanged = function() { - $scope.selectedAssignee = this.selectedAssignee; - }; - - $scope.showAddComment = function($event) { - Users.getLoggedInUser().then(function(user) { - $scope.loggedInUser = user; - }).then(function() { - $scope.popover.hide(); - $scope.addCommentModal.show(); - }); - }; - - $scope.closeAddComment = function() { - $scope.commentModalForm.comment = ''; - $scope.addCommentModal.hide(); - }; - - $scope.showAddNote = function($event) { - Users.getLoggedInUser().then(function(user) { - $scope.loggedInUser = user; - }).then(function() { - $scope.addNoteModal.show(); - $scope.popover.hide(); - }); - }; - - $scope.closeAddNote = function() { - $scope.noteModalForm.note = ''; - $scope.addNoteModal.hide(); - }; - - $scope.openSetAssigneeModal = function() { - $scope.setAssigneeModal.show(); - $scope.popover.hide(); - }; - - $scope.closeSetAssigneeModal = function() { - if ($scope.setAssigneeModal !== undefined) - $scope.setAssigneeModal.hide(); - }; - - $scope.showTicketDetails = function() { - $scope.ticketDetailModal.show(); - $scope.popover.hide(); - }; - - $scope.closeTicketDetailsModal = function() { - $scope.ticketDetailModal.hide(); - }; - - $scope.closeTicket = function() { - $scope.ticket.status = 3; - Tickets.update($scope.ticket).then(function successCallback(response) { - ionic.trigger('$trudesk.refreshTickets', {}); - $scope.popover.hide(); - $ionicHistory.goBack(); - }, function errorCallback(response) { - console.log(response); - }); - }; - - //Form Submits - $scope.addCommentFormSubmit = function() { - var comment = { - ownerId: $scope.loggedInUser._id, - comment: this.commentModalForm.comment - }; - - Tickets.addComment($scope.ticket, comment).then(function successCallback(response) { - //Comment Added - }, function errorCallback(err) { - console.log(err); - $scope.showSnackbar(err, true); - }).then(function() { - Tickets.get($stateParams.ticketuid).then(function successCallback(response) { - $scope.ticket = response.data.ticket; - //Merge Arrays for Note Displaying - if ($scope.isSupport) - $scope.ticket.commentsMerged = _.sortBy(_.union($scope.ticket.comments, $scope.ticket.notes), 'date'); - else - $scope.ticket.commentsMerged = $scope.ticket.comments; - - if ($scope.ticket.owner.image === undefined) $scope.ticket.owner.image = 'defaultProfile.jpg'; - }).then(function() { - $scope.commentModalForm.comment = ''; - $scope.closeAddComment(); - }); - }); - }; - - $scope.addNoteFormSubmit = function() { - var note = { - ownerId: $scope.loggedInUser._id, - note: this.noteModalForm.note - }; - - Tickets.addNote($scope.ticket, note).then(function successCallback(response) { - //Note Added - }, function errorCallback(err) { - console.log(err); - $scope.showSnackbar(err, true); - }).then(function() { - Tickets.get($stateParams.ticketuid).then(function successCallback(response) { - $scope.ticket = response.data.ticket; - - if ($scope.isSupport) - $scope.ticket.commentsMerged = _.sortBy(_.union($scope.ticket.comments, $scope.ticket.notes), 'date'); - else - $scope.ticket.commentsMerged = $scope.tickets.comments; - - if ($scope.ticket.owner.image === undefined) $scope.ticket.owner.image = 'defaultProfile.jpg'; - }).then(function() { - $scope.noteModalForm.note = ''; - $scope.closeAddNote(); - }); - }); - }; - - $scope.setAssigneeFormSubmit = function() { - if (!$scope.ticket) { - $scope.showSnackbar('Invalid Ticket Object', true); - return; - } - - if ($scope.ticket.assignee && $scope.ticket.assignee._id === $scope.selectedAssignee) { - $scope.setAssigneeModal.hide(); - return; - } - - $scope.ticket.assignee = $scope.selectedAssignee; - - Tickets.update($scope.ticket).then(function successCallback(response) { - $scope.ticket = response.data.ticket; - - $scope.hasAssignee = 'hide'; - if ($scope.ticket.assignee !== undefined) $scope.hasAssignee = 'show'; - if ($scope.ticket.assignee !== undefined && $scope.ticket.assignee.image === undefined) $scope.ticket.assignee.image = 'defaultProfile.jpg'; - - if ($scope.isSupport) - $scope.ticket.commentsMerged = _.sortBy(_.union($scope.ticket.comments, $scope.ticket.notes), 'date'); - else - $scope.ticket.commentsMerged = $scope.ticket.comments; - - $scope.setAssigneeModal.hide(); - }, function errorCallback(response) { - console.log(response.data); - $scope.showSnackbar('Error: ' + response.data, true); - }); - }; - - $scope.$on('$ionicView.beforeEnter', function() { - ensureLogin($localStorage, $state); - }); - - $scope.$on('$destroy', function() { - $scope.popover.remove(); - $scope.addCommentModal.remove(); - $scope.addNoteModal.remove(); - $scope.ticketDetailModal.remove(); - $scope.setAssigneeModal.remove(); - }); -}); - -function ensureLogin($localStorage, $state) { - if ($localStorage.server === undefined || $localStorage.accessToken === undefined) - return $state.go('login'); -} diff --git a/mobile/js/controllers/tickets.js b/mobile/js/controllers/tickets.js deleted file mode 100644 index d6291e7b5..000000000 --- a/mobile/js/controllers/tickets.js +++ /dev/null @@ -1,414 +0,0 @@ -angular.module('trudesk.controllers.tickets', []).controller('TicketsCtrl', function( - $scope, $state, $timeout, $stateParams, $localStorage, $ionicListDelegate, $ionicNavBarDelegate, $ionicModal, - $ionicPopup, $ionicActionSheet, $ionicLoading, $q, Tickets, Users, Groups, TicketTypes) { - - $ionicNavBarDelegate.showBackButton(true); - - $ionicModal.fromTemplateUrl('templates/modals/modal-newticket.html', { - scope: $scope, - animation: 'slide-in-up' - }).then(function(modal) { - $scope.newTicketModal = modal; - }); - - $ionicModal.fromTemplateUrl('templates/modals/modal-ticket-filter.html', { - scope: $scope, - animation: 'slide-in-up' - }).then(function(modal) { - $scope.filterTicketModal = modal; - }); - - $ionicModal.fromTemplateUrl('templates/modals/modal-addComment.html', { - scope: $scope, - animation: 'slide-in-up' - }).then(function(modal) { - $scope.addCommentModal = modal; - }); - - - //SETUP VARS - // $scope.server = $localStorage.server; - $scope.showLoadingTickets = true; - $scope.search = { - term: '' - }; - $scope.filter = {}; - $scope.filter.showClosedTickets = $localStorage.showClosedTickets; - $scope.filter.showOnlyAssigned = $localStorage.showOnlyAssigned; - $scope.commentModalForm = { - comment: '', - ticket: '' - }; - - $scope.isSupport = ($localStorage.loggedInUser.role == 'admin' || $localStorage.loggedInUser.role == 'mod' || $localStorage.loggedInUser.role == 'support'); - - $scope.showSnackbar = function(text, error) { - if (_.isUndefined(error)) error = false; - - var textColor = '#FFFFFF'; - - if (error) - textColor = '#ef473a'; - - Snackbar.show({ - text: text, - showAction: true, - actionText: 'X', - actionTextColor: '#ccc', - duration: 3000, - textColor: textColor - }); - }; - - $scope.showActionSheet = function($event, $ticket) { - $ionicListDelegate.closeOptionButtons(); - var buttons = [ - { text: 'Add Comment' } - ]; - - if ($scope.isSupport) { - buttons.push({ text: 'Open' }); - buttons.push({ text: 'Pending' }); - buttons.push({ text: 'Closed' }); - } - var sheet = $ionicActionSheet.show({ - buttons: buttons, - titleText: 'Ticket Options', - cancelText: 'Cancel', - cancel: function() { - - }, - buttonClicked: function(index) { - switch (index) { - case 0: - var t = _.find($scope.tickets, function(obj){ return obj._id == $ticket._id; }); - $scope.commentModalForm.ticket = t; - $scope.addCommentModal.show(); - return true; - break; - case 1: - var t = _.find($scope.tickets, function(obj){ return obj._id == $ticket._id; }); - var reqTicket = {_id: t._id}; - reqTicket.status = 1; - Tickets.update(reqTicket).then(function successCallback(response) { - t.status = 1; - $scope.showSnackbar('Ticket status set to Open'); - }, function errorCallback(response) { - console.log(response); - }); - return true; - case 2: - var t = _.find($scope.tickets, function(obj){ return obj._id == $ticket._id; }); - var reqTicket = {_id: t._id}; - reqTicket.status = 2; - Tickets.update(reqTicket).then(function successCallback(response) { - t.status = 2; - $scope.showSnackbar('Ticket status set to Pending'); - }, function errorCallback(response) { - console.log(response); - }); - return true; - case 3: - var t = _.find($scope.tickets, function(obj){ return obj._id == $ticket._id; }); - var reqTicket = {_id: t._id}; - reqTicket.status = 3; - Tickets.update(reqTicket).then(function successCallback(response) { - var idx = $scope.tickets.indexOf(t); - if (idx != -1) - $scope.tickets.splice(idx, 1); - $scope.showSnackbar('Ticket status set to Closed'); - }, function errorCallback(response) { - console.log(response); - }).finally(function() { - if (_.size($scope.tickets) < 1) - $scope.showNoTickets = true; - else - $scope.showNoTickets = false; - }); - return true; - default: - return true; - } - } - }); - }; - - $scope.doRefresh = function() { - $scope.search.term = ''; - $scope.shouldRefresh = true; - $scope.fetchTickets().finally(function() { - $scope.$broadcast('scroll.refreshComplete'); - }); - }; - - $scope.getUserImage = function(imageFile) { - var url = 'http://' + $localStorage.server + '/uploads/users/' + imageFile; - - return Users.getImage(url).then(function(image) { - console.log(image); - }); - } - - $scope.fetchTickets = function() { - angular.element(document).find('ion-item').removeClass('item-remove-animate'); - if ($scope.page == undefined) - $scope.page = 0; - - if ($scope.shouldRefresh) { - $scope.page = 0; - $scope.hasMoreTickets = true; - $scope.shouldRefresh = false; - } - - return Tickets.all($scope.page).then(function successCallback(response) { - if (_.size(response.data) < 1) { - $scope.hasMoreTickets = false; - return; - } - - if ($scope.page == 0) { - $scope.tickets = response.data; - } else { - var a = $scope.tickets; - if (_.size(a) > 0) - $scope.tickets = _.uniq(_.union(a, response.data), false, function(i, k, a){ return i._id; }); - } - - }, function errorCallback(error) { - $scope.$broadcast('scroll.infiniteScrollComplete'); - $scope.hasMoreTickets = false; - if (error.status === -1) - return $scope.showAlert('Error', 'Connection Refused.'); - if (error.status === 401) { - ionic.trigger('$trudesk.clearLoginForm', {}); - $localStorage.server = undefined; - $localStorage.accessToken = undefined; - $state.go('login'); - return $scope.showAlert('Error', 'You have been logged out.'); - } - $scope.showAlert('Error', 'Error Status: ' + error.status); - - }).finally(function() { - $scope.showLoadingTickets = false; - if (_.size($scope.tickets) > 0) - $scope.showNoTickets = false; - else - $scope.showNoTickets = true; - - $scope.page++; - $scope.$broadcast('scroll.infiniteScrollComplete'); - }); - }; - - $scope.canFetchMoreTickets = function() { - if ($scope.hasMoreTickets === undefined) - $scope.hasMoreTickets = true; - - return $scope.hasMoreTickets; - }; - - $scope.selected = { - group: '', - ticketType: '', - priority: '' - }; - - $scope.$watch('selected.ticketType', function(newValue, oldValue, scope) { - if (newValue && newValue.priorities) - $scope.selected.priority = newValue.priorities[0]; - }, true); - - $scope.openNewTicket = function() { - var groups = Groups.all(), - types = TicketTypes.all(); - - $q.all([groups, types]).then(function successCallback(results) { - $scope.groups = results[0].data.groups; - $scope.ticketTypes = results[1].data; - if ($scope.ticketTypes[0] && $scope.ticketTypes[0]._id) - $scope.selected.ticketType = $scope.ticketTypes[0]; - $scope.modalNewTicketForm = { - subject: '', - issue: '' - }; - $scope.selected.group = ''; - - }, function errorCallback(error) { - console.error('Error - ' + error); - }).then(function() { - $scope.newTicketModal.show(); - }); - }; - - $scope.closeNewTicket = function() { - $scope.newTicketModal.hide(); - }; - - $scope.openFilterTicket = function() { - $scope.filterTicketModal.show(); - }; - - $scope.applyTicketFilter = function() { - $scope.closeTicketFilter(); - }; - - $scope.closeTicketFilter = function() { - if ($scope.search.term !== '') { - $scope.tickets = []; - $scope.filterTicketModal.hide(); - Snackbar.show({ - text: 'Loading...', - showAction: false, - duration: 2147483647, // Max duration..24days - textColor: '#FFFFFF' - }); - - return Tickets.search($scope.search.term).then(function successCallback(response) { - $scope.tickets = response.data.tickets; - - $timeout(function() { - if (_.size($scope.tickets) < 1) - $scope.showNoTickets = true; - else - $scope.showNoTickets = false; - }, 0); - - $scope.hasMoreTickets = false; - Snackbar.close(); - }, function errorCallback(response) { - console.log(response); - }); - } - - $scope.filterTicketModal.hide(); - if ($scope.shouldRefresh) - $scope.fetchTickets(); - }; - - $scope.clearTicketFilter = function() { - $scope.search.term = ''; - $scope.tickets = null; - $scope.filter.showClosedTickets = false; - $scope.filter.showOnlyAssigned = false; - $localStorage.showClosedTickets = false; - $localStorage.showOnlyAssigned = false; - - ionic.trigger('$trudesk.refreshTickets', {}); - $scope.filterTicketModal.hide(); - }; - - $scope.searchTermChanged = function() { - $scope.shouldRefresh = true; - } - - $scope.showClosedTicketsChanged = function() { - $scope.filter.showClosedTickets = this.filter.showClosedTickets; - $localStorage.showClosedTickets = $scope.filter.showClosedTickets; - $scope.shouldRefresh = true; - }; - - $scope.showOnlyAssigneedChanged = function() { - $scope.filtershowOnlyAssigneed = this.filter.showOnlyAssigned; - $localStorage.showOnlyAssigned = $scope.filter.showOnlyAssigned; - $scope.shouldRefresh = true; - }; - - $scope.closeAddComment = function() { - $scope.addCommentModal.hide(); - }; - - $scope.modalNewTicketForm = { - subject: '', - issue: '' - }; - - $scope.addCommentFormSubmit = function() { - var comment = { - ownerId: $scope.loggedInUser._id, - comment: this.commentModalForm.comment - }; - - Tickets.addComment($scope.commentModalForm.ticket, comment).then(function successCallback(response) { - //Comment Added - }, function errorCallback(err) { - console.log(err); - $scope.showSnackbar(err, true); - }).then(function() { - $scope.commentModalForm.comment = ''; - $scope.commentModalForm.ticket = ''; - $scope.closeAddComment(); - }); - }; - - $scope.submitNewTicket = function($event) { - $event.preventDefault(); - var ticket = { - type: $scope.selected.ticketType, - subject: this.modalNewTicketForm.subject, - issue: this.modalNewTicketForm.issue, - group: $scope.selected.group, - priority: $scope.selected.priority - }; - - if (!ticket.type || !ticket.subject || !ticket.issue || !ticket.group || !ticket.priority) { - // Show Error - - return; - } - - Tickets.create(ticket).then(function successCallback(response) { - ionic.trigger('$trudesk.refreshTickets', {}); - $scope.modalNewTicketForm = { - subject: '', - issue: '' - }; - $scope.closeNewTicket(); - - }, function errorCallback(response) { - console.log('Error----'); - console.log(response); - $scope.showAlert('Error: ' + response.statusText, response.data.error.message); - }).then(function() { - - }); - }; - - $scope.showAlert = function(title, text, button) { - if (button === undefined) button = 'button-assertive'; - return $ionicPopup.alert({ - title: title, - template: text, - okType: button - }); - }; - - ionic.on('$trudesk.refreshTickets', function() { - $scope.doRefresh(); - }); - - $scope.$on('$ionicView.beforeEnter', function() { - ensureLogin($localStorage, $state); - $scope.server = $localStorage.server; - Users.getLoggedInUser().then(function(user) { - $scope.loggedInUser = user; - }, function(err) { - console.log(err); - }); - }); - - $scope.$on('$ionicView.enter', function() { - if (_.size($scope.tickets) < 1) - $scope.doRefresh(); - }); - - $scope.$on('$destroy', function() { - $scope.newTicketModal.remove(); - $scope.filterTicketModal.remove(); - $scope.addCommentModal.remove(); - }); -}); - -function ensureLogin($localStorage, $state) { - if ($localStorage.server === undefined || $localStorage.accessToken === undefined) - return $state.go('login'); -} diff --git a/mobile/js/directives.js b/mobile/js/directives.js deleted file mode 100644 index 610a25c70..000000000 --- a/mobile/js/directives.js +++ /dev/null @@ -1,116 +0,0 @@ -var angularPeity = angular.module('angular-peity', [] ); - -var peityDirective = function(type) { - 'user strict'; - - return { - restrict: 'E', - require: 'ngModel', - scope: { - options: '=' - }, - link: function(scope, element, attrs, ngModel) { - var options = {}; - - if (scope.options) - options = scope.options; - - element[0].innerText = ngModel.$viewValue; - attrs.val = ngModel.$viewValue; - - ngModel.$render = function() { - element[0].innerText = ngModel.$viewValue; - jQuery(element[0]).peity(type, options); - } - } - } -}; - -angularPeity.directive('pieChart', function() { - return peityDirective('donut'); -}); - -angularPeity.directive('barChart', function() { - return peityDirective('bar'); -}); - -angularPeity.directive('lineChart', function() { - return peityDirective('line'); -}); - -var fileOnChange = angular.module('fileOnChange', []); - -fileOnChange.directive('fileOnChange', function() { - return { - restrict: 'A', - link: function(scope, element, attrs) { - var onChangeHandler = scope.$eval(attrs.fileOnChange); - element.bind('change', onChangeHandler); - } - }; -}); - -var autoLinker = angular.module('autolinker', []); -autoLinker.directive('autolinker', ['$timeout', function($timeout) { - return { - restrict: 'A', - link: function(scope, element, attrs) { - $timeout(function() { - var eleHtml = element.html(); - if (eleHtml === '') { - return false; - } - - var text = AutoLinker.link(eleHtml, { - className: 'autolinker', - newWindow: false - }); - - element.html(text); - - var autolinks = element[0].getElementsByClassName('autolinker'); - - for(var i = 0; i < autolinks.length; i++) { - angular.element(autolinks[i].bind('click', function(e) { - var href = e.target.href; - - if (href) { - window.open(href, '_blank'); - } - - e.preventDefault(); - - return false; - })); - } - }, 0); - } - } -}]); - -var hideTabBar = angular.module('hideTabBar', []); - -hideTabBar.directive('hideTabBar', function($timeout) { - var style = angular.element('');\n\n/*** EXPORTS FROM exports-loader ***/\nmodule.exports = angular;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\")))\n\n//# sourceURL=webpack:///./src/public/js/vendor/angular/angular.min.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/async/async.js": -/*!*********************************************!*\ - !*** ./src/public/js/vendor/async/async.js ***! - \*********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function(global, module, setImmediate, process) {(function (global, factory) {\r\n true ? factory(exports) :\r\n undefined;\r\n}(this, (function (exports) { 'use strict';\r\n\r\n /**\r\n * A faster alternative to `Function#apply`, this function invokes `func`\r\n * with the `this` binding of `thisArg` and the arguments of `args`.\r\n *\r\n * @private\r\n * @param {Function} func The function to invoke.\r\n * @param {*} thisArg The `this` binding of `func`.\r\n * @param {Array} args The arguments to invoke `func` with.\r\n * @returns {*} Returns the result of `func`.\r\n */\r\n function apply(func, thisArg, args) {\r\n switch (args.length) {\r\n case 0: return func.call(thisArg);\r\n case 1: return func.call(thisArg, args[0]);\r\n case 2: return func.call(thisArg, args[0], args[1]);\r\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\r\n }\r\n return func.apply(thisArg, args);\r\n }\r\n\r\n /* Built-in method references for those with the same name as other `lodash` methods. */\r\n var nativeMax = Math.max;\r\n\r\n /**\r\n * A specialized version of `baseRest` which transforms the rest array.\r\n *\r\n * @private\r\n * @param {Function} func The function to apply a rest parameter to.\r\n * @param {number} [start=func.length-1] The start position of the rest parameter.\r\n * @param {Function} transform The rest array transform.\r\n * @returns {Function} Returns the new function.\r\n */\r\n function overRest$1(func, start, transform) {\r\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\r\n return function() {\r\n var args = arguments,\r\n index = -1,\r\n length = nativeMax(args.length - start, 0),\r\n array = Array(length);\r\n\r\n while (++index < length) {\r\n array[index] = args[start + index];\r\n }\r\n index = -1;\r\n var otherArgs = Array(start + 1);\r\n while (++index < start) {\r\n otherArgs[index] = args[index];\r\n }\r\n otherArgs[start] = transform(array);\r\n return apply(func, this, otherArgs);\r\n };\r\n }\r\n\r\n /**\r\n * This method returns the first argument it receives.\r\n *\r\n * @static\r\n * @since 0.1.0\r\n * @memberOf _\r\n * @category Util\r\n * @param {*} value Any value.\r\n * @returns {*} Returns `value`.\r\n * @example\r\n *\r\n * var object = { 'a': 1 };\r\n *\r\n * console.log(_.identity(object) === object);\r\n * // => true\r\n */\r\n function identity(value) {\r\n return value;\r\n }\r\n\r\n// Lodash rest function without function.toString()\r\n// remappings\r\n function rest(func, start) {\r\n return overRest$1(func, start, identity);\r\n }\r\n\r\n var initialParams = function (fn) {\r\n return rest(function (args /*..., callback*/) {\r\n var callback = args.pop();\r\n fn.call(this, args, callback);\r\n });\r\n };\r\n\r\n function applyEach$1(eachfn) {\r\n return rest(function (fns, args) {\r\n var go = initialParams(function (args, callback) {\r\n var that = this;\r\n return eachfn(fns, function (fn, cb) {\r\n fn.apply(that, args.concat(cb));\r\n }, callback);\r\n });\r\n if (args.length) {\r\n return go.apply(this, args);\r\n } else {\r\n return go;\r\n }\r\n });\r\n }\r\n\r\n /** Detect free variable `global` from Node.js. */\r\n var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\r\n\r\n /** Detect free variable `self`. */\r\n var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\r\n\r\n /** Used as a reference to the global object. */\r\n var root = freeGlobal || freeSelf || Function('return this')();\r\n\r\n /** Built-in value references. */\r\n var Symbol$1 = root.Symbol;\r\n\r\n /** Used for built-in method references. */\r\n var objectProto = Object.prototype;\r\n\r\n /** Used to check objects for own properties. */\r\n var hasOwnProperty = objectProto.hasOwnProperty;\r\n\r\n /**\r\n * Used to resolve the\r\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\r\n * of values.\r\n */\r\n var nativeObjectToString = objectProto.toString;\r\n\r\n /** Built-in value references. */\r\n var symToStringTag$1 = Symbol$1 ? Symbol$1.toStringTag : undefined;\r\n\r\n /**\r\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\r\n *\r\n * @private\r\n * @param {*} value The value to query.\r\n * @returns {string} Returns the raw `toStringTag`.\r\n */\r\n function getRawTag(value) {\r\n var isOwn = hasOwnProperty.call(value, symToStringTag$1),\r\n tag = value[symToStringTag$1];\r\n\r\n try {\r\n value[symToStringTag$1] = undefined;\r\n var unmasked = true;\r\n } catch (e) {}\r\n\r\n var result = nativeObjectToString.call(value);\r\n if (unmasked) {\r\n if (isOwn) {\r\n value[symToStringTag$1] = tag;\r\n } else {\r\n delete value[symToStringTag$1];\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /** Used for built-in method references. */\r\n var objectProto$1 = Object.prototype;\r\n\r\n /**\r\n * Used to resolve the\r\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\r\n * of values.\r\n */\r\n var nativeObjectToString$1 = objectProto$1.toString;\r\n\r\n /**\r\n * Converts `value` to a string using `Object.prototype.toString`.\r\n *\r\n * @private\r\n * @param {*} value The value to convert.\r\n * @returns {string} Returns the converted string.\r\n */\r\n function objectToString(value) {\r\n return nativeObjectToString$1.call(value);\r\n }\r\n\r\n /** `Object#toString` result references. */\r\n var nullTag = '[object Null]';\r\n var undefinedTag = '[object Undefined]';\r\n\r\n /** Built-in value references. */\r\n var symToStringTag = Symbol$1 ? Symbol$1.toStringTag : undefined;\r\n\r\n /**\r\n * The base implementation of `getTag` without fallbacks for buggy environments.\r\n *\r\n * @private\r\n * @param {*} value The value to query.\r\n * @returns {string} Returns the `toStringTag`.\r\n */\r\n function baseGetTag(value) {\r\n if (value == null) {\r\n return value === undefined ? undefinedTag : nullTag;\r\n }\r\n value = Object(value);\r\n return (symToStringTag && symToStringTag in value)\r\n ? getRawTag(value)\r\n : objectToString(value);\r\n }\r\n\r\n /**\r\n * Checks if `value` is the\r\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\r\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\r\n * @example\r\n *\r\n * _.isObject({});\r\n * // => true\r\n *\r\n * _.isObject([1, 2, 3]);\r\n * // => true\r\n *\r\n * _.isObject(_.noop);\r\n * // => true\r\n *\r\n * _.isObject(null);\r\n * // => false\r\n */\r\n function isObject(value) {\r\n var type = typeof value;\r\n return value != null && (type == 'object' || type == 'function');\r\n }\r\n\r\n /** `Object#toString` result references. */\r\n var asyncTag = '[object AsyncFunction]';\r\n var funcTag = '[object Function]';\r\n var genTag = '[object GeneratorFunction]';\r\n var proxyTag = '[object Proxy]';\r\n\r\n /**\r\n * Checks if `value` is classified as a `Function` object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\r\n * @example\r\n *\r\n * _.isFunction(_);\r\n * // => true\r\n *\r\n * _.isFunction(/abc/);\r\n * // => false\r\n */\r\n function isFunction(value) {\r\n if (!isObject(value)) {\r\n return false;\r\n }\r\n // The use of `Object#toString` avoids issues with the `typeof` operator\r\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\r\n var tag = baseGetTag(value);\r\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\r\n }\r\n\r\n /** Used as references for various `Number` constants. */\r\n var MAX_SAFE_INTEGER = 9007199254740991;\r\n\r\n /**\r\n * Checks if `value` is a valid array-like length.\r\n *\r\n * **Note:** This method is loosely based on\r\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\r\n * @example\r\n *\r\n * _.isLength(3);\r\n * // => true\r\n *\r\n * _.isLength(Number.MIN_VALUE);\r\n * // => false\r\n *\r\n * _.isLength(Infinity);\r\n * // => false\r\n *\r\n * _.isLength('3');\r\n * // => false\r\n */\r\n function isLength(value) {\r\n return typeof value == 'number' &&\r\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\r\n }\r\n\r\n /**\r\n * Checks if `value` is array-like. A value is considered array-like if it's\r\n * not a function and has a `value.length` that's an integer greater than or\r\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\r\n * @example\r\n *\r\n * _.isArrayLike([1, 2, 3]);\r\n * // => true\r\n *\r\n * _.isArrayLike(document.body.children);\r\n * // => true\r\n *\r\n * _.isArrayLike('abc');\r\n * // => true\r\n *\r\n * _.isArrayLike(_.noop);\r\n * // => false\r\n */\r\n function isArrayLike(value) {\r\n return value != null && isLength(value.length) && !isFunction(value);\r\n }\r\n\r\n /**\r\n * This method returns `undefined`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 2.3.0\r\n * @category Util\r\n * @example\r\n *\r\n * _.times(2, _.noop);\r\n * // => [undefined, undefined]\r\n */\r\n function noop() {\r\n // No operation performed.\r\n }\r\n\r\n function once(fn) {\r\n return function () {\r\n if (fn === null) return;\r\n var callFn = fn;\r\n fn = null;\r\n callFn.apply(this, arguments);\r\n };\r\n }\r\n\r\n var iteratorSymbol = typeof Symbol === 'function' && Symbol.iterator;\r\n\r\n var getIterator = function (coll) {\r\n return iteratorSymbol && coll[iteratorSymbol] && coll[iteratorSymbol]();\r\n };\r\n\r\n /**\r\n * The base implementation of `_.times` without support for iteratee shorthands\r\n * or max array length checks.\r\n *\r\n * @private\r\n * @param {number} n The number of times to invoke `iteratee`.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @returns {Array} Returns the array of results.\r\n */\r\n function baseTimes(n, iteratee) {\r\n var index = -1,\r\n result = Array(n);\r\n\r\n while (++index < n) {\r\n result[index] = iteratee(index);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Checks if `value` is object-like. A value is object-like if it's not `null`\r\n * and has a `typeof` result of \"object\".\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\r\n * @example\r\n *\r\n * _.isObjectLike({});\r\n * // => true\r\n *\r\n * _.isObjectLike([1, 2, 3]);\r\n * // => true\r\n *\r\n * _.isObjectLike(_.noop);\r\n * // => false\r\n *\r\n * _.isObjectLike(null);\r\n * // => false\r\n */\r\n function isObjectLike(value) {\r\n return value != null && typeof value == 'object';\r\n }\r\n\r\n /** `Object#toString` result references. */\r\n var argsTag = '[object Arguments]';\r\n\r\n /**\r\n * The base implementation of `_.isArguments`.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\r\n */\r\n function baseIsArguments(value) {\r\n return isObjectLike(value) && baseGetTag(value) == argsTag;\r\n }\r\n\r\n /** Used for built-in method references. */\r\n var objectProto$3 = Object.prototype;\r\n\r\n /** Used to check objects for own properties. */\r\n var hasOwnProperty$2 = objectProto$3.hasOwnProperty;\r\n\r\n /** Built-in value references. */\r\n var propertyIsEnumerable = objectProto$3.propertyIsEnumerable;\r\n\r\n /**\r\n * Checks if `value` is likely an `arguments` object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\r\n * else `false`.\r\n * @example\r\n *\r\n * _.isArguments(function() { return arguments; }());\r\n * // => true\r\n *\r\n * _.isArguments([1, 2, 3]);\r\n * // => false\r\n */\r\n var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\r\n return isObjectLike(value) && hasOwnProperty$2.call(value, 'callee') &&\r\n !propertyIsEnumerable.call(value, 'callee');\r\n };\r\n\r\n /**\r\n * Checks if `value` is classified as an `Array` object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 0.1.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\r\n * @example\r\n *\r\n * _.isArray([1, 2, 3]);\r\n * // => true\r\n *\r\n * _.isArray(document.body.children);\r\n * // => false\r\n *\r\n * _.isArray('abc');\r\n * // => false\r\n *\r\n * _.isArray(_.noop);\r\n * // => false\r\n */\r\n var isArray = Array.isArray;\r\n\r\n /**\r\n * This method returns `false`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.13.0\r\n * @category Util\r\n * @returns {boolean} Returns `false`.\r\n * @example\r\n *\r\n * _.times(2, _.stubFalse);\r\n * // => [false, false]\r\n */\r\n function stubFalse() {\r\n return false;\r\n }\r\n\r\n /** Detect free variable `exports`. */\r\n var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\r\n\r\n /** Detect free variable `module`. */\r\n var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\r\n\r\n /** Detect the popular CommonJS extension `module.exports`. */\r\n var moduleExports = freeModule && freeModule.exports === freeExports;\r\n\r\n /** Built-in value references. */\r\n var Buffer = moduleExports ? root.Buffer : undefined;\r\n\r\n /* Built-in method references for those with the same name as other `lodash` methods. */\r\n var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\r\n\r\n /**\r\n * Checks if `value` is a buffer.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.3.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\r\n * @example\r\n *\r\n * _.isBuffer(new Buffer(2));\r\n * // => true\r\n *\r\n * _.isBuffer(new Uint8Array(2));\r\n * // => false\r\n */\r\n var isBuffer = nativeIsBuffer || stubFalse;\r\n\r\n /** Used as references for various `Number` constants. */\r\n var MAX_SAFE_INTEGER$1 = 9007199254740991;\r\n\r\n /** Used to detect unsigned integer values. */\r\n var reIsUint = /^(?:0|[1-9]\\d*)$/;\r\n\r\n /**\r\n * Checks if `value` is a valid array-like index.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\r\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\r\n */\r\n function isIndex(value, length) {\r\n length = length == null ? MAX_SAFE_INTEGER$1 : length;\r\n return !!length &&\r\n (typeof value == 'number' || reIsUint.test(value)) &&\r\n (value > -1 && value % 1 == 0 && value < length);\r\n }\r\n\r\n /** `Object#toString` result references. */\r\n var argsTag$1 = '[object Arguments]';\r\n var arrayTag = '[object Array]';\r\n var boolTag = '[object Boolean]';\r\n var dateTag = '[object Date]';\r\n var errorTag = '[object Error]';\r\n var funcTag$1 = '[object Function]';\r\n var mapTag = '[object Map]';\r\n var numberTag = '[object Number]';\r\n var objectTag = '[object Object]';\r\n var regexpTag = '[object RegExp]';\r\n var setTag = '[object Set]';\r\n var stringTag = '[object String]';\r\n var weakMapTag = '[object WeakMap]';\r\n\r\n var arrayBufferTag = '[object ArrayBuffer]';\r\n var dataViewTag = '[object DataView]';\r\n var float32Tag = '[object Float32Array]';\r\n var float64Tag = '[object Float64Array]';\r\n var int8Tag = '[object Int8Array]';\r\n var int16Tag = '[object Int16Array]';\r\n var int32Tag = '[object Int32Array]';\r\n var uint8Tag = '[object Uint8Array]';\r\n var uint8ClampedTag = '[object Uint8ClampedArray]';\r\n var uint16Tag = '[object Uint16Array]';\r\n var uint32Tag = '[object Uint32Array]';\r\n\r\n /** Used to identify `toStringTag` values of typed arrays. */\r\n var typedArrayTags = {};\r\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\r\n typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\r\n typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\r\n typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\r\n typedArrayTags[uint32Tag] = true;\r\n typedArrayTags[argsTag$1] = typedArrayTags[arrayTag] =\r\n typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\r\n typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\r\n typedArrayTags[errorTag] = typedArrayTags[funcTag$1] =\r\n typedArrayTags[mapTag] = typedArrayTags[numberTag] =\r\n typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\r\n typedArrayTags[setTag] = typedArrayTags[stringTag] =\r\n typedArrayTags[weakMapTag] = false;\r\n\r\n /**\r\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\r\n */\r\n function baseIsTypedArray(value) {\r\n return isObjectLike(value) &&\r\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\r\n }\r\n\r\n /**\r\n * The base implementation of `_.unary` without support for storing metadata.\r\n *\r\n * @private\r\n * @param {Function} func The function to cap arguments for.\r\n * @returns {Function} Returns the new capped function.\r\n */\r\n function baseUnary(func) {\r\n return function(value) {\r\n return func(value);\r\n };\r\n }\r\n\r\n /** Detect free variable `exports`. */\r\n var freeExports$1 = typeof exports == 'object' && exports && !exports.nodeType && exports;\r\n\r\n /** Detect free variable `module`. */\r\n var freeModule$1 = freeExports$1 && typeof module == 'object' && module && !module.nodeType && module;\r\n\r\n /** Detect the popular CommonJS extension `module.exports`. */\r\n var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;\r\n\r\n /** Detect free variable `process` from Node.js. */\r\n var freeProcess = moduleExports$1 && freeGlobal.process;\r\n\r\n /** Used to access faster Node.js helpers. */\r\n var nodeUtil = (function() {\r\n try {\r\n return freeProcess && freeProcess.binding('util');\r\n } catch (e) {}\r\n }());\r\n\r\n /* Node.js helper references. */\r\n var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\r\n\r\n /**\r\n * Checks if `value` is classified as a typed array.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\r\n * @example\r\n *\r\n * _.isTypedArray(new Uint8Array);\r\n * // => true\r\n *\r\n * _.isTypedArray([]);\r\n * // => false\r\n */\r\n var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\r\n\r\n /** Used for built-in method references. */\r\n var objectProto$2 = Object.prototype;\r\n\r\n /** Used to check objects for own properties. */\r\n var hasOwnProperty$1 = objectProto$2.hasOwnProperty;\r\n\r\n /**\r\n * Creates an array of the enumerable property names of the array-like `value`.\r\n *\r\n * @private\r\n * @param {*} value The value to query.\r\n * @param {boolean} inherited Specify returning inherited property names.\r\n * @returns {Array} Returns the array of property names.\r\n */\r\n function arrayLikeKeys(value, inherited) {\r\n var isArr = isArray(value),\r\n isArg = !isArr && isArguments(value),\r\n isBuff = !isArr && !isArg && isBuffer(value),\r\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\r\n skipIndexes = isArr || isArg || isBuff || isType,\r\n result = skipIndexes ? baseTimes(value.length, String) : [],\r\n length = result.length;\r\n\r\n for (var key in value) {\r\n if ((inherited || hasOwnProperty$1.call(value, key)) &&\r\n !(skipIndexes && (\r\n // Safari 9 has enumerable `arguments.length` in strict mode.\r\n key == 'length' ||\r\n // Node.js 0.10 has enumerable non-index properties on buffers.\r\n (isBuff && (key == 'offset' || key == 'parent')) ||\r\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\r\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\r\n // Skip index properties.\r\n isIndex(key, length)\r\n ))) {\r\n result.push(key);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /** Used for built-in method references. */\r\n var objectProto$5 = Object.prototype;\r\n\r\n /**\r\n * Checks if `value` is likely a prototype object.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\r\n */\r\n function isPrototype(value) {\r\n var Ctor = value && value.constructor,\r\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$5;\r\n\r\n return value === proto;\r\n }\r\n\r\n /**\r\n * Creates a unary function that invokes `func` with its argument transformed.\r\n *\r\n * @private\r\n * @param {Function} func The function to wrap.\r\n * @param {Function} transform The argument transform.\r\n * @returns {Function} Returns the new function.\r\n */\r\n function overArg(func, transform) {\r\n return function(arg) {\r\n return func(transform(arg));\r\n };\r\n }\r\n\r\n /* Built-in method references for those with the same name as other `lodash` methods. */\r\n var nativeKeys = overArg(Object.keys, Object);\r\n\r\n /** Used for built-in method references. */\r\n var objectProto$4 = Object.prototype;\r\n\r\n /** Used to check objects for own properties. */\r\n var hasOwnProperty$3 = objectProto$4.hasOwnProperty;\r\n\r\n /**\r\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\r\n *\r\n * @private\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the array of property names.\r\n */\r\n function baseKeys(object) {\r\n if (!isPrototype(object)) {\r\n return nativeKeys(object);\r\n }\r\n var result = [];\r\n for (var key in Object(object)) {\r\n if (hasOwnProperty$3.call(object, key) && key != 'constructor') {\r\n result.push(key);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates an array of the own enumerable property names of `object`.\r\n *\r\n * **Note:** Non-object values are coerced to objects. See the\r\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\r\n * for more details.\r\n *\r\n * @static\r\n * @since 0.1.0\r\n * @memberOf _\r\n * @category Object\r\n * @param {Object} object The object to query.\r\n * @returns {Array} Returns the array of property names.\r\n * @example\r\n *\r\n * function Foo() {\r\n * this.a = 1;\r\n * this.b = 2;\r\n * }\r\n *\r\n * Foo.prototype.c = 3;\r\n *\r\n * _.keys(new Foo);\r\n * // => ['a', 'b'] (iteration order is not guaranteed)\r\n *\r\n * _.keys('hi');\r\n * // => ['0', '1']\r\n */\r\n function keys(object) {\r\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\r\n }\r\n\r\n function createArrayIterator(coll) {\r\n var i = -1;\r\n var len = coll.length;\r\n return function next() {\r\n return ++i < len ? { value: coll[i], key: i } : null;\r\n };\r\n }\r\n\r\n function createES2015Iterator(iterator) {\r\n var i = -1;\r\n return function next() {\r\n var item = iterator.next();\r\n if (item.done) return null;\r\n i++;\r\n return { value: item.value, key: i };\r\n };\r\n }\r\n\r\n function createObjectIterator(obj) {\r\n var okeys = keys(obj);\r\n var i = -1;\r\n var len = okeys.length;\r\n return function next() {\r\n var key = okeys[++i];\r\n return i < len ? { value: obj[key], key: key } : null;\r\n };\r\n }\r\n\r\n function iterator(coll) {\r\n if (isArrayLike(coll)) {\r\n return createArrayIterator(coll);\r\n }\r\n\r\n var iterator = getIterator(coll);\r\n return iterator ? createES2015Iterator(iterator) : createObjectIterator(coll);\r\n }\r\n\r\n function onlyOnce(fn) {\r\n return function () {\r\n if (fn === null) throw new Error(\"Callback was already called.\");\r\n var callFn = fn;\r\n fn = null;\r\n callFn.apply(this, arguments);\r\n };\r\n }\r\n\r\n// A temporary value used to identify if the loop should be broken.\r\n// See #1064, #1293\r\n var breakLoop = {};\r\n\r\n function _eachOfLimit(limit) {\r\n return function (obj, iteratee, callback) {\r\n callback = once(callback || noop);\r\n if (limit <= 0 || !obj) {\r\n return callback(null);\r\n }\r\n var nextElem = iterator(obj);\r\n var done = false;\r\n var running = 0;\r\n\r\n function iterateeCallback(err, value) {\r\n running -= 1;\r\n if (err) {\r\n done = true;\r\n callback(err);\r\n } else if (value === breakLoop || done && running <= 0) {\r\n done = true;\r\n return callback(null);\r\n } else {\r\n replenish();\r\n }\r\n }\r\n\r\n function replenish() {\r\n while (running < limit && !done) {\r\n var elem = nextElem();\r\n if (elem === null) {\r\n done = true;\r\n if (running <= 0) {\r\n callback(null);\r\n }\r\n return;\r\n }\r\n running += 1;\r\n iteratee(elem.value, elem.key, onlyOnce(iterateeCallback));\r\n }\r\n }\r\n\r\n replenish();\r\n };\r\n }\r\n\r\n /**\r\n * The same as [`eachOf`]{@link module:Collections.eachOf} but runs a maximum of `limit` async operations at a\r\n * time.\r\n *\r\n * @name eachOfLimit\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.eachOf]{@link module:Collections.eachOf}\r\n * @alias forEachOfLimit\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {number} limit - The maximum number of async operations at a time.\r\n * @param {Function} iteratee - A function to apply to each\r\n * item in `coll`. The `key` is the item's key, or index in the case of an\r\n * array. The iteratee is passed a `callback(err)` which must be called once it\r\n * has completed. If no error has occurred, the callback should be run without\r\n * arguments or with an explicit `null` argument. Invoked with\r\n * (item, key, callback).\r\n * @param {Function} [callback] - A callback which is called when all\r\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\r\n */\r\n function eachOfLimit(coll, limit, iteratee, callback) {\r\n _eachOfLimit(limit)(coll, iteratee, callback);\r\n }\r\n\r\n function doLimit(fn, limit) {\r\n return function (iterable, iteratee, callback) {\r\n return fn(iterable, limit, iteratee, callback);\r\n };\r\n }\r\n\r\n// eachOf implementation optimized for array-likes\r\n function eachOfArrayLike(coll, iteratee, callback) {\r\n callback = once(callback || noop);\r\n var index = 0,\r\n completed = 0,\r\n length = coll.length;\r\n if (length === 0) {\r\n callback(null);\r\n }\r\n\r\n function iteratorCallback(err) {\r\n if (err) {\r\n callback(err);\r\n } else if (++completed === length) {\r\n callback(null);\r\n }\r\n }\r\n\r\n for (; index < length; index++) {\r\n iteratee(coll[index], index, onlyOnce(iteratorCallback));\r\n }\r\n }\r\n\r\n// a generic version of eachOf which can handle array, object, and iterator cases.\r\n var eachOfGeneric = doLimit(eachOfLimit, Infinity);\r\n\r\n /**\r\n * Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument\r\n * to the iteratee.\r\n *\r\n * @name eachOf\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @alias forEachOf\r\n * @category Collection\r\n * @see [async.each]{@link module:Collections.each}\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {Function} iteratee - A function to apply to each\r\n * item in `coll`. The `key` is the item's key, or index in the case of an\r\n * array. The iteratee is passed a `callback(err)` which must be called once it\r\n * has completed. If no error has occurred, the callback should be run without\r\n * arguments or with an explicit `null` argument. Invoked with\r\n * (item, key, callback).\r\n * @param {Function} [callback] - A callback which is called when all\r\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\r\n * @example\r\n *\r\n * var obj = {dev: \"/dev.json\", test: \"/test.json\", prod: \"/prod.json\"};\r\n * var configs = {};\r\n *\r\n * async.forEachOf(obj, function (value, key, callback) {\r\n * fs.readFile(__dirname + value, \"utf8\", function (err, data) {\r\n * if (err) return callback(err);\r\n * try {\r\n * configs[key] = JSON.parse(data);\r\n * } catch (e) {\r\n * return callback(e);\r\n * }\r\n * callback();\r\n * });\r\n * }, function (err) {\r\n * if (err) console.error(err.message);\r\n * // configs is now a map of JSON data\r\n * doSomethingWith(configs);\r\n * });\r\n */\r\n var eachOf = function (coll, iteratee, callback) {\r\n var eachOfImplementation = isArrayLike(coll) ? eachOfArrayLike : eachOfGeneric;\r\n eachOfImplementation(coll, iteratee, callback);\r\n };\r\n\r\n function doParallel(fn) {\r\n return function (obj, iteratee, callback) {\r\n return fn(eachOf, obj, iteratee, callback);\r\n };\r\n }\r\n\r\n function _asyncMap(eachfn, arr, iteratee, callback) {\r\n callback = callback || noop;\r\n arr = arr || [];\r\n var results = [];\r\n var counter = 0;\r\n\r\n eachfn(arr, function (value, _, callback) {\r\n var index = counter++;\r\n iteratee(value, function (err, v) {\r\n results[index] = v;\r\n callback(err);\r\n });\r\n }, function (err) {\r\n callback(err, results);\r\n });\r\n }\r\n\r\n /**\r\n * Produces a new collection of values by mapping each value in `coll` through\r\n * the `iteratee` function. The `iteratee` is called with an item from `coll`\r\n * and a callback for when it has finished processing. Each of these callback\r\n * takes 2 arguments: an `error`, and the transformed item from `coll`. If\r\n * `iteratee` passes an error to its callback, the main `callback` (for the\r\n * `map` function) is immediately called with the error.\r\n *\r\n * Note, that since this function applies the `iteratee` to each item in\r\n * parallel, there is no guarantee that the `iteratee` functions will complete\r\n * in order. However, the results array will be in the same order as the\r\n * original `coll`.\r\n *\r\n * If `map` is passed an Object, the results will be an Array. The results\r\n * will roughly be in the order of the original Objects' keys (but this can\r\n * vary across JavaScript engines)\r\n *\r\n * @name map\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {Function} iteratee - A function to apply to each item in `coll`.\r\n * The iteratee is passed a `callback(err, transformed)` which must be called\r\n * once it has completed with an error (which can be `null`) and a\r\n * transformed item. Invoked with (item, callback).\r\n * @param {Function} [callback] - A callback which is called when all `iteratee`\r\n * functions have finished, or an error occurs. Results is an Array of the\r\n * transformed items from the `coll`. Invoked with (err, results).\r\n * @example\r\n *\r\n * async.map(['file1','file2','file3'], fs.stat, function(err, results) {\r\n * // results is now an array of stats for each file\r\n * });\r\n */\r\n var map = doParallel(_asyncMap);\r\n\r\n /**\r\n * Applies the provided arguments to each function in the array, calling\r\n * `callback` after all functions have completed. If you only provide the first\r\n * argument, `fns`, then it will return a function which lets you pass in the\r\n * arguments as if it were a single function call. If more arguments are\r\n * provided, `callback` is required while `args` is still optional.\r\n *\r\n * @name applyEach\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @category Control Flow\r\n * @param {Array|Iterable|Object} fns - A collection of asynchronous functions\r\n * to all call with the same arguments\r\n * @param {...*} [args] - any number of separate arguments to pass to the\r\n * function.\r\n * @param {Function} [callback] - the final argument should be the callback,\r\n * called when all functions have completed processing.\r\n * @returns {Function} - If only the first argument, `fns`, is provided, it will\r\n * return a function which lets you pass in the arguments as if it were a single\r\n * function call. The signature is `(..args, callback)`. If invoked with any\r\n * arguments, `callback` is required.\r\n * @example\r\n *\r\n * async.applyEach([enableSearch, updateSchema], 'bucket', callback);\r\n *\r\n * // partial application example:\r\n * async.each(\r\n * buckets,\r\n * async.applyEach([enableSearch, updateSchema]),\r\n * callback\r\n * );\r\n */\r\n var applyEach = applyEach$1(map);\r\n\r\n function doParallelLimit(fn) {\r\n return function (obj, limit, iteratee, callback) {\r\n return fn(_eachOfLimit(limit), obj, iteratee, callback);\r\n };\r\n }\r\n\r\n /**\r\n * The same as [`map`]{@link module:Collections.map} but runs a maximum of `limit` async operations at a time.\r\n *\r\n * @name mapLimit\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.map]{@link module:Collections.map}\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {number} limit - The maximum number of async operations at a time.\r\n * @param {Function} iteratee - A function to apply to each item in `coll`.\r\n * The iteratee is passed a `callback(err, transformed)` which must be called\r\n * once it has completed with an error (which can be `null`) and a transformed\r\n * item. Invoked with (item, callback).\r\n * @param {Function} [callback] - A callback which is called when all `iteratee`\r\n * functions have finished, or an error occurs. Results is an array of the\r\n * transformed items from the `coll`. Invoked with (err, results).\r\n */\r\n var mapLimit = doParallelLimit(_asyncMap);\r\n\r\n /**\r\n * The same as [`map`]{@link module:Collections.map} but runs only a single async operation at a time.\r\n *\r\n * @name mapSeries\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.map]{@link module:Collections.map}\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {Function} iteratee - A function to apply to each item in `coll`.\r\n * The iteratee is passed a `callback(err, transformed)` which must be called\r\n * once it has completed with an error (which can be `null`) and a\r\n * transformed item. Invoked with (item, callback).\r\n * @param {Function} [callback] - A callback which is called when all `iteratee`\r\n * functions have finished, or an error occurs. Results is an array of the\r\n * transformed items from the `coll`. Invoked with (err, results).\r\n */\r\n var mapSeries = doLimit(mapLimit, 1);\r\n\r\n /**\r\n * The same as [`applyEach`]{@link module:ControlFlow.applyEach} but runs only a single async operation at a time.\r\n *\r\n * @name applyEachSeries\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @see [async.applyEach]{@link module:ControlFlow.applyEach}\r\n * @category Control Flow\r\n * @param {Array|Iterable|Object} fns - A collection of asynchronous functions to all\r\n * call with the same arguments\r\n * @param {...*} [args] - any number of separate arguments to pass to the\r\n * function.\r\n * @param {Function} [callback] - the final argument should be the callback,\r\n * called when all functions have completed processing.\r\n * @returns {Function} - If only the first argument is provided, it will return\r\n * a function which lets you pass in the arguments as if it were a single\r\n * function call.\r\n */\r\n var applyEachSeries = applyEach$1(mapSeries);\r\n\r\n /**\r\n * Creates a continuation function with some arguments already applied.\r\n *\r\n * Useful as a shorthand when combined with other control flow functions. Any\r\n * arguments passed to the returned function are added to the arguments\r\n * originally passed to apply.\r\n *\r\n * @name apply\r\n * @static\r\n * @memberOf module:Utils\r\n * @method\r\n * @category Util\r\n * @param {Function} function - The function you want to eventually apply all\r\n * arguments to. Invokes with (arguments...).\r\n * @param {...*} arguments... - Any number of arguments to automatically apply\r\n * when the continuation is called.\r\n * @example\r\n *\r\n * // using apply\r\n * async.parallel([\r\n * async.apply(fs.writeFile, 'testfile1', 'test1'),\r\n * async.apply(fs.writeFile, 'testfile2', 'test2')\r\n * ]);\r\n *\r\n *\r\n * // the same process without using apply\r\n * async.parallel([\r\n * function(callback) {\r\n * fs.writeFile('testfile1', 'test1', callback);\r\n * },\r\n * function(callback) {\r\n * fs.writeFile('testfile2', 'test2', callback);\r\n * }\r\n * ]);\r\n *\r\n * // It's possible to pass any number of additional arguments when calling the\r\n * // continuation:\r\n *\r\n * node> var fn = async.apply(sys.puts, 'one');\r\n * node> fn('two', 'three');\r\n * one\r\n * two\r\n * three\r\n */\r\n var apply$2 = rest(function (fn, args) {\r\n return rest(function (callArgs) {\r\n return fn.apply(null, args.concat(callArgs));\r\n });\r\n });\r\n\r\n /**\r\n * Take a sync function and make it async, passing its return value to a\r\n * callback. This is useful for plugging sync functions into a waterfall,\r\n * series, or other async functions. Any arguments passed to the generated\r\n * function will be passed to the wrapped function (except for the final\r\n * callback argument). Errors thrown will be passed to the callback.\r\n *\r\n * If the function passed to `asyncify` returns a Promise, that promises's\r\n * resolved/rejected state will be used to call the callback, rather than simply\r\n * the synchronous return value.\r\n *\r\n * This also means you can asyncify ES2016 `async` functions.\r\n *\r\n * @name asyncify\r\n * @static\r\n * @memberOf module:Utils\r\n * @method\r\n * @alias wrapSync\r\n * @category Util\r\n * @param {Function} func - The synchronous function to convert to an\r\n * asynchronous function.\r\n * @returns {Function} An asynchronous wrapper of the `func`. To be invoked with\r\n * (callback).\r\n * @example\r\n *\r\n * // passing a regular synchronous function\r\n * async.waterfall([\r\n * async.apply(fs.readFile, filename, \"utf8\"),\r\n * async.asyncify(JSON.parse),\r\n * function (data, next) {\r\n * // data is the result of parsing the text.\r\n * // If there was a parsing error, it would have been caught.\r\n * }\r\n * ], callback);\r\n *\r\n * // passing a function returning a promise\r\n * async.waterfall([\r\n * async.apply(fs.readFile, filename, \"utf8\"),\r\n * async.asyncify(function (contents) {\r\n * return db.model.create(contents);\r\n * }),\r\n * function (model, next) {\r\n * // `model` is the instantiated model object.\r\n * // If there was an error, this function would be skipped.\r\n * }\r\n * ], callback);\r\n *\r\n * // es6 example\r\n * var q = async.queue(async.asyncify(async function(file) {\r\n * var intermediateStep = await processFile(file);\r\n * return await somePromise(intermediateStep)\r\n * }));\r\n *\r\n * q.push(files);\r\n */\r\n function asyncify(func) {\r\n return initialParams(function (args, callback) {\r\n var result;\r\n try {\r\n result = func.apply(this, args);\r\n } catch (e) {\r\n return callback(e);\r\n }\r\n // if result is Promise object\r\n if (isObject(result) && typeof result.then === 'function') {\r\n result.then(function (value) {\r\n callback(null, value);\r\n }, function (err) {\r\n callback(err.message ? err : new Error(err));\r\n });\r\n } else {\r\n callback(null, result);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * A specialized version of `_.forEach` for arrays without support for\r\n * iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array} [array] The array to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @returns {Array} Returns `array`.\r\n */\r\n function arrayEach(array, iteratee) {\r\n var index = -1,\r\n length = array == null ? 0 : array.length;\r\n\r\n while (++index < length) {\r\n if (iteratee(array[index], index, array) === false) {\r\n break;\r\n }\r\n }\r\n return array;\r\n }\r\n\r\n /**\r\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\r\n *\r\n * @private\r\n * @param {boolean} [fromRight] Specify iterating from right to left.\r\n * @returns {Function} Returns the new base function.\r\n */\r\n function createBaseFor(fromRight) {\r\n return function(object, iteratee, keysFunc) {\r\n var index = -1,\r\n iterable = Object(object),\r\n props = keysFunc(object),\r\n length = props.length;\r\n\r\n while (length--) {\r\n var key = props[fromRight ? length : ++index];\r\n if (iteratee(iterable[key], key, iterable) === false) {\r\n break;\r\n }\r\n }\r\n return object;\r\n };\r\n }\r\n\r\n /**\r\n * The base implementation of `baseForOwn` which iterates over `object`\r\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\r\n * Iteratee functions may exit iteration early by explicitly returning `false`.\r\n *\r\n * @private\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @param {Function} keysFunc The function to get the keys of `object`.\r\n * @returns {Object} Returns `object`.\r\n */\r\n var baseFor = createBaseFor();\r\n\r\n /**\r\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Object} object The object to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @returns {Object} Returns `object`.\r\n */\r\n function baseForOwn(object, iteratee) {\r\n return object && baseFor(object, iteratee, keys);\r\n }\r\n\r\n /**\r\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\r\n * support for iteratee shorthands.\r\n *\r\n * @private\r\n * @param {Array} array The array to inspect.\r\n * @param {Function} predicate The function invoked per iteration.\r\n * @param {number} fromIndex The index to search from.\r\n * @param {boolean} [fromRight] Specify iterating from right to left.\r\n * @returns {number} Returns the index of the matched value, else `-1`.\r\n */\r\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\r\n var length = array.length,\r\n index = fromIndex + (fromRight ? 1 : -1);\r\n\r\n while ((fromRight ? index-- : ++index < length)) {\r\n if (predicate(array[index], index, array)) {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.isNaN` without support for number objects.\r\n *\r\n * @private\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\r\n */\r\n function baseIsNaN(value) {\r\n return value !== value;\r\n }\r\n\r\n /**\r\n * A specialized version of `_.indexOf` which performs strict equality\r\n * comparisons of values, i.e. `===`.\r\n *\r\n * @private\r\n * @param {Array} array The array to inspect.\r\n * @param {*} value The value to search for.\r\n * @param {number} fromIndex The index to search from.\r\n * @returns {number} Returns the index of the matched value, else `-1`.\r\n */\r\n function strictIndexOf(array, value, fromIndex) {\r\n var index = fromIndex - 1,\r\n length = array.length;\r\n\r\n while (++index < length) {\r\n if (array[index] === value) {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\r\n *\r\n * @private\r\n * @param {Array} array The array to inspect.\r\n * @param {*} value The value to search for.\r\n * @param {number} fromIndex The index to search from.\r\n * @returns {number} Returns the index of the matched value, else `-1`.\r\n */\r\n function baseIndexOf(array, value, fromIndex) {\r\n return value === value\r\n ? strictIndexOf(array, value, fromIndex)\r\n : baseFindIndex(array, baseIsNaN, fromIndex);\r\n }\r\n\r\n /**\r\n * Determines the best order for running the functions in `tasks`, based on\r\n * their requirements. Each function can optionally depend on other functions\r\n * being completed first, and each function is run as soon as its requirements\r\n * are satisfied.\r\n *\r\n * If any of the functions pass an error to their callback, the `auto` sequence\r\n * will stop. Further tasks will not execute (so any other functions depending\r\n * on it will not run), and the main `callback` is immediately called with the\r\n * error.\r\n *\r\n * Functions also receive an object containing the results of functions which\r\n * have completed so far as the first argument, if they have dependencies. If a\r\n * task function has no dependencies, it will only be passed a callback.\r\n *\r\n * @name auto\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @category Control Flow\r\n * @param {Object} tasks - An object. Each of its properties is either a\r\n * function or an array of requirements, with the function itself the last item\r\n * in the array. The object's key of a property serves as the name of the task\r\n * defined by that property, i.e. can be used when specifying requirements for\r\n * other tasks. The function receives one or two arguments:\r\n * * a `results` object, containing the results of the previously executed\r\n * functions, only passed if the task has any dependencies,\r\n * * a `callback(err, result)` function, which must be called when finished,\r\n * passing an `error` (which can be `null`) and the result of the function's\r\n * execution.\r\n * @param {number} [concurrency=Infinity] - An optional `integer` for\r\n * determining the maximum number of tasks that can be run in parallel. By\r\n * default, as many as possible.\r\n * @param {Function} [callback] - An optional callback which is called when all\r\n * the tasks have been completed. It receives the `err` argument if any `tasks`\r\n * pass an error to their callback. Results are always returned; however, if an\r\n * error occurs, no further `tasks` will be performed, and the results object\r\n * will only contain partial results. Invoked with (err, results).\r\n * @returns undefined\r\n * @example\r\n *\r\n * async.auto({\r\n * // this function will just be passed a callback\r\n * readData: async.apply(fs.readFile, 'data.txt', 'utf-8'),\r\n * showData: ['readData', function(results, cb) {\r\n * // results.readData is the file's contents\r\n * // ...\r\n * }]\r\n * }, callback);\r\n *\r\n * async.auto({\r\n * get_data: function(callback) {\r\n * console.log('in get_data');\r\n * // async code to get some data\r\n * callback(null, 'data', 'converted to array');\r\n * },\r\n * make_folder: function(callback) {\r\n * console.log('in make_folder');\r\n * // async code to create a directory to store a file in\r\n * // this is run at the same time as getting the data\r\n * callback(null, 'folder');\r\n * },\r\n * write_file: ['get_data', 'make_folder', function(results, callback) {\r\n * console.log('in write_file', JSON.stringify(results));\r\n * // once there is some data and the directory exists,\r\n * // write the data to a file in the directory\r\n * callback(null, 'filename');\r\n * }],\r\n * email_link: ['write_file', function(results, callback) {\r\n * console.log('in email_link', JSON.stringify(results));\r\n * // once the file is written let's email a link to it...\r\n * // results.write_file contains the filename returned by write_file.\r\n * callback(null, {'file':results.write_file, 'email':'user@example.com'});\r\n * }]\r\n * }, function(err, results) {\r\n * console.log('err = ', err);\r\n * console.log('results = ', results);\r\n * });\r\n */\r\n var auto = function (tasks, concurrency, callback) {\r\n if (typeof concurrency === 'function') {\r\n // concurrency is optional, shift the args.\r\n callback = concurrency;\r\n concurrency = null;\r\n }\r\n callback = once(callback || noop);\r\n var keys$$1 = keys(tasks);\r\n var numTasks = keys$$1.length;\r\n if (!numTasks) {\r\n return callback(null);\r\n }\r\n if (!concurrency) {\r\n concurrency = numTasks;\r\n }\r\n\r\n var results = {};\r\n var runningTasks = 0;\r\n var hasError = false;\r\n\r\n var listeners = {};\r\n\r\n var readyTasks = [];\r\n\r\n // for cycle detection:\r\n var readyToCheck = []; // tasks that have been identified as reachable\r\n // without the possibility of returning to an ancestor task\r\n var uncheckedDependencies = {};\r\n\r\n baseForOwn(tasks, function (task, key) {\r\n if (!isArray(task)) {\r\n // no dependencies\r\n enqueueTask(key, [task]);\r\n readyToCheck.push(key);\r\n return;\r\n }\r\n\r\n var dependencies = task.slice(0, task.length - 1);\r\n var remainingDependencies = dependencies.length;\r\n if (remainingDependencies === 0) {\r\n enqueueTask(key, task);\r\n readyToCheck.push(key);\r\n return;\r\n }\r\n uncheckedDependencies[key] = remainingDependencies;\r\n\r\n arrayEach(dependencies, function (dependencyName) {\r\n if (!tasks[dependencyName]) {\r\n throw new Error('async.auto task `' + key + '` has a non-existent dependency in ' + dependencies.join(', '));\r\n }\r\n addListener(dependencyName, function () {\r\n remainingDependencies--;\r\n if (remainingDependencies === 0) {\r\n enqueueTask(key, task);\r\n }\r\n });\r\n });\r\n });\r\n\r\n checkForDeadlocks();\r\n processQueue();\r\n\r\n function enqueueTask(key, task) {\r\n readyTasks.push(function () {\r\n runTask(key, task);\r\n });\r\n }\r\n\r\n function processQueue() {\r\n if (readyTasks.length === 0 && runningTasks === 0) {\r\n return callback(null, results);\r\n }\r\n while (readyTasks.length && runningTasks < concurrency) {\r\n var run = readyTasks.shift();\r\n run();\r\n }\r\n }\r\n\r\n function addListener(taskName, fn) {\r\n var taskListeners = listeners[taskName];\r\n if (!taskListeners) {\r\n taskListeners = listeners[taskName] = [];\r\n }\r\n\r\n taskListeners.push(fn);\r\n }\r\n\r\n function taskComplete(taskName) {\r\n var taskListeners = listeners[taskName] || [];\r\n arrayEach(taskListeners, function (fn) {\r\n fn();\r\n });\r\n processQueue();\r\n }\r\n\r\n function runTask(key, task) {\r\n if (hasError) return;\r\n\r\n var taskCallback = onlyOnce(rest(function (err, args) {\r\n runningTasks--;\r\n if (args.length <= 1) {\r\n args = args[0];\r\n }\r\n if (err) {\r\n var safeResults = {};\r\n baseForOwn(results, function (val, rkey) {\r\n safeResults[rkey] = val;\r\n });\r\n safeResults[key] = args;\r\n hasError = true;\r\n listeners = [];\r\n\r\n callback(err, safeResults);\r\n } else {\r\n results[key] = args;\r\n taskComplete(key);\r\n }\r\n }));\r\n\r\n runningTasks++;\r\n var taskFn = task[task.length - 1];\r\n if (task.length > 1) {\r\n taskFn(results, taskCallback);\r\n } else {\r\n taskFn(taskCallback);\r\n }\r\n }\r\n\r\n function checkForDeadlocks() {\r\n // Kahn's algorithm\r\n // https://en.wikipedia.org/wiki/Topological_sorting#Kahn.27s_algorithm\r\n // http://connalle.blogspot.com/2013/10/topological-sortingkahn-algorithm.html\r\n var currentTask;\r\n var counter = 0;\r\n while (readyToCheck.length) {\r\n currentTask = readyToCheck.pop();\r\n counter++;\r\n arrayEach(getDependents(currentTask), function (dependent) {\r\n if (--uncheckedDependencies[dependent] === 0) {\r\n readyToCheck.push(dependent);\r\n }\r\n });\r\n }\r\n\r\n if (counter !== numTasks) {\r\n throw new Error('async.auto cannot execute tasks due to a recursive dependency');\r\n }\r\n }\r\n\r\n function getDependents(taskName) {\r\n var result = [];\r\n baseForOwn(tasks, function (task, key) {\r\n if (isArray(task) && baseIndexOf(task, taskName, 0) >= 0) {\r\n result.push(key);\r\n }\r\n });\r\n return result;\r\n }\r\n };\r\n\r\n /**\r\n * A specialized version of `_.map` for arrays without support for iteratee\r\n * shorthands.\r\n *\r\n * @private\r\n * @param {Array} [array] The array to iterate over.\r\n * @param {Function} iteratee The function invoked per iteration.\r\n * @returns {Array} Returns the new mapped array.\r\n */\r\n function arrayMap(array, iteratee) {\r\n var index = -1,\r\n length = array == null ? 0 : array.length,\r\n result = Array(length);\r\n\r\n while (++index < length) {\r\n result[index] = iteratee(array[index], index, array);\r\n }\r\n return result;\r\n }\r\n\r\n /** `Object#toString` result references. */\r\n var symbolTag = '[object Symbol]';\r\n\r\n /**\r\n * Checks if `value` is classified as a `Symbol` primitive or object.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to check.\r\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\r\n * @example\r\n *\r\n * _.isSymbol(Symbol.iterator);\r\n * // => true\r\n *\r\n * _.isSymbol('abc');\r\n * // => false\r\n */\r\n function isSymbol(value) {\r\n return typeof value == 'symbol' ||\r\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\r\n }\r\n\r\n /** Used as references for various `Number` constants. */\r\n var INFINITY = 1 / 0;\r\n\r\n /** Used to convert symbols to primitives and strings. */\r\n var symbolProto = Symbol$1 ? Symbol$1.prototype : undefined;\r\n var symbolToString = symbolProto ? symbolProto.toString : undefined;\r\n\r\n /**\r\n * The base implementation of `_.toString` which doesn't convert nullish\r\n * values to empty strings.\r\n *\r\n * @private\r\n * @param {*} value The value to process.\r\n * @returns {string} Returns the string.\r\n */\r\n function baseToString(value) {\r\n // Exit early for strings to avoid a performance hit in some environments.\r\n if (typeof value == 'string') {\r\n return value;\r\n }\r\n if (isArray(value)) {\r\n // Recursively convert values (susceptible to call stack limits).\r\n return arrayMap(value, baseToString) + '';\r\n }\r\n if (isSymbol(value)) {\r\n return symbolToString ? symbolToString.call(value) : '';\r\n }\r\n var result = (value + '');\r\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\r\n }\r\n\r\n /**\r\n * The base implementation of `_.slice` without an iteratee call guard.\r\n *\r\n * @private\r\n * @param {Array} array The array to slice.\r\n * @param {number} [start=0] The start position.\r\n * @param {number} [end=array.length] The end position.\r\n * @returns {Array} Returns the slice of `array`.\r\n */\r\n function baseSlice(array, start, end) {\r\n var index = -1,\r\n length = array.length;\r\n\r\n if (start < 0) {\r\n start = -start > length ? 0 : (length + start);\r\n }\r\n end = end > length ? length : end;\r\n if (end < 0) {\r\n end += length;\r\n }\r\n length = start > end ? 0 : ((end - start) >>> 0);\r\n start >>>= 0;\r\n\r\n var result = Array(length);\r\n while (++index < length) {\r\n result[index] = array[index + start];\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Casts `array` to a slice if it's needed.\r\n *\r\n * @private\r\n * @param {Array} array The array to inspect.\r\n * @param {number} start The start position.\r\n * @param {number} [end=array.length] The end position.\r\n * @returns {Array} Returns the cast slice.\r\n */\r\n function castSlice(array, start, end) {\r\n var length = array.length;\r\n end = end === undefined ? length : end;\r\n return (!start && end >= length) ? array : baseSlice(array, start, end);\r\n }\r\n\r\n /**\r\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\r\n * that is not found in the character symbols.\r\n *\r\n * @private\r\n * @param {Array} strSymbols The string symbols to inspect.\r\n * @param {Array} chrSymbols The character symbols to find.\r\n * @returns {number} Returns the index of the last unmatched string symbol.\r\n */\r\n function charsEndIndex(strSymbols, chrSymbols) {\r\n var index = strSymbols.length;\r\n\r\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\r\n return index;\r\n }\r\n\r\n /**\r\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\r\n * that is not found in the character symbols.\r\n *\r\n * @private\r\n * @param {Array} strSymbols The string symbols to inspect.\r\n * @param {Array} chrSymbols The character symbols to find.\r\n * @returns {number} Returns the index of the first unmatched string symbol.\r\n */\r\n function charsStartIndex(strSymbols, chrSymbols) {\r\n var index = -1,\r\n length = strSymbols.length;\r\n\r\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\r\n return index;\r\n }\r\n\r\n /**\r\n * Converts an ASCII `string` to an array.\r\n *\r\n * @private\r\n * @param {string} string The string to convert.\r\n * @returns {Array} Returns the converted array.\r\n */\r\n function asciiToArray(string) {\r\n return string.split('');\r\n }\r\n\r\n /** Used to compose unicode character classes. */\r\n var rsAstralRange = '\\\\ud800-\\\\udfff';\r\n var rsComboMarksRange = '\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23';\r\n var rsComboSymbolsRange = '\\\\u20d0-\\\\u20f0';\r\n var rsVarRange = '\\\\ufe0e\\\\ufe0f';\r\n\r\n /** Used to compose unicode capture groups. */\r\n var rsZWJ = '\\\\u200d';\r\n\r\n /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\r\n var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');\r\n\r\n /**\r\n * Checks if `string` contains Unicode symbols.\r\n *\r\n * @private\r\n * @param {string} string The string to inspect.\r\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\r\n */\r\n function hasUnicode(string) {\r\n return reHasUnicode.test(string);\r\n }\r\n\r\n /** Used to compose unicode character classes. */\r\n var rsAstralRange$1 = '\\\\ud800-\\\\udfff';\r\n var rsComboMarksRange$1 = '\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23';\r\n var rsComboSymbolsRange$1 = '\\\\u20d0-\\\\u20f0';\r\n var rsVarRange$1 = '\\\\ufe0e\\\\ufe0f';\r\n\r\n /** Used to compose unicode capture groups. */\r\n var rsAstral = '[' + rsAstralRange$1 + ']';\r\n var rsCombo = '[' + rsComboMarksRange$1 + rsComboSymbolsRange$1 + ']';\r\n var rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]';\r\n var rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')';\r\n var rsNonAstral = '[^' + rsAstralRange$1 + ']';\r\n var rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}';\r\n var rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]';\r\n var rsZWJ$1 = '\\\\u200d';\r\n\r\n /** Used to compose unicode regexes. */\r\n var reOptMod = rsModifier + '?';\r\n var rsOptVar = '[' + rsVarRange$1 + ']?';\r\n var rsOptJoin = '(?:' + rsZWJ$1 + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*';\r\n var rsSeq = rsOptVar + reOptMod + rsOptJoin;\r\n var rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\r\n\r\n /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\r\n var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\r\n\r\n /**\r\n * Converts a Unicode `string` to an array.\r\n *\r\n * @private\r\n * @param {string} string The string to convert.\r\n * @returns {Array} Returns the converted array.\r\n */\r\n function unicodeToArray(string) {\r\n return string.match(reUnicode) || [];\r\n }\r\n\r\n /**\r\n * Converts `string` to an array.\r\n *\r\n * @private\r\n * @param {string} string The string to convert.\r\n * @returns {Array} Returns the converted array.\r\n */\r\n function stringToArray(string) {\r\n return hasUnicode(string)\r\n ? unicodeToArray(string)\r\n : asciiToArray(string);\r\n }\r\n\r\n /**\r\n * Converts `value` to a string. An empty string is returned for `null`\r\n * and `undefined` values. The sign of `-0` is preserved.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 4.0.0\r\n * @category Lang\r\n * @param {*} value The value to convert.\r\n * @returns {string} Returns the converted string.\r\n * @example\r\n *\r\n * _.toString(null);\r\n * // => ''\r\n *\r\n * _.toString(-0);\r\n * // => '-0'\r\n *\r\n * _.toString([1, 2, 3]);\r\n * // => '1,2,3'\r\n */\r\n function toString(value) {\r\n return value == null ? '' : baseToString(value);\r\n }\r\n\r\n /** Used to match leading and trailing whitespace. */\r\n var reTrim = /^\\s+|\\s+$/g;\r\n\r\n /**\r\n * Removes leading and trailing whitespace or specified characters from `string`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 3.0.0\r\n * @category String\r\n * @param {string} [string=''] The string to trim.\r\n * @param {string} [chars=whitespace] The characters to trim.\r\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\r\n * @returns {string} Returns the trimmed string.\r\n * @example\r\n *\r\n * _.trim(' abc ');\r\n * // => 'abc'\r\n *\r\n * _.trim('-_-abc-_-', '_-');\r\n * // => 'abc'\r\n *\r\n * _.map([' foo ', ' bar '], _.trim);\r\n * // => ['foo', 'bar']\r\n */\r\n function trim(string, chars, guard) {\r\n string = toString(string);\r\n if (string && (guard || chars === undefined)) {\r\n return string.replace(reTrim, '');\r\n }\r\n if (!string || !(chars = baseToString(chars))) {\r\n return string;\r\n }\r\n var strSymbols = stringToArray(string),\r\n chrSymbols = stringToArray(chars),\r\n start = charsStartIndex(strSymbols, chrSymbols),\r\n end = charsEndIndex(strSymbols, chrSymbols) + 1;\r\n\r\n return castSlice(strSymbols, start, end).join('');\r\n }\r\n\r\n var FN_ARGS = /^(function)?\\s*[^\\(]*\\(\\s*([^\\)]*)\\)/m;\r\n var FN_ARG_SPLIT = /,/;\r\n var FN_ARG = /(=.+)?(\\s*)$/;\r\n var STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg;\r\n\r\n function parseParams(func) {\r\n func = func.toString().replace(STRIP_COMMENTS, '');\r\n func = func.match(FN_ARGS)[2].replace(' ', '');\r\n func = func ? func.split(FN_ARG_SPLIT) : [];\r\n func = func.map(function (arg) {\r\n return trim(arg.replace(FN_ARG, ''));\r\n });\r\n return func;\r\n }\r\n\r\n /**\r\n * A dependency-injected version of the [async.auto]{@link module:ControlFlow.auto} function. Dependent\r\n * tasks are specified as parameters to the function, after the usual callback\r\n * parameter, with the parameter names matching the names of the tasks it\r\n * depends on. This can provide even more readable task graphs which can be\r\n * easier to maintain.\r\n *\r\n * If a final callback is specified, the task results are similarly injected,\r\n * specified as named parameters after the initial error parameter.\r\n *\r\n * The autoInject function is purely syntactic sugar and its semantics are\r\n * otherwise equivalent to [async.auto]{@link module:ControlFlow.auto}.\r\n *\r\n * @name autoInject\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @see [async.auto]{@link module:ControlFlow.auto}\r\n * @category Control Flow\r\n * @param {Object} tasks - An object, each of whose properties is a function of\r\n * the form 'func([dependencies...], callback). The object's key of a property\r\n * serves as the name of the task defined by that property, i.e. can be used\r\n * when specifying requirements for other tasks.\r\n * * The `callback` parameter is a `callback(err, result)` which must be called\r\n * when finished, passing an `error` (which can be `null`) and the result of\r\n * the function's execution. The remaining parameters name other tasks on\r\n * which the task is dependent, and the results from those tasks are the\r\n * arguments of those parameters.\r\n * @param {Function} [callback] - An optional callback which is called when all\r\n * the tasks have been completed. It receives the `err` argument if any `tasks`\r\n * pass an error to their callback, and a `results` object with any completed\r\n * task results, similar to `auto`.\r\n * @example\r\n *\r\n * // The example from `auto` can be rewritten as follows:\r\n * async.autoInject({\r\n * get_data: function(callback) {\r\n * // async code to get some data\r\n * callback(null, 'data', 'converted to array');\r\n * },\r\n * make_folder: function(callback) {\r\n * // async code to create a directory to store a file in\r\n * // this is run at the same time as getting the data\r\n * callback(null, 'folder');\r\n * },\r\n * write_file: function(get_data, make_folder, callback) {\r\n * // once there is some data and the directory exists,\r\n * // write the data to a file in the directory\r\n * callback(null, 'filename');\r\n * },\r\n * email_link: function(write_file, callback) {\r\n * // once the file is written let's email a link to it...\r\n * // write_file contains the filename returned by write_file.\r\n * callback(null, {'file':write_file, 'email':'user@example.com'});\r\n * }\r\n * }, function(err, results) {\r\n * console.log('err = ', err);\r\n * console.log('email_link = ', results.email_link);\r\n * });\r\n *\r\n * // If you are using a JS minifier that mangles parameter names, `autoInject`\r\n * // will not work with plain functions, since the parameter names will be\r\n * // collapsed to a single letter identifier. To work around this, you can\r\n * // explicitly specify the names of the parameters your task function needs\r\n * // in an array, similar to Angular.js dependency injection.\r\n *\r\n * // This still has an advantage over plain `auto`, since the results a task\r\n * // depends on are still spread into arguments.\r\n * async.autoInject({\r\n * //...\r\n * write_file: ['get_data', 'make_folder', function(get_data, make_folder, callback) {\r\n * callback(null, 'filename');\r\n * }],\r\n * email_link: ['write_file', function(write_file, callback) {\r\n * callback(null, {'file':write_file, 'email':'user@example.com'});\r\n * }]\r\n * //...\r\n * }, function(err, results) {\r\n * console.log('err = ', err);\r\n * console.log('email_link = ', results.email_link);\r\n * });\r\n */\r\n function autoInject(tasks, callback) {\r\n var newTasks = {};\r\n\r\n baseForOwn(tasks, function (taskFn, key) {\r\n var params;\r\n\r\n if (isArray(taskFn)) {\r\n params = taskFn.slice(0, -1);\r\n taskFn = taskFn[taskFn.length - 1];\r\n\r\n newTasks[key] = params.concat(params.length > 0 ? newTask : taskFn);\r\n } else if (taskFn.length === 1) {\r\n // no dependencies, use the function as-is\r\n newTasks[key] = taskFn;\r\n } else {\r\n params = parseParams(taskFn);\r\n if (taskFn.length === 0 && params.length === 0) {\r\n throw new Error(\"autoInject task functions require explicit parameters.\");\r\n }\r\n\r\n params.pop();\r\n\r\n newTasks[key] = params.concat(newTask);\r\n }\r\n\r\n function newTask(results, taskCb) {\r\n var newArgs = arrayMap(params, function (name) {\r\n return results[name];\r\n });\r\n newArgs.push(taskCb);\r\n taskFn.apply(null, newArgs);\r\n }\r\n });\r\n\r\n auto(newTasks, callback);\r\n }\r\n\r\n var hasSetImmediate = typeof setImmediate === 'function' && setImmediate;\r\n var hasNextTick = typeof process === 'object' && typeof process.nextTick === 'function';\r\n\r\n function fallback(fn) {\r\n setTimeout(fn, 0);\r\n }\r\n\r\n function wrap(defer) {\r\n return rest(function (fn, args) {\r\n defer(function () {\r\n fn.apply(null, args);\r\n });\r\n });\r\n }\r\n\r\n var _defer;\r\n\r\n if (hasSetImmediate) {\r\n _defer = setImmediate;\r\n } else if (hasNextTick) {\r\n _defer = process.nextTick;\r\n } else {\r\n _defer = fallback;\r\n }\r\n\r\n var setImmediate$1 = wrap(_defer);\r\n\r\n// Simple doubly linked list (https://en.wikipedia.org/wiki/Doubly_linked_list) implementation\r\n// used for queues. This implementation assumes that the node provided by the user can be modified\r\n// to adjust the next and last properties. We implement only the minimal functionality\r\n// for queue support.\r\n function DLL() {\r\n this.head = this.tail = null;\r\n this.length = 0;\r\n }\r\n\r\n function setInitial(dll, node) {\r\n dll.length = 1;\r\n dll.head = dll.tail = node;\r\n }\r\n\r\n DLL.prototype.removeLink = function (node) {\r\n if (node.prev) node.prev.next = node.next;else this.head = node.next;\r\n if (node.next) node.next.prev = node.prev;else this.tail = node.prev;\r\n\r\n node.prev = node.next = null;\r\n this.length -= 1;\r\n return node;\r\n };\r\n\r\n DLL.prototype.empty = DLL;\r\n\r\n DLL.prototype.insertAfter = function (node, newNode) {\r\n newNode.prev = node;\r\n newNode.next = node.next;\r\n if (node.next) node.next.prev = newNode;else this.tail = newNode;\r\n node.next = newNode;\r\n this.length += 1;\r\n };\r\n\r\n DLL.prototype.insertBefore = function (node, newNode) {\r\n newNode.prev = node.prev;\r\n newNode.next = node;\r\n if (node.prev) node.prev.next = newNode;else this.head = newNode;\r\n node.prev = newNode;\r\n this.length += 1;\r\n };\r\n\r\n DLL.prototype.unshift = function (node) {\r\n if (this.head) this.insertBefore(this.head, node);else setInitial(this, node);\r\n };\r\n\r\n DLL.prototype.push = function (node) {\r\n if (this.tail) this.insertAfter(this.tail, node);else setInitial(this, node);\r\n };\r\n\r\n DLL.prototype.shift = function () {\r\n return this.head && this.removeLink(this.head);\r\n };\r\n\r\n DLL.prototype.pop = function () {\r\n return this.tail && this.removeLink(this.tail);\r\n };\r\n\r\n function queue(worker, concurrency, payload) {\r\n if (concurrency == null) {\r\n concurrency = 1;\r\n } else if (concurrency === 0) {\r\n throw new Error('Concurrency must not be zero');\r\n }\r\n\r\n function _insert(data, insertAtFront, callback) {\r\n if (callback != null && typeof callback !== 'function') {\r\n throw new Error('task callback must be a function');\r\n }\r\n q.started = true;\r\n if (!isArray(data)) {\r\n data = [data];\r\n }\r\n if (data.length === 0 && q.idle()) {\r\n // call drain immediately if there are no tasks\r\n return setImmediate$1(function () {\r\n q.drain();\r\n });\r\n }\r\n\r\n for (var i = 0, l = data.length; i < l; i++) {\r\n var item = {\r\n data: data[i],\r\n callback: callback || noop\r\n };\r\n\r\n if (insertAtFront) {\r\n q._tasks.unshift(item);\r\n } else {\r\n q._tasks.push(item);\r\n }\r\n }\r\n setImmediate$1(q.process);\r\n }\r\n\r\n function _next(tasks) {\r\n return rest(function (args) {\r\n workers -= 1;\r\n\r\n for (var i = 0, l = tasks.length; i < l; i++) {\r\n var task = tasks[i];\r\n var index = baseIndexOf(workersList, task, 0);\r\n if (index >= 0) {\r\n workersList.splice(index);\r\n }\r\n\r\n task.callback.apply(task, args);\r\n\r\n if (args[0] != null) {\r\n q.error(args[0], task.data);\r\n }\r\n }\r\n\r\n if (workers <= q.concurrency - q.buffer) {\r\n q.unsaturated();\r\n }\r\n\r\n if (q.idle()) {\r\n q.drain();\r\n }\r\n q.process();\r\n });\r\n }\r\n\r\n var workers = 0;\r\n var workersList = [];\r\n var q = {\r\n _tasks: new DLL(),\r\n concurrency: concurrency,\r\n payload: payload,\r\n saturated: noop,\r\n unsaturated: noop,\r\n buffer: concurrency / 4,\r\n empty: noop,\r\n drain: noop,\r\n error: noop,\r\n started: false,\r\n paused: false,\r\n push: function (data, callback) {\r\n _insert(data, false, callback);\r\n },\r\n kill: function () {\r\n q.drain = noop;\r\n q._tasks.empty();\r\n },\r\n unshift: function (data, callback) {\r\n _insert(data, true, callback);\r\n },\r\n process: function () {\r\n while (!q.paused && workers < q.concurrency && q._tasks.length) {\r\n var tasks = [],\r\n data = [];\r\n var l = q._tasks.length;\r\n if (q.payload) l = Math.min(l, q.payload);\r\n for (var i = 0; i < l; i++) {\r\n var node = q._tasks.shift();\r\n tasks.push(node);\r\n data.push(node.data);\r\n }\r\n\r\n if (q._tasks.length === 0) {\r\n q.empty();\r\n }\r\n workers += 1;\r\n workersList.push(tasks[0]);\r\n\r\n if (workers === q.concurrency) {\r\n q.saturated();\r\n }\r\n\r\n var cb = onlyOnce(_next(tasks));\r\n worker(data, cb);\r\n }\r\n },\r\n length: function () {\r\n return q._tasks.length;\r\n },\r\n running: function () {\r\n return workers;\r\n },\r\n workersList: function () {\r\n return workersList;\r\n },\r\n idle: function () {\r\n return q._tasks.length + workers === 0;\r\n },\r\n pause: function () {\r\n q.paused = true;\r\n },\r\n resume: function () {\r\n if (q.paused === false) {\r\n return;\r\n }\r\n q.paused = false;\r\n var resumeCount = Math.min(q.concurrency, q._tasks.length);\r\n // Need to call q.process once per concurrent\r\n // worker to preserve full concurrency after pause\r\n for (var w = 1; w <= resumeCount; w++) {\r\n setImmediate$1(q.process);\r\n }\r\n }\r\n };\r\n return q;\r\n }\r\n\r\n /**\r\n * A cargo of tasks for the worker function to complete. Cargo inherits all of\r\n * the same methods and event callbacks as [`queue`]{@link module:ControlFlow.queue}.\r\n * @typedef {Object} CargoObject\r\n * @memberOf module:ControlFlow\r\n * @property {Function} length - A function returning the number of items\r\n * waiting to be processed. Invoke like `cargo.length()`.\r\n * @property {number} payload - An `integer` for determining how many tasks\r\n * should be process per round. This property can be changed after a `cargo` is\r\n * created to alter the payload on-the-fly.\r\n * @property {Function} push - Adds `task` to the `queue`. The callback is\r\n * called once the `worker` has finished processing the task. Instead of a\r\n * single task, an array of `tasks` can be submitted. The respective callback is\r\n * used for every task in the list. Invoke like `cargo.push(task, [callback])`.\r\n * @property {Function} saturated - A callback that is called when the\r\n * `queue.length()` hits the concurrency and further tasks will be queued.\r\n * @property {Function} empty - A callback that is called when the last item\r\n * from the `queue` is given to a `worker`.\r\n * @property {Function} drain - A callback that is called when the last item\r\n * from the `queue` has returned from the `worker`.\r\n * @property {Function} idle - a function returning false if there are items\r\n * waiting or being processed, or true if not. Invoke like `cargo.idle()`.\r\n * @property {Function} pause - a function that pauses the processing of tasks\r\n * until `resume()` is called. Invoke like `cargo.pause()`.\r\n * @property {Function} resume - a function that resumes the processing of\r\n * queued tasks when the queue is paused. Invoke like `cargo.resume()`.\r\n * @property {Function} kill - a function that removes the `drain` callback and\r\n * empties remaining tasks from the queue forcing it to go idle. Invoke like `cargo.kill()`.\r\n */\r\n\r\n /**\r\n * Creates a `cargo` object with the specified payload. Tasks added to the\r\n * cargo will be processed altogether (up to the `payload` limit). If the\r\n * `worker` is in progress, the task is queued until it becomes available. Once\r\n * the `worker` has completed some tasks, each callback of those tasks is\r\n * called. Check out [these](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) [animations](https://camo.githubusercontent.com/f4810e00e1c5f5f8addbe3e9f49064fd5d102699/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130312f38346339323036362d356632392d313165322d383134662d3964336430323431336266642e676966)\r\n * for how `cargo` and `queue` work.\r\n *\r\n * While [`queue`]{@link module:ControlFlow.queue} passes only one task to one of a group of workers\r\n * at a time, cargo passes an array of tasks to a single worker, repeating\r\n * when the worker is finished.\r\n *\r\n * @name cargo\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @see [async.queue]{@link module:ControlFlow.queue}\r\n * @category Control Flow\r\n * @param {Function} worker - An asynchronous function for processing an array\r\n * of queued tasks, which must call its `callback(err)` argument when finished,\r\n * with an optional `err` argument. Invoked with `(tasks, callback)`.\r\n * @param {number} [payload=Infinity] - An optional `integer` for determining\r\n * how many tasks should be processed per round; if omitted, the default is\r\n * unlimited.\r\n * @returns {module:ControlFlow.CargoObject} A cargo object to manage the tasks. Callbacks can\r\n * attached as certain properties to listen for specific events during the\r\n * lifecycle of the cargo and inner queue.\r\n * @example\r\n *\r\n * // create a cargo object with payload 2\r\n * var cargo = async.cargo(function(tasks, callback) {\r\n * for (var i=0; i 3) {\r\n cb = cb || noop;\r\n eachfn(arr, limit, wrappedIteratee, done);\r\n } else {\r\n cb = iteratee;\r\n cb = cb || noop;\r\n iteratee = limit;\r\n eachfn(arr, wrappedIteratee, done);\r\n }\r\n };\r\n }\r\n\r\n function _findGetResult(v, x) {\r\n return x;\r\n }\r\n\r\n /**\r\n * Returns the first value in `coll` that passes an async truth test. The\r\n * `iteratee` is applied in parallel, meaning the first iteratee to return\r\n * `true` will fire the detect `callback` with that result. That means the\r\n * result might not be the first item in the original `coll` (in terms of order)\r\n * that passes the test.\r\n\r\n * If order within the original `coll` is important, then look at\r\n * [`detectSeries`]{@link module:Collections.detectSeries}.\r\n *\r\n * @name detect\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @alias find\r\n * @category Collections\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\r\n * The iteratee is passed a `callback(err, truthValue)` which must be called\r\n * with a boolean argument once it has completed. Invoked with (item, callback).\r\n * @param {Function} [callback] - A callback which is called as soon as any\r\n * iteratee returns `true`, or after all the `iteratee` functions have finished.\r\n * Result will be the first item in the array that passes the truth test\r\n * (iteratee) or the value `undefined` if none passed. Invoked with\r\n * (err, result).\r\n * @example\r\n *\r\n * async.detect(['file1','file2','file3'], function(filePath, callback) {\r\n * fs.access(filePath, function(err) {\r\n * callback(null, !err)\r\n * });\r\n * }, function(err, result) {\r\n * // result now equals the first file in the list that exists\r\n * });\r\n */\r\n var detect = _createTester(eachOf, identity, _findGetResult);\r\n\r\n /**\r\n * The same as [`detect`]{@link module:Collections.detect} but runs a maximum of `limit` async operations at a\r\n * time.\r\n *\r\n * @name detectLimit\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.detect]{@link module:Collections.detect}\r\n * @alias findLimit\r\n * @category Collections\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {number} limit - The maximum number of async operations at a time.\r\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\r\n * The iteratee is passed a `callback(err, truthValue)` which must be called\r\n * with a boolean argument once it has completed. Invoked with (item, callback).\r\n * @param {Function} [callback] - A callback which is called as soon as any\r\n * iteratee returns `true`, or after all the `iteratee` functions have finished.\r\n * Result will be the first item in the array that passes the truth test\r\n * (iteratee) or the value `undefined` if none passed. Invoked with\r\n * (err, result).\r\n */\r\n var detectLimit = _createTester(eachOfLimit, identity, _findGetResult);\r\n\r\n /**\r\n * The same as [`detect`]{@link module:Collections.detect} but runs only a single async operation at a time.\r\n *\r\n * @name detectSeries\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.detect]{@link module:Collections.detect}\r\n * @alias findSeries\r\n * @category Collections\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\r\n * The iteratee is passed a `callback(err, truthValue)` which must be called\r\n * with a boolean argument once it has completed. Invoked with (item, callback).\r\n * @param {Function} [callback] - A callback which is called as soon as any\r\n * iteratee returns `true`, or after all the `iteratee` functions have finished.\r\n * Result will be the first item in the array that passes the truth test\r\n * (iteratee) or the value `undefined` if none passed. Invoked with\r\n * (err, result).\r\n */\r\n var detectSeries = _createTester(eachOfSeries, identity, _findGetResult);\r\n\r\n function consoleFunc(name) {\r\n return rest(function (fn, args) {\r\n fn.apply(null, args.concat(rest(function (err, args) {\r\n if (typeof console === 'object') {\r\n if (err) {\r\n if (console.error) {\r\n console.error(err);\r\n }\r\n } else if (console[name]) {\r\n arrayEach(args, function (x) {\r\n console[name](x);\r\n });\r\n }\r\n }\r\n })));\r\n });\r\n }\r\n\r\n /**\r\n * Logs the result of an `async` function to the `console` using `console.dir`\r\n * to display the properties of the resulting object. Only works in Node.js or\r\n * in browsers that support `console.dir` and `console.error` (such as FF and\r\n * Chrome). If multiple arguments are returned from the async function,\r\n * `console.dir` is called on each argument in order.\r\n *\r\n * @name dir\r\n * @static\r\n * @memberOf module:Utils\r\n * @method\r\n * @category Util\r\n * @param {Function} function - The function you want to eventually apply all\r\n * arguments to.\r\n * @param {...*} arguments... - Any number of arguments to apply to the function.\r\n * @example\r\n *\r\n * // in a module\r\n * var hello = function(name, callback) {\r\n * setTimeout(function() {\r\n * callback(null, {hello: name});\r\n * }, 1000);\r\n * };\r\n *\r\n * // in the node repl\r\n * node> async.dir(hello, 'world');\r\n * {hello: 'world'}\r\n */\r\n var dir = consoleFunc('dir');\r\n\r\n /**\r\n * The post-check version of [`during`]{@link module:ControlFlow.during}. To reflect the difference in\r\n * the order of operations, the arguments `test` and `fn` are switched.\r\n *\r\n * Also a version of [`doWhilst`]{@link module:ControlFlow.doWhilst} with asynchronous `test` function.\r\n * @name doDuring\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @see [async.during]{@link module:ControlFlow.during}\r\n * @category Control Flow\r\n * @param {Function} fn - A function which is called each time `test` passes.\r\n * The function is passed a `callback(err)`, which must be called once it has\r\n * completed with an optional `err` argument. Invoked with (callback).\r\n * @param {Function} test - asynchronous truth test to perform before each\r\n * execution of `fn`. Invoked with (...args, callback), where `...args` are the\r\n * non-error args from the previous callback of `fn`.\r\n * @param {Function} [callback] - A callback which is called after the test\r\n * function has failed and repeated execution of `fn` has stopped. `callback`\r\n * will be passed an error if one occured, otherwise `null`.\r\n */\r\n function doDuring(fn, test, callback) {\r\n callback = onlyOnce(callback || noop);\r\n\r\n var next = rest(function (err, args) {\r\n if (err) return callback(err);\r\n args.push(check);\r\n test.apply(this, args);\r\n });\r\n\r\n function check(err, truth) {\r\n if (err) return callback(err);\r\n if (!truth) return callback(null);\r\n fn(next);\r\n }\r\n\r\n check(null, true);\r\n }\r\n\r\n /**\r\n * The post-check version of [`whilst`]{@link module:ControlFlow.whilst}. To reflect the difference in\r\n * the order of operations, the arguments `test` and `iteratee` are switched.\r\n *\r\n * `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.\r\n *\r\n * @name doWhilst\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @see [async.whilst]{@link module:ControlFlow.whilst}\r\n * @category Control Flow\r\n * @param {Function} iteratee - A function which is called each time `test`\r\n * passes. The function is passed a `callback(err)`, which must be called once\r\n * it has completed with an optional `err` argument. Invoked with (callback).\r\n * @param {Function} test - synchronous truth test to perform after each\r\n * execution of `iteratee`. Invoked with the non-error callback results of\r\n * `iteratee`.\r\n * @param {Function} [callback] - A callback which is called after the test\r\n * function has failed and repeated execution of `iteratee` has stopped.\r\n * `callback` will be passed an error and any arguments passed to the final\r\n * `iteratee`'s callback. Invoked with (err, [results]);\r\n */\r\n function doWhilst(iteratee, test, callback) {\r\n callback = onlyOnce(callback || noop);\r\n var next = rest(function (err, args) {\r\n if (err) return callback(err);\r\n if (test.apply(this, args)) return iteratee(next);\r\n callback.apply(null, [null].concat(args));\r\n });\r\n iteratee(next);\r\n }\r\n\r\n /**\r\n * Like ['doWhilst']{@link module:ControlFlow.doWhilst}, except the `test` is inverted. Note the\r\n * argument ordering differs from `until`.\r\n *\r\n * @name doUntil\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @see [async.doWhilst]{@link module:ControlFlow.doWhilst}\r\n * @category Control Flow\r\n * @param {Function} fn - A function which is called each time `test` fails.\r\n * The function is passed a `callback(err)`, which must be called once it has\r\n * completed with an optional `err` argument. Invoked with (callback).\r\n * @param {Function} test - synchronous truth test to perform after each\r\n * execution of `fn`. Invoked with the non-error callback results of `fn`.\r\n * @param {Function} [callback] - A callback which is called after the test\r\n * function has passed and repeated execution of `fn` has stopped. `callback`\r\n * will be passed an error and any arguments passed to the final `fn`'s\r\n * callback. Invoked with (err, [results]);\r\n */\r\n function doUntil(fn, test, callback) {\r\n doWhilst(fn, function () {\r\n return !test.apply(this, arguments);\r\n }, callback);\r\n }\r\n\r\n /**\r\n * Like [`whilst`]{@link module:ControlFlow.whilst}, except the `test` is an asynchronous function that\r\n * is passed a callback in the form of `function (err, truth)`. If error is\r\n * passed to `test` or `fn`, the main callback is immediately called with the\r\n * value of the error.\r\n *\r\n * @name during\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @see [async.whilst]{@link module:ControlFlow.whilst}\r\n * @category Control Flow\r\n * @param {Function} test - asynchronous truth test to perform before each\r\n * execution of `fn`. Invoked with (callback).\r\n * @param {Function} fn - A function which is called each time `test` passes.\r\n * The function is passed a `callback(err)`, which must be called once it has\r\n * completed with an optional `err` argument. Invoked with (callback).\r\n * @param {Function} [callback] - A callback which is called after the test\r\n * function has failed and repeated execution of `fn` has stopped. `callback`\r\n * will be passed an error, if one occured, otherwise `null`.\r\n * @example\r\n *\r\n * var count = 0;\r\n *\r\n * async.during(\r\n * function (callback) {\r\n * return callback(null, count < 5);\r\n * },\r\n * function (callback) {\r\n * count++;\r\n * setTimeout(callback, 1000);\r\n * },\r\n * function (err) {\r\n * // 5 seconds have passed\r\n * }\r\n * );\r\n */\r\n function during(test, fn, callback) {\r\n callback = onlyOnce(callback || noop);\r\n\r\n function next(err) {\r\n if (err) return callback(err);\r\n test(check);\r\n }\r\n\r\n function check(err, truth) {\r\n if (err) return callback(err);\r\n if (!truth) return callback(null);\r\n fn(next);\r\n }\r\n\r\n test(check);\r\n }\r\n\r\n function _withoutIndex(iteratee) {\r\n return function (value, index, callback) {\r\n return iteratee(value, callback);\r\n };\r\n }\r\n\r\n /**\r\n * Applies the function `iteratee` to each item in `coll`, in parallel.\r\n * The `iteratee` is called with an item from the list, and a callback for when\r\n * it has finished. If the `iteratee` passes an error to its `callback`, the\r\n * main `callback` (for the `each` function) is immediately called with the\r\n * error.\r\n *\r\n * Note, that since this function applies `iteratee` to each item in parallel,\r\n * there is no guarantee that the iteratee functions will complete in order.\r\n *\r\n * @name each\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @alias forEach\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {Function} iteratee - A function to apply to each item\r\n * in `coll`. The iteratee is passed a `callback(err)` which must be called once\r\n * it has completed. If no error has occurred, the `callback` should be run\r\n * without arguments or with an explicit `null` argument. The array index is not\r\n * passed to the iteratee. Invoked with (item, callback). If you need the index,\r\n * use `eachOf`.\r\n * @param {Function} [callback] - A callback which is called when all\r\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\r\n * @example\r\n *\r\n * // assuming openFiles is an array of file names and saveFile is a function\r\n * // to save the modified contents of that file:\r\n *\r\n * async.each(openFiles, saveFile, function(err){\r\n * // if any of the saves produced an error, err would equal that error\r\n * });\r\n *\r\n * // assuming openFiles is an array of file names\r\n * async.each(openFiles, function(file, callback) {\r\n *\r\n * // Perform operation on file here.\r\n * console.log('Processing file ' + file);\r\n *\r\n * if( file.length > 32 ) {\r\n * console.log('This file name is too long');\r\n * callback('File name too long');\r\n * } else {\r\n * // Do work to process file here\r\n * console.log('File processed');\r\n * callback();\r\n * }\r\n * }, function(err) {\r\n * // if any of the file processing produced an error, err would equal that error\r\n * if( err ) {\r\n * // One of the iterations produced an error.\r\n * // All processing will now stop.\r\n * console.log('A file failed to process');\r\n * } else {\r\n * console.log('All files have been processed successfully');\r\n * }\r\n * });\r\n */\r\n function eachLimit(coll, iteratee, callback) {\r\n eachOf(coll, _withoutIndex(iteratee), callback);\r\n }\r\n\r\n /**\r\n * The same as [`each`]{@link module:Collections.each} but runs a maximum of `limit` async operations at a time.\r\n *\r\n * @name eachLimit\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.each]{@link module:Collections.each}\r\n * @alias forEachLimit\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {number} limit - The maximum number of async operations at a time.\r\n * @param {Function} iteratee - A function to apply to each item in `coll`. The\r\n * iteratee is passed a `callback(err)` which must be called once it has\r\n * completed. If no error has occurred, the `callback` should be run without\r\n * arguments or with an explicit `null` argument. The array index is not passed\r\n * to the iteratee. Invoked with (item, callback). If you need the index, use\r\n * `eachOfLimit`.\r\n * @param {Function} [callback] - A callback which is called when all\r\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\r\n */\r\n function eachLimit$1(coll, limit, iteratee, callback) {\r\n _eachOfLimit(limit)(coll, _withoutIndex(iteratee), callback);\r\n }\r\n\r\n /**\r\n * The same as [`each`]{@link module:Collections.each} but runs only a single async operation at a time.\r\n *\r\n * @name eachSeries\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.each]{@link module:Collections.each}\r\n * @alias forEachSeries\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {Function} iteratee - A function to apply to each\r\n * item in `coll`. The iteratee is passed a `callback(err)` which must be called\r\n * once it has completed. If no error has occurred, the `callback` should be run\r\n * without arguments or with an explicit `null` argument. The array index is\r\n * not passed to the iteratee. Invoked with (item, callback). If you need the\r\n * index, use `eachOfSeries`.\r\n * @param {Function} [callback] - A callback which is called when all\r\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\r\n */\r\n var eachSeries = doLimit(eachLimit$1, 1);\r\n\r\n /**\r\n * Wrap an async function and ensure it calls its callback on a later tick of\r\n * the event loop. If the function already calls its callback on a next tick,\r\n * no extra deferral is added. This is useful for preventing stack overflows\r\n * (`RangeError: Maximum call stack size exceeded`) and generally keeping\r\n * [Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony)\r\n * contained.\r\n *\r\n * @name ensureAsync\r\n * @static\r\n * @memberOf module:Utils\r\n * @method\r\n * @category Util\r\n * @param {Function} fn - an async function, one that expects a node-style\r\n * callback as its last argument.\r\n * @returns {Function} Returns a wrapped function with the exact same call\r\n * signature as the function passed in.\r\n * @example\r\n *\r\n * function sometimesAsync(arg, callback) {\r\n * if (cache[arg]) {\r\n * return callback(null, cache[arg]); // this would be synchronous!!\r\n * } else {\r\n * doSomeIO(arg, callback); // this IO would be asynchronous\r\n * }\r\n * }\r\n *\r\n * // this has a risk of stack overflows if many results are cached in a row\r\n * async.mapSeries(args, sometimesAsync, done);\r\n *\r\n * // this will defer sometimesAsync's callback if necessary,\r\n * // preventing stack overflows\r\n * async.mapSeries(args, async.ensureAsync(sometimesAsync), done);\r\n */\r\n function ensureAsync(fn) {\r\n return initialParams(function (args, callback) {\r\n var sync = true;\r\n args.push(function () {\r\n var innerArgs = arguments;\r\n if (sync) {\r\n setImmediate$1(function () {\r\n callback.apply(null, innerArgs);\r\n });\r\n } else {\r\n callback.apply(null, innerArgs);\r\n }\r\n });\r\n fn.apply(this, args);\r\n sync = false;\r\n });\r\n }\r\n\r\n function notId(v) {\r\n return !v;\r\n }\r\n\r\n /**\r\n * Returns `true` if every element in `coll` satisfies an async test. If any\r\n * iteratee call returns `false`, the main `callback` is immediately called.\r\n *\r\n * @name every\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @alias all\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {Function} iteratee - A truth test to apply to each item in the\r\n * collection in parallel. The iteratee is passed a `callback(err, truthValue)`\r\n * which must be called with a boolean argument once it has completed. Invoked\r\n * with (item, callback).\r\n * @param {Function} [callback] - A callback which is called after all the\r\n * `iteratee` functions have finished. Result will be either `true` or `false`\r\n * depending on the values of the async tests. Invoked with (err, result).\r\n * @example\r\n *\r\n * async.every(['file1','file2','file3'], function(filePath, callback) {\r\n * fs.access(filePath, function(err) {\r\n * callback(null, !err)\r\n * });\r\n * }, function(err, result) {\r\n * // if result is true then every file exists\r\n * });\r\n */\r\n var every = _createTester(eachOf, notId, notId);\r\n\r\n /**\r\n * The same as [`every`]{@link module:Collections.every} but runs a maximum of `limit` async operations at a time.\r\n *\r\n * @name everyLimit\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.every]{@link module:Collections.every}\r\n * @alias allLimit\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {number} limit - The maximum number of async operations at a time.\r\n * @param {Function} iteratee - A truth test to apply to each item in the\r\n * collection in parallel. The iteratee is passed a `callback(err, truthValue)`\r\n * which must be called with a boolean argument once it has completed. Invoked\r\n * with (item, callback).\r\n * @param {Function} [callback] - A callback which is called after all the\r\n * `iteratee` functions have finished. Result will be either `true` or `false`\r\n * depending on the values of the async tests. Invoked with (err, result).\r\n */\r\n var everyLimit = _createTester(eachOfLimit, notId, notId);\r\n\r\n /**\r\n * The same as [`every`]{@link module:Collections.every} but runs only a single async operation at a time.\r\n *\r\n * @name everySeries\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.every]{@link module:Collections.every}\r\n * @alias allSeries\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {Function} iteratee - A truth test to apply to each item in the\r\n * collection in parallel. The iteratee is passed a `callback(err, truthValue)`\r\n * which must be called with a boolean argument once it has completed. Invoked\r\n * with (item, callback).\r\n * @param {Function} [callback] - A callback which is called after all the\r\n * `iteratee` functions have finished. Result will be either `true` or `false`\r\n * depending on the values of the async tests. Invoked with (err, result).\r\n */\r\n var everySeries = doLimit(everyLimit, 1);\r\n\r\n /**\r\n * The base implementation of `_.property` without support for deep paths.\r\n *\r\n * @private\r\n * @param {string} key The key of the property to get.\r\n * @returns {Function} Returns the new accessor function.\r\n */\r\n function baseProperty(key) {\r\n return function(object) {\r\n return object == null ? undefined : object[key];\r\n };\r\n }\r\n\r\n function filterArray(eachfn, arr, iteratee, callback) {\r\n var truthValues = new Array(arr.length);\r\n eachfn(arr, function (x, index, callback) {\r\n iteratee(x, function (err, v) {\r\n truthValues[index] = !!v;\r\n callback(err);\r\n });\r\n }, function (err) {\r\n if (err) return callback(err);\r\n var results = [];\r\n for (var i = 0; i < arr.length; i++) {\r\n if (truthValues[i]) results.push(arr[i]);\r\n }\r\n callback(null, results);\r\n });\r\n }\r\n\r\n function filterGeneric(eachfn, coll, iteratee, callback) {\r\n var results = [];\r\n eachfn(coll, function (x, index, callback) {\r\n iteratee(x, function (err, v) {\r\n if (err) {\r\n callback(err);\r\n } else {\r\n if (v) {\r\n results.push({ index: index, value: x });\r\n }\r\n callback();\r\n }\r\n });\r\n }, function (err) {\r\n if (err) {\r\n callback(err);\r\n } else {\r\n callback(null, arrayMap(results.sort(function (a, b) {\r\n return a.index - b.index;\r\n }), baseProperty('value')));\r\n }\r\n });\r\n }\r\n\r\n function _filter(eachfn, coll, iteratee, callback) {\r\n var filter = isArrayLike(coll) ? filterArray : filterGeneric;\r\n filter(eachfn, coll, iteratee, callback || noop);\r\n }\r\n\r\n /**\r\n * Returns a new array of all the values in `coll` which pass an async truth\r\n * test. This operation is performed in parallel, but the results array will be\r\n * in the same order as the original.\r\n *\r\n * @name filter\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @alias select\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\r\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\r\n * with a boolean argument once it has completed. Invoked with (item, callback).\r\n * @param {Function} [callback] - A callback which is called after all the\r\n * `iteratee` functions have finished. Invoked with (err, results).\r\n * @example\r\n *\r\n * async.filter(['file1','file2','file3'], function(filePath, callback) {\r\n * fs.access(filePath, function(err) {\r\n * callback(null, !err)\r\n * });\r\n * }, function(err, results) {\r\n * // results now equals an array of the existing files\r\n * });\r\n */\r\n var filter = doParallel(_filter);\r\n\r\n /**\r\n * The same as [`filter`]{@link module:Collections.filter} but runs a maximum of `limit` async operations at a\r\n * time.\r\n *\r\n * @name filterLimit\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.filter]{@link module:Collections.filter}\r\n * @alias selectLimit\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {number} limit - The maximum number of async operations at a time.\r\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\r\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\r\n * with a boolean argument once it has completed. Invoked with (item, callback).\r\n * @param {Function} [callback] - A callback which is called after all the\r\n * `iteratee` functions have finished. Invoked with (err, results).\r\n */\r\n var filterLimit = doParallelLimit(_filter);\r\n\r\n /**\r\n * The same as [`filter`]{@link module:Collections.filter} but runs only a single async operation at a time.\r\n *\r\n * @name filterSeries\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.filter]{@link module:Collections.filter}\r\n * @alias selectSeries\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\r\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\r\n * with a boolean argument once it has completed. Invoked with (item, callback).\r\n * @param {Function} [callback] - A callback which is called after all the\r\n * `iteratee` functions have finished. Invoked with (err, results)\r\n */\r\n var filterSeries = doLimit(filterLimit, 1);\r\n\r\n /**\r\n * Calls the asynchronous function `fn` with a callback parameter that allows it\r\n * to call itself again, in series, indefinitely.\r\n\r\n * If an error is passed to the\r\n * callback then `errback` is called with the error, and execution stops,\r\n * otherwise it will never be called.\r\n *\r\n * @name forever\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @category Control Flow\r\n * @param {Function} fn - a function to call repeatedly. Invoked with (next).\r\n * @param {Function} [errback] - when `fn` passes an error to it's callback,\r\n * this function will be called, and execution stops. Invoked with (err).\r\n * @example\r\n *\r\n * async.forever(\r\n * function(next) {\r\n * // next is suitable for passing to things that need a callback(err [, whatever]);\r\n * // it will result in this function being called again.\r\n * },\r\n * function(err) {\r\n * // if next is called with a value in its first parameter, it will appear\r\n * // in here as 'err', and execution will stop.\r\n * }\r\n * );\r\n */\r\n function forever(fn, errback) {\r\n var done = onlyOnce(errback || noop);\r\n var task = ensureAsync(fn);\r\n\r\n function next(err) {\r\n if (err) return done(err);\r\n task(next);\r\n }\r\n next();\r\n }\r\n\r\n /**\r\n * Logs the result of an `async` function to the `console`. Only works in\r\n * Node.js or in browsers that support `console.log` and `console.error` (such\r\n * as FF and Chrome). If multiple arguments are returned from the async\r\n * function, `console.log` is called on each argument in order.\r\n *\r\n * @name log\r\n * @static\r\n * @memberOf module:Utils\r\n * @method\r\n * @category Util\r\n * @param {Function} function - The function you want to eventually apply all\r\n * arguments to.\r\n * @param {...*} arguments... - Any number of arguments to apply to the function.\r\n * @example\r\n *\r\n * // in a module\r\n * var hello = function(name, callback) {\r\n * setTimeout(function() {\r\n * callback(null, 'hello ' + name);\r\n * }, 1000);\r\n * };\r\n *\r\n * // in the node repl\r\n * node> async.log(hello, 'world');\r\n * 'hello world'\r\n */\r\n var log = consoleFunc('log');\r\n\r\n /**\r\n * The same as [`mapValues`]{@link module:Collections.mapValues} but runs a maximum of `limit` async operations at a\r\n * time.\r\n *\r\n * @name mapValuesLimit\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.mapValues]{@link module:Collections.mapValues}\r\n * @category Collection\r\n * @param {Object} obj - A collection to iterate over.\r\n * @param {number} limit - The maximum number of async operations at a time.\r\n * @param {Function} iteratee - A function to apply to each value in `obj`.\r\n * The iteratee is passed a `callback(err, transformed)` which must be called\r\n * once it has completed with an error (which can be `null`) and a\r\n * transformed value. Invoked with (value, key, callback).\r\n * @param {Function} [callback] - A callback which is called when all `iteratee`\r\n * functions have finished, or an error occurs. `result` is a new object consisting\r\n * of each key from `obj`, with each transformed value on the right-hand side.\r\n * Invoked with (err, result).\r\n */\r\n function mapValuesLimit(obj, limit, iteratee, callback) {\r\n callback = once(callback || noop);\r\n var newObj = {};\r\n eachOfLimit(obj, limit, function (val, key, next) {\r\n iteratee(val, key, function (err, result) {\r\n if (err) return next(err);\r\n newObj[key] = result;\r\n next();\r\n });\r\n }, function (err) {\r\n callback(err, newObj);\r\n });\r\n }\r\n\r\n /**\r\n * A relative of [`map`]{@link module:Collections.map}, designed for use with objects.\r\n *\r\n * Produces a new Object by mapping each value of `obj` through the `iteratee`\r\n * function. The `iteratee` is called each `value` and `key` from `obj` and a\r\n * callback for when it has finished processing. Each of these callbacks takes\r\n * two arguments: an `error`, and the transformed item from `obj`. If `iteratee`\r\n * passes an error to its callback, the main `callback` (for the `mapValues`\r\n * function) is immediately called with the error.\r\n *\r\n * Note, the order of the keys in the result is not guaranteed. The keys will\r\n * be roughly in the order they complete, (but this is very engine-specific)\r\n *\r\n * @name mapValues\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @category Collection\r\n * @param {Object} obj - A collection to iterate over.\r\n * @param {Function} iteratee - A function to apply to each value and key in\r\n * `coll`. The iteratee is passed a `callback(err, transformed)` which must be\r\n * called once it has completed with an error (which can be `null`) and a\r\n * transformed value. Invoked with (value, key, callback).\r\n * @param {Function} [callback] - A callback which is called when all `iteratee`\r\n * functions have finished, or an error occurs. `result` is a new object consisting\r\n * of each key from `obj`, with each transformed value on the right-hand side.\r\n * Invoked with (err, result).\r\n * @example\r\n *\r\n * async.mapValues({\r\n * f1: 'file1',\r\n * f2: 'file2',\r\n * f3: 'file3'\r\n * }, function (file, key, callback) {\r\n * fs.stat(file, callback);\r\n * }, function(err, result) {\r\n * // result is now a map of stats for each file, e.g.\r\n * // {\r\n * // f1: [stats for file1],\r\n * // f2: [stats for file2],\r\n * // f3: [stats for file3]\r\n * // }\r\n * });\r\n */\r\n\r\n var mapValues = doLimit(mapValuesLimit, Infinity);\r\n\r\n /**\r\n * The same as [`mapValues`]{@link module:Collections.mapValues} but runs only a single async operation at a time.\r\n *\r\n * @name mapValuesSeries\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.mapValues]{@link module:Collections.mapValues}\r\n * @category Collection\r\n * @param {Object} obj - A collection to iterate over.\r\n * @param {Function} iteratee - A function to apply to each value in `obj`.\r\n * The iteratee is passed a `callback(err, transformed)` which must be called\r\n * once it has completed with an error (which can be `null`) and a\r\n * transformed value. Invoked with (value, key, callback).\r\n * @param {Function} [callback] - A callback which is called when all `iteratee`\r\n * functions have finished, or an error occurs. `result` is a new object consisting\r\n * of each key from `obj`, with each transformed value on the right-hand side.\r\n * Invoked with (err, result).\r\n */\r\n var mapValuesSeries = doLimit(mapValuesLimit, 1);\r\n\r\n function has(obj, key) {\r\n return key in obj;\r\n }\r\n\r\n /**\r\n * Caches the results of an `async` function. When creating a hash to store\r\n * function results against, the callback is omitted from the hash and an\r\n * optional hash function can be used.\r\n *\r\n * If no hash function is specified, the first argument is used as a hash key,\r\n * which may work reasonably if it is a string or a data type that converts to a\r\n * distinct string. Note that objects and arrays will not behave reasonably.\r\n * Neither will cases where the other arguments are significant. In such cases,\r\n * specify your own hash function.\r\n *\r\n * The cache of results is exposed as the `memo` property of the function\r\n * returned by `memoize`.\r\n *\r\n * @name memoize\r\n * @static\r\n * @memberOf module:Utils\r\n * @method\r\n * @category Util\r\n * @param {Function} fn - The function to proxy and cache results from.\r\n * @param {Function} hasher - An optional function for generating a custom hash\r\n * for storing results. It has all the arguments applied to it apart from the\r\n * callback, and must be synchronous.\r\n * @returns {Function} a memoized version of `fn`\r\n * @example\r\n *\r\n * var slow_fn = function(name, callback) {\r\n * // do something\r\n * callback(null, result);\r\n * };\r\n * var fn = async.memoize(slow_fn);\r\n *\r\n * // fn can now be used as if it were slow_fn\r\n * fn('some name', function() {\r\n * // callback\r\n * });\r\n */\r\n function memoize(fn, hasher) {\r\n var memo = Object.create(null);\r\n var queues = Object.create(null);\r\n hasher = hasher || identity;\r\n var memoized = initialParams(function memoized(args, callback) {\r\n var key = hasher.apply(null, args);\r\n if (has(memo, key)) {\r\n setImmediate$1(function () {\r\n callback.apply(null, memo[key]);\r\n });\r\n } else if (has(queues, key)) {\r\n queues[key].push(callback);\r\n } else {\r\n queues[key] = [callback];\r\n fn.apply(null, args.concat(rest(function (args) {\r\n memo[key] = args;\r\n var q = queues[key];\r\n delete queues[key];\r\n for (var i = 0, l = q.length; i < l; i++) {\r\n q[i].apply(null, args);\r\n }\r\n })));\r\n }\r\n });\r\n memoized.memo = memo;\r\n memoized.unmemoized = fn;\r\n return memoized;\r\n }\r\n\r\n /**\r\n * Calls `callback` on a later loop around the event loop. In Node.js this just\r\n * calls `setImmediate`. In the browser it will use `setImmediate` if\r\n * available, otherwise `setTimeout(callback, 0)`, which means other higher\r\n * priority events may precede the execution of `callback`.\r\n *\r\n * This is used internally for browser-compatibility purposes.\r\n *\r\n * @name nextTick\r\n * @static\r\n * @memberOf module:Utils\r\n * @method\r\n * @alias setImmediate\r\n * @category Util\r\n * @param {Function} callback - The function to call on a later loop around\r\n * the event loop. Invoked with (args...).\r\n * @param {...*} args... - any number of additional arguments to pass to the\r\n * callback on the next tick.\r\n * @example\r\n *\r\n * var call_order = [];\r\n * async.nextTick(function() {\r\n * call_order.push('two');\r\n * // call_order now equals ['one','two']\r\n * });\r\n * call_order.push('one');\r\n *\r\n * async.setImmediate(function (a, b, c) {\r\n * // a, b, and c equal 1, 2, and 3\r\n * }, 1, 2, 3);\r\n */\r\n var _defer$1;\r\n\r\n if (hasNextTick) {\r\n _defer$1 = process.nextTick;\r\n } else if (hasSetImmediate) {\r\n _defer$1 = setImmediate;\r\n } else {\r\n _defer$1 = fallback;\r\n }\r\n\r\n var nextTick = wrap(_defer$1);\r\n\r\n function _parallel(eachfn, tasks, callback) {\r\n callback = callback || noop;\r\n var results = isArrayLike(tasks) ? [] : {};\r\n\r\n eachfn(tasks, function (task, key, callback) {\r\n task(rest(function (err, args) {\r\n if (args.length <= 1) {\r\n args = args[0];\r\n }\r\n results[key] = args;\r\n callback(err);\r\n }));\r\n }, function (err) {\r\n callback(err, results);\r\n });\r\n }\r\n\r\n /**\r\n * Run the `tasks` collection of functions in parallel, without waiting until\r\n * the previous function has completed. If any of the functions pass an error to\r\n * its callback, the main `callback` is immediately called with the value of the\r\n * error. Once the `tasks` have completed, the results are passed to the final\r\n * `callback` as an array.\r\n *\r\n * **Note:** `parallel` is about kicking-off I/O tasks in parallel, not about\r\n * parallel execution of code. If your tasks do not use any timers or perform\r\n * any I/O, they will actually be executed in series. Any synchronous setup\r\n * sections for each task will happen one after the other. JavaScript remains\r\n * single-threaded.\r\n *\r\n * It is also possible to use an object instead of an array. Each property will\r\n * be run as a function and the results will be passed to the final `callback`\r\n * as an object instead of an array. This can be a more readable way of handling\r\n * results from {@link async.parallel}.\r\n *\r\n * @name parallel\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @category Control Flow\r\n * @param {Array|Iterable|Object} tasks - A collection containing functions to run.\r\n * Each function is passed a `callback(err, result)` which it must call on\r\n * completion with an error `err` (which can be `null`) and an optional `result`\r\n * value.\r\n * @param {Function} [callback] - An optional callback to run once all the\r\n * functions have completed successfully. This function gets a results array\r\n * (or object) containing all the result arguments passed to the task callbacks.\r\n * Invoked with (err, results).\r\n * @example\r\n * async.parallel([\r\n * function(callback) {\r\n * setTimeout(function() {\r\n * callback(null, 'one');\r\n * }, 200);\r\n * },\r\n * function(callback) {\r\n * setTimeout(function() {\r\n * callback(null, 'two');\r\n * }, 100);\r\n * }\r\n * ],\r\n * // optional callback\r\n * function(err, results) {\r\n * // the results array will equal ['one','two'] even though\r\n * // the second function had a shorter timeout.\r\n * });\r\n *\r\n * // an example using an object instead of an array\r\n * async.parallel({\r\n * one: function(callback) {\r\n * setTimeout(function() {\r\n * callback(null, 1);\r\n * }, 200);\r\n * },\r\n * two: function(callback) {\r\n * setTimeout(function() {\r\n * callback(null, 2);\r\n * }, 100);\r\n * }\r\n * }, function(err, results) {\r\n * // results is now equals to: {one: 1, two: 2}\r\n * });\r\n */\r\n function parallelLimit(tasks, callback) {\r\n _parallel(eachOf, tasks, callback);\r\n }\r\n\r\n /**\r\n * The same as [`parallel`]{@link module:ControlFlow.parallel} but runs a maximum of `limit` async operations at a\r\n * time.\r\n *\r\n * @name parallelLimit\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @see [async.parallel]{@link module:ControlFlow.parallel}\r\n * @category Control Flow\r\n * @param {Array|Collection} tasks - A collection containing functions to run.\r\n * Each function is passed a `callback(err, result)` which it must call on\r\n * completion with an error `err` (which can be `null`) and an optional `result`\r\n * value.\r\n * @param {number} limit - The maximum number of async operations at a time.\r\n * @param {Function} [callback] - An optional callback to run once all the\r\n * functions have completed successfully. This function gets a results array\r\n * (or object) containing all the result arguments passed to the task callbacks.\r\n * Invoked with (err, results).\r\n */\r\n function parallelLimit$1(tasks, limit, callback) {\r\n _parallel(_eachOfLimit(limit), tasks, callback);\r\n }\r\n\r\n /**\r\n * A queue of tasks for the worker function to complete.\r\n * @typedef {Object} QueueObject\r\n * @memberOf module:ControlFlow\r\n * @property {Function} length - a function returning the number of items\r\n * waiting to be processed. Invoke with `queue.length()`.\r\n * @property {boolean} started - a boolean indicating whether or not any\r\n * items have been pushed and processed by the queue.\r\n * @property {Function} running - a function returning the number of items\r\n * currently being processed. Invoke with `queue.running()`.\r\n * @property {Function} workersList - a function returning the array of items\r\n * currently being processed. Invoke with `queue.workersList()`.\r\n * @property {Function} idle - a function returning false if there are items\r\n * waiting or being processed, or true if not. Invoke with `queue.idle()`.\r\n * @property {number} concurrency - an integer for determining how many `worker`\r\n * functions should be run in parallel. This property can be changed after a\r\n * `queue` is created to alter the concurrency on-the-fly.\r\n * @property {Function} push - add a new task to the `queue`. Calls `callback`\r\n * once the `worker` has finished processing the task. Instead of a single task,\r\n * a `tasks` array can be submitted. The respective callback is used for every\r\n * task in the list. Invoke with `queue.push(task, [callback])`,\r\n * @property {Function} unshift - add a new task to the front of the `queue`.\r\n * Invoke with `queue.unshift(task, [callback])`.\r\n * @property {Function} saturated - a callback that is called when the number of\r\n * running workers hits the `concurrency` limit, and further tasks will be\r\n * queued.\r\n * @property {Function} unsaturated - a callback that is called when the number\r\n * of running workers is less than the `concurrency` & `buffer` limits, and\r\n * further tasks will not be queued.\r\n * @property {number} buffer - A minimum threshold buffer in order to say that\r\n * the `queue` is `unsaturated`.\r\n * @property {Function} empty - a callback that is called when the last item\r\n * from the `queue` is given to a `worker`.\r\n * @property {Function} drain - a callback that is called when the last item\r\n * from the `queue` has returned from the `worker`.\r\n * @property {Function} error - a callback that is called when a task errors.\r\n * Has the signature `function(error, task)`.\r\n * @property {boolean} paused - a boolean for determining whether the queue is\r\n * in a paused state.\r\n * @property {Function} pause - a function that pauses the processing of tasks\r\n * until `resume()` is called. Invoke with `queue.pause()`.\r\n * @property {Function} resume - a function that resumes the processing of\r\n * queued tasks when the queue is paused. Invoke with `queue.resume()`.\r\n * @property {Function} kill - a function that removes the `drain` callback and\r\n * empties remaining tasks from the queue forcing it to go idle. Invoke with `queue.kill()`.\r\n */\r\n\r\n /**\r\n * Creates a `queue` object with the specified `concurrency`. Tasks added to the\r\n * `queue` are processed in parallel (up to the `concurrency` limit). If all\r\n * `worker`s are in progress, the task is queued until one becomes available.\r\n * Once a `worker` completes a `task`, that `task`'s callback is called.\r\n *\r\n * @name queue\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @category Control Flow\r\n * @param {Function} worker - An asynchronous function for processing a queued\r\n * task, which must call its `callback(err)` argument when finished, with an\r\n * optional `error` as an argument. If you want to handle errors from an\r\n * individual task, pass a callback to `q.push()`. Invoked with\r\n * (task, callback).\r\n * @param {number} [concurrency=1] - An `integer` for determining how many\r\n * `worker` functions should be run in parallel. If omitted, the concurrency\r\n * defaults to `1`. If the concurrency is `0`, an error is thrown.\r\n * @returns {module:ControlFlow.QueueObject} A queue object to manage the tasks. Callbacks can\r\n * attached as certain properties to listen for specific events during the\r\n * lifecycle of the queue.\r\n * @example\r\n *\r\n * // create a queue object with concurrency 2\r\n * var q = async.queue(function(task, callback) {\r\n * console.log('hello ' + task.name);\r\n * callback();\r\n * }, 2);\r\n *\r\n * // assign a callback\r\n * q.drain = function() {\r\n * console.log('all items have been processed');\r\n * };\r\n *\r\n * // add some items to the queue\r\n * q.push({name: 'foo'}, function(err) {\r\n * console.log('finished processing foo');\r\n * });\r\n * q.push({name: 'bar'}, function (err) {\r\n * console.log('finished processing bar');\r\n * });\r\n *\r\n * // add some items to the queue (batch-wise)\r\n * q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function(err) {\r\n * console.log('finished processing item');\r\n * });\r\n *\r\n * // add some items to the front of the queue\r\n * q.unshift({name: 'bar'}, function (err) {\r\n * console.log('finished processing bar');\r\n * });\r\n */\r\n var queue$1 = function (worker, concurrency) {\r\n return queue(function (items, cb) {\r\n worker(items[0], cb);\r\n }, concurrency, 1);\r\n };\r\n\r\n /**\r\n * The same as [async.queue]{@link module:ControlFlow.queue} only tasks are assigned a priority and\r\n * completed in ascending priority order.\r\n *\r\n * @name priorityQueue\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @see [async.queue]{@link module:ControlFlow.queue}\r\n * @category Control Flow\r\n * @param {Function} worker - An asynchronous function for processing a queued\r\n * task, which must call its `callback(err)` argument when finished, with an\r\n * optional `error` as an argument. If you want to handle errors from an\r\n * individual task, pass a callback to `q.push()`. Invoked with\r\n * (task, callback).\r\n * @param {number} concurrency - An `integer` for determining how many `worker`\r\n * functions should be run in parallel. If omitted, the concurrency defaults to\r\n * `1`. If the concurrency is `0`, an error is thrown.\r\n * @returns {module:ControlFlow.QueueObject} A priorityQueue object to manage the tasks. There are two\r\n * differences between `queue` and `priorityQueue` objects:\r\n * * `push(task, priority, [callback])` - `priority` should be a number. If an\r\n * array of `tasks` is given, all tasks will be assigned the same priority.\r\n * * The `unshift` method was removed.\r\n */\r\n var priorityQueue = function (worker, concurrency) {\r\n // Start with a normal queue\r\n var q = queue$1(worker, concurrency);\r\n\r\n // Override push to accept second parameter representing priority\r\n q.push = function (data, priority, callback) {\r\n if (callback == null) callback = noop;\r\n if (typeof callback !== 'function') {\r\n throw new Error('task callback must be a function');\r\n }\r\n q.started = true;\r\n if (!isArray(data)) {\r\n data = [data];\r\n }\r\n if (data.length === 0) {\r\n // call drain immediately if there are no tasks\r\n return setImmediate$1(function () {\r\n q.drain();\r\n });\r\n }\r\n\r\n priority = priority || 0;\r\n var nextNode = q._tasks.head;\r\n while (nextNode && priority >= nextNode.priority) {\r\n nextNode = nextNode.next;\r\n }\r\n\r\n for (var i = 0, l = data.length; i < l; i++) {\r\n var item = {\r\n data: data[i],\r\n priority: priority,\r\n callback: callback\r\n };\r\n\r\n if (nextNode) {\r\n q._tasks.insertBefore(nextNode, item);\r\n } else {\r\n q._tasks.push(item);\r\n }\r\n }\r\n setImmediate$1(q.process);\r\n };\r\n\r\n // Remove unshift function\r\n delete q.unshift;\r\n\r\n return q;\r\n };\r\n\r\n /**\r\n * Runs the `tasks` array of functions in parallel, without waiting until the\r\n * previous function has completed. Once any of the `tasks` complete or pass an\r\n * error to its callback, the main `callback` is immediately called. It's\r\n * equivalent to `Promise.race()`.\r\n *\r\n * @name race\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @category Control Flow\r\n * @param {Array} tasks - An array containing functions to run. Each function\r\n * is passed a `callback(err, result)` which it must call on completion with an\r\n * error `err` (which can be `null`) and an optional `result` value.\r\n * @param {Function} callback - A callback to run once any of the functions have\r\n * completed. This function gets an error or result from the first function that\r\n * completed. Invoked with (err, result).\r\n * @returns undefined\r\n * @example\r\n *\r\n * async.race([\r\n * function(callback) {\r\n * setTimeout(function() {\r\n * callback(null, 'one');\r\n * }, 200);\r\n * },\r\n * function(callback) {\r\n * setTimeout(function() {\r\n * callback(null, 'two');\r\n * }, 100);\r\n * }\r\n * ],\r\n * // main callback\r\n * function(err, result) {\r\n * // the result will be equal to 'two' as it finishes earlier\r\n * });\r\n */\r\n function race(tasks, callback) {\r\n callback = once(callback || noop);\r\n if (!isArray(tasks)) return callback(new TypeError('First argument to race must be an array of functions'));\r\n if (!tasks.length) return callback();\r\n for (var i = 0, l = tasks.length; i < l; i++) {\r\n tasks[i](callback);\r\n }\r\n }\r\n\r\n var slice = Array.prototype.slice;\r\n\r\n /**\r\n * Same as [`reduce`]{@link module:Collections.reduce}, only operates on `array` in reverse order.\r\n *\r\n * @name reduceRight\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.reduce]{@link module:Collections.reduce}\r\n * @alias foldr\r\n * @category Collection\r\n * @param {Array} array - A collection to iterate over.\r\n * @param {*} memo - The initial state of the reduction.\r\n * @param {Function} iteratee - A function applied to each item in the\r\n * array to produce the next step in the reduction. The `iteratee` is passed a\r\n * `callback(err, reduction)` which accepts an optional error as its first\r\n * argument, and the state of the reduction as the second. If an error is\r\n * passed to the callback, the reduction is stopped and the main `callback` is\r\n * immediately called with the error. Invoked with (memo, item, callback).\r\n * @param {Function} [callback] - A callback which is called after all the\r\n * `iteratee` functions have finished. Result is the reduced value. Invoked with\r\n * (err, result).\r\n */\r\n function reduceRight(array, memo, iteratee, callback) {\r\n var reversed = slice.call(array).reverse();\r\n reduce(reversed, memo, iteratee, callback);\r\n }\r\n\r\n /**\r\n * Wraps the function in another function that always returns data even when it\r\n * errors.\r\n *\r\n * The object returned has either the property `error` or `value`.\r\n *\r\n * @name reflect\r\n * @static\r\n * @memberOf module:Utils\r\n * @method\r\n * @category Util\r\n * @param {Function} fn - The function you want to wrap\r\n * @returns {Function} - A function that always passes null to it's callback as\r\n * the error. The second argument to the callback will be an `object` with\r\n * either an `error` or a `value` property.\r\n * @example\r\n *\r\n * async.parallel([\r\n * async.reflect(function(callback) {\r\n * // do some stuff ...\r\n * callback(null, 'one');\r\n * }),\r\n * async.reflect(function(callback) {\r\n * // do some more stuff but error ...\r\n * callback('bad stuff happened');\r\n * }),\r\n * async.reflect(function(callback) {\r\n * // do some more stuff ...\r\n * callback(null, 'two');\r\n * })\r\n * ],\r\n * // optional callback\r\n * function(err, results) {\r\n * // values\r\n * // results[0].value = 'one'\r\n * // results[1].error = 'bad stuff happened'\r\n * // results[2].value = 'two'\r\n * });\r\n */\r\n function reflect(fn) {\r\n return initialParams(function reflectOn(args, reflectCallback) {\r\n args.push(rest(function callback(err, cbArgs) {\r\n if (err) {\r\n reflectCallback(null, {\r\n error: err\r\n });\r\n } else {\r\n var value = null;\r\n if (cbArgs.length === 1) {\r\n value = cbArgs[0];\r\n } else if (cbArgs.length > 1) {\r\n value = cbArgs;\r\n }\r\n reflectCallback(null, {\r\n value: value\r\n });\r\n }\r\n }));\r\n\r\n return fn.apply(this, args);\r\n });\r\n }\r\n\r\n function reject$1(eachfn, arr, iteratee, callback) {\r\n _filter(eachfn, arr, function (value, cb) {\r\n iteratee(value, function (err, v) {\r\n cb(err, !v);\r\n });\r\n }, callback);\r\n }\r\n\r\n /**\r\n * The opposite of [`filter`]{@link module:Collections.filter}. Removes values that pass an `async` truth test.\r\n *\r\n * @name reject\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.filter]{@link module:Collections.filter}\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\r\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\r\n * with a boolean argument once it has completed. Invoked with (item, callback).\r\n * @param {Function} [callback] - A callback which is called after all the\r\n * `iteratee` functions have finished. Invoked with (err, results).\r\n * @example\r\n *\r\n * async.reject(['file1','file2','file3'], function(filePath, callback) {\r\n * fs.access(filePath, function(err) {\r\n * callback(null, !err)\r\n * });\r\n * }, function(err, results) {\r\n * // results now equals an array of missing files\r\n * createFiles(results);\r\n * });\r\n */\r\n var reject = doParallel(reject$1);\r\n\r\n /**\r\n * A helper function that wraps an array or an object of functions with reflect.\r\n *\r\n * @name reflectAll\r\n * @static\r\n * @memberOf module:Utils\r\n * @method\r\n * @see [async.reflect]{@link module:Utils.reflect}\r\n * @category Util\r\n * @param {Array} tasks - The array of functions to wrap in `async.reflect`.\r\n * @returns {Array} Returns an array of functions, each function wrapped in\r\n * `async.reflect`\r\n * @example\r\n *\r\n * let tasks = [\r\n * function(callback) {\r\n * setTimeout(function() {\r\n * callback(null, 'one');\r\n * }, 200);\r\n * },\r\n * function(callback) {\r\n * // do some more stuff but error ...\r\n * callback(new Error('bad stuff happened'));\r\n * },\r\n * function(callback) {\r\n * setTimeout(function() {\r\n * callback(null, 'two');\r\n * }, 100);\r\n * }\r\n * ];\r\n *\r\n * async.parallel(async.reflectAll(tasks),\r\n * // optional callback\r\n * function(err, results) {\r\n * // values\r\n * // results[0].value = 'one'\r\n * // results[1].error = Error('bad stuff happened')\r\n * // results[2].value = 'two'\r\n * });\r\n *\r\n * // an example using an object instead of an array\r\n * let tasks = {\r\n * one: function(callback) {\r\n * setTimeout(function() {\r\n * callback(null, 'one');\r\n * }, 200);\r\n * },\r\n * two: function(callback) {\r\n * callback('two');\r\n * },\r\n * three: function(callback) {\r\n * setTimeout(function() {\r\n * callback(null, 'three');\r\n * }, 100);\r\n * }\r\n * };\r\n *\r\n * async.parallel(async.reflectAll(tasks),\r\n * // optional callback\r\n * function(err, results) {\r\n * // values\r\n * // results.one.value = 'one'\r\n * // results.two.error = 'two'\r\n * // results.three.value = 'three'\r\n * });\r\n */\r\n function reflectAll(tasks) {\r\n var results;\r\n if (isArray(tasks)) {\r\n results = arrayMap(tasks, reflect);\r\n } else {\r\n results = {};\r\n baseForOwn(tasks, function (task, key) {\r\n results[key] = reflect.call(this, task);\r\n });\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * The same as [`reject`]{@link module:Collections.reject} but runs a maximum of `limit` async operations at a\r\n * time.\r\n *\r\n * @name rejectLimit\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.reject]{@link module:Collections.reject}\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {number} limit - The maximum number of async operations at a time.\r\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\r\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\r\n * with a boolean argument once it has completed. Invoked with (item, callback).\r\n * @param {Function} [callback] - A callback which is called after all the\r\n * `iteratee` functions have finished. Invoked with (err, results).\r\n */\r\n var rejectLimit = doParallelLimit(reject$1);\r\n\r\n /**\r\n * The same as [`reject`]{@link module:Collections.reject} but runs only a single async operation at a time.\r\n *\r\n * @name rejectSeries\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.reject]{@link module:Collections.reject}\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {Function} iteratee - A truth test to apply to each item in `coll`.\r\n * The `iteratee` is passed a `callback(err, truthValue)`, which must be called\r\n * with a boolean argument once it has completed. Invoked with (item, callback).\r\n * @param {Function} [callback] - A callback which is called after all the\r\n * `iteratee` functions have finished. Invoked with (err, results).\r\n */\r\n var rejectSeries = doLimit(rejectLimit, 1);\r\n\r\n /**\r\n * Creates a function that returns `value`.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @since 2.4.0\r\n * @category Util\r\n * @param {*} value The value to return from the new function.\r\n * @returns {Function} Returns the new constant function.\r\n * @example\r\n *\r\n * var objects = _.times(2, _.constant({ 'a': 1 }));\r\n *\r\n * console.log(objects);\r\n * // => [{ 'a': 1 }, { 'a': 1 }]\r\n *\r\n * console.log(objects[0] === objects[1]);\r\n * // => true\r\n */\r\n function constant$1(value) {\r\n return function() {\r\n return value;\r\n };\r\n }\r\n\r\n /**\r\n * Attempts to get a successful response from `task` no more than `times` times\r\n * before returning an error. If the task is successful, the `callback` will be\r\n * passed the result of the successful task. If all attempts fail, the callback\r\n * will be passed the error and result (if any) of the final attempt.\r\n *\r\n * @name retry\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @category Control Flow\r\n * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - Can be either an\r\n * object with `times` and `interval` or a number.\r\n * * `times` - The number of attempts to make before giving up. The default\r\n * is `5`.\r\n * * `interval` - The time to wait between retries, in milliseconds. The\r\n * default is `0`. The interval may also be specified as a function of the\r\n * retry count (see example).\r\n * * `errorFilter` - An optional synchronous function that is invoked on\r\n * erroneous result. If it returns `true` the retry attempts will continue;\r\n * if the function returns `false` the retry flow is aborted with the current\r\n * attempt's error and result being returned to the final callback.\r\n * Invoked with (err).\r\n * * If `opts` is a number, the number specifies the number of times to retry,\r\n * with the default interval of `0`.\r\n * @param {Function} task - A function which receives two arguments: (1) a\r\n * `callback(err, result)` which must be called when finished, passing `err`\r\n * (which can be `null`) and the `result` of the function's execution, and (2)\r\n * a `results` object, containing the results of the previously executed\r\n * functions (if nested inside another control flow). Invoked with\r\n * (callback, results).\r\n * @param {Function} [callback] - An optional callback which is called when the\r\n * task has succeeded, or after the final failed attempt. It receives the `err`\r\n * and `result` arguments of the last attempt at completing the `task`. Invoked\r\n * with (err, results).\r\n * @example\r\n *\r\n * // The `retry` function can be used as a stand-alone control flow by passing\r\n * // a callback, as shown below:\r\n *\r\n * // try calling apiMethod 3 times\r\n * async.retry(3, apiMethod, function(err, result) {\r\n * // do something with the result\r\n * });\r\n *\r\n * // try calling apiMethod 3 times, waiting 200 ms between each retry\r\n * async.retry({times: 3, interval: 200}, apiMethod, function(err, result) {\r\n * // do something with the result\r\n * });\r\n *\r\n * // try calling apiMethod 10 times with exponential backoff\r\n * // (i.e. intervals of 100, 200, 400, 800, 1600, ... milliseconds)\r\n * async.retry({\r\n * times: 10,\r\n * interval: function(retryCount) {\r\n * return 50 * Math.pow(2, retryCount);\r\n * }\r\n * }, apiMethod, function(err, result) {\r\n * // do something with the result\r\n * });\r\n *\r\n * // try calling apiMethod the default 5 times no delay between each retry\r\n * async.retry(apiMethod, function(err, result) {\r\n * // do something with the result\r\n * });\r\n *\r\n * // try calling apiMethod only when error condition satisfies, all other\r\n * // errors will abort the retry control flow and return to final callback\r\n * async.retry({\r\n * errorFilter: function(err) {\r\n * return err.message === 'Temporary error'; // only retry on a specific error\r\n * }\r\n * }, apiMethod, function(err, result) {\r\n * // do something with the result\r\n * });\r\n *\r\n * // It can also be embedded within other control flow functions to retry\r\n * // individual methods that are not as reliable, like this:\r\n * async.auto({\r\n * users: api.getUsers.bind(api),\r\n * payments: async.retry(3, api.getPayments.bind(api))\r\n * }, function(err, results) {\r\n * // do something with the results\r\n * });\r\n *\r\n */\r\n function retry(opts, task, callback) {\r\n var DEFAULT_TIMES = 5;\r\n var DEFAULT_INTERVAL = 0;\r\n\r\n var options = {\r\n times: DEFAULT_TIMES,\r\n intervalFunc: constant$1(DEFAULT_INTERVAL)\r\n };\r\n\r\n function parseTimes(acc, t) {\r\n if (typeof t === 'object') {\r\n acc.times = +t.times || DEFAULT_TIMES;\r\n\r\n acc.intervalFunc = typeof t.interval === 'function' ? t.interval : constant$1(+t.interval || DEFAULT_INTERVAL);\r\n\r\n acc.errorFilter = t.errorFilter;\r\n } else if (typeof t === 'number' || typeof t === 'string') {\r\n acc.times = +t || DEFAULT_TIMES;\r\n } else {\r\n throw new Error(\"Invalid arguments for async.retry\");\r\n }\r\n }\r\n\r\n if (arguments.length < 3 && typeof opts === 'function') {\r\n callback = task || noop;\r\n task = opts;\r\n } else {\r\n parseTimes(options, opts);\r\n callback = callback || noop;\r\n }\r\n\r\n if (typeof task !== 'function') {\r\n throw new Error(\"Invalid arguments for async.retry\");\r\n }\r\n\r\n var attempt = 1;\r\n function retryAttempt() {\r\n task(function (err) {\r\n if (err && attempt++ < options.times && (typeof options.errorFilter != 'function' || options.errorFilter(err))) {\r\n setTimeout(retryAttempt, options.intervalFunc(attempt));\r\n } else {\r\n callback.apply(null, arguments);\r\n }\r\n });\r\n }\r\n\r\n retryAttempt();\r\n }\r\n\r\n /**\r\n * A close relative of [`retry`]{@link module:ControlFlow.retry}. This method wraps a task and makes it\r\n * retryable, rather than immediately calling it with retries.\r\n *\r\n * @name retryable\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @see [async.retry]{@link module:ControlFlow.retry}\r\n * @category Control Flow\r\n * @param {Object|number} [opts = {times: 5, interval: 0}| 5] - optional\r\n * options, exactly the same as from `retry`\r\n * @param {Function} task - the asynchronous function to wrap\r\n * @returns {Functions} The wrapped function, which when invoked, will retry on\r\n * an error, based on the parameters specified in `opts`.\r\n * @example\r\n *\r\n * async.auto({\r\n * dep1: async.retryable(3, getFromFlakyService),\r\n * process: [\"dep1\", async.retryable(3, function (results, cb) {\r\n * maybeProcessData(results.dep1, cb);\r\n * })]\r\n * }, callback);\r\n */\r\n var retryable = function (opts, task) {\r\n if (!task) {\r\n task = opts;\r\n opts = null;\r\n }\r\n return initialParams(function (args, callback) {\r\n function taskFn(cb) {\r\n task.apply(null, args.concat(cb));\r\n }\r\n\r\n if (opts) retry(opts, taskFn, callback);else retry(taskFn, callback);\r\n });\r\n };\r\n\r\n /**\r\n * Run the functions in the `tasks` collection in series, each one running once\r\n * the previous function has completed. If any functions in the series pass an\r\n * error to its callback, no more functions are run, and `callback` is\r\n * immediately called with the value of the error. Otherwise, `callback`\r\n * receives an array of results when `tasks` have completed.\r\n *\r\n * It is also possible to use an object instead of an array. Each property will\r\n * be run as a function, and the results will be passed to the final `callback`\r\n * as an object instead of an array. This can be a more readable way of handling\r\n * results from {@link async.series}.\r\n *\r\n * **Note** that while many implementations preserve the order of object\r\n * properties, the [ECMAScript Language Specification](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6)\r\n * explicitly states that\r\n *\r\n * > The mechanics and order of enumerating the properties is not specified.\r\n *\r\n * So if you rely on the order in which your series of functions are executed,\r\n * and want this to work on all platforms, consider using an array.\r\n *\r\n * @name series\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @category Control Flow\r\n * @param {Array|Iterable|Object} tasks - A collection containing functions to run, each\r\n * function is passed a `callback(err, result)` it must call on completion with\r\n * an error `err` (which can be `null`) and an optional `result` value.\r\n * @param {Function} [callback] - An optional callback to run once all the\r\n * functions have completed. This function gets a results array (or object)\r\n * containing all the result arguments passed to the `task` callbacks. Invoked\r\n * with (err, result).\r\n * @example\r\n * async.series([\r\n * function(callback) {\r\n * // do some stuff ...\r\n * callback(null, 'one');\r\n * },\r\n * function(callback) {\r\n * // do some more stuff ...\r\n * callback(null, 'two');\r\n * }\r\n * ],\r\n * // optional callback\r\n * function(err, results) {\r\n * // results is now equal to ['one', 'two']\r\n * });\r\n *\r\n * async.series({\r\n * one: function(callback) {\r\n * setTimeout(function() {\r\n * callback(null, 1);\r\n * }, 200);\r\n * },\r\n * two: function(callback){\r\n * setTimeout(function() {\r\n * callback(null, 2);\r\n * }, 100);\r\n * }\r\n * }, function(err, results) {\r\n * // results is now equal to: {one: 1, two: 2}\r\n * });\r\n */\r\n function series(tasks, callback) {\r\n _parallel(eachOfSeries, tasks, callback);\r\n }\r\n\r\n /**\r\n * Returns `true` if at least one element in the `coll` satisfies an async test.\r\n * If any iteratee call returns `true`, the main `callback` is immediately\r\n * called.\r\n *\r\n * @name some\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @alias any\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {Function} iteratee - A truth test to apply to each item in the array\r\n * in parallel. The iteratee is passed a `callback(err, truthValue)` which must\r\n * be called with a boolean argument once it has completed. Invoked with\r\n * (item, callback).\r\n * @param {Function} [callback] - A callback which is called as soon as any\r\n * iteratee returns `true`, or after all the iteratee functions have finished.\r\n * Result will be either `true` or `false` depending on the values of the async\r\n * tests. Invoked with (err, result).\r\n * @example\r\n *\r\n * async.some(['file1','file2','file3'], function(filePath, callback) {\r\n * fs.access(filePath, function(err) {\r\n * callback(null, !err)\r\n * });\r\n * }, function(err, result) {\r\n * // if result is true then at least one of the files exists\r\n * });\r\n */\r\n var some = _createTester(eachOf, Boolean, identity);\r\n\r\n /**\r\n * The same as [`some`]{@link module:Collections.some} but runs a maximum of `limit` async operations at a time.\r\n *\r\n * @name someLimit\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.some]{@link module:Collections.some}\r\n * @alias anyLimit\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {number} limit - The maximum number of async operations at a time.\r\n * @param {Function} iteratee - A truth test to apply to each item in the array\r\n * in parallel. The iteratee is passed a `callback(err, truthValue)` which must\r\n * be called with a boolean argument once it has completed. Invoked with\r\n * (item, callback).\r\n * @param {Function} [callback] - A callback which is called as soon as any\r\n * iteratee returns `true`, or after all the iteratee functions have finished.\r\n * Result will be either `true` or `false` depending on the values of the async\r\n * tests. Invoked with (err, result).\r\n */\r\n var someLimit = _createTester(eachOfLimit, Boolean, identity);\r\n\r\n /**\r\n * The same as [`some`]{@link module:Collections.some} but runs only a single async operation at a time.\r\n *\r\n * @name someSeries\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @see [async.some]{@link module:Collections.some}\r\n * @alias anySeries\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {Function} iteratee - A truth test to apply to each item in the array\r\n * in parallel. The iteratee is passed a `callback(err, truthValue)` which must\r\n * be called with a boolean argument once it has completed. Invoked with\r\n * (item, callback).\r\n * @param {Function} [callback] - A callback which is called as soon as any\r\n * iteratee returns `true`, or after all the iteratee functions have finished.\r\n * Result will be either `true` or `false` depending on the values of the async\r\n * tests. Invoked with (err, result).\r\n */\r\n var someSeries = doLimit(someLimit, 1);\r\n\r\n /**\r\n * Sorts a list by the results of running each `coll` value through an async\r\n * `iteratee`.\r\n *\r\n * @name sortBy\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {Function} iteratee - A function to apply to each item in `coll`.\r\n * The iteratee is passed a `callback(err, sortValue)` which must be called once\r\n * it has completed with an error (which can be `null`) and a value to use as\r\n * the sort criteria. Invoked with (item, callback).\r\n * @param {Function} callback - A callback which is called after all the\r\n * `iteratee` functions have finished, or an error occurs. Results is the items\r\n * from the original `coll` sorted by the values returned by the `iteratee`\r\n * calls. Invoked with (err, results).\r\n * @example\r\n *\r\n * async.sortBy(['file1','file2','file3'], function(file, callback) {\r\n * fs.stat(file, function(err, stats) {\r\n * callback(err, stats.mtime);\r\n * });\r\n * }, function(err, results) {\r\n * // results is now the original array of files sorted by\r\n * // modified date\r\n * });\r\n *\r\n * // By modifying the callback parameter the\r\n * // sorting order can be influenced:\r\n *\r\n * // ascending order\r\n * async.sortBy([1,9,3,5], function(x, callback) {\r\n * callback(null, x);\r\n * }, function(err,result) {\r\n * // result callback\r\n * });\r\n *\r\n * // descending order\r\n * async.sortBy([1,9,3,5], function(x, callback) {\r\n * callback(null, x*-1); //<- x*-1 instead of x, turns the order around\r\n * }, function(err,result) {\r\n * // result callback\r\n * });\r\n */\r\n function sortBy(coll, iteratee, callback) {\r\n map(coll, function (x, callback) {\r\n iteratee(x, function (err, criteria) {\r\n if (err) return callback(err);\r\n callback(null, { value: x, criteria: criteria });\r\n });\r\n }, function (err, results) {\r\n if (err) return callback(err);\r\n callback(null, arrayMap(results.sort(comparator), baseProperty('value')));\r\n });\r\n\r\n function comparator(left, right) {\r\n var a = left.criteria,\r\n b = right.criteria;\r\n return a < b ? -1 : a > b ? 1 : 0;\r\n }\r\n }\r\n\r\n /**\r\n * Sets a time limit on an asynchronous function. If the function does not call\r\n * its callback within the specified milliseconds, it will be called with a\r\n * timeout error. The code property for the error object will be `'ETIMEDOUT'`.\r\n *\r\n * @name timeout\r\n * @static\r\n * @memberOf module:Utils\r\n * @method\r\n * @category Util\r\n * @param {Function} asyncFn - The asynchronous function you want to set the\r\n * time limit.\r\n * @param {number} milliseconds - The specified time limit.\r\n * @param {*} [info] - Any variable you want attached (`string`, `object`, etc)\r\n * to timeout Error for more information..\r\n * @returns {Function} Returns a wrapped function that can be used with any of\r\n * the control flow functions. Invoke this function with the same\r\n * parameters as you would `asyncFunc`.\r\n * @example\r\n *\r\n * function myFunction(foo, callback) {\r\n * doAsyncTask(foo, function(err, data) {\r\n * // handle errors\r\n * if (err) return callback(err);\r\n *\r\n * // do some stuff ...\r\n *\r\n * // return processed data\r\n * return callback(null, data);\r\n * });\r\n * }\r\n *\r\n * var wrapped = async.timeout(myFunction, 1000);\r\n *\r\n * // call `wrapped` as you would `myFunction`\r\n * wrapped({ bar: 'bar' }, function(err, data) {\r\n * // if `myFunction` takes < 1000 ms to execute, `err`\r\n * // and `data` will have their expected values\r\n *\r\n * // else `err` will be an Error with the code 'ETIMEDOUT'\r\n * });\r\n */\r\n function timeout(asyncFn, milliseconds, info) {\r\n var originalCallback, timer;\r\n var timedOut = false;\r\n\r\n function injectedCallback() {\r\n if (!timedOut) {\r\n originalCallback.apply(null, arguments);\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n function timeoutCallback() {\r\n var name = asyncFn.name || 'anonymous';\r\n var error = new Error('Callback function \"' + name + '\" timed out.');\r\n error.code = 'ETIMEDOUT';\r\n if (info) {\r\n error.info = info;\r\n }\r\n timedOut = true;\r\n originalCallback(error);\r\n }\r\n\r\n return initialParams(function (args, origCallback) {\r\n originalCallback = origCallback;\r\n // setup timer and call original function\r\n timer = setTimeout(timeoutCallback, milliseconds);\r\n asyncFn.apply(null, args.concat(injectedCallback));\r\n });\r\n }\r\n\r\n /* Built-in method references for those with the same name as other `lodash` methods. */\r\n var nativeCeil = Math.ceil;\r\n var nativeMax$1 = Math.max;\r\n\r\n /**\r\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\r\n * coerce arguments.\r\n *\r\n * @private\r\n * @param {number} start The start of the range.\r\n * @param {number} end The end of the range.\r\n * @param {number} step The value to increment or decrement by.\r\n * @param {boolean} [fromRight] Specify iterating from right to left.\r\n * @returns {Array} Returns the range of numbers.\r\n */\r\n function baseRange(start, end, step, fromRight) {\r\n var index = -1,\r\n length = nativeMax$1(nativeCeil((end - start) / (step || 1)), 0),\r\n result = Array(length);\r\n\r\n while (length--) {\r\n result[fromRight ? length : ++index] = start;\r\n start += step;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * The same as [times]{@link module:ControlFlow.times} but runs a maximum of `limit` async operations at a\r\n * time.\r\n *\r\n * @name timesLimit\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @see [async.times]{@link module:ControlFlow.times}\r\n * @category Control Flow\r\n * @param {number} count - The number of times to run the function.\r\n * @param {number} limit - The maximum number of async operations at a time.\r\n * @param {Function} iteratee - The function to call `n` times. Invoked with the\r\n * iteration index and a callback (n, next).\r\n * @param {Function} callback - see [async.map]{@link module:Collections.map}.\r\n */\r\n function timeLimit(count, limit, iteratee, callback) {\r\n mapLimit(baseRange(0, count, 1), limit, iteratee, callback);\r\n }\r\n\r\n /**\r\n * Calls the `iteratee` function `n` times, and accumulates results in the same\r\n * manner you would use with [map]{@link module:Collections.map}.\r\n *\r\n * @name times\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @see [async.map]{@link module:Collections.map}\r\n * @category Control Flow\r\n * @param {number} n - The number of times to run the function.\r\n * @param {Function} iteratee - The function to call `n` times. Invoked with the\r\n * iteration index and a callback (n, next).\r\n * @param {Function} callback - see {@link module:Collections.map}.\r\n * @example\r\n *\r\n * // Pretend this is some complicated async factory\r\n * var createUser = function(id, callback) {\r\n * callback(null, {\r\n * id: 'user' + id\r\n * });\r\n * };\r\n *\r\n * // generate 5 users\r\n * async.times(5, function(n, next) {\r\n * createUser(n, function(err, user) {\r\n * next(err, user);\r\n * });\r\n * }, function(err, users) {\r\n * // we should now have 5 users\r\n * });\r\n */\r\n var times = doLimit(timeLimit, Infinity);\r\n\r\n /**\r\n * The same as [times]{@link module:ControlFlow.times} but runs only a single async operation at a time.\r\n *\r\n * @name timesSeries\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @see [async.times]{@link module:ControlFlow.times}\r\n * @category Control Flow\r\n * @param {number} n - The number of times to run the function.\r\n * @param {Function} iteratee - The function to call `n` times. Invoked with the\r\n * iteration index and a callback (n, next).\r\n * @param {Function} callback - see {@link module:Collections.map}.\r\n */\r\n var timesSeries = doLimit(timeLimit, 1);\r\n\r\n /**\r\n * A relative of `reduce`. Takes an Object or Array, and iterates over each\r\n * element in series, each step potentially mutating an `accumulator` value.\r\n * The type of the accumulator defaults to the type of collection passed in.\r\n *\r\n * @name transform\r\n * @static\r\n * @memberOf module:Collections\r\n * @method\r\n * @category Collection\r\n * @param {Array|Iterable|Object} coll - A collection to iterate over.\r\n * @param {*} [accumulator] - The initial state of the transform. If omitted,\r\n * it will default to an empty Object or Array, depending on the type of `coll`\r\n * @param {Function} iteratee - A function applied to each item in the\r\n * collection that potentially modifies the accumulator. The `iteratee` is\r\n * passed a `callback(err)` which accepts an optional error as its first\r\n * argument. If an error is passed to the callback, the transform is stopped\r\n * and the main `callback` is immediately called with the error.\r\n * Invoked with (accumulator, item, key, callback).\r\n * @param {Function} [callback] - A callback which is called after all the\r\n * `iteratee` functions have finished. Result is the transformed accumulator.\r\n * Invoked with (err, result).\r\n * @example\r\n *\r\n * async.transform([1,2,3], function(acc, item, index, callback) {\r\n * // pointless async:\r\n * process.nextTick(function() {\r\n * acc.push(item * 2)\r\n * callback(null)\r\n * });\r\n * }, function(err, result) {\r\n * // result is now equal to [2, 4, 6]\r\n * });\r\n *\r\n * @example\r\n *\r\n * async.transform({a: 1, b: 2, c: 3}, function (obj, val, key, callback) {\r\n * setImmediate(function () {\r\n * obj[key] = val * 2;\r\n * callback();\r\n * })\r\n * }, function (err, result) {\r\n * // result is equal to {a: 2, b: 4, c: 6}\r\n * })\r\n */\r\n function transform(coll, accumulator, iteratee, callback) {\r\n if (arguments.length === 3) {\r\n callback = iteratee;\r\n iteratee = accumulator;\r\n accumulator = isArray(coll) ? [] : {};\r\n }\r\n callback = once(callback || noop);\r\n\r\n eachOf(coll, function (v, k, cb) {\r\n iteratee(accumulator, v, k, cb);\r\n }, function (err) {\r\n callback(err, accumulator);\r\n });\r\n }\r\n\r\n /**\r\n * Undoes a [memoize]{@link module:Utils.memoize}d function, reverting it to the original,\r\n * unmemoized form. Handy for testing.\r\n *\r\n * @name unmemoize\r\n * @static\r\n * @memberOf module:Utils\r\n * @method\r\n * @see [async.memoize]{@link module:Utils.memoize}\r\n * @category Util\r\n * @param {Function} fn - the memoized function\r\n * @returns {Function} a function that calls the original unmemoized function\r\n */\r\n function unmemoize(fn) {\r\n return function () {\r\n return (fn.unmemoized || fn).apply(null, arguments);\r\n };\r\n }\r\n\r\n /**\r\n * Repeatedly call `iteratee`, while `test` returns `true`. Calls `callback` when\r\n * stopped, or an error occurs.\r\n *\r\n * @name whilst\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @category Control Flow\r\n * @param {Function} test - synchronous truth test to perform before each\r\n * execution of `iteratee`. Invoked with ().\r\n * @param {Function} iteratee - A function which is called each time `test` passes.\r\n * The function is passed a `callback(err)`, which must be called once it has\r\n * completed with an optional `err` argument. Invoked with (callback).\r\n * @param {Function} [callback] - A callback which is called after the test\r\n * function has failed and repeated execution of `iteratee` has stopped. `callback`\r\n * will be passed an error and any arguments passed to the final `iteratee`'s\r\n * callback. Invoked with (err, [results]);\r\n * @returns undefined\r\n * @example\r\n *\r\n * var count = 0;\r\n * async.whilst(\r\n * function() { return count < 5; },\r\n * function(callback) {\r\n * count++;\r\n * setTimeout(function() {\r\n * callback(null, count);\r\n * }, 1000);\r\n * },\r\n * function (err, n) {\r\n * // 5 seconds have passed, n = 5\r\n * }\r\n * );\r\n */\r\n function whilst(test, iteratee, callback) {\r\n callback = onlyOnce(callback || noop);\r\n if (!test()) return callback(null);\r\n var next = rest(function (err, args) {\r\n if (err) return callback(err);\r\n if (test()) return iteratee(next);\r\n callback.apply(null, [null].concat(args));\r\n });\r\n iteratee(next);\r\n }\r\n\r\n /**\r\n * Repeatedly call `fn` until `test` returns `true`. Calls `callback` when\r\n * stopped, or an error occurs. `callback` will be passed an error and any\r\n * arguments passed to the final `fn`'s callback.\r\n *\r\n * The inverse of [whilst]{@link module:ControlFlow.whilst}.\r\n *\r\n * @name until\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @see [async.whilst]{@link module:ControlFlow.whilst}\r\n * @category Control Flow\r\n * @param {Function} test - synchronous truth test to perform before each\r\n * execution of `fn`. Invoked with ().\r\n * @param {Function} fn - A function which is called each time `test` fails.\r\n * The function is passed a `callback(err)`, which must be called once it has\r\n * completed with an optional `err` argument. Invoked with (callback).\r\n * @param {Function} [callback] - A callback which is called after the test\r\n * function has passed and repeated execution of `fn` has stopped. `callback`\r\n * will be passed an error and any arguments passed to the final `fn`'s\r\n * callback. Invoked with (err, [results]);\r\n */\r\n function until(test, fn, callback) {\r\n whilst(function () {\r\n return !test.apply(this, arguments);\r\n }, fn, callback);\r\n }\r\n\r\n /**\r\n * Runs the `tasks` array of functions in series, each passing their results to\r\n * the next in the array. However, if any of the `tasks` pass an error to their\r\n * own callback, the next function is not executed, and the main `callback` is\r\n * immediately called with the error.\r\n *\r\n * @name waterfall\r\n * @static\r\n * @memberOf module:ControlFlow\r\n * @method\r\n * @category Control Flow\r\n * @param {Array} tasks - An array of functions to run, each function is passed\r\n * a `callback(err, result1, result2, ...)` it must call on completion. The\r\n * first argument is an error (which can be `null`) and any further arguments\r\n * will be passed as arguments in order to the next task.\r\n * @param {Function} [callback] - An optional callback to run once all the\r\n * functions have completed. This will be passed the results of the last task's\r\n * callback. Invoked with (err, [results]).\r\n * @returns undefined\r\n * @example\r\n *\r\n * async.waterfall([\r\n * function(callback) {\r\n * callback(null, 'one', 'two');\r\n * },\r\n * function(arg1, arg2, callback) {\r\n * // arg1 now equals 'one' and arg2 now equals 'two'\r\n * callback(null, 'three');\r\n * },\r\n * function(arg1, callback) {\r\n * // arg1 now equals 'three'\r\n * callback(null, 'done');\r\n * }\r\n * ], function (err, result) {\r\n * // result now equals 'done'\r\n * });\r\n *\r\n * // Or, with named functions:\r\n * async.waterfall([\r\n * myFirstFunction,\r\n * mySecondFunction,\r\n * myLastFunction,\r\n * ], function (err, result) {\r\n * // result now equals 'done'\r\n * });\r\n * function myFirstFunction(callback) {\r\n * callback(null, 'one', 'two');\r\n * }\r\n * function mySecondFunction(arg1, arg2, callback) {\r\n * // arg1 now equals 'one' and arg2 now equals 'two'\r\n * callback(null, 'three');\r\n * }\r\n * function myLastFunction(arg1, callback) {\r\n * // arg1 now equals 'three'\r\n * callback(null, 'done');\r\n * }\r\n */\r\n var waterfall = function (tasks, callback) {\r\n callback = once(callback || noop);\r\n if (!isArray(tasks)) return callback(new Error('First argument to waterfall must be an array of functions'));\r\n if (!tasks.length) return callback();\r\n var taskIndex = 0;\r\n\r\n function nextTask(args) {\r\n if (taskIndex === tasks.length) {\r\n return callback.apply(null, [null].concat(args));\r\n }\r\n\r\n var taskCallback = onlyOnce(rest(function (err, args) {\r\n if (err) {\r\n return callback.apply(null, [err].concat(args));\r\n }\r\n nextTask(args);\r\n }));\r\n\r\n args.push(taskCallback);\r\n\r\n var task = tasks[taskIndex++];\r\n task.apply(null, args);\r\n }\r\n\r\n nextTask([]);\r\n };\r\n\r\n /**\r\n * Async is a utility module which provides straight-forward, powerful functions\r\n * for working with asynchronous JavaScript. Although originally designed for\r\n * use with [Node.js](http://nodejs.org) and installable via\r\n * `npm install --save async`, it can also be used directly in the browser.\r\n * @module async\r\n */\r\n\r\n /**\r\n * A collection of `async` functions for manipulating collections, such as\r\n * arrays and objects.\r\n * @module Collections\r\n */\r\n\r\n /**\r\n * A collection of `async` functions for controlling the flow through a script.\r\n * @module ControlFlow\r\n */\r\n\r\n /**\r\n * A collection of `async` utility functions.\r\n * @module Utils\r\n */\r\n var index = {\r\n applyEach: applyEach,\r\n applyEachSeries: applyEachSeries,\r\n apply: apply$2,\r\n asyncify: asyncify,\r\n auto: auto,\r\n autoInject: autoInject,\r\n cargo: cargo,\r\n compose: compose,\r\n concat: concat,\r\n concatSeries: concatSeries,\r\n constant: constant,\r\n detect: detect,\r\n detectLimit: detectLimit,\r\n detectSeries: detectSeries,\r\n dir: dir,\r\n doDuring: doDuring,\r\n doUntil: doUntil,\r\n doWhilst: doWhilst,\r\n during: during,\r\n each: eachLimit,\r\n eachLimit: eachLimit$1,\r\n eachOf: eachOf,\r\n eachOfLimit: eachOfLimit,\r\n eachOfSeries: eachOfSeries,\r\n eachSeries: eachSeries,\r\n ensureAsync: ensureAsync,\r\n every: every,\r\n everyLimit: everyLimit,\r\n everySeries: everySeries,\r\n filter: filter,\r\n filterLimit: filterLimit,\r\n filterSeries: filterSeries,\r\n forever: forever,\r\n log: log,\r\n map: map,\r\n mapLimit: mapLimit,\r\n mapSeries: mapSeries,\r\n mapValues: mapValues,\r\n mapValuesLimit: mapValuesLimit,\r\n mapValuesSeries: mapValuesSeries,\r\n memoize: memoize,\r\n nextTick: nextTick,\r\n parallel: parallelLimit,\r\n parallelLimit: parallelLimit$1,\r\n priorityQueue: priorityQueue,\r\n queue: queue$1,\r\n race: race,\r\n reduce: reduce,\r\n reduceRight: reduceRight,\r\n reflect: reflect,\r\n reflectAll: reflectAll,\r\n reject: reject,\r\n rejectLimit: rejectLimit,\r\n rejectSeries: rejectSeries,\r\n retry: retry,\r\n retryable: retryable,\r\n seq: seq$1,\r\n series: series,\r\n setImmediate: setImmediate$1,\r\n some: some,\r\n someLimit: someLimit,\r\n someSeries: someSeries,\r\n sortBy: sortBy,\r\n timeout: timeout,\r\n times: times,\r\n timesLimit: timeLimit,\r\n timesSeries: timesSeries,\r\n transform: transform,\r\n unmemoize: unmemoize,\r\n until: until,\r\n waterfall: waterfall,\r\n whilst: whilst,\r\n\r\n // aliases\r\n all: every,\r\n any: some,\r\n forEach: eachLimit,\r\n forEachSeries: eachSeries,\r\n forEachLimit: eachLimit$1,\r\n forEachOf: eachOf,\r\n forEachOfSeries: eachOfSeries,\r\n forEachOfLimit: eachOfLimit,\r\n inject: reduce,\r\n foldl: reduce,\r\n foldr: reduceRight,\r\n select: filter,\r\n selectLimit: filterLimit,\r\n selectSeries: filterSeries,\r\n wrapSync: asyncify\r\n };\r\n\r\n exports['default'] = index;\r\n exports.applyEach = applyEach;\r\n exports.applyEachSeries = applyEachSeries;\r\n exports.apply = apply$2;\r\n exports.asyncify = asyncify;\r\n exports.auto = auto;\r\n exports.autoInject = autoInject;\r\n exports.cargo = cargo;\r\n exports.compose = compose;\r\n exports.concat = concat;\r\n exports.concatSeries = concatSeries;\r\n exports.constant = constant;\r\n exports.detect = detect;\r\n exports.detectLimit = detectLimit;\r\n exports.detectSeries = detectSeries;\r\n exports.dir = dir;\r\n exports.doDuring = doDuring;\r\n exports.doUntil = doUntil;\r\n exports.doWhilst = doWhilst;\r\n exports.during = during;\r\n exports.each = eachLimit;\r\n exports.eachLimit = eachLimit$1;\r\n exports.eachOf = eachOf;\r\n exports.eachOfLimit = eachOfLimit;\r\n exports.eachOfSeries = eachOfSeries;\r\n exports.eachSeries = eachSeries;\r\n exports.ensureAsync = ensureAsync;\r\n exports.every = every;\r\n exports.everyLimit = everyLimit;\r\n exports.everySeries = everySeries;\r\n exports.filter = filter;\r\n exports.filterLimit = filterLimit;\r\n exports.filterSeries = filterSeries;\r\n exports.forever = forever;\r\n exports.log = log;\r\n exports.map = map;\r\n exports.mapLimit = mapLimit;\r\n exports.mapSeries = mapSeries;\r\n exports.mapValues = mapValues;\r\n exports.mapValuesLimit = mapValuesLimit;\r\n exports.mapValuesSeries = mapValuesSeries;\r\n exports.memoize = memoize;\r\n exports.nextTick = nextTick;\r\n exports.parallel = parallelLimit;\r\n exports.parallelLimit = parallelLimit$1;\r\n exports.priorityQueue = priorityQueue;\r\n exports.queue = queue$1;\r\n exports.race = race;\r\n exports.reduce = reduce;\r\n exports.reduceRight = reduceRight;\r\n exports.reflect = reflect;\r\n exports.reflectAll = reflectAll;\r\n exports.reject = reject;\r\n exports.rejectLimit = rejectLimit;\r\n exports.rejectSeries = rejectSeries;\r\n exports.retry = retry;\r\n exports.retryable = retryable;\r\n exports.seq = seq$1;\r\n exports.series = series;\r\n exports.setImmediate = setImmediate$1;\r\n exports.some = some;\r\n exports.someLimit = someLimit;\r\n exports.someSeries = someSeries;\r\n exports.sortBy = sortBy;\r\n exports.timeout = timeout;\r\n exports.times = times;\r\n exports.timesLimit = timeLimit;\r\n exports.timesSeries = timesSeries;\r\n exports.transform = transform;\r\n exports.unmemoize = unmemoize;\r\n exports.until = until;\r\n exports.waterfall = waterfall;\r\n exports.whilst = whilst;\r\n exports.all = every;\r\n exports.allLimit = everyLimit;\r\n exports.allSeries = everySeries;\r\n exports.any = some;\r\n exports.anyLimit = someLimit;\r\n exports.anySeries = someSeries;\r\n exports.find = detect;\r\n exports.findLimit = detectLimit;\r\n exports.findSeries = detectSeries;\r\n exports.forEach = eachLimit;\r\n exports.forEachSeries = eachSeries;\r\n exports.forEachLimit = eachLimit$1;\r\n exports.forEachOf = eachOf;\r\n exports.forEachOfSeries = eachOfSeries;\r\n exports.forEachOfLimit = eachOfLimit;\r\n exports.inject = reduce;\r\n exports.foldl = reduce;\r\n exports.foldr = reduceRight;\r\n exports.select = filter;\r\n exports.selectLimit = filterLimit;\r\n exports.selectSeries = filterSeries;\r\n exports.wrapSync = asyncify;\r\n\r\n Object.defineProperty(exports, '__esModule', { value: true });\r\n\r\n})));\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\"), __webpack_require__(/*! ./../../../../../node_modules/webpack/buildin/module.js */ \"./node_modules/webpack/buildin/module.js\")(module), __webpack_require__(/*! async */ \"./src/public/js/vendor/async/async.js\"), __webpack_require__(/*! ./../../../../../node_modules/process/browser.js */ \"./node_modules/process/browser.js\")))\n\n//# sourceURL=webpack:///./src/public/js/vendor/async/async.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/chosen/chosen.jquery.min.js": -/*!**********************************************************!*\ - !*** ./src/public/js/vendor/chosen/chosen.jquery.min.js ***! - \**********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function(jQuery) {/* Chosen v1.3.0 | (c) 2011-2014 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */\r\n!function(){var a,AbstractChosen,Chosen,SelectParser,b,c={}.hasOwnProperty,d=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a};SelectParser=function(){function SelectParser(){this.options_index=0,this.parsed=[]}return SelectParser.prototype.add_node=function(a){return\"OPTGROUP\"===a.nodeName.toUpperCase()?this.add_group(a):this.add_option(a)},SelectParser.prototype.add_group=function(a){var b,c,d,e,f,g;for(b=this.parsed.length,this.parsed.push({array_index:b,group:!0,label:this.escapeExpression(a.label),children:0,disabled:a.disabled,classes:a.className}),f=a.childNodes,g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(this.add_option(c,b,a.disabled));return g},SelectParser.prototype.add_option=function(a,b,c){return\"OPTION\"===a.nodeName.toUpperCase()?(\"\"!==a.text?(null!=b&&(this.parsed[b].children+=1),this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:a.value,text:a.text,html:a.innerHTML,selected:a.selected,disabled:c===!0?c:a.disabled,group_array_index:b,classes:a.className,style:a.style.cssText})):this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:!0}),this.options_index+=1):void 0},SelectParser.prototype.escapeExpression=function(a){var b,c;return null==a||a===!1?\"\":/[\\&\\<\\>\\\"\\'\\`]/.test(a)?(b={\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\",\"`\":\"`\"},c=/&(?!\\w+;)|[\\<\\>\\\"\\'\\`]/g,a.replace(c,function(a){return b[a]||\"&\"})):a},SelectParser}(),SelectParser.select_to_array=function(a){var b,c,d,e,f;for(c=new SelectParser,f=a.childNodes,d=0,e=f.length;e>d;d++)b=f[d],c.add_node(b);return c.parsed},AbstractChosen=function(){function AbstractChosen(a,b){this.form_field=a,this.options=null!=b?b:{},AbstractChosen.browser_is_supported()&&(this.is_multiple=this.form_field.multiple,this.set_default_text(),this.set_default_values(),this.setup(),this.set_up_html(),this.register_observers(),this.on_ready())}return AbstractChosen.prototype.set_default_values=function(){var a=this;return this.click_test_action=function(b){return a.test_active_click(b)},this.activate_action=function(b){return a.activate_field(b)},this.active_field=!1,this.mouse_on_container=!1,this.results_showing=!1,this.result_highlighted=null,this.allow_single_deselect=null!=this.options.allow_single_deselect&&null!=this.form_field.options[0]&&\"\"===this.form_field.options[0].text?this.options.allow_single_deselect:!1,this.disable_search_threshold=this.options.disable_search_threshold||0,this.disable_search=this.options.disable_search||!1,this.enable_split_word_search=null!=this.options.enable_split_word_search?this.options.enable_split_word_search:!0,this.group_search=null!=this.options.group_search?this.options.group_search:!0,this.search_contains=this.options.search_contains||!1,this.single_backstroke_delete=null!=this.options.single_backstroke_delete?this.options.single_backstroke_delete:!0,this.max_selected_options=this.options.max_selected_options||1/0,this.inherit_select_classes=this.options.inherit_select_classes||!1,this.display_selected_options=null!=this.options.display_selected_options?this.options.display_selected_options:!0,this.display_disabled_options=null!=this.options.display_disabled_options?this.options.display_disabled_options:!0},AbstractChosen.prototype.set_default_text=function(){return this.default_text=this.form_field.getAttribute(\"data-placeholder\")?this.form_field.getAttribute(\"data-placeholder\"):this.is_multiple?this.options.placeholder_text_multiple||this.options.placeholder_text||AbstractChosen.default_multiple_text:this.options.placeholder_text_single||this.options.placeholder_text||AbstractChosen.default_single_text,this.results_none_found=this.form_field.getAttribute(\"data-no_results_text\")||this.options.no_results_text||AbstractChosen.default_no_result_text},AbstractChosen.prototype.mouse_enter=function(){return this.mouse_on_container=!0},AbstractChosen.prototype.mouse_leave=function(){return this.mouse_on_container=!1},AbstractChosen.prototype.input_focus=function(){var a=this;if(this.is_multiple){if(!this.active_field)return setTimeout(function(){return a.container_mousedown()},50)}else if(!this.active_field)return this.activate_field()},AbstractChosen.prototype.input_blur=function(){var a=this;return this.mouse_on_container?void 0:(this.active_field=!1,setTimeout(function(){return a.blur_test()},100))},AbstractChosen.prototype.results_option_build=function(a){var b,c,d,e,f;for(b=\"\",f=this.results_data,d=0,e=f.length;e>d;d++)c=f[d],b+=c.group?this.result_add_group(c):this.result_add_option(c),(null!=a?a.first:void 0)&&(c.selected&&this.is_multiple?this.choice_build(c):c.selected&&!this.is_multiple&&this.single_set_selected_text(c.text));return b},AbstractChosen.prototype.result_add_option=function(a){var b,c;return a.search_match?this.include_option_in_results(a)?(b=[],a.disabled||a.selected&&this.is_multiple||b.push(\"active-result\"),!a.disabled||a.selected&&this.is_multiple||b.push(\"disabled-result\"),a.selected&&b.push(\"result-selected\"),null!=a.group_array_index&&b.push(\"group-option\"),\"\"!==a.classes&&b.push(a.classes),c=document.createElement(\"li\"),c.className=b.join(\" \"),c.style.cssText=a.style,c.setAttribute(\"data-option-array-index\",a.array_index),c.innerHTML=a.search_text,this.outerHTML(c)):\"\":\"\"},AbstractChosen.prototype.result_add_group=function(a){var b,c;return a.search_match||a.group_match?a.active_options>0?(b=[],b.push(\"group-result\"),a.classes&&b.push(a.classes),c=document.createElement(\"li\"),c.className=b.join(\" \"),c.innerHTML=a.search_text,this.outerHTML(c)):\"\":\"\"},AbstractChosen.prototype.results_update_field=function(){return this.set_default_text(),this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.results_build(),this.results_showing?this.winnow_results():void 0},AbstractChosen.prototype.reset_single_select_options=function(){var a,b,c,d,e;for(d=this.results_data,e=[],b=0,c=d.length;c>b;b++)a=d[b],a.selected?e.push(a.selected=!1):e.push(void 0);return e},AbstractChosen.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},AbstractChosen.prototype.results_search=function(){return this.results_showing?this.winnow_results():this.results_show()},AbstractChosen.prototype.winnow_results=function(){var a,b,c,d,e,f,g,h,i,j,k,l;for(this.no_results_clear(),d=0,f=this.get_search_text(),a=f.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g,\"\\\\$&\"),i=new RegExp(a,\"i\"),c=this.get_search_regex(a),l=this.results_data,j=0,k=l.length;k>j;j++)b=l[j],b.search_match=!1,e=null,this.include_option_in_results(b)&&(b.group&&(b.group_match=!1,b.active_options=0),null!=b.group_array_index&&this.results_data[b.group_array_index]&&(e=this.results_data[b.group_array_index],0===e.active_options&&e.search_match&&(d+=1),e.active_options+=1),(!b.group||this.group_search)&&(b.search_text=b.group?b.label:b.text,b.search_match=this.search_string_match(b.search_text,c),b.search_match&&!b.group&&(d+=1),b.search_match?(f.length&&(g=b.search_text.search(i),h=b.search_text.substr(0,g+f.length)+\"\"+b.search_text.substr(g+f.length),b.search_text=h.substr(0,g)+\"\"+h.substr(g)),null!=e&&(e.group_match=!0)):null!=b.group_array_index&&this.results_data[b.group_array_index].search_match&&(b.search_match=!0)));return this.result_clear_highlight(),1>d&&f.length?(this.update_results_content(\"\"),this.no_results(f)):(this.update_results_content(this.results_option_build()),this.winnow_results_set_highlight())},AbstractChosen.prototype.get_search_regex=function(a){var b;return b=this.search_contains?\"\":\"^\",new RegExp(b+a,\"i\")},AbstractChosen.prototype.search_string_match=function(a,b){var c,d,e,f;if(b.test(a))return!0;if(this.enable_split_word_search&&(a.indexOf(\" \")>=0||0===a.indexOf(\"[\"))&&(d=a.replace(/\\[|\\]/g,\"\").split(\" \"),d.length))for(e=0,f=d.length;f>e;e++)if(c=d[e],b.test(c))return!0},AbstractChosen.prototype.choices_count=function(){var a,b,c,d;if(null!=this.selected_option_count)return this.selected_option_count;for(this.selected_option_count=0,d=this.form_field.options,b=0,c=d.length;c>b;b++)a=d[b],a.selected&&(this.selected_option_count+=1);return this.selected_option_count},AbstractChosen.prototype.choices_click=function(a){return a.preventDefault(),this.results_showing||this.is_disabled?void 0:this.results_show()},AbstractChosen.prototype.keyup_checker=function(a){var b,c;switch(b=null!=(c=a.which)?c:a.keyCode,this.search_field_scale(),b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices_count()>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:if(a.preventDefault(),this.results_showing)return this.result_select(a);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},AbstractChosen.prototype.clipboard_event_checker=function(){var a=this;return setTimeout(function(){return a.results_search()},50)},AbstractChosen.prototype.container_width=function(){return null!=this.options.width?this.options.width:\"\"+this.form_field.offsetWidth+\"px\"},AbstractChosen.prototype.include_option_in_results=function(a){return this.is_multiple&&!this.display_selected_options&&a.selected?!1:!this.display_disabled_options&&a.disabled?!1:a.empty?!1:!0},AbstractChosen.prototype.search_results_touchstart=function(a){return this.touch_started=!0,this.search_results_mouseover(a)},AbstractChosen.prototype.search_results_touchmove=function(a){return this.touch_started=!1,this.search_results_mouseout(a)},AbstractChosen.prototype.search_results_touchend=function(a){return this.touch_started?this.search_results_mouseup(a):void 0},AbstractChosen.prototype.outerHTML=function(a){var b;return a.outerHTML?a.outerHTML:(b=document.createElement(\"div\"),b.appendChild(a),b.innerHTML)},AbstractChosen.browser_is_supported=function(){return\"Microsoft Internet Explorer\"===window.navigator.appName?document.documentMode>=8:/iP(od|hone)/i.test(window.navigator.userAgent)?!1:/Android/i.test(window.navigator.userAgent)&&/Mobile/i.test(window.navigator.userAgent)?!1:!0},AbstractChosen.default_multiple_text=\"Select Some Options\",AbstractChosen.default_single_text=\"Select an Option\",AbstractChosen.default_no_result_text=\"No results match\",AbstractChosen}(),a=jQuery,a.fn.extend({chosen:function(b){return AbstractChosen.browser_is_supported()?this.each(function(){var c,d;c=a(this),d=c.data(\"chosen\"),\"destroy\"===b&&d instanceof Chosen?d.destroy():d instanceof Chosen||c.data(\"chosen\",new Chosen(this,b))}):this}}),Chosen=function(c){function Chosen(){return b=Chosen.__super__.constructor.apply(this,arguments)}return d(Chosen,c),Chosen.prototype.setup=function(){return this.form_field_jq=a(this.form_field),this.current_selectedIndex=this.form_field.selectedIndex,this.is_rtl=this.form_field_jq.hasClass(\"chosen-rtl\")},Chosen.prototype.set_up_html=function(){var b,c;return b=[\"chosen-container\"],b.push(\"chosen-container-\"+(this.is_multiple?\"multi\":\"single\")),this.inherit_select_classes&&this.form_field.className&&b.push(this.form_field.className),this.is_rtl&&b.push(\"chosen-rtl\"),c={\"class\":b.join(\" \"),style:\"width: \"+this.container_width()+\";\",title:this.form_field.title},this.form_field.id.length&&(c.id=this.form_field.id.replace(/[^\\w]/g,\"_\")+\"_chosen\"),this.container=a(\"
\",c),this.is_multiple?this.container.html('
    '):this.container.html(''+this.default_text+'
      '),this.form_field_jq.hide().after(this.container),this.dropdown=this.container.find(\"div.chosen-drop\").first(),this.search_field=this.container.find(\"input\").first(),this.search_results=this.container.find(\"ul.chosen-results\").first(),this.search_field_scale(),this.search_no_results=this.container.find(\"li.no-results\").first(),this.is_multiple?(this.search_choices=this.container.find(\"ul.chosen-choices\").first(),this.search_container=this.container.find(\"li.search-field\").first()):(this.search_container=this.container.find(\"div.chosen-search\").first(),this.selected_item=this.container.find(\".chosen-single\").first()),this.results_build(),this.set_tab_index(),this.set_label_behavior()},Chosen.prototype.on_ready=function(){return this.form_field_jq.trigger(\"chosen:ready\",{chosen:this})},Chosen.prototype.register_observers=function(){var a=this;return this.container.bind(\"touchstart.chosen\",function(b){a.container_mousedown(b)}),this.container.bind(\"touchend.chosen\",function(b){a.container_mouseup(b)}),this.container.bind(\"mousedown.chosen\",function(b){a.container_mousedown(b)}),this.container.bind(\"mouseup.chosen\",function(b){a.container_mouseup(b)}),this.container.bind(\"mouseenter.chosen\",function(b){a.mouse_enter(b)}),this.container.bind(\"mouseleave.chosen\",function(b){a.mouse_leave(b)}),this.search_results.bind(\"mouseup.chosen\",function(b){a.search_results_mouseup(b)}),this.search_results.bind(\"mouseover.chosen\",function(b){a.search_results_mouseover(b)}),this.search_results.bind(\"mouseout.chosen\",function(b){a.search_results_mouseout(b)}),this.search_results.bind(\"mousewheel.chosen DOMMouseScroll.chosen\",function(b){a.search_results_mousewheel(b)}),this.search_results.bind(\"touchstart.chosen\",function(b){a.search_results_touchstart(b)}),this.search_results.bind(\"touchmove.chosen\",function(b){a.search_results_touchmove(b)}),this.search_results.bind(\"touchend.chosen\",function(b){a.search_results_touchend(b)}),this.form_field_jq.bind(\"chosen:updated.chosen\",function(b){a.results_update_field(b)}),this.form_field_jq.bind(\"chosen:activate.chosen\",function(b){a.activate_field(b)}),this.form_field_jq.bind(\"chosen:open.chosen\",function(b){a.container_mousedown(b)}),this.form_field_jq.bind(\"chosen:close.chosen\",function(b){a.input_blur(b)}),this.search_field.bind(\"blur.chosen\",function(b){a.input_blur(b)}),this.search_field.bind(\"keyup.chosen\",function(b){a.keyup_checker(b)}),this.search_field.bind(\"keydown.chosen\",function(b){a.keydown_checker(b)}),this.search_field.bind(\"focus.chosen\",function(b){a.input_focus(b)}),this.search_field.bind(\"cut.chosen\",function(b){a.clipboard_event_checker(b)}),this.search_field.bind(\"paste.chosen\",function(b){a.clipboard_event_checker(b)}),this.is_multiple?this.search_choices.bind(\"click.chosen\",function(b){a.choices_click(b)}):this.container.bind(\"click.chosen\",function(a){a.preventDefault()})},Chosen.prototype.destroy=function(){return a(this.container[0].ownerDocument).unbind(\"click.chosen\",this.click_test_action),this.search_field[0].tabIndex&&(this.form_field_jq[0].tabIndex=this.search_field[0].tabIndex),this.container.remove(),this.form_field_jq.removeData(\"chosen\"),this.form_field_jq.show()},Chosen.prototype.search_field_disabled=function(){return this.is_disabled=this.form_field_jq[0].disabled,this.is_disabled?(this.container.addClass(\"chosen-disabled\"),this.search_field[0].disabled=!0,this.is_multiple||this.selected_item.unbind(\"focus.chosen\",this.activate_action),this.close_field()):(this.container.removeClass(\"chosen-disabled\"),this.search_field[0].disabled=!1,this.is_multiple?void 0:this.selected_item.bind(\"focus.chosen\",this.activate_action))},Chosen.prototype.container_mousedown=function(b){return this.is_disabled||(b&&\"mousedown\"===b.type&&!this.results_showing&&b.preventDefault(),null!=b&&a(b.target).hasClass(\"search-choice-close\"))?void 0:(this.active_field?this.is_multiple||!b||a(b.target)[0]!==this.selected_item[0]&&!a(b.target).parents(\"a.chosen-single\").length||(b.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(\"\"),a(this.container[0].ownerDocument).bind(\"click.chosen\",this.click_test_action),this.results_show()),this.activate_field())},Chosen.prototype.container_mouseup=function(a){return\"ABBR\"!==a.target.nodeName||this.is_disabled?void 0:this.results_reset(a)},Chosen.prototype.search_results_mousewheel=function(a){var b;return a.originalEvent&&(b=a.originalEvent.deltaY||-a.originalEvent.wheelDelta||a.originalEvent.detail),null!=b?(a.preventDefault(),\"DOMMouseScroll\"===a.type&&(b=40*b),this.search_results.scrollTop(b+this.search_results.scrollTop())):void 0},Chosen.prototype.blur_test=function(){return!this.active_field&&this.container.hasClass(\"chosen-container-active\")?this.close_field():void 0},Chosen.prototype.close_field=function(){return a(this.container[0].ownerDocument).unbind(\"click.chosen\",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClass(\"chosen-container-active\"),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},Chosen.prototype.activate_field=function(){return this.container.addClass(\"chosen-container-active\"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},Chosen.prototype.test_active_click=function(b){var c;return c=a(b.target).closest(\".chosen-container\"),c.length&&this.container[0]===c[0]?this.active_field=!0:this.close_field()},Chosen.prototype.results_build=function(){return this.parsing=!0,this.selected_option_count=null,this.results_data=SelectParser.select_to_array(this.form_field),this.is_multiple?this.search_choices.find(\"li.search-choice\").remove():this.is_multiple||(this.single_set_selected_text(),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?(this.search_field[0].readOnly=!0,this.container.addClass(\"chosen-container-single-nosearch\")):(this.search_field[0].readOnly=!1,this.container.removeClass(\"chosen-container-single-nosearch\"))),this.update_results_content(this.results_option_build({first:!0})),this.search_field_disabled(),this.show_search_field_default(),this.search_field_scale(),this.parsing=!1},Chosen.prototype.result_do_highlight=function(a){var b,c,d,e,f;if(a.length){if(this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClass(\"highlighted\"),d=parseInt(this.search_results.css(\"maxHeight\"),10),f=this.search_results.scrollTop(),e=d+f,c=this.result_highlight.position().top+this.search_results.scrollTop(),b=c+this.result_highlight.outerHeight(),b>=e)return this.search_results.scrollTop(b-d>0?b-d:0);if(f>c)return this.search_results.scrollTop(c)}},Chosen.prototype.result_clear_highlight=function(){return this.result_highlight&&this.result_highlight.removeClass(\"highlighted\"),this.result_highlight=null},Chosen.prototype.results_show=function(){return this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger(\"chosen:maxselected\",{chosen:this}),!1):(this.container.addClass(\"chosen-with-drop\"),this.results_showing=!0,this.search_field.focus(),this.search_field.val(this.search_field.val()),this.winnow_results(),this.form_field_jq.trigger(\"chosen:showing_dropdown\",{chosen:this}))},Chosen.prototype.update_results_content=function(a){return this.search_results.html(a)},Chosen.prototype.results_hide=function(){return this.results_showing&&(this.result_clear_highlight(),this.container.removeClass(\"chosen-with-drop\"),this.form_field_jq.trigger(\"chosen:hiding_dropdown\",{chosen:this})),this.results_showing=!1},Chosen.prototype.set_tab_index=function(){var a;return this.form_field.tabIndex?(a=this.form_field.tabIndex,this.form_field.tabIndex=-1,this.search_field[0].tabIndex=a):void 0},Chosen.prototype.set_label_behavior=function(){var b=this;return this.form_field_label=this.form_field_jq.parents(\"label\"),!this.form_field_label.length&&this.form_field.id.length&&(this.form_field_label=a(\"label[for='\"+this.form_field.id+\"']\")),this.form_field_label.length>0?this.form_field_label.bind(\"click.chosen\",function(a){return b.is_multiple?b.container_mousedown(a):b.activate_field()}):void 0},Chosen.prototype.show_search_field_default=function(){return this.is_multiple&&this.choices_count()<1&&!this.active_field?(this.search_field.val(this.default_text),this.search_field.addClass(\"default\")):(this.search_field.val(\"\"),this.search_field.removeClass(\"default\"))},Chosen.prototype.search_results_mouseup=function(b){var c;return c=a(b.target).hasClass(\"active-result\")?a(b.target):a(b.target).parents(\".active-result\").first(),c.length?(this.result_highlight=c,this.result_select(b),this.search_field.focus()):void 0},Chosen.prototype.search_results_mouseover=function(b){var c;return c=a(b.target).hasClass(\"active-result\")?a(b.target):a(b.target).parents(\".active-result\").first(),c?this.result_do_highlight(c):void 0},Chosen.prototype.search_results_mouseout=function(b){return a(b.target).hasClass(\"active-result\")?this.result_clear_highlight():void 0},Chosen.prototype.choice_build=function(b){var c,d,e=this;return c=a(\"
    • \",{\"class\":\"search-choice\"}).html(\"\"+b.html+\"\"),b.disabled?c.addClass(\"search-choice-disabled\"):(d=a(\"\",{\"class\":\"search-choice-close\",\"data-option-array-index\":b.array_index}),d.bind(\"click.chosen\",function(a){return e.choice_destroy_link_click(a)}),c.append(d)),this.search_container.before(c)},Chosen.prototype.choice_destroy_link_click=function(b){return b.preventDefault(),b.stopPropagation(),this.is_disabled?void 0:this.choice_destroy(a(b.target))},Chosen.prototype.choice_destroy=function(a){return this.result_deselect(a[0].getAttribute(\"data-option-array-index\"))?(this.show_search_field_default(),this.is_multiple&&this.choices_count()>0&&this.search_field.val().length<1&&this.results_hide(),a.parents(\"li\").first().remove(),this.search_field_scale()):void 0},Chosen.prototype.results_reset=function(){return this.reset_single_select_options(),this.form_field.options[0].selected=!0,this.single_set_selected_text(),this.show_search_field_default(),this.results_reset_cleanup(),this.form_field_jq.trigger(\"change\"),this.active_field?this.results_hide():void 0},Chosen.prototype.results_reset_cleanup=function(){return this.current_selectedIndex=this.form_field.selectedIndex,this.selected_item.find(\"abbr\").remove()},Chosen.prototype.result_select=function(a){var b,c;return this.result_highlight?(b=this.result_highlight,this.result_clear_highlight(),this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger(\"chosen:maxselected\",{chosen:this}),!1):(this.is_multiple?b.removeClass(\"active-result\"):this.reset_single_select_options(),c=this.results_data[b[0].getAttribute(\"data-option-array-index\")],c.selected=!0,this.form_field.options[c.options_index].selected=!0,this.selected_option_count=null,this.is_multiple?this.choice_build(c):this.single_set_selected_text(c.text),(a.metaKey||a.ctrlKey)&&this.is_multiple||this.results_hide(),this.search_field.val(\"\"),(this.is_multiple||this.form_field.selectedIndex!==this.current_selectedIndex)&&this.form_field_jq.trigger(\"change\",{selected:this.form_field.options[c.options_index].value}),this.current_selectedIndex=this.form_field.selectedIndex,this.search_field_scale())):void 0},Chosen.prototype.single_set_selected_text=function(a){return null==a&&(a=this.default_text),a===this.default_text?this.selected_item.addClass(\"chosen-default\"):(this.single_deselect_control_build(),this.selected_item.removeClass(\"chosen-default\")),this.selected_item.find(\"span\").text(a)},Chosen.prototype.result_deselect=function(a){var b;return b=this.results_data[a],this.form_field.options[b.options_index].disabled?!1:(b.selected=!1,this.form_field.options[b.options_index].selected=!1,this.selected_option_count=null,this.result_clear_highlight(),this.results_showing&&this.winnow_results(),this.form_field_jq.trigger(\"change\",{deselected:this.form_field.options[b.options_index].value}),this.search_field_scale(),!0)},Chosen.prototype.single_deselect_control_build=function(){return this.allow_single_deselect?(this.selected_item.find(\"abbr\").length||this.selected_item.find(\"span\").first().after(''),this.selected_item.addClass(\"chosen-single-with-deselect\")):void 0},Chosen.prototype.get_search_text=function(){return this.search_field.val()===this.default_text?\"\":a(\"
      \").text(a.trim(this.search_field.val())).html()},Chosen.prototype.winnow_results_set_highlight=function(){var a,b;return b=this.is_multiple?[]:this.search_results.find(\".result-selected.active-result\"),a=b.length?b.first():this.search_results.find(\".active-result\").first(),null!=a?this.result_do_highlight(a):void 0},Chosen.prototype.no_results=function(b){var c;return c=a('
    • '+this.results_none_found+' \"\"
    • '),c.find(\"span\").first().html(b),this.search_results.append(c),this.form_field_jq.trigger(\"chosen:no_results\",{chosen:this})},Chosen.prototype.no_results_clear=function(){return this.search_results.find(\".no-results\").remove()},Chosen.prototype.keydown_arrow=function(){var a;return this.results_showing&&this.result_highlight?(a=this.result_highlight.nextAll(\"li.active-result\").first())?this.result_do_highlight(a):void 0:this.results_show()},Chosen.prototype.keyup_arrow=function(){var a;return this.results_showing||this.is_multiple?this.result_highlight?(a=this.result_highlight.prevAll(\"li.active-result\"),a.length?this.result_do_highlight(a.first()):(this.choices_count()>0&&this.results_hide(),this.result_clear_highlight())):void 0:this.results_show()},Chosen.prototype.keydown_backstroke=function(){var a;return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.find(\"a\").first()),this.clear_backstroke()):(a=this.search_container.siblings(\"li.search-choice\").last(),a.length&&!a.hasClass(\"search-choice-disabled\")?(this.pending_backstroke=a,this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClass(\"search-choice-focus\")):void 0)},Chosen.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass(\"search-choice-focus\"),this.pending_backstroke=null},Chosen.prototype.keydown_checker=function(a){var b,c;switch(b=null!=(c=a.which)?c:a.keyCode,this.search_field_scale(),8!==b&&this.pending_backstroke&&this.clear_backstroke(),b){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(a),this.mouse_on_container=!1;break;case 13:this.results_showing&&a.preventDefault();break;case 32:this.disable_search&&a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:a.preventDefault(),this.keydown_arrow()}},Chosen.prototype.search_field_scale=function(){var b,c,d,e,f,g,h,i,j;if(this.is_multiple){for(d=0,h=0,f=\"position:absolute; left: -1000px; top: -1000px; display:none;\",g=[\"font-size\",\"font-style\",\"font-weight\",\"font-family\",\"line-height\",\"text-transform\",\"letter-spacing\"],i=0,j=g.length;j>i;i++)e=g[i],f+=e+\":\"+this.search_field.css(e)+\";\";return b=a(\"
      \",{style:f}),b.text(this.search_field.val()),a(\"body\").append(b),h=b.width()+25,b.remove(),c=this.container.outerWidth(),h>c-10&&(h=c-10),this.search_field.css({width:h+\"px\"})}},Chosen}(AbstractChosen)}.call(this);\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\")))\n\n//# sourceURL=webpack:///./src/public/js/vendor/chosen/chosen.jquery.min.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/countup/countUp.min.js": -/*!*****************************************************!*\ - !*** ./src/public/js/vendor/countup/countUp.min.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;!function(t,a){ true?!(__WEBPACK_AMD_DEFINE_FACTORY__ = (a),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)):undefined}(this,function(t,a,e){/*\r\n\r\n countUp.js\r\n (c) 2014-2015 @inorganik\r\n Licensed under the MIT license.\r\n\r\n */\r\n var n=function(t,a,e,n,i,r){for(var o=0,s=[\"webkit\",\"moz\",\"ms\",\"o\"],m=0;mthis.endVal,this.frameVal=this.startVal,this.decimals=Math.max(0,n||0),this.dec=Math.pow(10,this.decimals),this.duration=1e3*Number(i)||2e3;var l=this;this.version=function(){return\"1.6.1\"},this.printValue=function(t){var a=isNaN(t)?\"--\":l.formatNumber(t);\"INPUT\"==l.d.tagName?this.d.value=a:\"text\"==l.d.tagName||\"tspan\"==l.d.tagName?this.d.textContent=a:this.d.innerHTML=a},this.easeOutExpo=function(t,a,e,n){return e*(-Math.pow(2,-10*t/n)+1)*1024/1023+a},this.count=function(t){l.startTime||(l.startTime=t),l.timestamp=t;var a=t-l.startTime;l.remaining=l.duration-a,l.options.useEasing?l.countDown?l.frameVal=l.startVal-l.easeOutExpo(a,0,l.startVal-l.endVal,l.duration):l.frameVal=l.easeOutExpo(a,l.startVal,l.endVal-l.startVal,l.duration):l.countDown?l.frameVal=l.startVal-(l.startVal-l.endVal)*(a/l.duration):l.frameVal=l.startVal+(l.endVal-l.startVal)*(a/l.duration),l.countDown?l.frameVal=l.frameVall.endVal?l.endVal:l.frameVal,l.frameVal=Math.floor(l.frameVal*l.dec)/l.dec,l.printValue(l.frameVal),al.endVal,l.rAF=requestAnimationFrame(l.count)},this.formatNumber=function(t){t=t.toFixed(l.decimals),t+=\"\";var a,e,n,i;if(a=t.split(\".\"),e=a[0],n=a.length>1?l.options.decimal+a[1]:\"\",i=/(\\d+)(\\d{3})/,l.options.useGrouping)for(;i.test(e);)e=e.replace(i,\"$1\"+l.options.separator+\"$2\");var r=l.options.prefix+e+n+l.options.suffix;return null!=l.options.postFormatter&&(r=l.options.postFormatter(r)),r},l.printValue(l.startVal)};return n});\n\n//# sourceURL=webpack:///./src/public/js/vendor/countup/countUp.min.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/easypiechart/easypiechart.js": -/*!***********************************************************!*\ - !*** ./src/public/js/vendor/easypiechart/easypiechart.js ***! - \***********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function(jQuery) {/**!\r\n * easyPieChart\r\n * Lightweight plugin to render simple, animated and retina optimized pie charts\r\n *\r\n * @license\r\n * @author Robert Fleischmann (http://robert-fleischmann.de)\r\n * @version 2.1.5\r\n **/\r\n!function(a,b){ true?module.exports=b(__webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\")):undefined}(this,function(a){var b=function(a,b){var c,d=document.createElement(\"canvas\");a.appendChild(d),\"undefined\"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext(\"2d\");d.width=d.height=b.size;var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,\"px\"].join(\"\"),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(-1,c||0),1);var d=0>=c?!0:!1;e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,d),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)d%6===0?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth,1)};this.getCanvas=function(){return d},this.getCtx=function(){return e},this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d=\"function\"==typeof b.barColor?b.barColor(a):b.barColor,h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate.duration),g=b.easing(this,f,a,c-a,b.animate.duration);this.draw(g),b.onStep(a,c,g),f>=b.animate.duration?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:\"#ef1e25\",trackColor:\"#f9f9f9\",scaleColor:\"#dfe0e0\",scaleLength:5,lineCap:\"round\",lineWidth:3,size:110,rotate:0,animate:{duration:1e3,enabled:!0},easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if(\"undefined\"!=typeof b)d.renderer=b;else{if(\"undefined\"==typeof SVGRenderer)throw new Error(\"Please load either the SVG- or the CanvasRenderer\");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&&(e[b]=c&&\"undefined\"!=typeof c[b]?c[b]:d[b],\"function\"==typeof e[b]&&(e[b]=e[b].bind(this)));e.easing=\"string\"==typeof e.easing&&\"undefined\"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,\"number\"==typeof e.animate&&(e.animate={duration:e.animate,enabled:!0}),\"boolean\"!=typeof e.animate||e.animate||(e.animate={duration:1e3,enabled:e.animate}),this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&&a.dataset.percent?this.update(parseFloat(a.dataset.percent)):a.getAttribute&&a.getAttribute(\"data-percent\")&&this.update(parseFloat(a.getAttribute(\"data-percent\")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate.enabled?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),this.disableAnimation=function(){return e.animate.enabled=!1,this},this.enableAnimation=function(){return e.animate.enabled=!0,this},g()};a.fn.easyPieChart=function(b){return this.each(function(){var d;a.data(this,\"easyPieChart\")||(d=a.extend({},b,a(this).data()),a.data(this,\"easyPieChart\",new c(this,d)))})}});\r\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\")))\n\n//# sourceURL=webpack:///./src/public/js/vendor/easypiechart/easypiechart.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/formvalidator/jquery.form-validator.js": -/*!*********************************************************************!*\ - !*** ./src/public/js/vendor/formvalidator/jquery.form-validator.js ***! - \*********************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (root, factory) {\r\n if (true) {\r\n // AMD. Register as an anonymous module unless amdModuleId is set\r\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (a0) {\r\n return (factory(a0));\r\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n } else {}\r\n}(this, function (jQuery) {\r\n\r\n /** File generated by Grunt -- do not modify\r\n * JQUERY-FORM-VALIDATOR\r\n *\r\n * @version 2.3.26\r\n * @website http://formvalidator.net/\r\n * @author Victor Jonsson, http://victorjonsson.se\r\n * @license MIT\r\n */\r\n /**\r\n * Deprecated functions and attributes\r\n * @todo: Remove in release of 3.0\r\n */\r\n (function ($, undefined) {\r\n\r\n 'use strict';\r\n\r\n /**\r\n * @deprecated\r\n * @param language\r\n * @param conf\r\n */\r\n $.fn.validateForm = function (language, conf) {\r\n $.formUtils.warn('Use of deprecated function $.validateForm, use $.isValid instead');\r\n return this.isValid(language, conf, true);\r\n };\r\n\r\n $(window).on('validatorsLoaded formValidationSetup', function(evt, $form, config) {\r\n if( !$form ) {\r\n $form = $('form');\r\n }\r\n\r\n addSupportForCustomErrorMessageCallback(config);\r\n addSupportForElementReferenceInPositionParam(config);\r\n addSupportForValidationDependingOnCheckedInput($form);\r\n });\r\n\r\n\r\n function addSupportForCustomErrorMessageCallback(config) {\r\n if (config &&\r\n config.errorMessagePosition === 'custom' &&\r\n typeof config.errorMessageCustom === 'function') {\r\n\r\n $.formUtils.warn('Use of deprecated function errorMessageCustom, use config.submitErrorMessageCallback instead');\r\n\r\n config.submitErrorMessageCallback = function($form, errorMessages) {\r\n config.errorMessageCustom(\r\n $form,\r\n config.language.errorTitle,\r\n errorMessages,\r\n config\r\n );\r\n };\r\n }\r\n }\r\n\r\n function addSupportForElementReferenceInPositionParam(config) {\r\n if (config.errorMessagePosition && typeof config.errorMessagePosition === 'object') {\r\n $.formUtils.warn('Deprecated use of config parameter errorMessagePosition, use config.submitErrorMessageCallback instead');\r\n var $errorMessageContainer = config.errorMessagePosition;\r\n config.errorMessagePosition = 'top';\r\n config.submitErrorMessageCallback = function() {\r\n return $errorMessageContainer;\r\n };\r\n }\r\n }\r\n\r\n function addSupportForValidationDependingOnCheckedInput($form) {\r\n var $inputsDependingOnCheckedInputs = $form.find('[data-validation-if-checked]');\r\n if ($inputsDependingOnCheckedInputs.length) {\r\n $.formUtils.warn(\r\n 'Detected use of attribute \"data-validation-if-checked\" which is '+\r\n 'deprecated. Use \"data-validation-depends-on\" provided by module \"logic\"'\r\n );\r\n }\r\n\r\n $inputsDependingOnCheckedInputs\r\n .on('beforeValidation', function() {\r\n\r\n var $elem = $(this),\r\n nameOfDependingInput = $elem.valAttr('if-checked');\r\n\r\n // Set the boolean telling us that the validation depends\r\n // on another input being checked\r\n var $dependingInput = $('input[name=\"' + nameOfDependingInput + '\"]', $form),\r\n dependingInputIsChecked = $dependingInput.is(':checked'),\r\n valueOfDependingInput = ($.formUtils.getValue($dependingInput) || '').toString(),\r\n requiredValueOfDependingInput = $elem.valAttr('if-checked-value');\r\n\r\n if (!dependingInputIsChecked || !(\r\n !requiredValueOfDependingInput ||\r\n requiredValueOfDependingInput === valueOfDependingInput\r\n )) {\r\n $elem.valAttr('skipped', true);\r\n }\r\n\r\n });\r\n }\r\n\r\n })(jQuery);\r\n\r\n /**\r\n * Utility methods used for displaying error messages (attached to $.formUtils)\r\n */\r\n (function ($) {\r\n\r\n 'use strict';\r\n\r\n var dialogs = {\r\n\r\n resolveErrorMessage: function($elem, validator, validatorName, conf, language) {\r\n var errorMsgAttr = conf.validationErrorMsgAttribute + '-' + validatorName.replace('validate_', ''),\r\n validationErrorMsg = $elem.attr(errorMsgAttr);\r\n\r\n if (!validationErrorMsg) {\r\n validationErrorMsg = $elem.attr(conf.validationErrorMsgAttribute);\r\n if (!validationErrorMsg) {\r\n if (typeof validator.errorMessageKey !== 'function') {\r\n validationErrorMsg = language[validator.errorMessageKey];\r\n }\r\n else {\r\n validationErrorMsg = language[validator.errorMessageKey(conf)];\r\n }\r\n if (!validationErrorMsg) {\r\n validationErrorMsg = validator.errorMessage;\r\n }\r\n }\r\n }\r\n return validationErrorMsg;\r\n },\r\n getParentContainer: function ($elem) {\r\n if ($elem.valAttr('error-msg-container')) {\r\n return $($elem.valAttr('error-msg-container'));\r\n } else {\r\n var $parent = $elem.parent();\r\n if (!$parent.hasClass('form-group') && !$parent.closest('form').hasClass('form-horizontal')) {\r\n var $formGroup = $parent.closest('.form-group');\r\n if ($formGroup.length) {\r\n return $formGroup.eq(0);\r\n }\r\n }\r\n return $parent;\r\n }\r\n },\r\n applyInputErrorStyling: function ($input, conf) {\r\n $input\r\n .addClass(conf.errorElementClass)\r\n .removeClass('valid');\r\n\r\n this.getParentContainer($input)\r\n .addClass(conf.inputParentClassOnError)\r\n .removeClass(conf.inputParentClassOnSuccess);\r\n\r\n if (conf.borderColorOnError !== '') {\r\n $input.css('border-color', conf.borderColorOnError);\r\n }\r\n },\r\n applyInputSuccessStyling: function($input, conf) {\r\n $input.addClass('valid');\r\n this.getParentContainer($input)\r\n .addClass(conf.inputParentClassOnSuccess);\r\n },\r\n removeInputStylingAndMessage: function($input, conf) {\r\n\r\n // Reset input css\r\n $input\r\n .removeClass('valid')\r\n .removeClass(conf.errorElementClass)\r\n .css('border-color', '');\r\n\r\n var $parentContainer = dialogs.getParentContainer($input);\r\n\r\n // Reset parent css\r\n $parentContainer\r\n .removeClass(conf.inputParentClassOnError)\r\n .removeClass(conf.inputParentClassOnSuccess);\r\n\r\n // Remove possible error message\r\n if (typeof conf.inlineErrorMessageCallback === 'function') {\r\n var $errorMessage = conf.inlineErrorMessageCallback($input, false, conf);\r\n if ($errorMessage) {\r\n $errorMessage.html('');\r\n }\r\n } else {\r\n $parentContainer\r\n .find('.' + conf.errorMessageClass)\r\n .remove();\r\n }\r\n\r\n },\r\n removeAllMessagesAndStyling: function($form, conf) {\r\n\r\n // Remove error messages in top of form\r\n if (typeof conf.submitErrorMessageCallback === 'function') {\r\n var $errorMessagesInTopOfForm = conf.submitErrorMessageCallback($form, conf);\r\n if ($errorMessagesInTopOfForm) {\r\n $errorMessagesInTopOfForm.html('');\r\n }\r\n } else {\r\n $form.find('.' + conf.errorMessageClass + '.alert').remove();\r\n }\r\n\r\n // Remove input css/messages\r\n $form.find('.' + conf.errorElementClass + ',.valid').each(function() {\r\n dialogs.removeInputStylingAndMessage($(this), conf);\r\n });\r\n },\r\n setInlineMessage: function ($input, errorMsg, conf) {\r\n\r\n this.applyInputErrorStyling($input, conf);\r\n\r\n var custom = document.getElementById($input.attr('name') + '_err_msg'),\r\n $messageContainer = false,\r\n setErrorMessage = function ($elem) {\r\n $.formUtils.$win.trigger('validationErrorDisplay', [$input, $elem]);\r\n $elem.html(errorMsg);\r\n },\r\n addErrorToMessageContainer = function() {\r\n var $found = false;\r\n $messageContainer.find('.' + conf.errorMessageClass).each(function () {\r\n if (this.inputReferer === $input[0]) {\r\n $found = $(this);\r\n return false;\r\n }\r\n });\r\n if ($found) {\r\n if (!errorMsg) {\r\n $found.remove();\r\n } else {\r\n setErrorMessage($found);\r\n }\r\n } else if(errorMsg !== '') {\r\n $message = $('
      ');\r\n setErrorMessage($message);\r\n $message[0].inputReferer = $input[0];\r\n $messageContainer.prepend($message);\r\n }\r\n },\r\n $message;\r\n\r\n if (custom) {\r\n // Todo: remove in 3.0\r\n $.formUtils.warn('Using deprecated element reference ' + custom.id);\r\n $messageContainer = $(custom);\r\n addErrorToMessageContainer();\r\n } else if (typeof conf.inlineErrorMessageCallback === 'function') {\r\n $messageContainer = conf.inlineErrorMessageCallback($input, errorMsg, conf);\r\n if (!$messageContainer) {\r\n // Error display taken care of by inlineErrorMessageCallback\r\n return;\r\n }\r\n addErrorToMessageContainer();\r\n } else {\r\n var $parent = this.getParentContainer($input);\r\n $message = $parent.find('.' + conf.errorMessageClass + '.help-block');\r\n if ($message.length === 0) {\r\n $message = $('').addClass('help-block').addClass(conf.errorMessageClass);\r\n $message.appendTo($parent);\r\n }\r\n setErrorMessage($message);\r\n }\r\n },\r\n setMessageInTopOfForm: function ($form, errorMessages, conf, lang) {\r\n var view = '
      '+\r\n '{errorTitle}'+\r\n '
        {fields}
      '+\r\n '
      ',\r\n $container = false;\r\n\r\n if (typeof conf.submitErrorMessageCallback === 'function') {\r\n $container = conf.submitErrorMessageCallback($form, errorMessages, conf);\r\n if (!$container) {\r\n // message display taken care of by callback\r\n return;\r\n }\r\n }\r\n\r\n var viewParams = {\r\n errorTitle: lang.errorTitle,\r\n fields: '',\r\n errorMessageClass: conf.errorMessageClass\r\n };\r\n\r\n $.each(errorMessages, function (i, msg) {\r\n viewParams.fields += '
    • '+msg+'
    • ';\r\n });\r\n\r\n $.each(viewParams, function(param, value) {\r\n view = view.replace('{'+param+'}', value);\r\n });\r\n\r\n if ($container) {\r\n $container.html(view);\r\n } else {\r\n $form.children().eq(0).before($(view));\r\n }\r\n }\r\n };\r\n\r\n $.formUtils = $.extend($.formUtils || {}, {\r\n dialogs: dialogs\r\n });\r\n\r\n })(jQuery);\r\n\r\n /**\r\n * File declaring all methods if this plugin which is applied to $.fn.\r\n */\r\n (function($, window, undefined) {\r\n\r\n 'use strict';\r\n\r\n var _helpers = 0;\r\n\r\n\r\n /**\r\n * Assigns validateInputOnBlur function to elements blur event\r\n *\r\n * @param {Object} language Optional, will override $.formUtils.LANG\r\n * @param {Object} conf Optional, will override the default settings\r\n * @return {jQuery}\r\n */\r\n $.fn.validateOnBlur = function (language, conf) {\r\n var $form = this,\r\n $elems = this.find('*[data-validation]');\r\n\r\n $elems.each(function(){\r\n var $this = $(this);\r\n if ($this.is('[type=radio]')){\r\n var $additionals = $form.find('[type=radio][name=\"' + $this.attr('name') + '\"]');\r\n $additionals.bind('blur.validation', function(){\r\n $this.validateInputOnBlur(language, conf, true, 'blur');\r\n });\r\n if (conf.validateCheckboxRadioOnClick) {\r\n $additionals.bind('click.validation', function () {\r\n $this.validateInputOnBlur(language, conf, true, 'click');\r\n });\r\n }\r\n }\r\n });\r\n\r\n $elems.bind('blur.validation', function () {\r\n $(this).validateInputOnBlur(language, conf, true, 'blur');\r\n });\r\n\r\n if (conf.validateCheckboxRadioOnClick) {\r\n // bind click event to validate on click for radio & checkboxes for nice UX\r\n this.find('input[type=checkbox][data-validation],input[type=radio][data-validation]')\r\n .bind('click.validation', function () {\r\n $(this).validateInputOnBlur(language, conf, true, 'click');\r\n });\r\n }\r\n\r\n return this;\r\n };\r\n\r\n /*\r\n * Assigns validateInputOnBlur function to elements custom event\r\n * @param {Object} language Optional, will override $.formUtils.LANG\r\n * @param {Object} settings Optional, will override the default settings\r\n * * @return {jQuery}\r\n */\r\n $.fn.validateOnEvent = function (language, config) {\r\n var $elements = this[0].nodeName === 'FORM' ? this.find('*[data-validation-event]') : this;\r\n $elements\r\n .each(function () {\r\n var $el = $(this),\r\n etype = $el.valAttr('event');\r\n if (etype) {\r\n $el\r\n .unbind(etype + '.validation')\r\n .bind(etype + '.validation', function (evt) {\r\n if( (evt || {}).keyCode !== 9 ) {\r\n $(this).validateInputOnBlur(language, config, true, etype);\r\n }\r\n });\r\n }\r\n });\r\n return this;\r\n };\r\n\r\n /**\r\n * fade in help message when input gains focus\r\n * fade out when input loses focus\r\n * \r\n *\r\n * @param {String} attrName - Optional, default is data-help\r\n * @return {jQuery}\r\n */\r\n $.fn.showHelpOnFocus = function (attrName) {\r\n if (!attrName) {\r\n attrName = 'data-validation-help';\r\n }\r\n\r\n // Remove previously added event listeners\r\n this.find('.has-help-txt')\r\n .valAttr('has-keyup-event', false)\r\n .removeClass('has-help-txt');\r\n\r\n // Add help text listeners\r\n this.find('textarea,input').each(function () {\r\n var $elem = $(this),\r\n className = 'jquery_form_help_' + (++_helpers),\r\n help = $elem.attr(attrName);\r\n\r\n if (help) {\r\n $elem\r\n .addClass('has-help-txt')\r\n .unbind('focus.help')\r\n .bind('focus.help', function () {\r\n var $help = $elem.parent().find('.' + className);\r\n if ($help.length === 0) {\r\n $help = $('')\r\n .addClass(className)\r\n .addClass('help')\r\n .addClass('help-block') // twitter bs\r\n .text(help)\r\n .hide();\r\n\r\n $elem.after($help);\r\n }\r\n $help.fadeIn();\r\n })\r\n .unbind('blur.help')\r\n .bind('blur.help', function () {\r\n $(this)\r\n .parent()\r\n .find('.' + className)\r\n .fadeOut('slow');\r\n });\r\n }\r\n });\r\n\r\n return this;\r\n };\r\n\r\n /**\r\n * @param {Function} cb\r\n * @param {Object} [conf]\r\n * @param {Object} [lang]\r\n */\r\n $.fn.validate = function(cb, conf, lang) {\r\n var language = $.extend({}, $.formUtils.LANG, lang || {});\r\n this.each(function() {\r\n var $elem = $(this),\r\n formDefaultConfig = $elem.closest('form').get(0).validationConfig || {};\r\n\r\n $elem.one('validation', function(evt, isValid) {\r\n if ( typeof cb === 'function' ) {\r\n cb(isValid, this, evt);\r\n }\r\n });\r\n\r\n $elem.validateInputOnBlur(\r\n language,\r\n $.extend({}, formDefaultConfig, conf || {}),\r\n true\r\n );\r\n });\r\n };\r\n\r\n /**\r\n * Tells whether or not validation of this input will have to postpone the form submit ()\r\n * @returns {Boolean}\r\n */\r\n $.fn.willPostponeValidation = function() {\r\n return (this.valAttr('suggestion-nr') ||\r\n this.valAttr('postpone') ||\r\n this.hasClass('hasDatepicker')) &&\r\n !window.postponedValidation;\r\n };\r\n\r\n /**\r\n * Validate single input when it loses focus\r\n * shows error message in a span element\r\n * that is appended to the parent element\r\n *\r\n * @param {Object} [language] Optional, will override $.formUtils.LANG\r\n * @param {Object} [conf] Optional, will override the default settings\r\n * @param {Boolean} attachKeyupEvent Optional\r\n * @param {String} eventType\r\n * @return {jQuery}\r\n */\r\n $.fn.validateInputOnBlur = function (language, conf, attachKeyupEvent, eventType) {\r\n\r\n $.formUtils.eventType = eventType;\r\n\r\n if ( this.willPostponeValidation() ) {\r\n // This validation has to be postponed\r\n var _self = this,\r\n postponeTime = this.valAttr('postpone') || 200;\r\n\r\n window.postponedValidation = function () {\r\n _self.validateInputOnBlur(language, conf, attachKeyupEvent, eventType);\r\n window.postponedValidation = false;\r\n };\r\n\r\n setTimeout(function () {\r\n if (window.postponedValidation) {\r\n window.postponedValidation();\r\n }\r\n }, postponeTime);\r\n\r\n return this;\r\n }\r\n\r\n language = $.extend({}, $.formUtils.LANG, language || {});\r\n $.formUtils.dialogs.removeInputStylingAndMessage(this, conf);\r\n\r\n var $elem = this,\r\n $form = $elem.closest('form'),\r\n result = $.formUtils.validateInput(\r\n $elem,\r\n language,\r\n conf,\r\n $form,\r\n eventType\r\n );\r\n\r\n if (attachKeyupEvent) {\r\n $elem.unbind('keyup.validation');\r\n }\r\n\r\n if (result.shouldChangeDisplay) {\r\n if (result.isValid) {\r\n $.formUtils.dialogs.applyInputSuccessStyling($elem, conf);\r\n } else {\r\n $.formUtils.dialogs.setInlineMessage($elem, result.errorMsg, conf);\r\n }\r\n }\r\n\r\n if (!result.isValid && attachKeyupEvent) {\r\n $elem.bind('keyup.validation', function (evt) {\r\n if( evt.keyCode !== 9 ) {\r\n $(this).validateInputOnBlur(language, conf, false, 'keyup');\r\n }\r\n });\r\n }\r\n\r\n return this;\r\n };\r\n\r\n /**\r\n * Short hand for fetching/adding/removing element attributes\r\n * prefixed with 'data-validation-'\r\n *\r\n * @param {String} name\r\n * @param {String|Boolean} [val]\r\n * @return {String|undefined|jQuery}\r\n * @protected\r\n */\r\n $.fn.valAttr = function (name, val) {\r\n if (val === undefined) {\r\n return this.attr('data-validation-' + name);\r\n } else if (val === false || val === null) {\r\n return this.removeAttr('data-validation-' + name);\r\n } else {\r\n name = ((name.length > 0) ? '-' + name : '');\r\n return this.attr('data-validation' + name, val);\r\n }\r\n };\r\n\r\n /**\r\n * Function that validates all inputs in active form\r\n *\r\n * @param {Object} [language]\r\n * @param {Object} [conf]\r\n * @param {Boolean} [displayError] Defaults to true\r\n */\r\n $.fn.isValid = function (language, conf, displayError) {\r\n\r\n if ($.formUtils.isLoadingModules) {\r\n var $self = this;\r\n setTimeout(function () {\r\n $self.isValid(language, conf, displayError);\r\n }, 200);\r\n return null;\r\n }\r\n\r\n conf = $.extend({}, $.formUtils.defaultConfig(), conf || {});\r\n language = $.extend({}, $.formUtils.LANG, language || {});\r\n displayError = displayError !== false;\r\n\r\n if ($.formUtils.errorDisplayPreventedWhenHalted) {\r\n // isValid() was called programmatically with argument displayError set\r\n // to false when the validation was halted by any of the validators\r\n delete $.formUtils.errorDisplayPreventedWhenHalted;\r\n displayError = false;\r\n }\r\n\r\n $.formUtils.isValidatingEntireForm = true;\r\n $.formUtils.haltValidation = false;\r\n\r\n /**\r\n * Adds message to error message stack if not already in the message stack\r\n *\r\n * @param {String} mess\r\n * @para {jQuery} $elem\r\n */\r\n var addErrorMessage = function (mess, $elem) {\r\n if ($.inArray(mess, errorMessages) < 0) {\r\n errorMessages.push(mess);\r\n }\r\n errorInputs.push($elem);\r\n $elem.attr('current-error', mess);\r\n if (displayError) {\r\n $.formUtils.dialogs.applyInputErrorStyling($elem, conf);\r\n }\r\n },\r\n\r\n /** Holds inputs (of type checkox or radio) already validated, to prevent recheck of mulitple checkboxes & radios */\r\n checkedInputs = [],\r\n\r\n /** Error messages for this validation */\r\n errorMessages = [],\r\n\r\n /** Input elements which value was not valid */\r\n errorInputs = [],\r\n\r\n /** Form instance */\r\n $form = this,\r\n\r\n /**\r\n * Tells whether or not to validate element with this name and of this type\r\n *\r\n * @param {String} name\r\n * @param {String} type\r\n * @return {Boolean}\r\n */\r\n ignoreInput = function (name, type) {\r\n if (type === 'submit' || type === 'button' || type === 'reset') {\r\n return true;\r\n }\r\n return $.inArray(name, conf.ignore || []) > -1;\r\n };\r\n\r\n // Reset style and remove error class\r\n if (displayError) {\r\n $.formUtils.dialogs.removeAllMessagesAndStyling($form, conf);\r\n }\r\n\r\n // Validate element values\r\n $form.find('input,textarea,select').filter(':not([type=\"submit\"],[type=\"button\"])').each(function () {\r\n var $elem = $(this),\r\n elementType = $elem.attr('type'),\r\n isCheckboxOrRadioBtn = elementType === 'radio' || elementType === 'checkbox',\r\n elementName = $elem.attr('name');\r\n\r\n if (!ignoreInput(elementName, elementType) && (!isCheckboxOrRadioBtn || $.inArray(elementName, checkedInputs) < 0)) {\r\n\r\n if (isCheckboxOrRadioBtn) {\r\n checkedInputs.push(elementName);\r\n }\r\n\r\n var result = $.formUtils.validateInput(\r\n $elem,\r\n language,\r\n conf,\r\n $form,\r\n 'submit'\r\n );\r\n\r\n if (!result.isValid) {\r\n addErrorMessage(result.errorMsg, $elem);\r\n } else if (result.isValid && result.shouldChangeDisplay) {\r\n $elem.valAttr('current-error', false);\r\n $.formUtils.dialogs.applyInputSuccessStyling($elem, conf);\r\n }\r\n }\r\n\r\n });\r\n\r\n // Run validation callback\r\n if (typeof conf.onValidate === 'function') {\r\n var errors = conf.onValidate($form);\r\n if ($.isArray(errors)) {\r\n $.each(errors, function (i, err) {\r\n addErrorMessage(err.message, err.element);\r\n });\r\n }\r\n else if (errors && errors.element && errors.message) {\r\n addErrorMessage(errors.message, errors.element);\r\n }\r\n }\r\n\r\n // Reset form validation flag\r\n $.formUtils.isValidatingEntireForm = false;\r\n\r\n // Validation failed\r\n if (!$.formUtils.haltValidation && errorInputs.length > 0) {\r\n\r\n if (displayError) {\r\n\r\n if (conf.errorMessagePosition === 'top') {\r\n $.formUtils.dialogs.setMessageInTopOfForm($form, errorMessages, conf, language);\r\n } else {\r\n $.each(errorInputs, function (i, $input) {\r\n $.formUtils.dialogs.setInlineMessage($input, $input.attr('current-error'), conf);\r\n });\r\n }\r\n if (conf.scrollToTopOnError) {\r\n $.formUtils.$win.scrollTop($form.offset().top - 20);\r\n }\r\n\r\n }\r\n\r\n return false;\r\n }\r\n\r\n if (!displayError && $.formUtils.haltValidation) {\r\n $.formUtils.errorDisplayPreventedWhenHalted = true;\r\n }\r\n\r\n return !$.formUtils.haltValidation;\r\n };\r\n\r\n /**\r\n * Plugin for displaying input length restriction\r\n */\r\n $.fn.restrictLength = function (maxLengthElement) {\r\n new $.formUtils.lengthRestriction(this, maxLengthElement);\r\n return this;\r\n };\r\n\r\n /**\r\n * Add suggestion dropdown to inputs having data-suggestions with a comma\r\n * separated string with suggestions\r\n * @param {Array} [settings]\r\n * @returns {jQuery}\r\n */\r\n $.fn.addSuggestions = function (settings) {\r\n var sugs = false;\r\n this.find('input').each(function () {\r\n var $field = $(this);\r\n\r\n sugs = $.split($field.attr('data-suggestions'));\r\n\r\n if (sugs.length > 0 && !$field.hasClass('has-suggestions')) {\r\n $.formUtils.suggest($field, sugs, settings);\r\n $field.addClass('has-suggestions');\r\n }\r\n });\r\n return this;\r\n };\r\n\r\n\r\n })(jQuery, window);\r\n\r\n /**\r\n * Utility methods used for handling loading of modules (attached to $.formUtils)\r\n */\r\n (function($) {\r\n\r\n 'use strict';\r\n\r\n $.formUtils = $.extend($.formUtils || {}, {\r\n\r\n /**\r\n * @var {Boolean}\r\n */\r\n isLoadingModules: false,\r\n\r\n /**\r\n * @var {Object}\r\n */\r\n loadedModules: {},\r\n\r\n /**\r\n * @example\r\n * $.formUtils.loadModules('date, security.dev');\r\n *\r\n * Will load the scripts date.js and security.dev.js from the\r\n * directory where this script resides. If you want to load\r\n * the modules from another directory you can use the\r\n * path argument.\r\n *\r\n * The script will be cached by the browser unless the module\r\n * name ends with .dev\r\n *\r\n * @param {String} modules - Comma separated string with module file names (no directory nor file extension)\r\n * @param {String} [path] - Optional, path where the module files is located if their not in the same directory as the core modules\r\n * @param {function} [callback] - Optional, whether or not to fire event 'load' when modules finished loading\r\n */\r\n loadModules: function (modules, path, callback) {\r\n\r\n if ($.formUtils.isLoadingModules) {\r\n setTimeout(function () {\r\n $.formUtils.loadModules(modules, path, callback);\r\n }, 10);\r\n return;\r\n }\r\n\r\n var hasLoadedAnyModule = false,\r\n loadModuleScripts = function (modules, path) {\r\n\r\n var moduleList = $.split(modules),\r\n numModules = moduleList.length,\r\n moduleLoadedCallback = function () {\r\n numModules--;\r\n if (numModules === 0) {\r\n $.formUtils.isLoadingModules = false;\r\n if (callback && hasLoadedAnyModule) {\r\n if( typeof callback === 'function' ) {\r\n callback();\r\n }\r\n }\r\n }\r\n };\r\n\r\n\r\n if (numModules > 0) {\r\n $.formUtils.isLoadingModules = true;\r\n }\r\n\r\n var cacheSuffix = '?_=' + ( new Date().getTime() ),\r\n appendToElement = document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0];\r\n\r\n $.each(moduleList, function (i, modName) {\r\n modName = $.trim(modName);\r\n if (modName.length === 0) {\r\n moduleLoadedCallback();\r\n }\r\n else {\r\n var scriptUrl = path + modName + (modName.slice(-3) === '.js' ? '' : '.js'),\r\n script = document.createElement('SCRIPT');\r\n\r\n if (scriptUrl in $.formUtils.loadedModules) {\r\n // already loaded\r\n moduleLoadedCallback();\r\n }\r\n else {\r\n\r\n // Remember that this script is loaded\r\n $.formUtils.loadedModules[scriptUrl] = 1;\r\n hasLoadedAnyModule = true;\r\n\r\n // Load the script\r\n script.type = 'text/javascript';\r\n script.onload = moduleLoadedCallback;\r\n script.src = scriptUrl + ( scriptUrl.slice(-7) === '.dev.js' ? cacheSuffix : '' );\r\n script.onerror = function() {\r\n $.formUtils.warn('Unable to load form validation module '+scriptUrl);\r\n };\r\n script.onreadystatechange = function () {\r\n // IE 7 fix\r\n if (this.readyState === 'complete' || this.readyState === 'loaded') {\r\n moduleLoadedCallback();\r\n // Handle memory leak in IE\r\n this.onload = null;\r\n this.onreadystatechange = null;\r\n }\r\n };\r\n appendToElement.appendChild(script);\r\n }\r\n }\r\n });\r\n };\r\n\r\n if (path) {\r\n loadModuleScripts(modules, path);\r\n } else {\r\n var findScriptPathAndLoadModules = function () {\r\n var foundPath = false;\r\n $('script[src*=\"form-validator\"]').each(function () {\r\n foundPath = this.src.substr(0, this.src.lastIndexOf('/')) + '/';\r\n if (foundPath === '/') {\r\n foundPath = '';\r\n }\r\n return false;\r\n });\r\n\r\n if (foundPath !== false) {\r\n loadModuleScripts(modules, foundPath);\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n if (!findScriptPathAndLoadModules()) {\r\n $(findScriptPathAndLoadModules);\r\n }\r\n }\r\n }\r\n\r\n });\r\n\r\n })(jQuery);\r\n\r\n /**\r\n * Setup function for the plugin\r\n */\r\n (function ($) {\r\n\r\n 'use strict';\r\n\r\n\r\n /**\r\n * A bit smarter split function\r\n * delimiter can be space, comma, dash or pipe\r\n * @param {String} val\r\n * @param {Function|String} [callback]\r\n * @returns {Array|void}\r\n */\r\n $.split = function (val, callback) {\r\n if (typeof callback !== 'function') {\r\n // return array\r\n if (!val) {\r\n return [];\r\n }\r\n var values = [];\r\n $.each(val.split(callback ? callback : /[,|\\-\\s]\\s*/g),\r\n function (i, str) {\r\n str = $.trim(str);\r\n if (str.length) {\r\n values.push(str);\r\n }\r\n }\r\n );\r\n return values;\r\n } else if (val) {\r\n // exec callback func on each\r\n $.each(val.split(/[,|\\-\\s]\\s*/g),\r\n function (i, str) {\r\n str = $.trim(str);\r\n if (str.length) {\r\n return callback(str, i);\r\n }\r\n }\r\n );\r\n }\r\n };\r\n\r\n /**\r\n * Short hand function that makes the validation setup require less code\r\n * @param conf\r\n */\r\n $.validate = function (conf) {\r\n\r\n var defaultConf = $.extend($.formUtils.defaultConfig(), {\r\n form: 'form',\r\n validateOnEvent: false,\r\n validateOnBlur: true,\r\n validateCheckboxRadioOnClick: true,\r\n showHelpOnFocus: true,\r\n addSuggestions: true,\r\n modules: '',\r\n onModulesLoaded: null,\r\n language: false,\r\n onSuccess: false,\r\n onError: false,\r\n onElementValidate: false\r\n });\r\n\r\n conf = $.extend(defaultConf, conf || {});\r\n\r\n if( conf.lang && conf.lang !== 'en' ) {\r\n var langModule = 'lang/'+conf.lang+'.js';\r\n conf.modules += conf.modules.length ? ','+langModule : langModule;\r\n }\r\n\r\n // Add validation to forms\r\n $(conf.form).each(function (i, form) {\r\n\r\n // Make a reference to the config for this form\r\n form.validationConfig = conf;\r\n\r\n // Trigger jQuery event that we're about to setup validation\r\n var $form = $(form);\r\n // $.formUtils.$win.trigger('formValidationSetup', [$form, conf]);\r\n $form.trigger('formValidationSetup', [$form, conf]);\r\n\r\n // Remove classes and event handlers that might have been\r\n // added by a previous call to $.validate\r\n $form.find('.has-help-txt')\r\n .unbind('focus.validation')\r\n .unbind('blur.validation');\r\n\r\n $form\r\n .removeClass('has-validation-callback')\r\n .unbind('submit.validation')\r\n .unbind('reset.validation')\r\n .find('input[data-validation],textarea[data-validation]')\r\n .unbind('blur.validation');\r\n\r\n // Validate when submitted\r\n $form.bind('submit.validation', function (evt) {\r\n\r\n var $form = $(this),\r\n stop = function() {\r\n evt.stopImmediatePropagation();\r\n return false;\r\n };\r\n\r\n if ($.formUtils.haltValidation) {\r\n // pressing several times on submit button while validation is halted\r\n return stop();\r\n }\r\n\r\n if ($.formUtils.isLoadingModules) {\r\n setTimeout(function () {\r\n $form.trigger('submit.validation');\r\n }, 200);\r\n return stop();\r\n }\r\n\r\n var valid = $form.isValid(conf.language, conf);\r\n\r\n if ($.formUtils.haltValidation) {\r\n // Validation got halted by one of the validators\r\n return stop();\r\n } else {\r\n if (valid && typeof conf.onSuccess === 'function') {\r\n var callbackResponse = conf.onSuccess($form);\r\n if (callbackResponse === false) {\r\n return stop();\r\n }\r\n } else if (!valid && typeof conf.onError === 'function') {\r\n conf.onError($form);\r\n return stop();\r\n } else {\r\n return valid ? true : stop();\r\n }\r\n }\r\n })\r\n .bind('reset.validation', function () {\r\n $.formUtils.dialogs.removeAllMessagesAndStyling($form, conf);\r\n })\r\n .addClass('has-validation-callback');\r\n\r\n if (conf.showHelpOnFocus) {\r\n $form.showHelpOnFocus();\r\n }\r\n if (conf.addSuggestions) {\r\n $form.addSuggestions();\r\n }\r\n if (conf.validateOnBlur) {\r\n $form.validateOnBlur(conf.language, conf);\r\n $form.bind('html5ValidationAttrsFound', function () {\r\n $form.validateOnBlur(conf.language, conf);\r\n });\r\n }\r\n if (conf.validateOnEvent) {\r\n $form.validateOnEvent(conf.language, conf);\r\n }\r\n });\r\n\r\n if (conf.modules !== '') {\r\n $.formUtils.loadModules(conf.modules, false, function() {\r\n if (typeof conf.onModulesLoaded === 'function') {\r\n conf.onModulesLoaded();\r\n }\r\n var $form = typeof conf.form === 'string' ? $(conf.form) : conf.form;\r\n $.formUtils.$win.trigger('validatorsLoaded', [$form, conf]);\r\n });\r\n }\r\n };\r\n\r\n })(jQuery);\r\n\r\n /**\r\n * Utility methods and properties attached to $.formUtils\r\n */\r\n (function($, window) {\r\n\r\n 'use strict';\r\n\r\n var $win = $(window);\r\n\r\n $.formUtils = $.extend($.formUtils || {}, {\r\n\r\n $win: $win,\r\n\r\n /**\r\n * Default config for $(...).isValid();\r\n */\r\n defaultConfig: function () {\r\n return {\r\n ignore: [], // Names of inputs not to be validated even though `validationRuleAttribute` containing the validation rules tells us to\r\n errorElementClass: 'error', // Class that will be put on elements which value is invalid\r\n borderColorOnError: '#b94a48', // Border color of elements which value is invalid, empty string to not change border color\r\n errorMessageClass: 'form-error', // class name of div containing error messages when validation fails\r\n validationRuleAttribute: 'data-validation', // name of the attribute holding the validation rules\r\n validationErrorMsgAttribute: 'data-validation-error-msg', // define custom err msg inline with element\r\n errorMessagePosition: 'inline', // Can be either \"top\" or \"inline\"\r\n errorMessageTemplate: {\r\n container: '
      {messages}
      ',\r\n messages: '{errorTitle}
        {fields}
      ',\r\n field: '
    • {msg}
    • '\r\n },\r\n scrollToTopOnError: true,\r\n dateFormat: 'yyyy-mm-dd',\r\n addValidClassOnAll: false, // whether or not to apply class=\"valid\" even if the input wasn't validated\r\n decimalSeparator: '.',\r\n inputParentClassOnError: 'has-error', // twitter-bootstrap default class name\r\n inputParentClassOnSuccess: 'has-success', // twitter-bootstrap default class name\r\n validateHiddenInputs: false, // whether or not hidden inputs should be validated\r\n inlineErrorMessageCallback: false,\r\n submitErrorMessageCallback: false\r\n };\r\n },\r\n\r\n /**\r\n * Available validators\r\n */\r\n validators: {},\r\n\r\n /**\r\n * Events triggered by form validator\r\n */\r\n _events: {load: [], valid: [], invalid: []},\r\n\r\n /**\r\n * Setting this property to true during validation will\r\n * stop further validation from taking place and form will\r\n * not be sent\r\n */\r\n haltValidation: false,\r\n\r\n /**\r\n * This variable will be true $.fn.isValid() is called\r\n * and false when $.fn.validateOnBlur is called\r\n */\r\n isValidatingEntireForm: false,\r\n\r\n /**\r\n * Function for adding a validator\r\n * @param {Object} validator\r\n */\r\n addValidator: function (validator) {\r\n // prefix with \"validate_\" for backward compatibility reasons\r\n var name = validator.name.indexOf('validate_') === 0 ? validator.name : 'validate_' + validator.name;\r\n if (validator.validateOnKeyUp === undefined) {\r\n validator.validateOnKeyUp = true;\r\n }\r\n this.validators[name] = validator;\r\n },\r\n\r\n /**\r\n * Warn user via the console if available\r\n */\r\n warn: function(msg) {\r\n if( 'console' in window ) {\r\n if( typeof window.console.warn === 'function' ) {\r\n window.console.warn(msg);\r\n } else if( typeof window.console.log === 'function' ) {\r\n window.console.log(msg);\r\n }\r\n } else {\r\n alert(msg);\r\n }\r\n },\r\n\r\n /**\r\n * Same as input $.fn.val() but also supporting input of typ radio or checkbox\r\n * @example\r\n *\r\n * $.formUtils.getValue('.myRadioButtons', $('#some-form'));\r\n * $.formUtils.getValue($('#some-form').find('.check-boxes'));\r\n *\r\n * @param query\r\n * @param $parent\r\n * @returns {String|Boolean}\r\n */\r\n getValue: function(query, $parent) {\r\n var $inputs = $parent ? $parent.find(query) : query;\r\n if ($inputs.length > 0 ) {\r\n var type = $inputs.eq(0).attr('type');\r\n if (type === 'radio' || type === 'checkbox') {\r\n return $inputs.filter(':checked').val();\r\n } else {\r\n return $inputs.val();\r\n }\r\n }\r\n return false;\r\n },\r\n\r\n /**\r\n * Validate the value of given element according to the validation rules\r\n * found in the attribute data-validation. Will return an object representing\r\n * a validation result, having the props shouldChangeDisplay, isValid and errorMsg\r\n * @param {jQuery} $elem\r\n * @param {Object} language ($.formUtils.LANG)\r\n * @param {Object} conf\r\n * @param {jQuery} $form\r\n * @param {String} [eventContext]\r\n * @return {Object}\r\n */\r\n validateInput: function ($elem, language, conf, $form, eventContext) {\r\n\r\n conf = conf || $.formUtils.defaultConfig();\r\n language = language || $.formUtils.LANG;\r\n\r\n var value = this.getValue($elem);\r\n\r\n $elem\r\n .valAttr('skipped', false)\r\n .one('beforeValidation', function() {\r\n // Skip input because its hidden or disabled\r\n // Doing this in a callback makes it possible for others to prevent the default\r\n // behaviour by binding to the same event and call evt.stopImmediatePropagation()\r\n if ($elem.attr('disabled') || (!$elem.is(':visible') && !conf.validateHiddenInputs)) {\r\n $elem.valAttr('skipped', 1);\r\n }\r\n })\r\n .trigger('beforeValidation', [value, conf, language]);\r\n\r\n\r\n var inputIsOptional = $elem.valAttr('optional') === 'true',\r\n skipBecauseItsEmpty = !value && inputIsOptional,\r\n validationRules = $elem.attr(conf.validationRuleAttribute),\r\n isValid = true,\r\n errorMsg = '',\r\n result = {isValid: true, shouldChangeDisplay:true, errorMsg:''};\r\n\r\n // For input type=\"number\", browsers attempt to parse the entered value into a number.\r\n // If the input is not numeric, browsers handle the situation differently:\r\n // Chrome 48 simply disallows non-numeric input; FF 44 clears out the input box on blur;\r\n // Safari 5 parses the entered string to find a leading number.\r\n // If the input fails browser validation, the browser sets the input value equal to an empty string.\r\n // Therefore, we cannot distinguish (apart from hacks) between an empty input type=\"text\" and one with a\r\n // value that can't be parsed by the browser.\r\n\r\n if (!validationRules || skipBecauseItsEmpty || $elem.valAttr('skipped')) {\r\n result.shouldChangeDisplay = conf.addValidClassOnAll;\r\n return result;\r\n }\r\n\r\n // Filter out specified characters\r\n var ignore = $elem.valAttr('ignore');\r\n if (ignore) {\r\n $.each(ignore.split(''), function(i, char) {\r\n value = value.replace(new RegExp('\\\\'+char), '');\r\n });\r\n }\r\n\r\n $.split(validationRules, function (rule) {\r\n\r\n if (rule.indexOf('validate_') !== 0) {\r\n rule = 'validate_' + rule;\r\n }\r\n\r\n var validator = $.formUtils.validators[rule];\r\n\r\n if (validator) {\r\n\r\n // special change of element for checkbox_group rule\r\n if (rule === 'validate_checkbox_group') {\r\n // set element to first in group, so error msg attr doesn't need to be set on all elements in group\r\n $elem = $form.find('[name=\"' + $elem.attr('name') + '\"]:eq(0)');\r\n }\r\n\r\n if (eventContext !== 'keyup' || validator.validateOnKeyUp) {\r\n // A validator can prevent itself from getting triggered on keyup\r\n isValid = validator.validatorFunction(value, $elem, conf, language, $form);\r\n }\r\n\r\n if (!isValid) {\r\n errorMsg = $.formUtils.dialogs.resolveErrorMessage($elem, validator, rule, conf, language);\r\n return false; // break iteration\r\n }\r\n\r\n } else {\r\n\r\n // todo: Add some validator lookup function and tell immediately which module is missing\r\n throw new Error('Using undefined validator \"' + rule +\r\n '\". Maybe you have forgotten to load the module that \"' + rule +'\" belongs to?');\r\n\r\n }\r\n\r\n }, ' ');\r\n\r\n\r\n if (isValid === false) {\r\n $elem.trigger('validation', false);\r\n result.errorMsg = errorMsg;\r\n result.isValid = false;\r\n result.shouldChangeDisplay = true;\r\n } else if (isValid === null) {\r\n // A validatorFunction returning null means that it's not able to validate\r\n // the input at this time. Most probably some async stuff need to gets finished\r\n // first and then the validator will re-trigger the validation.\r\n result.shouldChangeDisplay = false;\r\n } else {\r\n $elem.trigger('validation', true);\r\n result.shouldChangeDisplay = true;\r\n }\r\n\r\n // Run element validation callback\r\n if (typeof conf.onElementValidate === 'function' && errorMsg !== null) {\r\n conf.onElementValidate(result.isValid, $elem, $form, errorMsg);\r\n }\r\n\r\n $elem.trigger('afterValidation', [result, eventContext]);\r\n\r\n return result;\r\n },\r\n\r\n /**\r\n * Is it a correct date according to given dateFormat. Will return false if not, otherwise\r\n * an array 0=>year 1=>month 2=>day\r\n *\r\n * @param {String} val\r\n * @param {String} dateFormat\r\n * @param {Boolean} [addMissingLeadingZeros]\r\n * @return {Array}|{Boolean}\r\n */\r\n parseDate: function (val, dateFormat, addMissingLeadingZeros) {\r\n var divider = dateFormat.replace(/[a-zA-Z]/gi, '').substring(0, 1),\r\n regexp = '^',\r\n formatParts = dateFormat.split(divider || null),\r\n matches, day, month, year;\r\n\r\n $.each(formatParts, function (i, part) {\r\n regexp += (i > 0 ? '\\\\' + divider : '') + '(\\\\d{' + part.length + '})';\r\n });\r\n\r\n regexp += '$';\r\n\r\n if (addMissingLeadingZeros) {\r\n var newValueParts = [];\r\n $.each(val.split(divider), function(i, part) {\r\n if(part.length === 1) {\r\n part = '0'+part;\r\n }\r\n newValueParts.push(part);\r\n });\r\n val = newValueParts.join(divider);\r\n }\r\n\r\n matches = val.match(new RegExp(regexp));\r\n if (matches === null) {\r\n return false;\r\n }\r\n\r\n var findDateUnit = function (unit, formatParts, matches) {\r\n for (var i = 0; i < formatParts.length; i++) {\r\n if (formatParts[i].substring(0, 1) === unit) {\r\n return $.formUtils.parseDateInt(matches[i + 1]);\r\n }\r\n }\r\n return -1;\r\n };\r\n\r\n month = findDateUnit('m', formatParts, matches);\r\n day = findDateUnit('d', formatParts, matches);\r\n year = findDateUnit('y', formatParts, matches);\r\n\r\n if ((month === 2 && day > 28 && (year % 4 !== 0 || year % 100 === 0 && year % 400 !== 0)) ||\r\n (month === 2 && day > 29 && (year % 4 === 0 || year % 100 !== 0 && year % 400 === 0)) ||\r\n month > 12 || month === 0) {\r\n return false;\r\n }\r\n if ((this.isShortMonth(month) && day > 30) || (!this.isShortMonth(month) && day > 31) || day === 0) {\r\n return false;\r\n }\r\n\r\n return [year, month, day];\r\n },\r\n\r\n /**\r\n * skum fix. är talet 05 eller lägre ger parseInt rätt int annars får man 0 när man kör parseInt?\r\n *\r\n * @param {String} val\r\n * @return {Number}\r\n */\r\n parseDateInt: function (val) {\r\n if (val.indexOf('0') === 0) {\r\n val = val.replace('0', '');\r\n }\r\n return parseInt(val, 10);\r\n },\r\n\r\n /**\r\n * Has month only 30 days?\r\n *\r\n * @param {Number} m\r\n * @return {Boolean}\r\n */\r\n isShortMonth: function (m) {\r\n return (m % 2 === 0 && m < 7) || (m % 2 !== 0 && m > 7);\r\n },\r\n\r\n /**\r\n * Restrict input length\r\n *\r\n * @param {jQuery} $inputElement Jquery Html object\r\n * @param {jQuery} $maxLengthElement jQuery Html Object\r\n * @return void\r\n */\r\n lengthRestriction: function ($inputElement, $maxLengthElement) {\r\n // read maxChars from counter display initial text value\r\n var maxChars = parseInt($maxLengthElement.text(), 10),\r\n charsLeft = 0,\r\n\r\n // internal function does the counting and sets display value\r\n countCharacters = function () {\r\n var numChars = $inputElement.val().length;\r\n if (numChars > maxChars) {\r\n // get current scroll bar position\r\n var currScrollTopPos = $inputElement.scrollTop();\r\n // trim value to max length\r\n $inputElement.val($inputElement.val().substring(0, maxChars));\r\n $inputElement.scrollTop(currScrollTopPos);\r\n }\r\n charsLeft = maxChars - numChars;\r\n if (charsLeft < 0) {\r\n charsLeft = 0;\r\n }\r\n\r\n // set counter text\r\n $maxLengthElement.text(charsLeft);\r\n };\r\n\r\n // bind events to this element\r\n // setTimeout is needed, cut or paste fires before val is available\r\n $($inputElement).bind('keydown keyup keypress focus blur', countCharacters)\r\n .bind('cut paste', function () {\r\n setTimeout(countCharacters, 100);\r\n });\r\n\r\n // count chars on pageload, if there are prefilled input-values\r\n $(document).bind('ready', countCharacters);\r\n },\r\n\r\n /**\r\n * Test numeric against allowed range\r\n *\r\n * @param $value int\r\n * @param $rangeAllowed str; (1-2, min1, max2, 10)\r\n * @return array\r\n */\r\n numericRangeCheck: function (value, rangeAllowed) {\r\n // split by dash\r\n var range = $.split(rangeAllowed),\r\n // min or max\r\n minmax = parseInt(rangeAllowed.substr(3), 10);\r\n\r\n if( range.length === 1 && rangeAllowed.indexOf('min') === -1 && rangeAllowed.indexOf('max') === -1 ) {\r\n range = [rangeAllowed, rangeAllowed]; // only a number, checking agains an exact number of characters\r\n }\r\n\r\n // range ?\r\n if (range.length === 2 && (value < parseInt(range[0], 10) || value > parseInt(range[1], 10) )) {\r\n return [ 'out', range[0], range[1] ];\r\n } // value is out of range\r\n else if (rangeAllowed.indexOf('min') === 0 && (value < minmax )) // min\r\n {\r\n return ['min', minmax];\r\n } // value is below min\r\n else if (rangeAllowed.indexOf('max') === 0 && (value > minmax )) // max\r\n {\r\n return ['max', minmax];\r\n } // value is above max\r\n // since no other returns executed, value is in allowed range\r\n return [ 'ok' ];\r\n },\r\n\r\n\r\n _numSuggestionElements: 0,\r\n _selectedSuggestion: null,\r\n _previousTypedVal: null,\r\n\r\n /**\r\n * Utility function that can be used to create plugins that gives\r\n * suggestions when inputs is typed into\r\n * @param {jQuery} $elem\r\n * @param {Array} suggestions\r\n * @param {Object} settings - Optional\r\n * @return {jQuery}\r\n */\r\n suggest: function ($elem, suggestions, settings) {\r\n var conf = {\r\n css: {\r\n maxHeight: '150px',\r\n background: '#FFF',\r\n lineHeight: '150%',\r\n textDecoration: 'underline',\r\n overflowX: 'hidden',\r\n overflowY: 'auto',\r\n border: '#CCC solid 1px',\r\n borderTop: 'none',\r\n cursor: 'pointer'\r\n },\r\n activeSuggestionCSS: {\r\n background: '#E9E9E9'\r\n }\r\n },\r\n setSuggsetionPosition = function ($suggestionContainer, $input) {\r\n var offset = $input.offset();\r\n $suggestionContainer.css({\r\n width: $input.outerWidth(),\r\n left: offset.left + 'px',\r\n top: (offset.top + $input.outerHeight()) + 'px'\r\n });\r\n };\r\n\r\n if (settings) {\r\n $.extend(conf, settings);\r\n }\r\n\r\n conf.css.position = 'absolute';\r\n conf.css['z-index'] = 9999;\r\n $elem.attr('autocomplete', 'off');\r\n\r\n if (this._numSuggestionElements === 0) {\r\n // Re-position suggestion container if window size changes\r\n $win.bind('resize', function () {\r\n $('.jquery-form-suggestions').each(function () {\r\n var $container = $(this),\r\n suggestID = $container.attr('data-suggest-container');\r\n setSuggsetionPosition($container, $('.suggestions-' + suggestID).eq(0));\r\n });\r\n });\r\n }\r\n\r\n this._numSuggestionElements++;\r\n\r\n var onSelectSuggestion = function ($el) {\r\n var suggestionId = $el.valAttr('suggestion-nr');\r\n $.formUtils._selectedSuggestion = null;\r\n $.formUtils._previousTypedVal = null;\r\n $('.jquery-form-suggestion-' + suggestionId).fadeOut('fast');\r\n };\r\n\r\n $elem\r\n .data('suggestions', suggestions)\r\n .valAttr('suggestion-nr', this._numSuggestionElements)\r\n .unbind('focus.suggest')\r\n .bind('focus.suggest', function () {\r\n $(this).trigger('keyup');\r\n $.formUtils._selectedSuggestion = null;\r\n })\r\n .unbind('keyup.suggest')\r\n .bind('keyup.suggest', function () {\r\n var $input = $(this),\r\n foundSuggestions = [],\r\n val = $.trim($input.val()).toLocaleLowerCase();\r\n\r\n if (val === $.formUtils._previousTypedVal) {\r\n return;\r\n }\r\n else {\r\n $.formUtils._previousTypedVal = val;\r\n }\r\n\r\n var hasTypedSuggestion = false,\r\n suggestionId = $input.valAttr('suggestion-nr'),\r\n $suggestionContainer = $('.jquery-form-suggestion-' + suggestionId);\r\n\r\n $suggestionContainer.scrollTop(0);\r\n\r\n // Find the right suggestions\r\n if (val !== '') {\r\n var findPartial = val.length > 2;\r\n $.each($input.data('suggestions'), function (i, suggestion) {\r\n var lowerCaseVal = suggestion.toLocaleLowerCase();\r\n if (lowerCaseVal === val) {\r\n foundSuggestions.push('' + suggestion + '');\r\n hasTypedSuggestion = true;\r\n return false;\r\n } else if (lowerCaseVal.indexOf(val) === 0 || (findPartial && lowerCaseVal.indexOf(val) > -1)) {\r\n foundSuggestions.push(suggestion.replace(new RegExp(val, 'gi'), '$&'));\r\n }\r\n });\r\n }\r\n\r\n // Hide suggestion container\r\n if (hasTypedSuggestion || (foundSuggestions.length === 0 && $suggestionContainer.length > 0)) {\r\n $suggestionContainer.hide();\r\n }\r\n\r\n // Create suggestion container if not already exists\r\n else if (foundSuggestions.length > 0 && $suggestionContainer.length === 0) {\r\n $suggestionContainer = $('
      ').css(conf.css).appendTo('body');\r\n $elem.addClass('suggestions-' + suggestionId);\r\n $suggestionContainer\r\n .attr('data-suggest-container', suggestionId)\r\n .addClass('jquery-form-suggestions')\r\n .addClass('jquery-form-suggestion-' + suggestionId);\r\n }\r\n\r\n // Show hidden container\r\n else if (foundSuggestions.length > 0 && !$suggestionContainer.is(':visible')) {\r\n $suggestionContainer.show();\r\n }\r\n\r\n // add suggestions\r\n if (foundSuggestions.length > 0 && val.length !== foundSuggestions[0].length) {\r\n\r\n // put container in place every time, just in case\r\n setSuggsetionPosition($suggestionContainer, $input);\r\n\r\n // Add suggestions HTML to container\r\n $suggestionContainer.html('');\r\n $.each(foundSuggestions, function (i, text) {\r\n $('
      ')\r\n .append(text)\r\n .css({\r\n overflow: 'hidden',\r\n textOverflow: 'ellipsis',\r\n whiteSpace: 'nowrap',\r\n padding: '5px'\r\n })\r\n .addClass('form-suggest-element')\r\n .appendTo($suggestionContainer)\r\n .click(function () {\r\n $input.focus();\r\n $input.val($(this).text());\r\n $input.trigger('change');\r\n onSelectSuggestion($input);\r\n });\r\n });\r\n }\r\n })\r\n .unbind('keydown.validation')\r\n .bind('keydown.validation', function (e) {\r\n var code = (e.keyCode ? e.keyCode : e.which),\r\n suggestionId,\r\n $suggestionContainer,\r\n $input = $(this);\r\n\r\n if (code === 13 && $.formUtils._selectedSuggestion !== null) {\r\n suggestionId = $input.valAttr('suggestion-nr');\r\n $suggestionContainer = $('.jquery-form-suggestion-' + suggestionId);\r\n if ($suggestionContainer.length > 0) {\r\n var newText = $suggestionContainer.find('div').eq($.formUtils._selectedSuggestion).text();\r\n $input.val(newText);\r\n $input.trigger('change');\r\n onSelectSuggestion($input);\r\n e.preventDefault();\r\n }\r\n }\r\n else {\r\n suggestionId = $input.valAttr('suggestion-nr');\r\n $suggestionContainer = $('.jquery-form-suggestion-' + suggestionId);\r\n var $suggestions = $suggestionContainer.children();\r\n if ($suggestions.length > 0 && $.inArray(code, [38, 40]) > -1) {\r\n if (code === 38) { // key up\r\n if ($.formUtils._selectedSuggestion === null) {\r\n $.formUtils._selectedSuggestion = $suggestions.length - 1;\r\n }\r\n else{\r\n $.formUtils._selectedSuggestion--;\r\n }\r\n if ($.formUtils._selectedSuggestion < 0) {\r\n $.formUtils._selectedSuggestion = $suggestions.length - 1;\r\n }\r\n }\r\n else if (code === 40) { // key down\r\n if ($.formUtils._selectedSuggestion === null) {\r\n $.formUtils._selectedSuggestion = 0;\r\n }\r\n else {\r\n $.formUtils._selectedSuggestion++;\r\n }\r\n if ($.formUtils._selectedSuggestion > ($suggestions.length - 1)) {\r\n $.formUtils._selectedSuggestion = 0;\r\n }\r\n }\r\n\r\n // Scroll in suggestion window\r\n var containerInnerHeight = $suggestionContainer.innerHeight(),\r\n containerScrollTop = $suggestionContainer.scrollTop(),\r\n suggestionHeight = $suggestionContainer.children().eq(0).outerHeight(),\r\n activeSuggestionPosY = suggestionHeight * ($.formUtils._selectedSuggestion);\r\n\r\n if (activeSuggestionPosY < containerScrollTop || activeSuggestionPosY > (containerScrollTop + containerInnerHeight)) {\r\n $suggestionContainer.scrollTop(activeSuggestionPosY);\r\n }\r\n\r\n $suggestions\r\n .removeClass('active-suggestion')\r\n .css('background', 'none')\r\n .eq($.formUtils._selectedSuggestion)\r\n .addClass('active-suggestion')\r\n .css(conf.activeSuggestionCSS);\r\n\r\n e.preventDefault();\r\n return false;\r\n }\r\n }\r\n })\r\n .unbind('blur.suggest')\r\n .bind('blur.suggest', function () {\r\n onSelectSuggestion($(this));\r\n });\r\n\r\n return $elem;\r\n },\r\n\r\n /**\r\n * Error dialogs\r\n *\r\n * @var {Object}\r\n */\r\n LANG: {\r\n errorTitle: 'Form submission failed!',\r\n requiredField: 'This is a required field',\r\n requiredFields: 'You have not answered all required fields',\r\n badTime: 'You have not given a correct time',\r\n badEmail: 'You have not given a correct e-mail address',\r\n badTelephone: 'You have not given a correct phone number',\r\n badSecurityAnswer: 'You have not given a correct answer to the security question',\r\n badDate: 'You have not given a correct date',\r\n lengthBadStart: 'The input value must be between ',\r\n lengthBadEnd: ' characters',\r\n lengthTooLongStart: 'The input value is longer than ',\r\n lengthTooShortStart: 'The input value is shorter than ',\r\n notConfirmed: 'Input values could not be confirmed',\r\n badDomain: 'Incorrect domain value',\r\n badUrl: 'The input value is not a correct URL',\r\n badCustomVal: 'The input value is incorrect',\r\n andSpaces: ' and spaces ',\r\n badInt: 'The input value was not a correct number',\r\n badSecurityNumber: 'Your social security number was incorrect',\r\n badUKVatAnswer: 'Incorrect UK VAT Number',\r\n badUKNin: 'Incorrect UK NIN',\r\n badUKUtr: 'Incorrect UK UTR Number',\r\n badStrength: 'The password isn\\'t strong enough',\r\n badNumberOfSelectedOptionsStart: 'You have to choose at least ',\r\n badNumberOfSelectedOptionsEnd: ' answers',\r\n badAlphaNumeric: 'The input value can only contain alphanumeric characters ',\r\n badAlphaNumericExtra: ' and ',\r\n wrongFileSize: 'The file you are trying to upload is too large (max %s)',\r\n wrongFileType: 'Only files of type %s is allowed',\r\n groupCheckedRangeStart: 'Please choose between ',\r\n groupCheckedTooFewStart: 'Please choose at least ',\r\n groupCheckedTooManyStart: 'Please choose a maximum of ',\r\n groupCheckedEnd: ' item(s)',\r\n badCreditCard: 'The credit card number is not correct',\r\n badCVV: 'The CVV number was not correct',\r\n wrongFileDim : 'Incorrect image dimensions,',\r\n imageTooTall : 'the image can not be taller than',\r\n imageTooWide : 'the image can not be wider than',\r\n imageTooSmall : 'the image was too small',\r\n min : 'min',\r\n max : 'max',\r\n imageRatioNotAccepted : 'Image ratio is not be accepted',\r\n badBrazilTelephoneAnswer: 'The phone number entered is invalid',\r\n badBrazilCEPAnswer: 'The CEP entered is invalid',\r\n badBrazilCPFAnswer: 'The CPF entered is invalid',\r\n badPlPesel: 'The PESEL entered is invalid',\r\n badPlNip: 'The NIP entered is invalid',\r\n badPlRegon: 'The REGON entered is invalid',\r\n badreCaptcha: 'Please confirm that you are not a bot'\r\n }\r\n });\r\n\r\n })(jQuery, window);\r\n\r\n /**\r\n * File declaring all default validators.\r\n */\r\n (function($) {\r\n\r\n /*\r\n * Validate email\r\n */\r\n $.formUtils.addValidator({\r\n name: 'email',\r\n validatorFunction: function (email) {\r\n\r\n var emailParts = email.toLowerCase().split('@'),\r\n localPart = emailParts[0],\r\n domain = emailParts[1];\r\n\r\n if (localPart && domain) {\r\n\r\n if( localPart.indexOf('\"') === 0 ) {\r\n var len = localPart.length;\r\n localPart = localPart.replace(/\\\"/g, '');\r\n if( localPart.length !== (len-2) ) {\r\n return false; // It was not allowed to have more than two apostrophes\r\n }\r\n }\r\n\r\n return $.formUtils.validators.validate_domain.validatorFunction(emailParts[1]) &&\r\n localPart.indexOf('.') !== 0 &&\r\n localPart.substring(localPart.length-1, localPart.length) !== '.' &&\r\n localPart.indexOf('..') === -1 &&\r\n !(/[^\\w\\+\\.\\-\\#\\-\\_\\~\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=\\:]/.test(localPart));\r\n }\r\n\r\n return false;\r\n },\r\n errorMessage: '',\r\n errorMessageKey: 'badEmail'\r\n });\r\n\r\n /*\r\n * Validate domain name\r\n */\r\n $.formUtils.addValidator({\r\n name: 'domain',\r\n validatorFunction: function (val) {\r\n return val.length > 0 &&\r\n val.length <= 253 && // Including sub domains\r\n !(/[^a-zA-Z0-9]/.test(val.slice(-2))) && !(/[^a-zA-Z0-9]/.test(val.substr(0, 1))) && !(/[^a-zA-Z0-9\\.\\-]/.test(val)) &&\r\n val.split('..').length === 1 &&\r\n val.split('.').length > 1;\r\n },\r\n errorMessage: '',\r\n errorMessageKey: 'badDomain'\r\n });\r\n\r\n /*\r\n * Validate required\r\n */\r\n $.formUtils.addValidator({\r\n name: 'required',\r\n validatorFunction: function (val, $el, config, language, $form) {\r\n switch ($el.attr('type')) {\r\n case 'checkbox':\r\n return $el.is(':checked');\r\n case 'radio':\r\n return $form.find('input[name=\"' + $el.attr('name') + '\"]').filter(':checked').length > 0;\r\n default:\r\n return $.trim(val) !== '';\r\n }\r\n },\r\n errorMessage: '',\r\n errorMessageKey: function(config) {\r\n if (config.errorMessagePosition === 'top' || typeof config.errorMessagePosition === 'function') {\r\n return 'requiredFields';\r\n }\r\n else {\r\n return 'requiredField';\r\n }\r\n }\r\n });\r\n\r\n /*\r\n * Validate length range\r\n */\r\n $.formUtils.addValidator({\r\n name: 'length',\r\n validatorFunction: function (val, $el, conf, lang) {\r\n var lengthAllowed = $el.valAttr('length'),\r\n type = $el.attr('type');\r\n\r\n if (lengthAllowed === undefined) {\r\n alert('Please add attribute \"data-validation-length\" to ' + $el[0].nodeName + ' named ' + $el.attr('name'));\r\n return true;\r\n }\r\n\r\n // check if length is above min, below max or within range.\r\n var len = type === 'file' && $el.get(0).files !== undefined ? $el.get(0).files.length : val.length,\r\n lengthCheckResults = $.formUtils.numericRangeCheck(len, lengthAllowed),\r\n checkResult;\r\n\r\n switch (lengthCheckResults[0]) { // outside of allowed range\r\n case 'out':\r\n this.errorMessage = lang.lengthBadStart + lengthAllowed + lang.lengthBadEnd;\r\n checkResult = false;\r\n break;\r\n // too short\r\n case 'min':\r\n this.errorMessage = lang.lengthTooShortStart + lengthCheckResults[1] + lang.lengthBadEnd;\r\n checkResult = false;\r\n break;\r\n // too long\r\n case 'max':\r\n this.errorMessage = lang.lengthTooLongStart + lengthCheckResults[1] + lang.lengthBadEnd;\r\n checkResult = false;\r\n break;\r\n // ok\r\n default:\r\n checkResult = true;\r\n }\r\n\r\n return checkResult;\r\n },\r\n errorMessage: '',\r\n errorMessageKey: ''\r\n });\r\n\r\n /*\r\n * Validate url\r\n */\r\n $.formUtils.addValidator({\r\n name: 'url',\r\n validatorFunction: function (url) {\r\n // written by Scott Gonzalez: http://projects.scottsplayground.com/iri/\r\n // - Victor Jonsson added support for arrays in the url ?arg[]=sdfsdf\r\n // - General improvements made by Stéphane Moureau \r\n\r\n var urlFilter = /^(https?|ftp):\\/\\/((((\\w|-|\\.|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])(\\w|-|\\.|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])(\\w|-|\\.|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/(((\\w|-|\\.|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/((\\w|-|\\.|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|\\[|\\]|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(\\#(((\\w|-|\\.|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i;\r\n if (urlFilter.test(url)) {\r\n var domain = url.split('://')[1],\r\n domainSlashPos = domain.indexOf('/');\r\n\r\n if (domainSlashPos > -1) {\r\n domain = domain.substr(0, domainSlashPos);\r\n }\r\n\r\n return $.formUtils.validators.validate_domain.validatorFunction(domain); // todo: add support for IP-addresses\r\n }\r\n return false;\r\n },\r\n errorMessage: '',\r\n errorMessageKey: 'badUrl'\r\n });\r\n\r\n /*\r\n * Validate number (floating or integer)\r\n */\r\n $.formUtils.addValidator({\r\n name: 'number',\r\n validatorFunction: function (val, $el, conf) {\r\n if (val !== '') {\r\n var allowing = $el.valAttr('allowing') || '',\r\n decimalSeparator = $el.valAttr('decimal-separator') || conf.decimalSeparator,\r\n allowsRange = false,\r\n begin, end,\r\n steps = $el.valAttr('step') || '',\r\n allowsSteps = false,\r\n sanitize = $el.attr('data-sanitize') || '',\r\n isFormattedWithNumeral = sanitize.match(/(^|[\\s])numberFormat([\\s]|$)/i);\r\n\r\n if (isFormattedWithNumeral) {\r\n if (!window.numeral) {\r\n throw new ReferenceError('The data-sanitize value numberFormat cannot be used without the numeral' +\r\n ' library. Please see Data Validation in http://www.formvalidator.net for more information.');\r\n }\r\n //Unformat input first, then convert back to String\r\n if (val.length) {\r\n val = String(numeral().unformat(val));\r\n }\r\n }\r\n\r\n if (allowing.indexOf('number') === -1) {\r\n allowing += ',number';\r\n }\r\n\r\n if (allowing.indexOf('negative') === -1 && val.indexOf('-') === 0) {\r\n return false;\r\n }\r\n\r\n if (allowing.indexOf('range') > -1) {\r\n begin = parseFloat(allowing.substring(allowing.indexOf('[') + 1, allowing.indexOf(';')));\r\n end = parseFloat(allowing.substring(allowing.indexOf(';') + 1, allowing.indexOf(']')));\r\n allowsRange = true;\r\n }\r\n\r\n if (steps !== '') {\r\n allowsSteps = true;\r\n }\r\n\r\n if (decimalSeparator === ',') {\r\n if (val.indexOf('.') > -1) {\r\n return false;\r\n }\r\n // Fix for checking range with floats using ,\r\n val = val.replace(',', '.');\r\n }\r\n if (val.replace(/[0-9-]/g, '') === '' && (!allowsRange || (val >= begin && val <= end)) && (!allowsSteps || (val % steps === 0))) {\r\n return true;\r\n }\r\n\r\n if (allowing.indexOf('float') > -1 && val.match(new RegExp('^([0-9-]+)\\\\.([0-9]+)$')) !== null && (!allowsRange || (val >= begin && val <= end)) && (!allowsSteps || (val % steps === 0))) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n errorMessage: '',\r\n errorMessageKey: 'badInt'\r\n });\r\n\r\n /*\r\n * Validate alpha numeric\r\n */\r\n $.formUtils.addValidator({\r\n name: 'alphanumeric',\r\n validatorFunction: function (val, $el, conf, language) {\r\n var patternStart = '^([a-zA-Z0-9',\r\n patternEnd = ']+)$',\r\n additionalChars = $el.valAttr('allowing'),\r\n pattern = '';\r\n\r\n if (additionalChars) {\r\n pattern = patternStart + additionalChars + patternEnd;\r\n var extra = additionalChars.replace(/\\\\/g, '');\r\n if (extra.indexOf(' ') > -1) {\r\n extra = extra.replace(' ', '');\r\n extra += language.andSpaces || $.formUtils.LANG.andSpaces;\r\n }\r\n this.errorMessage = language.badAlphaNumeric + language.badAlphaNumericExtra + extra;\r\n } else {\r\n pattern = patternStart + patternEnd;\r\n this.errorMessage = language.badAlphaNumeric;\r\n }\r\n\r\n return new RegExp(pattern).test(val);\r\n },\r\n errorMessage: '',\r\n errorMessageKey: ''\r\n });\r\n\r\n /*\r\n * Validate against regexp\r\n */\r\n $.formUtils.addValidator({\r\n name: 'custom',\r\n validatorFunction: function (val, $el) {\r\n var regexp = new RegExp($el.valAttr('regexp'));\r\n return regexp.test(val);\r\n },\r\n errorMessage: '',\r\n errorMessageKey: 'badCustomVal'\r\n });\r\n\r\n /*\r\n * Validate date\r\n */\r\n $.formUtils.addValidator({\r\n name: 'date',\r\n validatorFunction: function (date, $el, conf) {\r\n var dateFormat = $el.valAttr('format') || conf.dateFormat || 'yyyy-mm-dd',\r\n addMissingLeadingZeros = $el.valAttr('require-leading-zero') === 'false';\r\n return $.formUtils.parseDate(date, dateFormat, addMissingLeadingZeros) !== false;\r\n },\r\n errorMessage: '',\r\n errorMessageKey: 'badDate'\r\n });\r\n\r\n\r\n /*\r\n * Validate group of checkboxes, validate qty required is checked\r\n * written by Steve Wasiura : http://stevewasiura.waztech.com\r\n * element attrs\r\n * data-validation=\"checkbox_group\"\r\n * data-validation-qty=\"1-2\" // min 1 max 2\r\n * data-validation-error-msg=\"chose min 1, max of 2 checkboxes\"\r\n */\r\n $.formUtils.addValidator({\r\n name: 'checkbox_group',\r\n validatorFunction: function (val, $el, conf, lang, $form) {\r\n // preset return var\r\n var isValid = true,\r\n // get name of element. since it is a checkbox group, all checkboxes will have same name\r\n elname = $el.attr('name'),\r\n // get checkboxes and count the checked ones\r\n $checkBoxes = $('input[type=checkbox][name^=\"' + elname + '\"]', $form),\r\n checkedCount = $checkBoxes.filter(':checked').length,\r\n // get el attr that specs qty required / allowed\r\n qtyAllowed = $el.valAttr('qty');\r\n\r\n if (qtyAllowed === undefined) {\r\n var elementType = $el.get(0).nodeName;\r\n alert('Attribute \"data-validation-qty\" is missing from ' + elementType + ' named ' + $el.attr('name'));\r\n }\r\n\r\n // call Utility function to check if count is above min, below max, within range etc.\r\n var qtyCheckResults = $.formUtils.numericRangeCheck(checkedCount, qtyAllowed);\r\n\r\n // results will be array, [0]=result str, [1]=qty int\r\n switch (qtyCheckResults[0]) {\r\n // outside allowed range\r\n case 'out':\r\n this.errorMessage = lang.groupCheckedRangeStart + qtyAllowed + lang.groupCheckedEnd;\r\n isValid = false;\r\n break;\r\n // below min qty\r\n case 'min':\r\n this.errorMessage = lang.groupCheckedTooFewStart + qtyCheckResults[1] + lang.groupCheckedEnd;\r\n isValid = false;\r\n break;\r\n // above max qty\r\n case 'max':\r\n this.errorMessage = lang.groupCheckedTooManyStart + qtyCheckResults[1] + lang.groupCheckedEnd;\r\n isValid = false;\r\n break;\r\n // ok\r\n default:\r\n isValid = true;\r\n }\r\n\r\n if( !isValid ) {\r\n var _triggerOnBlur = function() {\r\n $checkBoxes.unbind('click', _triggerOnBlur);\r\n $checkBoxes.filter('*[data-validation]').validateInputOnBlur(lang, conf, false, 'blur');\r\n };\r\n $checkBoxes.bind('click', _triggerOnBlur);\r\n }\r\n\r\n return isValid;\r\n }\r\n // errorMessage : '', // set above in switch statement\r\n // errorMessageKey: '' // not used\r\n });\r\n\r\n $.formUtils.addValidator({\r\n name: 'confirmation',\r\n validatorFunction: function (value, $el, config, language, $form) {\r\n var password,\r\n passwordInputName = $el.valAttr('confirm') ||\r\n ($el.attr('name') + '_confirmation'),\r\n $passwordInput = $form.find('[name=\"' + passwordInputName + '\"]');\r\n if (!$passwordInput.length) {\r\n $.formUtils.warn('Password confirmation validator: could not find an input ' +\r\n 'with name \"' + passwordInputName + '\"', true);\r\n return false;\r\n }\r\n\r\n password = $passwordInput.val();\r\n if (config.validateOnBlur && !$passwordInput[0].hasValidationCallback) {\r\n $passwordInput[0].hasValidationCallback = true;\r\n var keyUpCallback = function () {\r\n $el.validate();\r\n };\r\n $passwordInput.on('keyup', keyUpCallback);\r\n $form.one('formValidationSetup', function () {\r\n $passwordInput[0].hasValidationCallback = false;\r\n $passwordInput.off('keyup', keyUpCallback);\r\n });\r\n }\r\n\r\n return value === password;\r\n },\r\n errorMessage: '',\r\n errorMessageKey: 'notConfirmed'\r\n });\r\n\r\n })(jQuery);\r\n\r\n\r\n}));\n\n//# sourceURL=webpack:///./src/public/js/vendor/formvalidator/jquery.form-validator.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/jquery/jquery.js": -/*!***********************************************!*\ - !*** ./src/public/js/vendor/jquery/jquery.js ***! - \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * jQuery JavaScript Library v2.2.4\r\n * http://jquery.com/\r\n *\r\n * Includes Sizzle.js\r\n * http://sizzlejs.com/\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license\r\n * http://jquery.org/license\r\n *\r\n * Date: 2016-05-20T17:23Z\r\n */\r\n\r\n(function( global, factory ) {\r\n\r\n if ( true && typeof module.exports === \"object\" ) {\r\n // For CommonJS and CommonJS-like environments where a proper `window`\r\n // is present, execute the factory and get jQuery.\r\n // For environments that do not have a `window` with a `document`\r\n // (such as Node.js), expose a factory as module.exports.\r\n // This accentuates the need for the creation of a real `window`.\r\n // e.g. var jQuery = require(\"jquery\")(window);\r\n // See ticket #14549 for more info.\r\n module.exports = global.document ?\r\n factory( global, true ) :\r\n function( w ) {\r\n if ( !w.document ) {\r\n throw new Error( \"jQuery requires a window with a document\" );\r\n }\r\n return factory( w );\r\n };\r\n } else {\r\n factory( global );\r\n }\r\n\r\n// Pass this if window is not defined yet\r\n}(typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\r\n\r\n// Support: Firefox 18+\r\n// Can't be in strict mode, several libs including ASP.NET trace\r\n// the stack via arguments.caller.callee and Firefox dies if\r\n// you try to trace through \"use strict\" call chains. (#13335)\r\n//\"use strict\";\r\n var arr = [];\r\n\r\n var document = window.document;\r\n\r\n var slice = arr.slice;\r\n\r\n var concat = arr.concat;\r\n\r\n var push = arr.push;\r\n\r\n var indexOf = arr.indexOf;\r\n\r\n var class2type = {};\r\n\r\n var toString = class2type.toString;\r\n\r\n var hasOwn = class2type.hasOwnProperty;\r\n\r\n var support = {};\r\n\r\n\r\n\r\n var\r\n version = \"2.2.4\",\r\n\r\n // Define a local copy of jQuery\r\n jQuery = function( selector, context ) {\r\n\r\n // The jQuery object is actually just the init constructor 'enhanced'\r\n // Need init if jQuery is called (just allow error to be thrown if not included)\r\n return new jQuery.fn.init( selector, context );\r\n },\r\n\r\n // Support: Android<4.1\r\n // Make sure we trim BOM and NBSP\r\n rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\r\n\r\n // Matches dashed string for camelizing\r\n rmsPrefix = /^-ms-/,\r\n rdashAlpha = /-([\\da-z])/gi,\r\n\r\n // Used by jQuery.camelCase as callback to replace()\r\n fcamelCase = function( all, letter ) {\r\n return letter.toUpperCase();\r\n };\r\n\r\n jQuery.fn = jQuery.prototype = {\r\n\r\n // The current version of jQuery being used\r\n jquery: version,\r\n\r\n constructor: jQuery,\r\n\r\n // Start with an empty selector\r\n selector: \"\",\r\n\r\n // The default length of a jQuery object is 0\r\n length: 0,\r\n\r\n toArray: function() {\r\n return slice.call( this );\r\n },\r\n\r\n // Get the Nth element in the matched element set OR\r\n // Get the whole matched element set as a clean array\r\n get: function( num ) {\r\n return num != null ?\r\n\r\n // Return just the one element from the set\r\n ( num < 0 ? this[ num + this.length ] : this[ num ] ) :\r\n\r\n // Return all the elements in a clean array\r\n slice.call( this );\r\n },\r\n\r\n // Take an array of elements and push it onto the stack\r\n // (returning the new matched element set)\r\n pushStack: function( elems ) {\r\n\r\n // Build a new jQuery matched element set\r\n var ret = jQuery.merge( this.constructor(), elems );\r\n\r\n // Add the old object onto the stack (as a reference)\r\n ret.prevObject = this;\r\n ret.context = this.context;\r\n\r\n // Return the newly-formed element set\r\n return ret;\r\n },\r\n\r\n // Execute a callback for every element in the matched set.\r\n each: function( callback ) {\r\n return jQuery.each( this, callback );\r\n },\r\n\r\n map: function( callback ) {\r\n return this.pushStack( jQuery.map( this, function( elem, i ) {\r\n return callback.call( elem, i, elem );\r\n } ) );\r\n },\r\n\r\n slice: function() {\r\n return this.pushStack( slice.apply( this, arguments ) );\r\n },\r\n\r\n first: function() {\r\n return this.eq( 0 );\r\n },\r\n\r\n last: function() {\r\n return this.eq( -1 );\r\n },\r\n\r\n eq: function( i ) {\r\n var len = this.length,\r\n j = +i + ( i < 0 ? len : 0 );\r\n return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\r\n },\r\n\r\n end: function() {\r\n return this.prevObject || this.constructor();\r\n },\r\n\r\n // For internal use only.\r\n // Behaves like an Array's method, not like a jQuery method.\r\n push: push,\r\n sort: arr.sort,\r\n splice: arr.splice\r\n };\r\n\r\n jQuery.extend = jQuery.fn.extend = function() {\r\n var options, name, src, copy, copyIsArray, clone,\r\n target = arguments[ 0 ] || {},\r\n i = 1,\r\n length = arguments.length,\r\n deep = false;\r\n\r\n // Handle a deep copy situation\r\n if ( typeof target === \"boolean\" ) {\r\n deep = target;\r\n\r\n // Skip the boolean and the target\r\n target = arguments[ i ] || {};\r\n i++;\r\n }\r\n\r\n // Handle case when target is a string or something (possible in deep copy)\r\n if ( typeof target !== \"object\" && !jQuery.isFunction( target ) ) {\r\n target = {};\r\n }\r\n\r\n // Extend jQuery itself if only one argument is passed\r\n if ( i === length ) {\r\n target = this;\r\n i--;\r\n }\r\n\r\n for ( ; i < length; i++ ) {\r\n\r\n // Only deal with non-null/undefined values\r\n if ( ( options = arguments[ i ] ) != null ) {\r\n\r\n // Extend the base object\r\n for ( name in options ) {\r\n src = target[ name ];\r\n copy = options[ name ];\r\n\r\n // Prevent never-ending loop\r\n if ( target === copy ) {\r\n continue;\r\n }\r\n\r\n // Recurse if we're merging plain objects or arrays\r\n if ( deep && copy && ( jQuery.isPlainObject( copy ) ||\r\n ( copyIsArray = jQuery.isArray( copy ) ) ) ) {\r\n\r\n if ( copyIsArray ) {\r\n copyIsArray = false;\r\n clone = src && jQuery.isArray( src ) ? src : [];\r\n\r\n } else {\r\n clone = src && jQuery.isPlainObject( src ) ? src : {};\r\n }\r\n\r\n // Never move original objects, clone them\r\n target[ name ] = jQuery.extend( deep, clone, copy );\r\n\r\n // Don't bring in undefined values\r\n } else if ( copy !== undefined ) {\r\n target[ name ] = copy;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Return the modified object\r\n return target;\r\n };\r\n\r\n jQuery.extend( {\r\n\r\n // Unique for each copy of jQuery on the page\r\n expando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\r\n\r\n // Assume jQuery is ready without the ready module\r\n isReady: true,\r\n\r\n error: function( msg ) {\r\n throw new Error( msg );\r\n },\r\n\r\n noop: function() {},\r\n\r\n isFunction: function( obj ) {\r\n return jQuery.type( obj ) === \"function\";\r\n },\r\n\r\n isArray: Array.isArray,\r\n\r\n isWindow: function( obj ) {\r\n return obj != null && obj === obj.window;\r\n },\r\n\r\n isNumeric: function( obj ) {\r\n\r\n // parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\r\n // ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\r\n // subtraction forces infinities to NaN\r\n // adding 1 corrects loss of precision from parseFloat (#15100)\r\n var realStringObj = obj && obj.toString();\r\n return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;\r\n },\r\n\r\n isPlainObject: function( obj ) {\r\n var key;\r\n\r\n // Not plain objects:\r\n // - Any object or value whose internal [[Class]] property is not \"[object Object]\"\r\n // - DOM nodes\r\n // - window\r\n if ( jQuery.type( obj ) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\r\n return false;\r\n }\r\n\r\n // Not own constructor property must be Object\r\n if ( obj.constructor &&\r\n !hasOwn.call( obj, \"constructor\" ) &&\r\n !hasOwn.call( obj.constructor.prototype || {}, \"isPrototypeOf\" ) ) {\r\n return false;\r\n }\r\n\r\n // Own properties are enumerated firstly, so to speed up,\r\n // if last one is own, then all properties are own\r\n for ( key in obj ) {}\r\n\r\n return key === undefined || hasOwn.call( obj, key );\r\n },\r\n\r\n isEmptyObject: function( obj ) {\r\n var name;\r\n for ( name in obj ) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n\r\n type: function( obj ) {\r\n if ( obj == null ) {\r\n return obj + \"\";\r\n }\r\n\r\n // Support: Android<4.0, iOS<6 (functionish RegExp)\r\n return typeof obj === \"object\" || typeof obj === \"function\" ?\r\n class2type[ toString.call( obj ) ] || \"object\" :\r\n typeof obj;\r\n },\r\n\r\n // Evaluates a script in a global context\r\n globalEval: function( code ) {\r\n var script,\r\n indirect = eval;\r\n\r\n code = jQuery.trim( code );\r\n\r\n if ( code ) {\r\n\r\n // If the code includes a valid, prologue position\r\n // strict mode pragma, execute code by injecting a\r\n // script tag into the document.\r\n if ( code.indexOf( \"use strict\" ) === 1 ) {\r\n script = document.createElement( \"script\" );\r\n script.text = code;\r\n document.head.appendChild( script ).parentNode.removeChild( script );\r\n } else {\r\n\r\n // Otherwise, avoid the DOM node creation, insertion\r\n // and removal by using an indirect global eval\r\n\r\n indirect( code );\r\n }\r\n }\r\n },\r\n\r\n // Convert dashed to camelCase; used by the css and data modules\r\n // Support: IE9-11+\r\n // Microsoft forgot to hump their vendor prefix (#9572)\r\n camelCase: function( string ) {\r\n return string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\r\n },\r\n\r\n nodeName: function( elem, name ) {\r\n return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\r\n },\r\n\r\n each: function( obj, callback ) {\r\n var length, i = 0;\r\n\r\n if ( isArrayLike( obj ) ) {\r\n length = obj.length;\r\n for ( ; i < length; i++ ) {\r\n if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\r\n break;\r\n }\r\n }\r\n } else {\r\n for ( i in obj ) {\r\n if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return obj;\r\n },\r\n\r\n // Support: Android<4.1\r\n trim: function( text ) {\r\n return text == null ?\r\n \"\" :\r\n ( text + \"\" ).replace( rtrim, \"\" );\r\n },\r\n\r\n // results is for internal usage only\r\n makeArray: function( arr, results ) {\r\n var ret = results || [];\r\n\r\n if ( arr != null ) {\r\n if ( isArrayLike( Object( arr ) ) ) {\r\n jQuery.merge( ret,\r\n typeof arr === \"string\" ?\r\n [ arr ] : arr\r\n );\r\n } else {\r\n push.call( ret, arr );\r\n }\r\n }\r\n\r\n return ret;\r\n },\r\n\r\n inArray: function( elem, arr, i ) {\r\n return arr == null ? -1 : indexOf.call( arr, elem, i );\r\n },\r\n\r\n merge: function( first, second ) {\r\n var len = +second.length,\r\n j = 0,\r\n i = first.length;\r\n\r\n for ( ; j < len; j++ ) {\r\n first[ i++ ] = second[ j ];\r\n }\r\n\r\n first.length = i;\r\n\r\n return first;\r\n },\r\n\r\n grep: function( elems, callback, invert ) {\r\n var callbackInverse,\r\n matches = [],\r\n i = 0,\r\n length = elems.length,\r\n callbackExpect = !invert;\r\n\r\n // Go through the array, only saving the items\r\n // that pass the validator function\r\n for ( ; i < length; i++ ) {\r\n callbackInverse = !callback( elems[ i ], i );\r\n if ( callbackInverse !== callbackExpect ) {\r\n matches.push( elems[ i ] );\r\n }\r\n }\r\n\r\n return matches;\r\n },\r\n\r\n // arg is for internal usage only\r\n map: function( elems, callback, arg ) {\r\n var length, value,\r\n i = 0,\r\n ret = [];\r\n\r\n // Go through the array, translating each of the items to their new values\r\n if ( isArrayLike( elems ) ) {\r\n length = elems.length;\r\n for ( ; i < length; i++ ) {\r\n value = callback( elems[ i ], i, arg );\r\n\r\n if ( value != null ) {\r\n ret.push( value );\r\n }\r\n }\r\n\r\n // Go through every key on the object,\r\n } else {\r\n for ( i in elems ) {\r\n value = callback( elems[ i ], i, arg );\r\n\r\n if ( value != null ) {\r\n ret.push( value );\r\n }\r\n }\r\n }\r\n\r\n // Flatten any nested arrays\r\n return concat.apply( [], ret );\r\n },\r\n\r\n // A global GUID counter for objects\r\n guid: 1,\r\n\r\n // Bind a function to a context, optionally partially applying any\r\n // arguments.\r\n proxy: function( fn, context ) {\r\n var tmp, args, proxy;\r\n\r\n if ( typeof context === \"string\" ) {\r\n tmp = fn[ context ];\r\n context = fn;\r\n fn = tmp;\r\n }\r\n\r\n // Quick check to determine if target is callable, in the spec\r\n // this throws a TypeError, but we will just return undefined.\r\n if ( !jQuery.isFunction( fn ) ) {\r\n return undefined;\r\n }\r\n\r\n // Simulated bind\r\n args = slice.call( arguments, 2 );\r\n proxy = function() {\r\n return fn.apply( context || this, args.concat( slice.call( arguments ) ) );\r\n };\r\n\r\n // Set the guid of unique handler to the same of original handler, so it can be removed\r\n proxy.guid = fn.guid = fn.guid || jQuery.guid++;\r\n\r\n return proxy;\r\n },\r\n\r\n now: Date.now,\r\n\r\n // jQuery.support is not used in Core but other projects attach their\r\n // properties to it so it needs to exist.\r\n support: support\r\n } );\r\n\r\n// JSHint would error on this code due to the Symbol not being defined in ES5.\r\n// Defining this global in .jshintrc would create a danger of using the global\r\n// unguarded in another place, it seems safer to just disable JSHint for these\r\n// three lines.\r\n /* jshint ignore: start */\r\n if ( typeof Symbol === \"function\" ) {\r\n jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\r\n }\r\n /* jshint ignore: end */\r\n\r\n// Populate the class2type map\r\n jQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\r\n function( i, name ) {\r\n class2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\r\n } );\r\n\r\n function isArrayLike( obj ) {\r\n\r\n // Support: iOS 8.2 (not reproducible in simulator)\r\n // `in` check used to prevent JIT error (gh-2145)\r\n // hasOwn isn't used here due to false negatives\r\n // regarding Nodelist length in IE\r\n var length = !!obj && \"length\" in obj && obj.length,\r\n type = jQuery.type( obj );\r\n\r\n if ( type === \"function\" || jQuery.isWindow( obj ) ) {\r\n return false;\r\n }\r\n\r\n return type === \"array\" || length === 0 ||\r\n typeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\r\n }\r\n var Sizzle =\r\n /*!\r\n * Sizzle CSS Selector Engine v2.2.1\r\n * http://sizzlejs.com/\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license\r\n * http://jquery.org/license\r\n *\r\n * Date: 2015-10-17\r\n */\r\n (function( window ) {\r\n\r\n var i,\r\n support,\r\n Expr,\r\n getText,\r\n isXML,\r\n tokenize,\r\n compile,\r\n select,\r\n outermostContext,\r\n sortInput,\r\n hasDuplicate,\r\n\r\n // Local document vars\r\n setDocument,\r\n document,\r\n docElem,\r\n documentIsHTML,\r\n rbuggyQSA,\r\n rbuggyMatches,\r\n matches,\r\n contains,\r\n\r\n // Instance-specific data\r\n expando = \"sizzle\" + 1 * new Date(),\r\n preferredDoc = window.document,\r\n dirruns = 0,\r\n done = 0,\r\n classCache = createCache(),\r\n tokenCache = createCache(),\r\n compilerCache = createCache(),\r\n sortOrder = function( a, b ) {\r\n if ( a === b ) {\r\n hasDuplicate = true;\r\n }\r\n return 0;\r\n },\r\n\r\n // General-purpose constants\r\n MAX_NEGATIVE = 1 << 31,\r\n\r\n // Instance methods\r\n hasOwn = ({}).hasOwnProperty,\r\n arr = [],\r\n pop = arr.pop,\r\n push_native = arr.push,\r\n push = arr.push,\r\n slice = arr.slice,\r\n // Use a stripped-down indexOf as it's faster than native\r\n // http://jsperf.com/thor-indexof-vs-for/5\r\n indexOf = function( list, elem ) {\r\n var i = 0,\r\n len = list.length;\r\n for ( ; i < len; i++ ) {\r\n if ( list[i] === elem ) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n },\r\n\r\n booleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\r\n\r\n // Regular expressions\r\n\r\n // http://www.w3.org/TR/css3-selectors/#whitespace\r\n whitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\r\n\r\n // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\r\n identifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\r\n\r\n // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\r\n attributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\r\n // Operator (capture 2)\r\n \"*([*^$|!~]?=)\" + whitespace +\r\n // \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\r\n \"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\r\n \"*\\\\]\",\r\n\r\n pseudos = \":(\" + identifier + \")(?:\\\\((\" +\r\n // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\r\n // 1. quoted (capture 3; capture 4 or capture 5)\r\n \"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\r\n // 2. simple (capture 6)\r\n \"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\r\n // 3. anything else (capture 2)\r\n \".*\" +\r\n \")\\\\)|)\",\r\n\r\n // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\r\n rwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\r\n rtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\r\n\r\n rcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\r\n rcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\r\n\r\n rattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\r\n\r\n rpseudo = new RegExp( pseudos ),\r\n ridentifier = new RegExp( \"^\" + identifier + \"$\" ),\r\n\r\n matchExpr = {\r\n \"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\r\n \"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\r\n \"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\r\n \"ATTR\": new RegExp( \"^\" + attributes ),\r\n \"PSEUDO\": new RegExp( \"^\" + pseudos ),\r\n \"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\r\n \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\r\n \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\r\n \"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\r\n // For use in libraries implementing .is()\r\n // We use this for POS matching in `select`\r\n \"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\r\n whitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\r\n },\r\n\r\n rinputs = /^(?:input|select|textarea|button)$/i,\r\n rheader = /^h\\d$/i,\r\n\r\n rnative = /^[^{]+\\{\\s*\\[native \\w/,\r\n\r\n // Easily-parseable/retrievable ID or TAG or CLASS selectors\r\n rquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\r\n\r\n rsibling = /[+~]/,\r\n rescape = /'|\\\\/g,\r\n\r\n // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\r\n runescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\r\n funescape = function( _, escaped, escapedWhitespace ) {\r\n var high = \"0x\" + escaped - 0x10000;\r\n // NaN means non-codepoint\r\n // Support: Firefox<24\r\n // Workaround erroneous numeric interpretation of +\"0x\"\r\n return high !== high || escapedWhitespace ?\r\n escaped :\r\n high < 0 ?\r\n // BMP codepoint\r\n String.fromCharCode( high + 0x10000 ) :\r\n // Supplemental Plane codepoint (surrogate pair)\r\n String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\r\n },\r\n\r\n // Used for iframes\r\n // See setDocument()\r\n // Removing the function wrapper causes a \"Permission Denied\"\r\n // error in IE\r\n unloadHandler = function() {\r\n setDocument();\r\n };\r\n\r\n// Optimize for push.apply( _, NodeList )\r\n try {\r\n push.apply(\r\n (arr = slice.call( preferredDoc.childNodes )),\r\n preferredDoc.childNodes\r\n );\r\n // Support: Android<4.0\r\n // Detect silently failing push.apply\r\n arr[ preferredDoc.childNodes.length ].nodeType;\r\n } catch ( e ) {\r\n push = { apply: arr.length ?\r\n\r\n // Leverage slice if possible\r\n function( target, els ) {\r\n push_native.apply( target, slice.call(els) );\r\n } :\r\n\r\n // Support: IE<9\r\n // Otherwise append directly\r\n function( target, els ) {\r\n var j = target.length,\r\n i = 0;\r\n // Can't trust NodeList.length\r\n while ( (target[j++] = els[i++]) ) {}\r\n target.length = j - 1;\r\n }\r\n };\r\n }\r\n\r\n function Sizzle( selector, context, results, seed ) {\r\n var m, i, elem, nid, nidselect, match, groups, newSelector,\r\n newContext = context && context.ownerDocument,\r\n\r\n // nodeType defaults to 9, since context defaults to document\r\n nodeType = context ? context.nodeType : 9;\r\n\r\n results = results || [];\r\n\r\n // Return early from calls with invalid selector or context\r\n if ( typeof selector !== \"string\" || !selector ||\r\n nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\r\n\r\n return results;\r\n }\r\n\r\n // Try to shortcut find operations (as opposed to filters) in HTML documents\r\n if ( !seed ) {\r\n\r\n if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\r\n setDocument( context );\r\n }\r\n context = context || document;\r\n\r\n if ( documentIsHTML ) {\r\n\r\n // If the selector is sufficiently simple, try using a \"get*By*\" DOM method\r\n // (excepting DocumentFragment context, where the methods don't exist)\r\n if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\r\n\r\n // ID selector\r\n if ( (m = match[1]) ) {\r\n\r\n // Document context\r\n if ( nodeType === 9 ) {\r\n if ( (elem = context.getElementById( m )) ) {\r\n\r\n // Support: IE, Opera, Webkit\r\n // TODO: identify versions\r\n // getElementById can match elements by name instead of ID\r\n if ( elem.id === m ) {\r\n results.push( elem );\r\n return results;\r\n }\r\n } else {\r\n return results;\r\n }\r\n\r\n // Element context\r\n } else {\r\n\r\n // Support: IE, Opera, Webkit\r\n // TODO: identify versions\r\n // getElementById can match elements by name instead of ID\r\n if ( newContext && (elem = newContext.getElementById( m )) &&\r\n contains( context, elem ) &&\r\n elem.id === m ) {\r\n\r\n results.push( elem );\r\n return results;\r\n }\r\n }\r\n\r\n // Type selector\r\n } else if ( match[2] ) {\r\n push.apply( results, context.getElementsByTagName( selector ) );\r\n return results;\r\n\r\n // Class selector\r\n } else if ( (m = match[3]) && support.getElementsByClassName &&\r\n context.getElementsByClassName ) {\r\n\r\n push.apply( results, context.getElementsByClassName( m ) );\r\n return results;\r\n }\r\n }\r\n\r\n // Take advantage of querySelectorAll\r\n if ( support.qsa &&\r\n !compilerCache[ selector + \" \" ] &&\r\n (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\r\n\r\n if ( nodeType !== 1 ) {\r\n newContext = context;\r\n newSelector = selector;\r\n\r\n // qSA looks outside Element context, which is not what we want\r\n // Thanks to Andrew Dupont for this workaround technique\r\n // Support: IE <=8\r\n // Exclude object elements\r\n } else if ( context.nodeName.toLowerCase() !== \"object\" ) {\r\n\r\n // Capture the context ID, setting it first if necessary\r\n if ( (nid = context.getAttribute( \"id\" )) ) {\r\n nid = nid.replace( rescape, \"\\\\$&\" );\r\n } else {\r\n context.setAttribute( \"id\", (nid = expando) );\r\n }\r\n\r\n // Prefix every selector in the list\r\n groups = tokenize( selector );\r\n i = groups.length;\r\n nidselect = ridentifier.test( nid ) ? \"#\" + nid : \"[id='\" + nid + \"']\";\r\n while ( i-- ) {\r\n groups[i] = nidselect + \" \" + toSelector( groups[i] );\r\n }\r\n newSelector = groups.join( \",\" );\r\n\r\n // Expand context for sibling selectors\r\n newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\r\n context;\r\n }\r\n\r\n if ( newSelector ) {\r\n try {\r\n push.apply( results,\r\n newContext.querySelectorAll( newSelector )\r\n );\r\n return results;\r\n } catch ( qsaError ) {\r\n } finally {\r\n if ( nid === expando ) {\r\n context.removeAttribute( \"id\" );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // All others\r\n return select( selector.replace( rtrim, \"$1\" ), context, results, seed );\r\n }\r\n\r\n /**\r\n * Create key-value caches of limited size\r\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\r\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\r\n *\tdeleting the oldest entry\r\n */\r\n function createCache() {\r\n var keys = [];\r\n\r\n function cache( key, value ) {\r\n // Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\r\n if ( keys.push( key + \" \" ) > Expr.cacheLength ) {\r\n // Only keep the most recent entries\r\n delete cache[ keys.shift() ];\r\n }\r\n return (cache[ key + \" \" ] = value);\r\n }\r\n return cache;\r\n }\r\n\r\n /**\r\n * Mark a function for special use by Sizzle\r\n * @param {Function} fn The function to mark\r\n */\r\n function markFunction( fn ) {\r\n fn[ expando ] = true;\r\n return fn;\r\n }\r\n\r\n /**\r\n * Support testing using an element\r\n * @param {Function} fn Passed the created div and expects a boolean result\r\n */\r\n function assert( fn ) {\r\n var div = document.createElement(\"div\");\r\n\r\n try {\r\n return !!fn( div );\r\n } catch (e) {\r\n return false;\r\n } finally {\r\n // Remove from its parent by default\r\n if ( div.parentNode ) {\r\n div.parentNode.removeChild( div );\r\n }\r\n // release memory in IE\r\n div = null;\r\n }\r\n }\r\n\r\n /**\r\n * Adds the same handler for all of the specified attrs\r\n * @param {String} attrs Pipe-separated list of attributes\r\n * @param {Function} handler The method that will be applied\r\n */\r\n function addHandle( attrs, handler ) {\r\n var arr = attrs.split(\"|\"),\r\n i = arr.length;\r\n\r\n while ( i-- ) {\r\n Expr.attrHandle[ arr[i] ] = handler;\r\n }\r\n }\r\n\r\n /**\r\n * Checks document order of two siblings\r\n * @param {Element} a\r\n * @param {Element} b\r\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\r\n */\r\n function siblingCheck( a, b ) {\r\n var cur = b && a,\r\n diff = cur && a.nodeType === 1 && b.nodeType === 1 &&\r\n ( ~b.sourceIndex || MAX_NEGATIVE ) -\r\n ( ~a.sourceIndex || MAX_NEGATIVE );\r\n\r\n // Use IE sourceIndex if available on both nodes\r\n if ( diff ) {\r\n return diff;\r\n }\r\n\r\n // Check if b follows a\r\n if ( cur ) {\r\n while ( (cur = cur.nextSibling) ) {\r\n if ( cur === b ) {\r\n return -1;\r\n }\r\n }\r\n }\r\n\r\n return a ? 1 : -1;\r\n }\r\n\r\n /**\r\n * Returns a function to use in pseudos for input types\r\n * @param {String} type\r\n */\r\n function createInputPseudo( type ) {\r\n return function( elem ) {\r\n var name = elem.nodeName.toLowerCase();\r\n return name === \"input\" && elem.type === type;\r\n };\r\n }\r\n\r\n /**\r\n * Returns a function to use in pseudos for buttons\r\n * @param {String} type\r\n */\r\n function createButtonPseudo( type ) {\r\n return function( elem ) {\r\n var name = elem.nodeName.toLowerCase();\r\n return (name === \"input\" || name === \"button\") && elem.type === type;\r\n };\r\n }\r\n\r\n /**\r\n * Returns a function to use in pseudos for positionals\r\n * @param {Function} fn\r\n */\r\n function createPositionalPseudo( fn ) {\r\n return markFunction(function( argument ) {\r\n argument = +argument;\r\n return markFunction(function( seed, matches ) {\r\n var j,\r\n matchIndexes = fn( [], seed.length, argument ),\r\n i = matchIndexes.length;\r\n\r\n // Match elements found at the specified indexes\r\n while ( i-- ) {\r\n if ( seed[ (j = matchIndexes[i]) ] ) {\r\n seed[j] = !(matches[j] = seed[j]);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Checks a node for validity as a Sizzle context\r\n * @param {Element|Object=} context\r\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\r\n */\r\n function testContext( context ) {\r\n return context && typeof context.getElementsByTagName !== \"undefined\" && context;\r\n }\r\n\r\n// Expose support vars for convenience\r\n support = Sizzle.support = {};\r\n\r\n /**\r\n * Detects XML nodes\r\n * @param {Element|Object} elem An element or a document\r\n * @returns {Boolean} True iff elem is a non-HTML XML node\r\n */\r\n isXML = Sizzle.isXML = function( elem ) {\r\n // documentElement is verified for cases where it doesn't yet exist\r\n // (such as loading iframes in IE - #4833)\r\n var documentElement = elem && (elem.ownerDocument || elem).documentElement;\r\n return documentElement ? documentElement.nodeName !== \"HTML\" : false;\r\n };\r\n\r\n /**\r\n * Sets document-related variables once based on the current document\r\n * @param {Element|Object} [doc] An element or document object to use to set the document\r\n * @returns {Object} Returns the current document\r\n */\r\n setDocument = Sizzle.setDocument = function( node ) {\r\n var hasCompare, parent,\r\n doc = node ? node.ownerDocument || node : preferredDoc;\r\n\r\n // Return early if doc is invalid or already selected\r\n if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\r\n return document;\r\n }\r\n\r\n // Update global variables\r\n document = doc;\r\n docElem = document.documentElement;\r\n documentIsHTML = !isXML( document );\r\n\r\n // Support: IE 9-11, Edge\r\n // Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\r\n if ( (parent = document.defaultView) && parent.top !== parent ) {\r\n // Support: IE 11\r\n if ( parent.addEventListener ) {\r\n parent.addEventListener( \"unload\", unloadHandler, false );\r\n\r\n // Support: IE 9 - 10 only\r\n } else if ( parent.attachEvent ) {\r\n parent.attachEvent( \"onunload\", unloadHandler );\r\n }\r\n }\r\n\r\n /* Attributes\r\n\t---------------------------------------------------------------------- */\r\n\r\n // Support: IE<8\r\n // Verify that getAttribute really returns attributes and not properties\r\n // (excepting IE8 booleans)\r\n support.attributes = assert(function( div ) {\r\n div.className = \"i\";\r\n return !div.getAttribute(\"className\");\r\n });\r\n\r\n /* getElement(s)By*\r\n\t---------------------------------------------------------------------- */\r\n\r\n // Check if getElementsByTagName(\"*\") returns only elements\r\n support.getElementsByTagName = assert(function( div ) {\r\n div.appendChild( document.createComment(\"\") );\r\n return !div.getElementsByTagName(\"*\").length;\r\n });\r\n\r\n // Support: IE<9\r\n support.getElementsByClassName = rnative.test( document.getElementsByClassName );\r\n\r\n // Support: IE<10\r\n // Check if getElementById returns elements by name\r\n // The broken getElementById methods don't pick up programatically-set names,\r\n // so use a roundabout getElementsByName test\r\n support.getById = assert(function( div ) {\r\n docElem.appendChild( div ).id = expando;\r\n return !document.getElementsByName || !document.getElementsByName( expando ).length;\r\n });\r\n\r\n // ID find and filter\r\n if ( support.getById ) {\r\n Expr.find[\"ID\"] = function( id, context ) {\r\n if ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\r\n var m = context.getElementById( id );\r\n return m ? [ m ] : [];\r\n }\r\n };\r\n Expr.filter[\"ID\"] = function( id ) {\r\n var attrId = id.replace( runescape, funescape );\r\n return function( elem ) {\r\n return elem.getAttribute(\"id\") === attrId;\r\n };\r\n };\r\n } else {\r\n // Support: IE6/7\r\n // getElementById is not reliable as a find shortcut\r\n delete Expr.find[\"ID\"];\r\n\r\n Expr.filter[\"ID\"] = function( id ) {\r\n var attrId = id.replace( runescape, funescape );\r\n return function( elem ) {\r\n var node = typeof elem.getAttributeNode !== \"undefined\" &&\r\n elem.getAttributeNode(\"id\");\r\n return node && node.value === attrId;\r\n };\r\n };\r\n }\r\n\r\n // Tag\r\n Expr.find[\"TAG\"] = support.getElementsByTagName ?\r\n function( tag, context ) {\r\n if ( typeof context.getElementsByTagName !== \"undefined\" ) {\r\n return context.getElementsByTagName( tag );\r\n\r\n // DocumentFragment nodes don't have gEBTN\r\n } else if ( support.qsa ) {\r\n return context.querySelectorAll( tag );\r\n }\r\n } :\r\n\r\n function( tag, context ) {\r\n var elem,\r\n tmp = [],\r\n i = 0,\r\n // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\r\n results = context.getElementsByTagName( tag );\r\n\r\n // Filter out possible comments\r\n if ( tag === \"*\" ) {\r\n while ( (elem = results[i++]) ) {\r\n if ( elem.nodeType === 1 ) {\r\n tmp.push( elem );\r\n }\r\n }\r\n\r\n return tmp;\r\n }\r\n return results;\r\n };\r\n\r\n // Class\r\n Expr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\r\n if ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\r\n return context.getElementsByClassName( className );\r\n }\r\n };\r\n\r\n /* QSA/matchesSelector\r\n\t---------------------------------------------------------------------- */\r\n\r\n // QSA and matchesSelector support\r\n\r\n // matchesSelector(:active) reports false when true (IE9/Opera 11.5)\r\n rbuggyMatches = [];\r\n\r\n // qSa(:focus) reports false when true (Chrome 21)\r\n // We allow this because of a bug in IE8/9 that throws an error\r\n // whenever `document.activeElement` is accessed on an iframe\r\n // So, we allow :focus to pass through QSA all the time to avoid the IE error\r\n // See http://bugs.jquery.com/ticket/13378\r\n rbuggyQSA = [];\r\n\r\n if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\r\n // Build QSA regex\r\n // Regex strategy adopted from Diego Perini\r\n assert(function( div ) {\r\n // Select is set to empty string on purpose\r\n // This is to test IE's treatment of not explicitly\r\n // setting a boolean content attribute,\r\n // since its presence should be enough\r\n // http://bugs.jquery.com/ticket/12359\r\n docElem.appendChild( div ).innerHTML = \"
      \" +\r\n \"\";\r\n\r\n // Support: IE8, Opera 11-12.16\r\n // Nothing should be selected when empty strings follow ^= or $= or *=\r\n // The test attribute must be unknown in Opera but \"safe\" for WinRT\r\n // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\r\n if ( div.querySelectorAll(\"[msallowcapture^='']\").length ) {\r\n rbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\r\n }\r\n\r\n // Support: IE8\r\n // Boolean attributes and \"value\" are not treated correctly\r\n if ( !div.querySelectorAll(\"[selected]\").length ) {\r\n rbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\r\n }\r\n\r\n // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\r\n if ( !div.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\r\n rbuggyQSA.push(\"~=\");\r\n }\r\n\r\n // Webkit/Opera - :checked should return selected option elements\r\n // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r\n // IE8 throws error here and will not see later tests\r\n if ( !div.querySelectorAll(\":checked\").length ) {\r\n rbuggyQSA.push(\":checked\");\r\n }\r\n\r\n // Support: Safari 8+, iOS 8+\r\n // https://bugs.webkit.org/show_bug.cgi?id=136851\r\n // In-page `selector#id sibing-combinator selector` fails\r\n if ( !div.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\r\n rbuggyQSA.push(\".#.+[+~]\");\r\n }\r\n });\r\n\r\n assert(function( div ) {\r\n // Support: Windows 8 Native Apps\r\n // The type and name attributes are restricted during .innerHTML assignment\r\n var input = document.createElement(\"input\");\r\n input.setAttribute( \"type\", \"hidden\" );\r\n div.appendChild( input ).setAttribute( \"name\", \"D\" );\r\n\r\n // Support: IE8\r\n // Enforce case-sensitivity of name attribute\r\n if ( div.querySelectorAll(\"[name=d]\").length ) {\r\n rbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\r\n }\r\n\r\n // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\r\n // IE8 throws error here and will not see later tests\r\n if ( !div.querySelectorAll(\":enabled\").length ) {\r\n rbuggyQSA.push( \":enabled\", \":disabled\" );\r\n }\r\n\r\n // Opera 10-11 does not throw on post-comma invalid pseudos\r\n div.querySelectorAll(\"*,:x\");\r\n rbuggyQSA.push(\",.*:\");\r\n });\r\n }\r\n\r\n if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\r\n docElem.webkitMatchesSelector ||\r\n docElem.mozMatchesSelector ||\r\n docElem.oMatchesSelector ||\r\n docElem.msMatchesSelector) )) ) {\r\n\r\n assert(function( div ) {\r\n // Check to see if it's possible to do matchesSelector\r\n // on a disconnected node (IE 9)\r\n support.disconnectedMatch = matches.call( div, \"div\" );\r\n\r\n // This should fail with an exception\r\n // Gecko does not error, returns false instead\r\n matches.call( div, \"[s!='']:x\" );\r\n rbuggyMatches.push( \"!=\", pseudos );\r\n });\r\n }\r\n\r\n rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\r\n rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\r\n\r\n /* Contains\r\n\t---------------------------------------------------------------------- */\r\n hasCompare = rnative.test( docElem.compareDocumentPosition );\r\n\r\n // Element contains another\r\n // Purposefully self-exclusive\r\n // As in, an element does not contain itself\r\n contains = hasCompare || rnative.test( docElem.contains ) ?\r\n function( a, b ) {\r\n var adown = a.nodeType === 9 ? a.documentElement : a,\r\n bup = b && b.parentNode;\r\n return a === bup || !!( bup && bup.nodeType === 1 && (\r\n adown.contains ?\r\n adown.contains( bup ) :\r\n a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\r\n ));\r\n } :\r\n function( a, b ) {\r\n if ( b ) {\r\n while ( (b = b.parentNode) ) {\r\n if ( b === a ) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n /* Sorting\r\n\t---------------------------------------------------------------------- */\r\n\r\n // Document order sorting\r\n sortOrder = hasCompare ?\r\n function( a, b ) {\r\n\r\n // Flag for duplicate removal\r\n if ( a === b ) {\r\n hasDuplicate = true;\r\n return 0;\r\n }\r\n\r\n // Sort on method existence if only one input has compareDocumentPosition\r\n var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\r\n if ( compare ) {\r\n return compare;\r\n }\r\n\r\n // Calculate position if both inputs belong to the same document\r\n compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\r\n a.compareDocumentPosition( b ) :\r\n\r\n // Otherwise we know they are disconnected\r\n 1;\r\n\r\n // Disconnected nodes\r\n if ( compare & 1 ||\r\n (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\r\n\r\n // Choose the first element that is related to our preferred document\r\n if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\r\n return -1;\r\n }\r\n if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\r\n return 1;\r\n }\r\n\r\n // Maintain original order\r\n return sortInput ?\r\n ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\r\n 0;\r\n }\r\n\r\n return compare & 4 ? -1 : 1;\r\n } :\r\n function( a, b ) {\r\n // Exit early if the nodes are identical\r\n if ( a === b ) {\r\n hasDuplicate = true;\r\n return 0;\r\n }\r\n\r\n var cur,\r\n i = 0,\r\n aup = a.parentNode,\r\n bup = b.parentNode,\r\n ap = [ a ],\r\n bp = [ b ];\r\n\r\n // Parentless nodes are either documents or disconnected\r\n if ( !aup || !bup ) {\r\n return a === document ? -1 :\r\n b === document ? 1 :\r\n aup ? -1 :\r\n bup ? 1 :\r\n sortInput ?\r\n ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\r\n 0;\r\n\r\n // If the nodes are siblings, we can do a quick check\r\n } else if ( aup === bup ) {\r\n return siblingCheck( a, b );\r\n }\r\n\r\n // Otherwise we need full lists of their ancestors for comparison\r\n cur = a;\r\n while ( (cur = cur.parentNode) ) {\r\n ap.unshift( cur );\r\n }\r\n cur = b;\r\n while ( (cur = cur.parentNode) ) {\r\n bp.unshift( cur );\r\n }\r\n\r\n // Walk down the tree looking for a discrepancy\r\n while ( ap[i] === bp[i] ) {\r\n i++;\r\n }\r\n\r\n return i ?\r\n // Do a sibling check if the nodes have a common ancestor\r\n siblingCheck( ap[i], bp[i] ) :\r\n\r\n // Otherwise nodes in our document sort first\r\n ap[i] === preferredDoc ? -1 :\r\n bp[i] === preferredDoc ? 1 :\r\n 0;\r\n };\r\n\r\n return document;\r\n };\r\n\r\n Sizzle.matches = function( expr, elements ) {\r\n return Sizzle( expr, null, null, elements );\r\n };\r\n\r\n Sizzle.matchesSelector = function( elem, expr ) {\r\n // Set document vars if needed\r\n if ( ( elem.ownerDocument || elem ) !== document ) {\r\n setDocument( elem );\r\n }\r\n\r\n // Make sure that attribute selectors are quoted\r\n expr = expr.replace( rattributeQuotes, \"='$1']\" );\r\n\r\n if ( support.matchesSelector && documentIsHTML &&\r\n !compilerCache[ expr + \" \" ] &&\r\n ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\r\n ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\r\n\r\n try {\r\n var ret = matches.call( elem, expr );\r\n\r\n // IE 9's matchesSelector returns false on disconnected nodes\r\n if ( ret || support.disconnectedMatch ||\r\n // As well, disconnected nodes are said to be in a document\r\n // fragment in IE 9\r\n elem.document && elem.document.nodeType !== 11 ) {\r\n return ret;\r\n }\r\n } catch (e) {}\r\n }\r\n\r\n return Sizzle( expr, document, null, [ elem ] ).length > 0;\r\n };\r\n\r\n Sizzle.contains = function( context, elem ) {\r\n // Set document vars if needed\r\n if ( ( context.ownerDocument || context ) !== document ) {\r\n setDocument( context );\r\n }\r\n return contains( context, elem );\r\n };\r\n\r\n Sizzle.attr = function( elem, name ) {\r\n // Set document vars if needed\r\n if ( ( elem.ownerDocument || elem ) !== document ) {\r\n setDocument( elem );\r\n }\r\n\r\n var fn = Expr.attrHandle[ name.toLowerCase() ],\r\n // Don't get fooled by Object.prototype properties (jQuery #13807)\r\n val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\r\n fn( elem, name, !documentIsHTML ) :\r\n undefined;\r\n\r\n return val !== undefined ?\r\n val :\r\n support.attributes || !documentIsHTML ?\r\n elem.getAttribute( name ) :\r\n (val = elem.getAttributeNode(name)) && val.specified ?\r\n val.value :\r\n null;\r\n };\r\n\r\n Sizzle.error = function( msg ) {\r\n throw new Error( \"Syntax error, unrecognized expression: \" + msg );\r\n };\r\n\r\n /**\r\n * Document sorting and removing duplicates\r\n * @param {ArrayLike} results\r\n */\r\n Sizzle.uniqueSort = function( results ) {\r\n var elem,\r\n duplicates = [],\r\n j = 0,\r\n i = 0;\r\n\r\n // Unless we *know* we can detect duplicates, assume their presence\r\n hasDuplicate = !support.detectDuplicates;\r\n sortInput = !support.sortStable && results.slice( 0 );\r\n results.sort( sortOrder );\r\n\r\n if ( hasDuplicate ) {\r\n while ( (elem = results[i++]) ) {\r\n if ( elem === results[ i ] ) {\r\n j = duplicates.push( i );\r\n }\r\n }\r\n while ( j-- ) {\r\n results.splice( duplicates[ j ], 1 );\r\n }\r\n }\r\n\r\n // Clear input after sorting to release objects\r\n // See https://github.com/jquery/sizzle/pull/225\r\n sortInput = null;\r\n\r\n return results;\r\n };\r\n\r\n /**\r\n * Utility function for retrieving the text value of an array of DOM nodes\r\n * @param {Array|Element} elem\r\n */\r\n getText = Sizzle.getText = function( elem ) {\r\n var node,\r\n ret = \"\",\r\n i = 0,\r\n nodeType = elem.nodeType;\r\n\r\n if ( !nodeType ) {\r\n // If no nodeType, this is expected to be an array\r\n while ( (node = elem[i++]) ) {\r\n // Do not traverse comment nodes\r\n ret += getText( node );\r\n }\r\n } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\r\n // Use textContent for elements\r\n // innerText usage removed for consistency of new lines (jQuery #11153)\r\n if ( typeof elem.textContent === \"string\" ) {\r\n return elem.textContent;\r\n } else {\r\n // Traverse its children\r\n for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\r\n ret += getText( elem );\r\n }\r\n }\r\n } else if ( nodeType === 3 || nodeType === 4 ) {\r\n return elem.nodeValue;\r\n }\r\n // Do not include comment or processing instruction nodes\r\n\r\n return ret;\r\n };\r\n\r\n Expr = Sizzle.selectors = {\r\n\r\n // Can be adjusted by the user\r\n cacheLength: 50,\r\n\r\n createPseudo: markFunction,\r\n\r\n match: matchExpr,\r\n\r\n attrHandle: {},\r\n\r\n find: {},\r\n\r\n relative: {\r\n \">\": { dir: \"parentNode\", first: true },\r\n \" \": { dir: \"parentNode\" },\r\n \"+\": { dir: \"previousSibling\", first: true },\r\n \"~\": { dir: \"previousSibling\" }\r\n },\r\n\r\n preFilter: {\r\n \"ATTR\": function( match ) {\r\n match[1] = match[1].replace( runescape, funescape );\r\n\r\n // Move the given value to match[3] whether quoted or unquoted\r\n match[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\r\n\r\n if ( match[2] === \"~=\" ) {\r\n match[3] = \" \" + match[3] + \" \";\r\n }\r\n\r\n return match.slice( 0, 4 );\r\n },\r\n\r\n \"CHILD\": function( match ) {\r\n /* matches from matchExpr[\"CHILD\"]\r\n\t\t\t\t1 type (only|nth|...)\r\n\t\t\t\t2 what (child|of-type)\r\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\r\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\r\n\t\t\t\t5 sign of xn-component\r\n\t\t\t\t6 x of xn-component\r\n\t\t\t\t7 sign of y-component\r\n\t\t\t\t8 y of y-component\r\n\t\t\t*/\r\n match[1] = match[1].toLowerCase();\r\n\r\n if ( match[1].slice( 0, 3 ) === \"nth\" ) {\r\n // nth-* requires argument\r\n if ( !match[3] ) {\r\n Sizzle.error( match[0] );\r\n }\r\n\r\n // numeric x and y parameters for Expr.filter.CHILD\r\n // remember that false/true cast respectively to 0/1\r\n match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\r\n match[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\r\n\r\n // other types prohibit arguments\r\n } else if ( match[3] ) {\r\n Sizzle.error( match[0] );\r\n }\r\n\r\n return match;\r\n },\r\n\r\n \"PSEUDO\": function( match ) {\r\n var excess,\r\n unquoted = !match[6] && match[2];\r\n\r\n if ( matchExpr[\"CHILD\"].test( match[0] ) ) {\r\n return null;\r\n }\r\n\r\n // Accept quoted arguments as-is\r\n if ( match[3] ) {\r\n match[2] = match[4] || match[5] || \"\";\r\n\r\n // Strip excess characters from unquoted arguments\r\n } else if ( unquoted && rpseudo.test( unquoted ) &&\r\n // Get excess from tokenize (recursively)\r\n (excess = tokenize( unquoted, true )) &&\r\n // advance to the next closing parenthesis\r\n (excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\r\n\r\n // excess is a negative index\r\n match[0] = match[0].slice( 0, excess );\r\n match[2] = unquoted.slice( 0, excess );\r\n }\r\n\r\n // Return only captures needed by the pseudo filter method (type and argument)\r\n return match.slice( 0, 3 );\r\n }\r\n },\r\n\r\n filter: {\r\n\r\n \"TAG\": function( nodeNameSelector ) {\r\n var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\r\n return nodeNameSelector === \"*\" ?\r\n function() { return true; } :\r\n function( elem ) {\r\n return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\r\n };\r\n },\r\n\r\n \"CLASS\": function( className ) {\r\n var pattern = classCache[ className + \" \" ];\r\n\r\n return pattern ||\r\n (pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\r\n classCache( className, function( elem ) {\r\n return pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\r\n });\r\n },\r\n\r\n \"ATTR\": function( name, operator, check ) {\r\n return function( elem ) {\r\n var result = Sizzle.attr( elem, name );\r\n\r\n if ( result == null ) {\r\n return operator === \"!=\";\r\n }\r\n if ( !operator ) {\r\n return true;\r\n }\r\n\r\n result += \"\";\r\n\r\n return operator === \"=\" ? result === check :\r\n operator === \"!=\" ? result !== check :\r\n operator === \"^=\" ? check && result.indexOf( check ) === 0 :\r\n operator === \"*=\" ? check && result.indexOf( check ) > -1 :\r\n operator === \"$=\" ? check && result.slice( -check.length ) === check :\r\n operator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\r\n operator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\r\n false;\r\n };\r\n },\r\n\r\n \"CHILD\": function( type, what, argument, first, last ) {\r\n var simple = type.slice( 0, 3 ) !== \"nth\",\r\n forward = type.slice( -4 ) !== \"last\",\r\n ofType = what === \"of-type\";\r\n\r\n return first === 1 && last === 0 ?\r\n\r\n // Shortcut for :nth-*(n)\r\n function( elem ) {\r\n return !!elem.parentNode;\r\n } :\r\n\r\n function( elem, context, xml ) {\r\n var cache, uniqueCache, outerCache, node, nodeIndex, start,\r\n dir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\r\n parent = elem.parentNode,\r\n name = ofType && elem.nodeName.toLowerCase(),\r\n useCache = !xml && !ofType,\r\n diff = false;\r\n\r\n if ( parent ) {\r\n\r\n // :(first|last|only)-(child|of-type)\r\n if ( simple ) {\r\n while ( dir ) {\r\n node = elem;\r\n while ( (node = node[ dir ]) ) {\r\n if ( ofType ?\r\n node.nodeName.toLowerCase() === name :\r\n node.nodeType === 1 ) {\r\n\r\n return false;\r\n }\r\n }\r\n // Reverse direction for :only-* (if we haven't yet done so)\r\n start = dir = type === \"only\" && !start && \"nextSibling\";\r\n }\r\n return true;\r\n }\r\n\r\n start = [ forward ? parent.firstChild : parent.lastChild ];\r\n\r\n // non-xml :nth-child(...) stores cache data on `parent`\r\n if ( forward && useCache ) {\r\n\r\n // Seek `elem` from a previously-cached index\r\n\r\n // ...in a gzip-friendly way\r\n node = parent;\r\n outerCache = node[ expando ] || (node[ expando ] = {});\r\n\r\n // Support: IE <9 only\r\n // Defend against cloned attroperties (jQuery gh-1709)\r\n uniqueCache = outerCache[ node.uniqueID ] ||\r\n (outerCache[ node.uniqueID ] = {});\r\n\r\n cache = uniqueCache[ type ] || [];\r\n nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\r\n diff = nodeIndex && cache[ 2 ];\r\n node = nodeIndex && parent.childNodes[ nodeIndex ];\r\n\r\n while ( (node = ++nodeIndex && node && node[ dir ] ||\r\n\r\n // Fallback to seeking `elem` from the start\r\n (diff = nodeIndex = 0) || start.pop()) ) {\r\n\r\n // When found, cache indexes on `parent` and break\r\n if ( node.nodeType === 1 && ++diff && node === elem ) {\r\n uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\r\n break;\r\n }\r\n }\r\n\r\n } else {\r\n // Use previously-cached element index if available\r\n if ( useCache ) {\r\n // ...in a gzip-friendly way\r\n node = elem;\r\n outerCache = node[ expando ] || (node[ expando ] = {});\r\n\r\n // Support: IE <9 only\r\n // Defend against cloned attroperties (jQuery gh-1709)\r\n uniqueCache = outerCache[ node.uniqueID ] ||\r\n (outerCache[ node.uniqueID ] = {});\r\n\r\n cache = uniqueCache[ type ] || [];\r\n nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\r\n diff = nodeIndex;\r\n }\r\n\r\n // xml :nth-child(...)\r\n // or :nth-last-child(...) or :nth(-last)?-of-type(...)\r\n if ( diff === false ) {\r\n // Use the same loop as above to seek `elem` from the start\r\n while ( (node = ++nodeIndex && node && node[ dir ] ||\r\n (diff = nodeIndex = 0) || start.pop()) ) {\r\n\r\n if ( ( ofType ?\r\n node.nodeName.toLowerCase() === name :\r\n node.nodeType === 1 ) &&\r\n ++diff ) {\r\n\r\n // Cache the index of each encountered element\r\n if ( useCache ) {\r\n outerCache = node[ expando ] || (node[ expando ] = {});\r\n\r\n // Support: IE <9 only\r\n // Defend against cloned attroperties (jQuery gh-1709)\r\n uniqueCache = outerCache[ node.uniqueID ] ||\r\n (outerCache[ node.uniqueID ] = {});\r\n\r\n uniqueCache[ type ] = [ dirruns, diff ];\r\n }\r\n\r\n if ( node === elem ) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Incorporate the offset, then check against cycle size\r\n diff -= last;\r\n return diff === first || ( diff % first === 0 && diff / first >= 0 );\r\n }\r\n };\r\n },\r\n\r\n \"PSEUDO\": function( pseudo, argument ) {\r\n // pseudo-class names are case-insensitive\r\n // http://www.w3.org/TR/selectors/#pseudo-classes\r\n // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\r\n // Remember that setFilters inherits from pseudos\r\n var args,\r\n fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\r\n Sizzle.error( \"unsupported pseudo: \" + pseudo );\r\n\r\n // The user may use createPseudo to indicate that\r\n // arguments are needed to create the filter function\r\n // just as Sizzle does\r\n if ( fn[ expando ] ) {\r\n return fn( argument );\r\n }\r\n\r\n // But maintain support for old signatures\r\n if ( fn.length > 1 ) {\r\n args = [ pseudo, pseudo, \"\", argument ];\r\n return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\r\n markFunction(function( seed, matches ) {\r\n var idx,\r\n matched = fn( seed, argument ),\r\n i = matched.length;\r\n while ( i-- ) {\r\n idx = indexOf( seed, matched[i] );\r\n seed[ idx ] = !( matches[ idx ] = matched[i] );\r\n }\r\n }) :\r\n function( elem ) {\r\n return fn( elem, 0, args );\r\n };\r\n }\r\n\r\n return fn;\r\n }\r\n },\r\n\r\n pseudos: {\r\n // Potentially complex pseudos\r\n \"not\": markFunction(function( selector ) {\r\n // Trim the selector passed to compile\r\n // to avoid treating leading and trailing\r\n // spaces as combinators\r\n var input = [],\r\n results = [],\r\n matcher = compile( selector.replace( rtrim, \"$1\" ) );\r\n\r\n return matcher[ expando ] ?\r\n markFunction(function( seed, matches, context, xml ) {\r\n var elem,\r\n unmatched = matcher( seed, null, xml, [] ),\r\n i = seed.length;\r\n\r\n // Match elements unmatched by `matcher`\r\n while ( i-- ) {\r\n if ( (elem = unmatched[i]) ) {\r\n seed[i] = !(matches[i] = elem);\r\n }\r\n }\r\n }) :\r\n function( elem, context, xml ) {\r\n input[0] = elem;\r\n matcher( input, null, xml, results );\r\n // Don't keep the element (issue #299)\r\n input[0] = null;\r\n return !results.pop();\r\n };\r\n }),\r\n\r\n \"has\": markFunction(function( selector ) {\r\n return function( elem ) {\r\n return Sizzle( selector, elem ).length > 0;\r\n };\r\n }),\r\n\r\n \"contains\": markFunction(function( text ) {\r\n text = text.replace( runescape, funescape );\r\n return function( elem ) {\r\n return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\r\n };\r\n }),\r\n\r\n // \"Whether an element is represented by a :lang() selector\r\n // is based solely on the element's language value\r\n // being equal to the identifier C,\r\n // or beginning with the identifier C immediately followed by \"-\".\r\n // The matching of C against the element's language value is performed case-insensitively.\r\n // The identifier C does not have to be a valid language name.\"\r\n // http://www.w3.org/TR/selectors/#lang-pseudo\r\n \"lang\": markFunction( function( lang ) {\r\n // lang value must be a valid identifier\r\n if ( !ridentifier.test(lang || \"\") ) {\r\n Sizzle.error( \"unsupported lang: \" + lang );\r\n }\r\n lang = lang.replace( runescape, funescape ).toLowerCase();\r\n return function( elem ) {\r\n var elemLang;\r\n do {\r\n if ( (elemLang = documentIsHTML ?\r\n elem.lang :\r\n elem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\r\n\r\n elemLang = elemLang.toLowerCase();\r\n return elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\r\n }\r\n } while ( (elem = elem.parentNode) && elem.nodeType === 1 );\r\n return false;\r\n };\r\n }),\r\n\r\n // Miscellaneous\r\n \"target\": function( elem ) {\r\n var hash = window.location && window.location.hash;\r\n return hash && hash.slice( 1 ) === elem.id;\r\n },\r\n\r\n \"root\": function( elem ) {\r\n return elem === docElem;\r\n },\r\n\r\n \"focus\": function( elem ) {\r\n return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\r\n },\r\n\r\n // Boolean properties\r\n \"enabled\": function( elem ) {\r\n return elem.disabled === false;\r\n },\r\n\r\n \"disabled\": function( elem ) {\r\n return elem.disabled === true;\r\n },\r\n\r\n \"checked\": function( elem ) {\r\n // In CSS3, :checked should return both checked and selected elements\r\n // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r\n var nodeName = elem.nodeName.toLowerCase();\r\n return (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\r\n },\r\n\r\n \"selected\": function( elem ) {\r\n // Accessing this property makes selected-by-default\r\n // options in Safari work properly\r\n if ( elem.parentNode ) {\r\n elem.parentNode.selectedIndex;\r\n }\r\n\r\n return elem.selected === true;\r\n },\r\n\r\n // Contents\r\n \"empty\": function( elem ) {\r\n // http://www.w3.org/TR/selectors/#empty-pseudo\r\n // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\r\n // but not by others (comment: 8; processing instruction: 7; etc.)\r\n // nodeType < 6 works because attributes (2) do not appear as children\r\n for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\r\n if ( elem.nodeType < 6 ) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n },\r\n\r\n \"parent\": function( elem ) {\r\n return !Expr.pseudos[\"empty\"]( elem );\r\n },\r\n\r\n // Element/input types\r\n \"header\": function( elem ) {\r\n return rheader.test( elem.nodeName );\r\n },\r\n\r\n \"input\": function( elem ) {\r\n return rinputs.test( elem.nodeName );\r\n },\r\n\r\n \"button\": function( elem ) {\r\n var name = elem.nodeName.toLowerCase();\r\n return name === \"input\" && elem.type === \"button\" || name === \"button\";\r\n },\r\n\r\n \"text\": function( elem ) {\r\n var attr;\r\n return elem.nodeName.toLowerCase() === \"input\" &&\r\n elem.type === \"text\" &&\r\n\r\n // Support: IE<8\r\n // New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\r\n ( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\r\n },\r\n\r\n // Position-in-collection\r\n \"first\": createPositionalPseudo(function() {\r\n return [ 0 ];\r\n }),\r\n\r\n \"last\": createPositionalPseudo(function( matchIndexes, length ) {\r\n return [ length - 1 ];\r\n }),\r\n\r\n \"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\r\n return [ argument < 0 ? argument + length : argument ];\r\n }),\r\n\r\n \"even\": createPositionalPseudo(function( matchIndexes, length ) {\r\n var i = 0;\r\n for ( ; i < length; i += 2 ) {\r\n matchIndexes.push( i );\r\n }\r\n return matchIndexes;\r\n }),\r\n\r\n \"odd\": createPositionalPseudo(function( matchIndexes, length ) {\r\n var i = 1;\r\n for ( ; i < length; i += 2 ) {\r\n matchIndexes.push( i );\r\n }\r\n return matchIndexes;\r\n }),\r\n\r\n \"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\r\n var i = argument < 0 ? argument + length : argument;\r\n for ( ; --i >= 0; ) {\r\n matchIndexes.push( i );\r\n }\r\n return matchIndexes;\r\n }),\r\n\r\n \"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\r\n var i = argument < 0 ? argument + length : argument;\r\n for ( ; ++i < length; ) {\r\n matchIndexes.push( i );\r\n }\r\n return matchIndexes;\r\n })\r\n }\r\n };\r\n\r\n Expr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\r\n\r\n// Add button/input type pseudos\r\n for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\r\n Expr.pseudos[ i ] = createInputPseudo( i );\r\n }\r\n for ( i in { submit: true, reset: true } ) {\r\n Expr.pseudos[ i ] = createButtonPseudo( i );\r\n }\r\n\r\n// Easy API for creating new setFilters\r\n function setFilters() {}\r\n setFilters.prototype = Expr.filters = Expr.pseudos;\r\n Expr.setFilters = new setFilters();\r\n\r\n tokenize = Sizzle.tokenize = function( selector, parseOnly ) {\r\n var matched, match, tokens, type,\r\n soFar, groups, preFilters,\r\n cached = tokenCache[ selector + \" \" ];\r\n\r\n if ( cached ) {\r\n return parseOnly ? 0 : cached.slice( 0 );\r\n }\r\n\r\n soFar = selector;\r\n groups = [];\r\n preFilters = Expr.preFilter;\r\n\r\n while ( soFar ) {\r\n\r\n // Comma and first run\r\n if ( !matched || (match = rcomma.exec( soFar )) ) {\r\n if ( match ) {\r\n // Don't consume trailing commas as valid\r\n soFar = soFar.slice( match[0].length ) || soFar;\r\n }\r\n groups.push( (tokens = []) );\r\n }\r\n\r\n matched = false;\r\n\r\n // Combinators\r\n if ( (match = rcombinators.exec( soFar )) ) {\r\n matched = match.shift();\r\n tokens.push({\r\n value: matched,\r\n // Cast descendant combinators to space\r\n type: match[0].replace( rtrim, \" \" )\r\n });\r\n soFar = soFar.slice( matched.length );\r\n }\r\n\r\n // Filters\r\n for ( type in Expr.filter ) {\r\n if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\r\n (match = preFilters[ type ]( match ))) ) {\r\n matched = match.shift();\r\n tokens.push({\r\n value: matched,\r\n type: type,\r\n matches: match\r\n });\r\n soFar = soFar.slice( matched.length );\r\n }\r\n }\r\n\r\n if ( !matched ) {\r\n break;\r\n }\r\n }\r\n\r\n // Return the length of the invalid excess\r\n // if we're just parsing\r\n // Otherwise, throw an error or return tokens\r\n return parseOnly ?\r\n soFar.length :\r\n soFar ?\r\n Sizzle.error( selector ) :\r\n // Cache the tokens\r\n tokenCache( selector, groups ).slice( 0 );\r\n };\r\n\r\n function toSelector( tokens ) {\r\n var i = 0,\r\n len = tokens.length,\r\n selector = \"\";\r\n for ( ; i < len; i++ ) {\r\n selector += tokens[i].value;\r\n }\r\n return selector;\r\n }\r\n\r\n function addCombinator( matcher, combinator, base ) {\r\n var dir = combinator.dir,\r\n checkNonElements = base && dir === \"parentNode\",\r\n doneName = done++;\r\n\r\n return combinator.first ?\r\n // Check against closest ancestor/preceding element\r\n function( elem, context, xml ) {\r\n while ( (elem = elem[ dir ]) ) {\r\n if ( elem.nodeType === 1 || checkNonElements ) {\r\n return matcher( elem, context, xml );\r\n }\r\n }\r\n } :\r\n\r\n // Check against all ancestor/preceding elements\r\n function( elem, context, xml ) {\r\n var oldCache, uniqueCache, outerCache,\r\n newCache = [ dirruns, doneName ];\r\n\r\n // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\r\n if ( xml ) {\r\n while ( (elem = elem[ dir ]) ) {\r\n if ( elem.nodeType === 1 || checkNonElements ) {\r\n if ( matcher( elem, context, xml ) ) {\r\n return true;\r\n }\r\n }\r\n }\r\n } else {\r\n while ( (elem = elem[ dir ]) ) {\r\n if ( elem.nodeType === 1 || checkNonElements ) {\r\n outerCache = elem[ expando ] || (elem[ expando ] = {});\r\n\r\n // Support: IE <9 only\r\n // Defend against cloned attroperties (jQuery gh-1709)\r\n uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\r\n\r\n if ( (oldCache = uniqueCache[ dir ]) &&\r\n oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\r\n\r\n // Assign to newCache so results back-propagate to previous elements\r\n return (newCache[ 2 ] = oldCache[ 2 ]);\r\n } else {\r\n // Reuse newcache so results back-propagate to previous elements\r\n uniqueCache[ dir ] = newCache;\r\n\r\n // A match means we're done; a fail means we have to keep checking\r\n if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n }\r\n\r\n function elementMatcher( matchers ) {\r\n return matchers.length > 1 ?\r\n function( elem, context, xml ) {\r\n var i = matchers.length;\r\n while ( i-- ) {\r\n if ( !matchers[i]( elem, context, xml ) ) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n } :\r\n matchers[0];\r\n }\r\n\r\n function multipleContexts( selector, contexts, results ) {\r\n var i = 0,\r\n len = contexts.length;\r\n for ( ; i < len; i++ ) {\r\n Sizzle( selector, contexts[i], results );\r\n }\r\n return results;\r\n }\r\n\r\n function condense( unmatched, map, filter, context, xml ) {\r\n var elem,\r\n newUnmatched = [],\r\n i = 0,\r\n len = unmatched.length,\r\n mapped = map != null;\r\n\r\n for ( ; i < len; i++ ) {\r\n if ( (elem = unmatched[i]) ) {\r\n if ( !filter || filter( elem, context, xml ) ) {\r\n newUnmatched.push( elem );\r\n if ( mapped ) {\r\n map.push( i );\r\n }\r\n }\r\n }\r\n }\r\n\r\n return newUnmatched;\r\n }\r\n\r\n function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\r\n if ( postFilter && !postFilter[ expando ] ) {\r\n postFilter = setMatcher( postFilter );\r\n }\r\n if ( postFinder && !postFinder[ expando ] ) {\r\n postFinder = setMatcher( postFinder, postSelector );\r\n }\r\n return markFunction(function( seed, results, context, xml ) {\r\n var temp, i, elem,\r\n preMap = [],\r\n postMap = [],\r\n preexisting = results.length,\r\n\r\n // Get initial elements from seed or context\r\n elems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\r\n\r\n // Prefilter to get matcher input, preserving a map for seed-results synchronization\r\n matcherIn = preFilter && ( seed || !selector ) ?\r\n condense( elems, preMap, preFilter, context, xml ) :\r\n elems,\r\n\r\n matcherOut = matcher ?\r\n // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\r\n postFinder || ( seed ? preFilter : preexisting || postFilter ) ?\r\n\r\n // ...intermediate processing is necessary\r\n [] :\r\n\r\n // ...otherwise use results directly\r\n results :\r\n matcherIn;\r\n\r\n // Find primary matches\r\n if ( matcher ) {\r\n matcher( matcherIn, matcherOut, context, xml );\r\n }\r\n\r\n // Apply postFilter\r\n if ( postFilter ) {\r\n temp = condense( matcherOut, postMap );\r\n postFilter( temp, [], context, xml );\r\n\r\n // Un-match failing elements by moving them back to matcherIn\r\n i = temp.length;\r\n while ( i-- ) {\r\n if ( (elem = temp[i]) ) {\r\n matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\r\n }\r\n }\r\n }\r\n\r\n if ( seed ) {\r\n if ( postFinder || preFilter ) {\r\n if ( postFinder ) {\r\n // Get the final matcherOut by condensing this intermediate into postFinder contexts\r\n temp = [];\r\n i = matcherOut.length;\r\n while ( i-- ) {\r\n if ( (elem = matcherOut[i]) ) {\r\n // Restore matcherIn since elem is not yet a final match\r\n temp.push( (matcherIn[i] = elem) );\r\n }\r\n }\r\n postFinder( null, (matcherOut = []), temp, xml );\r\n }\r\n\r\n // Move matched elements from seed to results to keep them synchronized\r\n i = matcherOut.length;\r\n while ( i-- ) {\r\n if ( (elem = matcherOut[i]) &&\r\n (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\r\n\r\n seed[temp] = !(results[temp] = elem);\r\n }\r\n }\r\n }\r\n\r\n // Add elements to results, through postFinder if defined\r\n } else {\r\n matcherOut = condense(\r\n matcherOut === results ?\r\n matcherOut.splice( preexisting, matcherOut.length ) :\r\n matcherOut\r\n );\r\n if ( postFinder ) {\r\n postFinder( null, results, matcherOut, xml );\r\n } else {\r\n push.apply( results, matcherOut );\r\n }\r\n }\r\n });\r\n }\r\n\r\n function matcherFromTokens( tokens ) {\r\n var checkContext, matcher, j,\r\n len = tokens.length,\r\n leadingRelative = Expr.relative[ tokens[0].type ],\r\n implicitRelative = leadingRelative || Expr.relative[\" \"],\r\n i = leadingRelative ? 1 : 0,\r\n\r\n // The foundational matcher ensures that elements are reachable from top-level context(s)\r\n matchContext = addCombinator( function( elem ) {\r\n return elem === checkContext;\r\n }, implicitRelative, true ),\r\n matchAnyContext = addCombinator( function( elem ) {\r\n return indexOf( checkContext, elem ) > -1;\r\n }, implicitRelative, true ),\r\n matchers = [ function( elem, context, xml ) {\r\n var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\r\n (checkContext = context).nodeType ?\r\n matchContext( elem, context, xml ) :\r\n matchAnyContext( elem, context, xml ) );\r\n // Avoid hanging onto element (issue #299)\r\n checkContext = null;\r\n return ret;\r\n } ];\r\n\r\n for ( ; i < len; i++ ) {\r\n if ( (matcher = Expr.relative[ tokens[i].type ]) ) {\r\n matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\r\n } else {\r\n matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\r\n\r\n // Return special upon seeing a positional matcher\r\n if ( matcher[ expando ] ) {\r\n // Find the next relative operator (if any) for proper handling\r\n j = ++i;\r\n for ( ; j < len; j++ ) {\r\n if ( Expr.relative[ tokens[j].type ] ) {\r\n break;\r\n }\r\n }\r\n return setMatcher(\r\n i > 1 && elementMatcher( matchers ),\r\n i > 1 && toSelector(\r\n // If the preceding token was a descendant combinator, insert an implicit any-element `*`\r\n tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\r\n ).replace( rtrim, \"$1\" ),\r\n matcher,\r\n i < j && matcherFromTokens( tokens.slice( i, j ) ),\r\n j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\r\n j < len && toSelector( tokens )\r\n );\r\n }\r\n matchers.push( matcher );\r\n }\r\n }\r\n\r\n return elementMatcher( matchers );\r\n }\r\n\r\n function matcherFromGroupMatchers( elementMatchers, setMatchers ) {\r\n var bySet = setMatchers.length > 0,\r\n byElement = elementMatchers.length > 0,\r\n superMatcher = function( seed, context, xml, results, outermost ) {\r\n var elem, j, matcher,\r\n matchedCount = 0,\r\n i = \"0\",\r\n unmatched = seed && [],\r\n setMatched = [],\r\n contextBackup = outermostContext,\r\n // We must always have either seed elements or outermost context\r\n elems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\r\n // Use integer dirruns iff this is the outermost matcher\r\n dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\r\n len = elems.length;\r\n\r\n if ( outermost ) {\r\n outermostContext = context === document || context || outermost;\r\n }\r\n\r\n // Add elements passing elementMatchers directly to results\r\n // Support: IE<9, Safari\r\n // Tolerate NodeList properties (IE: \"length\"; Safari: ) matching elements by id\r\n for ( ; i !== len && (elem = elems[i]) != null; i++ ) {\r\n if ( byElement && elem ) {\r\n j = 0;\r\n if ( !context && elem.ownerDocument !== document ) {\r\n setDocument( elem );\r\n xml = !documentIsHTML;\r\n }\r\n while ( (matcher = elementMatchers[j++]) ) {\r\n if ( matcher( elem, context || document, xml) ) {\r\n results.push( elem );\r\n break;\r\n }\r\n }\r\n if ( outermost ) {\r\n dirruns = dirrunsUnique;\r\n }\r\n }\r\n\r\n // Track unmatched elements for set filters\r\n if ( bySet ) {\r\n // They will have gone through all possible matchers\r\n if ( (elem = !matcher && elem) ) {\r\n matchedCount--;\r\n }\r\n\r\n // Lengthen the array for every element, matched or not\r\n if ( seed ) {\r\n unmatched.push( elem );\r\n }\r\n }\r\n }\r\n\r\n // `i` is now the count of elements visited above, and adding it to `matchedCount`\r\n // makes the latter nonnegative.\r\n matchedCount += i;\r\n\r\n // Apply set filters to unmatched elements\r\n // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\r\n // equals `i`), unless we didn't visit _any_ elements in the above loop because we have\r\n // no element matchers and no seed.\r\n // Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\r\n // case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\r\n // numerically zero.\r\n if ( bySet && i !== matchedCount ) {\r\n j = 0;\r\n while ( (matcher = setMatchers[j++]) ) {\r\n matcher( unmatched, setMatched, context, xml );\r\n }\r\n\r\n if ( seed ) {\r\n // Reintegrate element matches to eliminate the need for sorting\r\n if ( matchedCount > 0 ) {\r\n while ( i-- ) {\r\n if ( !(unmatched[i] || setMatched[i]) ) {\r\n setMatched[i] = pop.call( results );\r\n }\r\n }\r\n }\r\n\r\n // Discard index placeholder values to get only actual matches\r\n setMatched = condense( setMatched );\r\n }\r\n\r\n // Add matches to results\r\n push.apply( results, setMatched );\r\n\r\n // Seedless set matches succeeding multiple successful matchers stipulate sorting\r\n if ( outermost && !seed && setMatched.length > 0 &&\r\n ( matchedCount + setMatchers.length ) > 1 ) {\r\n\r\n Sizzle.uniqueSort( results );\r\n }\r\n }\r\n\r\n // Override manipulation of globals by nested matchers\r\n if ( outermost ) {\r\n dirruns = dirrunsUnique;\r\n outermostContext = contextBackup;\r\n }\r\n\r\n return unmatched;\r\n };\r\n\r\n return bySet ?\r\n markFunction( superMatcher ) :\r\n superMatcher;\r\n }\r\n\r\n compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\r\n var i,\r\n setMatchers = [],\r\n elementMatchers = [],\r\n cached = compilerCache[ selector + \" \" ];\r\n\r\n if ( !cached ) {\r\n // Generate a function of recursive functions that can be used to check each element\r\n if ( !match ) {\r\n match = tokenize( selector );\r\n }\r\n i = match.length;\r\n while ( i-- ) {\r\n cached = matcherFromTokens( match[i] );\r\n if ( cached[ expando ] ) {\r\n setMatchers.push( cached );\r\n } else {\r\n elementMatchers.push( cached );\r\n }\r\n }\r\n\r\n // Cache the compiled function\r\n cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\r\n\r\n // Save selector and tokenization\r\n cached.selector = selector;\r\n }\r\n return cached;\r\n };\r\n\r\n /**\r\n * A low-level selection function that works with Sizzle's compiled\r\n * selector functions\r\n * @param {String|Function} selector A selector or a pre-compiled\r\n * selector function built with Sizzle.compile\r\n * @param {Element} context\r\n * @param {Array} [results]\r\n * @param {Array} [seed] A set of elements to match against\r\n */\r\n select = Sizzle.select = function( selector, context, results, seed ) {\r\n var i, tokens, token, type, find,\r\n compiled = typeof selector === \"function\" && selector,\r\n match = !seed && tokenize( (selector = compiled.selector || selector) );\r\n\r\n results = results || [];\r\n\r\n // Try to minimize operations if there is only one selector in the list and no seed\r\n // (the latter of which guarantees us context)\r\n if ( match.length === 1 ) {\r\n\r\n // Reduce context if the leading compound selector is an ID\r\n tokens = match[0] = match[0].slice( 0 );\r\n if ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\r\n support.getById && context.nodeType === 9 && documentIsHTML &&\r\n Expr.relative[ tokens[1].type ] ) {\r\n\r\n context = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\r\n if ( !context ) {\r\n return results;\r\n\r\n // Precompiled matchers will still verify ancestry, so step up a level\r\n } else if ( compiled ) {\r\n context = context.parentNode;\r\n }\r\n\r\n selector = selector.slice( tokens.shift().value.length );\r\n }\r\n\r\n // Fetch a seed set for right-to-left matching\r\n i = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\r\n while ( i-- ) {\r\n token = tokens[i];\r\n\r\n // Abort if we hit a combinator\r\n if ( Expr.relative[ (type = token.type) ] ) {\r\n break;\r\n }\r\n if ( (find = Expr.find[ type ]) ) {\r\n // Search, expanding context for leading sibling combinators\r\n if ( (seed = find(\r\n token.matches[0].replace( runescape, funescape ),\r\n rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\r\n )) ) {\r\n\r\n // If seed is empty or no tokens remain, we can return early\r\n tokens.splice( i, 1 );\r\n selector = seed.length && toSelector( tokens );\r\n if ( !selector ) {\r\n push.apply( results, seed );\r\n return results;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Compile and execute a filtering function if one is not provided\r\n // Provide `match` to avoid retokenization if we modified the selector above\r\n ( compiled || compile( selector, match ) )(\r\n seed,\r\n context,\r\n !documentIsHTML,\r\n results,\r\n !context || rsibling.test( selector ) && testContext( context.parentNode ) || context\r\n );\r\n return results;\r\n };\r\n\r\n// One-time assignments\r\n\r\n// Sort stability\r\n support.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\r\n\r\n// Support: Chrome 14-35+\r\n// Always assume duplicates if they aren't passed to the comparison function\r\n support.detectDuplicates = !!hasDuplicate;\r\n\r\n// Initialize against the default document\r\n setDocument();\r\n\r\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\r\n// Detached nodes confoundingly follow *each other*\r\n support.sortDetached = assert(function( div1 ) {\r\n // Should return 1, but returns 4 (following)\r\n return div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\r\n });\r\n\r\n// Support: IE<8\r\n// Prevent attribute/property \"interpolation\"\r\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\r\n if ( !assert(function( div ) {\r\n div.innerHTML = \"\";\r\n return div.firstChild.getAttribute(\"href\") === \"#\" ;\r\n }) ) {\r\n addHandle( \"type|href|height|width\", function( elem, name, isXML ) {\r\n if ( !isXML ) {\r\n return elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\r\n }\r\n });\r\n }\r\n\r\n// Support: IE<9\r\n// Use defaultValue in place of getAttribute(\"value\")\r\n if ( !support.attributes || !assert(function( div ) {\r\n div.innerHTML = \"\";\r\n div.firstChild.setAttribute( \"value\", \"\" );\r\n return div.firstChild.getAttribute( \"value\" ) === \"\";\r\n }) ) {\r\n addHandle( \"value\", function( elem, name, isXML ) {\r\n if ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\r\n return elem.defaultValue;\r\n }\r\n });\r\n }\r\n\r\n// Support: IE<9\r\n// Use getAttributeNode to fetch booleans when getAttribute lies\r\n if ( !assert(function( div ) {\r\n return div.getAttribute(\"disabled\") == null;\r\n }) ) {\r\n addHandle( booleans, function( elem, name, isXML ) {\r\n var val;\r\n if ( !isXML ) {\r\n return elem[ name ] === true ? name.toLowerCase() :\r\n (val = elem.getAttributeNode( name )) && val.specified ?\r\n val.value :\r\n null;\r\n }\r\n });\r\n }\r\n\r\n return Sizzle;\r\n\r\n })( window );\r\n\r\n\r\n\r\n jQuery.find = Sizzle;\r\n jQuery.expr = Sizzle.selectors;\r\n jQuery.expr[ \":\" ] = jQuery.expr.pseudos;\r\n jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\r\n jQuery.text = Sizzle.getText;\r\n jQuery.isXMLDoc = Sizzle.isXML;\r\n jQuery.contains = Sizzle.contains;\r\n\r\n\r\n\r\n var dir = function( elem, dir, until ) {\r\n var matched = [],\r\n truncate = until !== undefined;\r\n\r\n while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\r\n if ( elem.nodeType === 1 ) {\r\n if ( truncate && jQuery( elem ).is( until ) ) {\r\n break;\r\n }\r\n matched.push( elem );\r\n }\r\n }\r\n return matched;\r\n };\r\n\r\n\r\n var siblings = function( n, elem ) {\r\n var matched = [];\r\n\r\n for ( ; n; n = n.nextSibling ) {\r\n if ( n.nodeType === 1 && n !== elem ) {\r\n matched.push( n );\r\n }\r\n }\r\n\r\n return matched;\r\n };\r\n\r\n\r\n var rneedsContext = jQuery.expr.match.needsContext;\r\n\r\n var rsingleTag = ( /^<([\\w-]+)\\s*\\/?>(?:<\\/\\1>|)$/ );\r\n\r\n\r\n\r\n var risSimple = /^.[^:#\\[\\.,]*$/;\r\n\r\n// Implement the identical functionality for filter and not\r\n function winnow( elements, qualifier, not ) {\r\n if ( jQuery.isFunction( qualifier ) ) {\r\n return jQuery.grep( elements, function( elem, i ) {\r\n /* jshint -W018 */\r\n return !!qualifier.call( elem, i, elem ) !== not;\r\n } );\r\n\r\n }\r\n\r\n if ( qualifier.nodeType ) {\r\n return jQuery.grep( elements, function( elem ) {\r\n return ( elem === qualifier ) !== not;\r\n } );\r\n\r\n }\r\n\r\n if ( typeof qualifier === \"string\" ) {\r\n if ( risSimple.test( qualifier ) ) {\r\n return jQuery.filter( qualifier, elements, not );\r\n }\r\n\r\n qualifier = jQuery.filter( qualifier, elements );\r\n }\r\n\r\n return jQuery.grep( elements, function( elem ) {\r\n return ( indexOf.call( qualifier, elem ) > -1 ) !== not;\r\n } );\r\n }\r\n\r\n jQuery.filter = function( expr, elems, not ) {\r\n var elem = elems[ 0 ];\r\n\r\n if ( not ) {\r\n expr = \":not(\" + expr + \")\";\r\n }\r\n\r\n return elems.length === 1 && elem.nodeType === 1 ?\r\n jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\r\n jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\r\n return elem.nodeType === 1;\r\n } ) );\r\n };\r\n\r\n jQuery.fn.extend( {\r\n find: function( selector ) {\r\n var i,\r\n len = this.length,\r\n ret = [],\r\n self = this;\r\n\r\n if ( typeof selector !== \"string\" ) {\r\n return this.pushStack( jQuery( selector ).filter( function() {\r\n for ( i = 0; i < len; i++ ) {\r\n if ( jQuery.contains( self[ i ], this ) ) {\r\n return true;\r\n }\r\n }\r\n } ) );\r\n }\r\n\r\n for ( i = 0; i < len; i++ ) {\r\n jQuery.find( selector, self[ i ], ret );\r\n }\r\n\r\n // Needed because $( selector, context ) becomes $( context ).find( selector )\r\n ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\r\n ret.selector = this.selector ? this.selector + \" \" + selector : selector;\r\n return ret;\r\n },\r\n filter: function( selector ) {\r\n return this.pushStack( winnow( this, selector || [], false ) );\r\n },\r\n not: function( selector ) {\r\n return this.pushStack( winnow( this, selector || [], true ) );\r\n },\r\n is: function( selector ) {\r\n return !!winnow(\r\n this,\r\n\r\n // If this is a positional/relative selector, check membership in the returned set\r\n // so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\r\n typeof selector === \"string\" && rneedsContext.test( selector ) ?\r\n jQuery( selector ) :\r\n selector || [],\r\n false\r\n ).length;\r\n }\r\n } );\r\n\r\n\r\n// Initialize a jQuery object\r\n\r\n\r\n// A central reference to the root jQuery(document)\r\n var rootjQuery,\r\n\r\n // A simple way to check for HTML strings\r\n // Prioritize #id over to avoid XSS via location.hash (#9521)\r\n // Strict HTML recognition (#11290: must start with <)\r\n rquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\r\n\r\n init = jQuery.fn.init = function( selector, context, root ) {\r\n var match, elem;\r\n\r\n // HANDLE: $(\"\"), $(null), $(undefined), $(false)\r\n if ( !selector ) {\r\n return this;\r\n }\r\n\r\n // Method init() accepts an alternate rootjQuery\r\n // so migrate can support jQuery.sub (gh-2101)\r\n root = root || rootjQuery;\r\n\r\n // Handle HTML strings\r\n if ( typeof selector === \"string\" ) {\r\n if ( selector[ 0 ] === \"<\" &&\r\n selector[ selector.length - 1 ] === \">\" &&\r\n selector.length >= 3 ) {\r\n\r\n // Assume that strings that start and end with <> are HTML and skip the regex check\r\n match = [ null, selector, null ];\r\n\r\n } else {\r\n match = rquickExpr.exec( selector );\r\n }\r\n\r\n // Match html or make sure no context is specified for #id\r\n if ( match && ( match[ 1 ] || !context ) ) {\r\n\r\n // HANDLE: $(html) -> $(array)\r\n if ( match[ 1 ] ) {\r\n context = context instanceof jQuery ? context[ 0 ] : context;\r\n\r\n // Option to run scripts is true for back-compat\r\n // Intentionally let the error be thrown if parseHTML is not present\r\n jQuery.merge( this, jQuery.parseHTML(\r\n match[ 1 ],\r\n context && context.nodeType ? context.ownerDocument || context : document,\r\n true\r\n ) );\r\n\r\n // HANDLE: $(html, props)\r\n if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\r\n for ( match in context ) {\r\n\r\n // Properties of context are called as methods if possible\r\n if ( jQuery.isFunction( this[ match ] ) ) {\r\n this[ match ]( context[ match ] );\r\n\r\n // ...and otherwise set as attributes\r\n } else {\r\n this.attr( match, context[ match ] );\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n\r\n // HANDLE: $(#id)\r\n } else {\r\n elem = document.getElementById( match[ 2 ] );\r\n\r\n // Support: Blackberry 4.6\r\n // gEBID returns nodes no longer in the document (#6963)\r\n if ( elem && elem.parentNode ) {\r\n\r\n // Inject the element directly into the jQuery object\r\n this.length = 1;\r\n this[ 0 ] = elem;\r\n }\r\n\r\n this.context = document;\r\n this.selector = selector;\r\n return this;\r\n }\r\n\r\n // HANDLE: $(expr, $(...))\r\n } else if ( !context || context.jquery ) {\r\n return ( context || root ).find( selector );\r\n\r\n // HANDLE: $(expr, context)\r\n // (which is just equivalent to: $(context).find(expr)\r\n } else {\r\n return this.constructor( context ).find( selector );\r\n }\r\n\r\n // HANDLE: $(DOMElement)\r\n } else if ( selector.nodeType ) {\r\n this.context = this[ 0 ] = selector;\r\n this.length = 1;\r\n return this;\r\n\r\n // HANDLE: $(function)\r\n // Shortcut for document ready\r\n } else if ( jQuery.isFunction( selector ) ) {\r\n return root.ready !== undefined ?\r\n root.ready( selector ) :\r\n\r\n // Execute immediately if ready is not present\r\n selector( jQuery );\r\n }\r\n\r\n if ( selector.selector !== undefined ) {\r\n this.selector = selector.selector;\r\n this.context = selector.context;\r\n }\r\n\r\n return jQuery.makeArray( selector, this );\r\n };\r\n\r\n// Give the init function the jQuery prototype for later instantiation\r\n init.prototype = jQuery.fn;\r\n\r\n// Initialize central reference\r\n rootjQuery = jQuery( document );\r\n\r\n\r\n var rparentsprev = /^(?:parents|prev(?:Until|All))/,\r\n\r\n // Methods guaranteed to produce a unique set when starting from a unique set\r\n guaranteedUnique = {\r\n children: true,\r\n contents: true,\r\n next: true,\r\n prev: true\r\n };\r\n\r\n jQuery.fn.extend( {\r\n has: function( target ) {\r\n var targets = jQuery( target, this ),\r\n l = targets.length;\r\n\r\n return this.filter( function() {\r\n var i = 0;\r\n for ( ; i < l; i++ ) {\r\n if ( jQuery.contains( this, targets[ i ] ) ) {\r\n return true;\r\n }\r\n }\r\n } );\r\n },\r\n\r\n closest: function( selectors, context ) {\r\n var cur,\r\n i = 0,\r\n l = this.length,\r\n matched = [],\r\n pos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\r\n jQuery( selectors, context || this.context ) :\r\n 0;\r\n\r\n for ( ; i < l; i++ ) {\r\n for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\r\n\r\n // Always skip document fragments\r\n if ( cur.nodeType < 11 && ( pos ?\r\n pos.index( cur ) > -1 :\r\n\r\n // Don't pass non-elements to Sizzle\r\n cur.nodeType === 1 &&\r\n jQuery.find.matchesSelector( cur, selectors ) ) ) {\r\n\r\n matched.push( cur );\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\r\n },\r\n\r\n // Determine the position of an element within the set\r\n index: function( elem ) {\r\n\r\n // No argument, return index in parent\r\n if ( !elem ) {\r\n return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\r\n }\r\n\r\n // Index in selector\r\n if ( typeof elem === \"string\" ) {\r\n return indexOf.call( jQuery( elem ), this[ 0 ] );\r\n }\r\n\r\n // Locate the position of the desired element\r\n return indexOf.call( this,\r\n\r\n // If it receives a jQuery object, the first element is used\r\n elem.jquery ? elem[ 0 ] : elem\r\n );\r\n },\r\n\r\n add: function( selector, context ) {\r\n return this.pushStack(\r\n jQuery.uniqueSort(\r\n jQuery.merge( this.get(), jQuery( selector, context ) )\r\n )\r\n );\r\n },\r\n\r\n addBack: function( selector ) {\r\n return this.add( selector == null ?\r\n this.prevObject : this.prevObject.filter( selector )\r\n );\r\n }\r\n } );\r\n\r\n function sibling( cur, dir ) {\r\n while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\r\n return cur;\r\n }\r\n\r\n jQuery.each( {\r\n parent: function( elem ) {\r\n var parent = elem.parentNode;\r\n return parent && parent.nodeType !== 11 ? parent : null;\r\n },\r\n parents: function( elem ) {\r\n return dir( elem, \"parentNode\" );\r\n },\r\n parentsUntil: function( elem, i, until ) {\r\n return dir( elem, \"parentNode\", until );\r\n },\r\n next: function( elem ) {\r\n return sibling( elem, \"nextSibling\" );\r\n },\r\n prev: function( elem ) {\r\n return sibling( elem, \"previousSibling\" );\r\n },\r\n nextAll: function( elem ) {\r\n return dir( elem, \"nextSibling\" );\r\n },\r\n prevAll: function( elem ) {\r\n return dir( elem, \"previousSibling\" );\r\n },\r\n nextUntil: function( elem, i, until ) {\r\n return dir( elem, \"nextSibling\", until );\r\n },\r\n prevUntil: function( elem, i, until ) {\r\n return dir( elem, \"previousSibling\", until );\r\n },\r\n siblings: function( elem ) {\r\n return siblings( ( elem.parentNode || {} ).firstChild, elem );\r\n },\r\n children: function( elem ) {\r\n return siblings( elem.firstChild );\r\n },\r\n contents: function( elem ) {\r\n return elem.contentDocument || jQuery.merge( [], elem.childNodes );\r\n }\r\n }, function( name, fn ) {\r\n jQuery.fn[ name ] = function( until, selector ) {\r\n var matched = jQuery.map( this, fn, until );\r\n\r\n if ( name.slice( -5 ) !== \"Until\" ) {\r\n selector = until;\r\n }\r\n\r\n if ( selector && typeof selector === \"string\" ) {\r\n matched = jQuery.filter( selector, matched );\r\n }\r\n\r\n if ( this.length > 1 ) {\r\n\r\n // Remove duplicates\r\n if ( !guaranteedUnique[ name ] ) {\r\n jQuery.uniqueSort( matched );\r\n }\r\n\r\n // Reverse order for parents* and prev-derivatives\r\n if ( rparentsprev.test( name ) ) {\r\n matched.reverse();\r\n }\r\n }\r\n\r\n return this.pushStack( matched );\r\n };\r\n } );\r\n var rnotwhite = ( /\\S+/g );\r\n\r\n\r\n\r\n// Convert String-formatted options into Object-formatted ones\r\n function createOptions( options ) {\r\n var object = {};\r\n jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\r\n object[ flag ] = true;\r\n } );\r\n return object;\r\n }\r\n\r\n /*\r\n * Create a callback list using the following parameters:\r\n *\r\n *\toptions: an optional list of space-separated options that will change how\r\n *\t\t\tthe callback list behaves or a more traditional option object\r\n *\r\n * By default a callback list will act like an event callback list and can be\r\n * \"fired\" multiple times.\r\n *\r\n * Possible options:\r\n *\r\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\r\n *\r\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\r\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\r\n *\t\t\t\t\tvalues (like a Deferred)\r\n *\r\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\r\n *\r\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\r\n *\r\n */\r\n jQuery.Callbacks = function( options ) {\r\n\r\n // Convert options from String-formatted to Object-formatted if needed\r\n // (we check in cache first)\r\n options = typeof options === \"string\" ?\r\n createOptions( options ) :\r\n jQuery.extend( {}, options );\r\n\r\n var // Flag to know if list is currently firing\r\n firing,\r\n\r\n // Last fire value for non-forgettable lists\r\n memory,\r\n\r\n // Flag to know if list was already fired\r\n fired,\r\n\r\n // Flag to prevent firing\r\n locked,\r\n\r\n // Actual callback list\r\n list = [],\r\n\r\n // Queue of execution data for repeatable lists\r\n queue = [],\r\n\r\n // Index of currently firing callback (modified by add/remove as needed)\r\n firingIndex = -1,\r\n\r\n // Fire callbacks\r\n fire = function() {\r\n\r\n // Enforce single-firing\r\n locked = options.once;\r\n\r\n // Execute callbacks for all pending executions,\r\n // respecting firingIndex overrides and runtime changes\r\n fired = firing = true;\r\n for ( ; queue.length; firingIndex = -1 ) {\r\n memory = queue.shift();\r\n while ( ++firingIndex < list.length ) {\r\n\r\n // Run callback and check for early termination\r\n if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\r\n options.stopOnFalse ) {\r\n\r\n // Jump to end and forget the data so .add doesn't re-fire\r\n firingIndex = list.length;\r\n memory = false;\r\n }\r\n }\r\n }\r\n\r\n // Forget the data if we're done with it\r\n if ( !options.memory ) {\r\n memory = false;\r\n }\r\n\r\n firing = false;\r\n\r\n // Clean up if we're done firing for good\r\n if ( locked ) {\r\n\r\n // Keep an empty list if we have data for future add calls\r\n if ( memory ) {\r\n list = [];\r\n\r\n // Otherwise, this object is spent\r\n } else {\r\n list = \"\";\r\n }\r\n }\r\n },\r\n\r\n // Actual Callbacks object\r\n self = {\r\n\r\n // Add a callback or a collection of callbacks to the list\r\n add: function() {\r\n if ( list ) {\r\n\r\n // If we have memory from a past run, we should fire after adding\r\n if ( memory && !firing ) {\r\n firingIndex = list.length - 1;\r\n queue.push( memory );\r\n }\r\n\r\n ( function add( args ) {\r\n jQuery.each( args, function( _, arg ) {\r\n if ( jQuery.isFunction( arg ) ) {\r\n if ( !options.unique || !self.has( arg ) ) {\r\n list.push( arg );\r\n }\r\n } else if ( arg && arg.length && jQuery.type( arg ) !== \"string\" ) {\r\n\r\n // Inspect recursively\r\n add( arg );\r\n }\r\n } );\r\n } )( arguments );\r\n\r\n if ( memory && !firing ) {\r\n fire();\r\n }\r\n }\r\n return this;\r\n },\r\n\r\n // Remove a callback from the list\r\n remove: function() {\r\n jQuery.each( arguments, function( _, arg ) {\r\n var index;\r\n while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\r\n list.splice( index, 1 );\r\n\r\n // Handle firing indexes\r\n if ( index <= firingIndex ) {\r\n firingIndex--;\r\n }\r\n }\r\n } );\r\n return this;\r\n },\r\n\r\n // Check if a given callback is in the list.\r\n // If no argument is given, return whether or not list has callbacks attached.\r\n has: function( fn ) {\r\n return fn ?\r\n jQuery.inArray( fn, list ) > -1 :\r\n list.length > 0;\r\n },\r\n\r\n // Remove all callbacks from the list\r\n empty: function() {\r\n if ( list ) {\r\n list = [];\r\n }\r\n return this;\r\n },\r\n\r\n // Disable .fire and .add\r\n // Abort any current/pending executions\r\n // Clear all callbacks and values\r\n disable: function() {\r\n locked = queue = [];\r\n list = memory = \"\";\r\n return this;\r\n },\r\n disabled: function() {\r\n return !list;\r\n },\r\n\r\n // Disable .fire\r\n // Also disable .add unless we have memory (since it would have no effect)\r\n // Abort any pending executions\r\n lock: function() {\r\n locked = queue = [];\r\n if ( !memory ) {\r\n list = memory = \"\";\r\n }\r\n return this;\r\n },\r\n locked: function() {\r\n return !!locked;\r\n },\r\n\r\n // Call all callbacks with the given context and arguments\r\n fireWith: function( context, args ) {\r\n if ( !locked ) {\r\n args = args || [];\r\n args = [ context, args.slice ? args.slice() : args ];\r\n queue.push( args );\r\n if ( !firing ) {\r\n fire();\r\n }\r\n }\r\n return this;\r\n },\r\n\r\n // Call all the callbacks with the given arguments\r\n fire: function() {\r\n self.fireWith( this, arguments );\r\n return this;\r\n },\r\n\r\n // To know if the callbacks have already been called at least once\r\n fired: function() {\r\n return !!fired;\r\n }\r\n };\r\n\r\n return self;\r\n };\r\n\r\n\r\n jQuery.extend( {\r\n\r\n Deferred: function( func ) {\r\n var tuples = [\r\n\r\n // action, add listener, listener list, final state\r\n [ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ), \"resolved\" ],\r\n [ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ), \"rejected\" ],\r\n [ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ) ]\r\n ],\r\n state = \"pending\",\r\n promise = {\r\n state: function() {\r\n return state;\r\n },\r\n always: function() {\r\n deferred.done( arguments ).fail( arguments );\r\n return this;\r\n },\r\n then: function( /* fnDone, fnFail, fnProgress */ ) {\r\n var fns = arguments;\r\n return jQuery.Deferred( function( newDefer ) {\r\n jQuery.each( tuples, function( i, tuple ) {\r\n var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\r\n\r\n // deferred[ done | fail | progress ] for forwarding actions to newDefer\r\n deferred[ tuple[ 1 ] ]( function() {\r\n var returned = fn && fn.apply( this, arguments );\r\n if ( returned && jQuery.isFunction( returned.promise ) ) {\r\n returned.promise()\r\n .progress( newDefer.notify )\r\n .done( newDefer.resolve )\r\n .fail( newDefer.reject );\r\n } else {\r\n newDefer[ tuple[ 0 ] + \"With\" ](\r\n this === promise ? newDefer.promise() : this,\r\n fn ? [ returned ] : arguments\r\n );\r\n }\r\n } );\r\n } );\r\n fns = null;\r\n } ).promise();\r\n },\r\n\r\n // Get a promise for this deferred\r\n // If obj is provided, the promise aspect is added to the object\r\n promise: function( obj ) {\r\n return obj != null ? jQuery.extend( obj, promise ) : promise;\r\n }\r\n },\r\n deferred = {};\r\n\r\n // Keep pipe for back-compat\r\n promise.pipe = promise.then;\r\n\r\n // Add list-specific methods\r\n jQuery.each( tuples, function( i, tuple ) {\r\n var list = tuple[ 2 ],\r\n stateString = tuple[ 3 ];\r\n\r\n // promise[ done | fail | progress ] = list.add\r\n promise[ tuple[ 1 ] ] = list.add;\r\n\r\n // Handle state\r\n if ( stateString ) {\r\n list.add( function() {\r\n\r\n // state = [ resolved | rejected ]\r\n state = stateString;\r\n\r\n // [ reject_list | resolve_list ].disable; progress_list.lock\r\n }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\r\n }\r\n\r\n // deferred[ resolve | reject | notify ]\r\n deferred[ tuple[ 0 ] ] = function() {\r\n deferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? promise : this, arguments );\r\n return this;\r\n };\r\n deferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\r\n } );\r\n\r\n // Make the deferred a promise\r\n promise.promise( deferred );\r\n\r\n // Call given func if any\r\n if ( func ) {\r\n func.call( deferred, deferred );\r\n }\r\n\r\n // All done!\r\n return deferred;\r\n },\r\n\r\n // Deferred helper\r\n when: function( subordinate /* , ..., subordinateN */ ) {\r\n var i = 0,\r\n resolveValues = slice.call( arguments ),\r\n length = resolveValues.length,\r\n\r\n // the count of uncompleted subordinates\r\n remaining = length !== 1 ||\r\n ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\r\n\r\n // the master Deferred.\r\n // If resolveValues consist of only a single Deferred, just use that.\r\n deferred = remaining === 1 ? subordinate : jQuery.Deferred(),\r\n\r\n // Update function for both resolve and progress values\r\n updateFunc = function( i, contexts, values ) {\r\n return function( value ) {\r\n contexts[ i ] = this;\r\n values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\r\n if ( values === progressValues ) {\r\n deferred.notifyWith( contexts, values );\r\n } else if ( !( --remaining ) ) {\r\n deferred.resolveWith( contexts, values );\r\n }\r\n };\r\n },\r\n\r\n progressValues, progressContexts, resolveContexts;\r\n\r\n // Add listeners to Deferred subordinates; treat others as resolved\r\n if ( length > 1 ) {\r\n progressValues = new Array( length );\r\n progressContexts = new Array( length );\r\n resolveContexts = new Array( length );\r\n for ( ; i < length; i++ ) {\r\n if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\r\n resolveValues[ i ].promise()\r\n .progress( updateFunc( i, progressContexts, progressValues ) )\r\n .done( updateFunc( i, resolveContexts, resolveValues ) )\r\n .fail( deferred.reject );\r\n } else {\r\n --remaining;\r\n }\r\n }\r\n }\r\n\r\n // If we're not waiting on anything, resolve the master\r\n if ( !remaining ) {\r\n deferred.resolveWith( resolveContexts, resolveValues );\r\n }\r\n\r\n return deferred.promise();\r\n }\r\n } );\r\n\r\n\r\n// The deferred used on DOM ready\r\n var readyList;\r\n\r\n jQuery.fn.ready = function( fn ) {\r\n\r\n // Add the callback\r\n jQuery.ready.promise().done( fn );\r\n\r\n return this;\r\n };\r\n\r\n jQuery.extend( {\r\n\r\n // Is the DOM ready to be used? Set to true once it occurs.\r\n isReady: false,\r\n\r\n // A counter to track how many items to wait for before\r\n // the ready event fires. See #6781\r\n readyWait: 1,\r\n\r\n // Hold (or release) the ready event\r\n holdReady: function( hold ) {\r\n if ( hold ) {\r\n jQuery.readyWait++;\r\n } else {\r\n jQuery.ready( true );\r\n }\r\n },\r\n\r\n // Handle when the DOM is ready\r\n ready: function( wait ) {\r\n\r\n // Abort if there are pending holds or we're already ready\r\n if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\r\n return;\r\n }\r\n\r\n // Remember that the DOM is ready\r\n jQuery.isReady = true;\r\n\r\n // If a normal DOM Ready event fired, decrement, and wait if need be\r\n if ( wait !== true && --jQuery.readyWait > 0 ) {\r\n return;\r\n }\r\n\r\n // If there are functions bound, to execute\r\n readyList.resolveWith( document, [ jQuery ] );\r\n\r\n // Trigger any bound ready events\r\n if ( jQuery.fn.triggerHandler ) {\r\n jQuery( document ).triggerHandler( \"ready\" );\r\n jQuery( document ).off( \"ready\" );\r\n }\r\n }\r\n } );\r\n\r\n /**\r\n * The ready event handler and self cleanup method\r\n */\r\n function completed() {\r\n document.removeEventListener( \"DOMContentLoaded\", completed );\r\n window.removeEventListener( \"load\", completed );\r\n jQuery.ready();\r\n }\r\n\r\n jQuery.ready.promise = function( obj ) {\r\n if ( !readyList ) {\r\n\r\n readyList = jQuery.Deferred();\r\n\r\n // Catch cases where $(document).ready() is called\r\n // after the browser event has already occurred.\r\n // Support: IE9-10 only\r\n // Older IE sometimes signals \"interactive\" too soon\r\n if ( document.readyState === \"complete\" ||\r\n ( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\r\n\r\n // Handle it asynchronously to allow scripts the opportunity to delay ready\r\n window.setTimeout( jQuery.ready );\r\n\r\n } else {\r\n\r\n // Use the handy event callback\r\n document.addEventListener( \"DOMContentLoaded\", completed );\r\n\r\n // A fallback to window.onload, that will always work\r\n window.addEventListener( \"load\", completed );\r\n }\r\n }\r\n return readyList.promise( obj );\r\n };\r\n\r\n// Kick off the DOM ready check even if the user does not\r\n jQuery.ready.promise();\r\n\r\n\r\n\r\n\r\n// Multifunctional method to get and set values of a collection\r\n// The value/s can optionally be executed if it's a function\r\n var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\r\n var i = 0,\r\n len = elems.length,\r\n bulk = key == null;\r\n\r\n // Sets many values\r\n if ( jQuery.type( key ) === \"object\" ) {\r\n chainable = true;\r\n for ( i in key ) {\r\n access( elems, fn, i, key[ i ], true, emptyGet, raw );\r\n }\r\n\r\n // Sets one value\r\n } else if ( value !== undefined ) {\r\n chainable = true;\r\n\r\n if ( !jQuery.isFunction( value ) ) {\r\n raw = true;\r\n }\r\n\r\n if ( bulk ) {\r\n\r\n // Bulk operations run against the entire set\r\n if ( raw ) {\r\n fn.call( elems, value );\r\n fn = null;\r\n\r\n // ...except when executing function values\r\n } else {\r\n bulk = fn;\r\n fn = function( elem, key, value ) {\r\n return bulk.call( jQuery( elem ), value );\r\n };\r\n }\r\n }\r\n\r\n if ( fn ) {\r\n for ( ; i < len; i++ ) {\r\n fn(\r\n elems[ i ], key, raw ?\r\n value :\r\n value.call( elems[ i ], i, fn( elems[ i ], key ) )\r\n );\r\n }\r\n }\r\n }\r\n\r\n return chainable ?\r\n elems :\r\n\r\n // Gets\r\n bulk ?\r\n fn.call( elems ) :\r\n len ? fn( elems[ 0 ], key ) : emptyGet;\r\n };\r\n var acceptData = function( owner ) {\r\n\r\n // Accepts only:\r\n // - Node\r\n // - Node.ELEMENT_NODE\r\n // - Node.DOCUMENT_NODE\r\n // - Object\r\n // - Any\r\n /* jshint -W018 */\r\n return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\r\n };\r\n\r\n\r\n\r\n\r\n function Data() {\r\n this.expando = jQuery.expando + Data.uid++;\r\n }\r\n\r\n Data.uid = 1;\r\n\r\n Data.prototype = {\r\n\r\n register: function( owner, initial ) {\r\n var value = initial || {};\r\n\r\n // If it is a node unlikely to be stringify-ed or looped over\r\n // use plain assignment\r\n if ( owner.nodeType ) {\r\n owner[ this.expando ] = value;\r\n\r\n // Otherwise secure it in a non-enumerable, non-writable property\r\n // configurability must be true to allow the property to be\r\n // deleted with the delete operator\r\n } else {\r\n Object.defineProperty( owner, this.expando, {\r\n value: value,\r\n writable: true,\r\n configurable: true\r\n } );\r\n }\r\n return owner[ this.expando ];\r\n },\r\n cache: function( owner ) {\r\n\r\n // We can accept data for non-element nodes in modern browsers,\r\n // but we should not, see #8335.\r\n // Always return an empty object.\r\n if ( !acceptData( owner ) ) {\r\n return {};\r\n }\r\n\r\n // Check if the owner object already has a cache\r\n var value = owner[ this.expando ];\r\n\r\n // If not, create one\r\n if ( !value ) {\r\n value = {};\r\n\r\n // We can accept data for non-element nodes in modern browsers,\r\n // but we should not, see #8335.\r\n // Always return an empty object.\r\n if ( acceptData( owner ) ) {\r\n\r\n // If it is a node unlikely to be stringify-ed or looped over\r\n // use plain assignment\r\n if ( owner.nodeType ) {\r\n owner[ this.expando ] = value;\r\n\r\n // Otherwise secure it in a non-enumerable property\r\n // configurable must be true to allow the property to be\r\n // deleted when data is removed\r\n } else {\r\n Object.defineProperty( owner, this.expando, {\r\n value: value,\r\n configurable: true\r\n } );\r\n }\r\n }\r\n }\r\n\r\n return value;\r\n },\r\n set: function( owner, data, value ) {\r\n var prop,\r\n cache = this.cache( owner );\r\n\r\n // Handle: [ owner, key, value ] args\r\n if ( typeof data === \"string\" ) {\r\n cache[ data ] = value;\r\n\r\n // Handle: [ owner, { properties } ] args\r\n } else {\r\n\r\n // Copy the properties one-by-one to the cache object\r\n for ( prop in data ) {\r\n cache[ prop ] = data[ prop ];\r\n }\r\n }\r\n return cache;\r\n },\r\n get: function( owner, key ) {\r\n return key === undefined ?\r\n this.cache( owner ) :\r\n owner[ this.expando ] && owner[ this.expando ][ key ];\r\n },\r\n access: function( owner, key, value ) {\r\n var stored;\r\n\r\n // In cases where either:\r\n //\r\n // 1. No key was specified\r\n // 2. A string key was specified, but no value provided\r\n //\r\n // Take the \"read\" path and allow the get method to determine\r\n // which value to return, respectively either:\r\n //\r\n // 1. The entire cache object\r\n // 2. The data stored at the key\r\n //\r\n if ( key === undefined ||\r\n ( ( key && typeof key === \"string\" ) && value === undefined ) ) {\r\n\r\n stored = this.get( owner, key );\r\n\r\n return stored !== undefined ?\r\n stored : this.get( owner, jQuery.camelCase( key ) );\r\n }\r\n\r\n // When the key is not a string, or both a key and value\r\n // are specified, set or extend (existing objects) with either:\r\n //\r\n // 1. An object of properties\r\n // 2. A key and value\r\n //\r\n this.set( owner, key, value );\r\n\r\n // Since the \"set\" path can have two possible entry points\r\n // return the expected data based on which path was taken[*]\r\n return value !== undefined ? value : key;\r\n },\r\n remove: function( owner, key ) {\r\n var i, name, camel,\r\n cache = owner[ this.expando ];\r\n\r\n if ( cache === undefined ) {\r\n return;\r\n }\r\n\r\n if ( key === undefined ) {\r\n this.register( owner );\r\n\r\n } else {\r\n\r\n // Support array or space separated string of keys\r\n if ( jQuery.isArray( key ) ) {\r\n\r\n // If \"name\" is an array of keys...\r\n // When data is initially created, via (\"key\", \"val\") signature,\r\n // keys will be converted to camelCase.\r\n // Since there is no way to tell _how_ a key was added, remove\r\n // both plain key and camelCase key. #12786\r\n // This will only penalize the array argument path.\r\n name = key.concat( key.map( jQuery.camelCase ) );\r\n } else {\r\n camel = jQuery.camelCase( key );\r\n\r\n // Try the string as a key before any manipulation\r\n if ( key in cache ) {\r\n name = [ key, camel ];\r\n } else {\r\n\r\n // If a key with the spaces exists, use it.\r\n // Otherwise, create an array by matching non-whitespace\r\n name = camel;\r\n name = name in cache ?\r\n [ name ] : ( name.match( rnotwhite ) || [] );\r\n }\r\n }\r\n\r\n i = name.length;\r\n\r\n while ( i-- ) {\r\n delete cache[ name[ i ] ];\r\n }\r\n }\r\n\r\n // Remove the expando if there's no more data\r\n if ( key === undefined || jQuery.isEmptyObject( cache ) ) {\r\n\r\n // Support: Chrome <= 35-45+\r\n // Webkit & Blink performance suffers when deleting properties\r\n // from DOM nodes, so set to undefined instead\r\n // https://code.google.com/p/chromium/issues/detail?id=378607\r\n if ( owner.nodeType ) {\r\n owner[ this.expando ] = undefined;\r\n } else {\r\n delete owner[ this.expando ];\r\n }\r\n }\r\n },\r\n hasData: function( owner ) {\r\n var cache = owner[ this.expando ];\r\n return cache !== undefined && !jQuery.isEmptyObject( cache );\r\n }\r\n };\r\n var dataPriv = new Data();\r\n\r\n var dataUser = new Data();\r\n\r\n\r\n\r\n//\tImplementation Summary\r\n//\r\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\r\n//\t2. Improve the module's maintainability by reducing the storage\r\n//\t\tpaths to a single mechanism.\r\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\r\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\r\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\r\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\r\n\r\n var rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\r\n rmultiDash = /[A-Z]/g;\r\n\r\n function dataAttr( elem, key, data ) {\r\n var name;\r\n\r\n // If nothing was found internally, try to fetch any\r\n // data from the HTML5 data-* attribute\r\n if ( data === undefined && elem.nodeType === 1 ) {\r\n name = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\r\n data = elem.getAttribute( name );\r\n\r\n if ( typeof data === \"string\" ) {\r\n try {\r\n data = data === \"true\" ? true :\r\n data === \"false\" ? false :\r\n data === \"null\" ? null :\r\n\r\n // Only convert to a number if it doesn't change the string\r\n +data + \"\" === data ? +data :\r\n rbrace.test( data ) ? jQuery.parseJSON( data ) :\r\n data;\r\n } catch ( e ) {}\r\n\r\n // Make sure we set the data so it isn't changed later\r\n dataUser.set( elem, key, data );\r\n } else {\r\n data = undefined;\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n jQuery.extend( {\r\n hasData: function( elem ) {\r\n return dataUser.hasData( elem ) || dataPriv.hasData( elem );\r\n },\r\n\r\n data: function( elem, name, data ) {\r\n return dataUser.access( elem, name, data );\r\n },\r\n\r\n removeData: function( elem, name ) {\r\n dataUser.remove( elem, name );\r\n },\r\n\r\n // TODO: Now that all calls to _data and _removeData have been replaced\r\n // with direct calls to dataPriv methods, these can be deprecated.\r\n _data: function( elem, name, data ) {\r\n return dataPriv.access( elem, name, data );\r\n },\r\n\r\n _removeData: function( elem, name ) {\r\n dataPriv.remove( elem, name );\r\n }\r\n } );\r\n\r\n jQuery.fn.extend( {\r\n data: function( key, value ) {\r\n var i, name, data,\r\n elem = this[ 0 ],\r\n attrs = elem && elem.attributes;\r\n\r\n // Gets all values\r\n if ( key === undefined ) {\r\n if ( this.length ) {\r\n data = dataUser.get( elem );\r\n\r\n if ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\r\n i = attrs.length;\r\n while ( i-- ) {\r\n\r\n // Support: IE11+\r\n // The attrs elements can be null (#14894)\r\n if ( attrs[ i ] ) {\r\n name = attrs[ i ].name;\r\n if ( name.indexOf( \"data-\" ) === 0 ) {\r\n name = jQuery.camelCase( name.slice( 5 ) );\r\n dataAttr( elem, name, data[ name ] );\r\n }\r\n }\r\n }\r\n dataPriv.set( elem, \"hasDataAttrs\", true );\r\n }\r\n }\r\n\r\n return data;\r\n }\r\n\r\n // Sets multiple values\r\n if ( typeof key === \"object\" ) {\r\n return this.each( function() {\r\n dataUser.set( this, key );\r\n } );\r\n }\r\n\r\n return access( this, function( value ) {\r\n var data, camelKey;\r\n\r\n // The calling jQuery object (element matches) is not empty\r\n // (and therefore has an element appears at this[ 0 ]) and the\r\n // `value` parameter was not undefined. An empty jQuery object\r\n // will result in `undefined` for elem = this[ 0 ] which will\r\n // throw an exception if an attempt to read a data cache is made.\r\n if ( elem && value === undefined ) {\r\n\r\n // Attempt to get data from the cache\r\n // with the key as-is\r\n data = dataUser.get( elem, key ) ||\r\n\r\n // Try to find dashed key if it exists (gh-2779)\r\n // This is for 2.2.x only\r\n dataUser.get( elem, key.replace( rmultiDash, \"-$&\" ).toLowerCase() );\r\n\r\n if ( data !== undefined ) {\r\n return data;\r\n }\r\n\r\n camelKey = jQuery.camelCase( key );\r\n\r\n // Attempt to get data from the cache\r\n // with the key camelized\r\n data = dataUser.get( elem, camelKey );\r\n if ( data !== undefined ) {\r\n return data;\r\n }\r\n\r\n // Attempt to \"discover\" the data in\r\n // HTML5 custom data-* attrs\r\n data = dataAttr( elem, camelKey, undefined );\r\n if ( data !== undefined ) {\r\n return data;\r\n }\r\n\r\n // We tried really hard, but the data doesn't exist.\r\n return;\r\n }\r\n\r\n // Set the data...\r\n camelKey = jQuery.camelCase( key );\r\n this.each( function() {\r\n\r\n // First, attempt to store a copy or reference of any\r\n // data that might've been store with a camelCased key.\r\n var data = dataUser.get( this, camelKey );\r\n\r\n // For HTML5 data-* attribute interop, we have to\r\n // store property names with dashes in a camelCase form.\r\n // This might not apply to all properties...*\r\n dataUser.set( this, camelKey, value );\r\n\r\n // *... In the case of properties that might _actually_\r\n // have dashes, we need to also store a copy of that\r\n // unchanged property.\r\n if ( key.indexOf( \"-\" ) > -1 && data !== undefined ) {\r\n dataUser.set( this, key, value );\r\n }\r\n } );\r\n }, null, value, arguments.length > 1, null, true );\r\n },\r\n\r\n removeData: function( key ) {\r\n return this.each( function() {\r\n dataUser.remove( this, key );\r\n } );\r\n }\r\n } );\r\n\r\n\r\n jQuery.extend( {\r\n queue: function( elem, type, data ) {\r\n var queue;\r\n\r\n if ( elem ) {\r\n type = ( type || \"fx\" ) + \"queue\";\r\n queue = dataPriv.get( elem, type );\r\n\r\n // Speed up dequeue by getting out quickly if this is just a lookup\r\n if ( data ) {\r\n if ( !queue || jQuery.isArray( data ) ) {\r\n queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\r\n } else {\r\n queue.push( data );\r\n }\r\n }\r\n return queue || [];\r\n }\r\n },\r\n\r\n dequeue: function( elem, type ) {\r\n type = type || \"fx\";\r\n\r\n var queue = jQuery.queue( elem, type ),\r\n startLength = queue.length,\r\n fn = queue.shift(),\r\n hooks = jQuery._queueHooks( elem, type ),\r\n next = function() {\r\n jQuery.dequeue( elem, type );\r\n };\r\n\r\n // If the fx queue is dequeued, always remove the progress sentinel\r\n if ( fn === \"inprogress\" ) {\r\n fn = queue.shift();\r\n startLength--;\r\n }\r\n\r\n if ( fn ) {\r\n\r\n // Add a progress sentinel to prevent the fx queue from being\r\n // automatically dequeued\r\n if ( type === \"fx\" ) {\r\n queue.unshift( \"inprogress\" );\r\n }\r\n\r\n // Clear up the last queue stop function\r\n delete hooks.stop;\r\n fn.call( elem, next, hooks );\r\n }\r\n\r\n if ( !startLength && hooks ) {\r\n hooks.empty.fire();\r\n }\r\n },\r\n\r\n // Not public - generate a queueHooks object, or return the current one\r\n _queueHooks: function( elem, type ) {\r\n var key = type + \"queueHooks\";\r\n return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\r\n empty: jQuery.Callbacks( \"once memory\" ).add( function() {\r\n dataPriv.remove( elem, [ type + \"queue\", key ] );\r\n } )\r\n } );\r\n }\r\n } );\r\n\r\n jQuery.fn.extend( {\r\n queue: function( type, data ) {\r\n var setter = 2;\r\n\r\n if ( typeof type !== \"string\" ) {\r\n data = type;\r\n type = \"fx\";\r\n setter--;\r\n }\r\n\r\n if ( arguments.length < setter ) {\r\n return jQuery.queue( this[ 0 ], type );\r\n }\r\n\r\n return data === undefined ?\r\n this :\r\n this.each( function() {\r\n var queue = jQuery.queue( this, type, data );\r\n\r\n // Ensure a hooks for this queue\r\n jQuery._queueHooks( this, type );\r\n\r\n if ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\r\n jQuery.dequeue( this, type );\r\n }\r\n } );\r\n },\r\n dequeue: function( type ) {\r\n return this.each( function() {\r\n jQuery.dequeue( this, type );\r\n } );\r\n },\r\n clearQueue: function( type ) {\r\n return this.queue( type || \"fx\", [] );\r\n },\r\n\r\n // Get a promise resolved when queues of a certain type\r\n // are emptied (fx is the type by default)\r\n promise: function( type, obj ) {\r\n var tmp,\r\n count = 1,\r\n defer = jQuery.Deferred(),\r\n elements = this,\r\n i = this.length,\r\n resolve = function() {\r\n if ( !( --count ) ) {\r\n defer.resolveWith( elements, [ elements ] );\r\n }\r\n };\r\n\r\n if ( typeof type !== \"string\" ) {\r\n obj = type;\r\n type = undefined;\r\n }\r\n type = type || \"fx\";\r\n\r\n while ( i-- ) {\r\n tmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\r\n if ( tmp && tmp.empty ) {\r\n count++;\r\n tmp.empty.add( resolve );\r\n }\r\n }\r\n resolve();\r\n return defer.promise( obj );\r\n }\r\n } );\r\n var pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\r\n\r\n var rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\r\n\r\n\r\n var cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\r\n\r\n var isHidden = function( elem, el ) {\r\n\r\n // isHidden might be called from jQuery#filter function;\r\n // in that case, element will be second argument\r\n elem = el || elem;\r\n return jQuery.css( elem, \"display\" ) === \"none\" ||\r\n !jQuery.contains( elem.ownerDocument, elem );\r\n };\r\n\r\n\r\n\r\n function adjustCSS( elem, prop, valueParts, tween ) {\r\n var adjusted,\r\n scale = 1,\r\n maxIterations = 20,\r\n currentValue = tween ?\r\n function() { return tween.cur(); } :\r\n function() { return jQuery.css( elem, prop, \"\" ); },\r\n initial = currentValue(),\r\n unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\r\n\r\n // Starting value computation is required for potential unit mismatches\r\n initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\r\n rcssNum.exec( jQuery.css( elem, prop ) );\r\n\r\n if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\r\n\r\n // Trust units reported by jQuery.css\r\n unit = unit || initialInUnit[ 3 ];\r\n\r\n // Make sure we update the tween properties later on\r\n valueParts = valueParts || [];\r\n\r\n // Iteratively approximate from a nonzero starting point\r\n initialInUnit = +initial || 1;\r\n\r\n do {\r\n\r\n // If previous iteration zeroed out, double until we get *something*.\r\n // Use string for doubling so we don't accidentally see scale as unchanged below\r\n scale = scale || \".5\";\r\n\r\n // Adjust and apply\r\n initialInUnit = initialInUnit / scale;\r\n jQuery.style( elem, prop, initialInUnit + unit );\r\n\r\n // Update scale, tolerating zero or NaN from tween.cur()\r\n // Break the loop if scale is unchanged or perfect, or if we've just had enough.\r\n } while (\r\n scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations\r\n );\r\n }\r\n\r\n if ( valueParts ) {\r\n initialInUnit = +initialInUnit || +initial || 0;\r\n\r\n // Apply relative offset (+=/-=) if specified\r\n adjusted = valueParts[ 1 ] ?\r\n initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\r\n +valueParts[ 2 ];\r\n if ( tween ) {\r\n tween.unit = unit;\r\n tween.start = initialInUnit;\r\n tween.end = adjusted;\r\n }\r\n }\r\n return adjusted;\r\n }\r\n var rcheckableType = ( /^(?:checkbox|radio)$/i );\r\n\r\n var rtagName = ( /<([\\w:-]+)/ );\r\n\r\n var rscriptType = ( /^$|\\/(?:java|ecma)script/i );\r\n\r\n\r\n\r\n// We have to close these tags to support XHTML (#13200)\r\n var wrapMap = {\r\n\r\n // Support: IE9\r\n option: [ 1, \"\" ],\r\n\r\n // XHTML parsers do not magically insert elements in the\r\n // same way that tag soup parsers do. So we cannot shorten\r\n // this by omitting or other required elements.\r\n thead: [ 1, \"\", \"
      \" ],\r\n col: [ 2, \"\", \"
      \" ],\r\n tr: [ 2, \"\", \"
      \" ],\r\n td: [ 3, \"\", \"
      \" ],\r\n\r\n _default: [ 0, \"\", \"\" ]\r\n };\r\n\r\n// Support: IE9\r\n wrapMap.optgroup = wrapMap.option;\r\n\r\n wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\r\n wrapMap.th = wrapMap.td;\r\n\r\n\r\n function getAll( context, tag ) {\r\n\r\n // Support: IE9-11+\r\n // Use typeof to avoid zero-argument method invocation on host objects (#15151)\r\n var ret = typeof context.getElementsByTagName !== \"undefined\" ?\r\n context.getElementsByTagName( tag || \"*\" ) :\r\n typeof context.querySelectorAll !== \"undefined\" ?\r\n context.querySelectorAll( tag || \"*\" ) :\r\n [];\r\n\r\n return tag === undefined || tag && jQuery.nodeName( context, tag ) ?\r\n jQuery.merge( [ context ], ret ) :\r\n ret;\r\n }\r\n\r\n\r\n// Mark scripts as having already been evaluated\r\n function setGlobalEval( elems, refElements ) {\r\n var i = 0,\r\n l = elems.length;\r\n\r\n for ( ; i < l; i++ ) {\r\n dataPriv.set(\r\n elems[ i ],\r\n \"globalEval\",\r\n !refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\r\n );\r\n }\r\n }\r\n\r\n\r\n var rhtml = /<|&#?\\w+;/;\r\n\r\n function buildFragment( elems, context, scripts, selection, ignored ) {\r\n var elem, tmp, tag, wrap, contains, j,\r\n fragment = context.createDocumentFragment(),\r\n nodes = [],\r\n i = 0,\r\n l = elems.length;\r\n\r\n for ( ; i < l; i++ ) {\r\n elem = elems[ i ];\r\n\r\n if ( elem || elem === 0 ) {\r\n\r\n // Add nodes directly\r\n if ( jQuery.type( elem ) === \"object\" ) {\r\n\r\n // Support: Android<4.1, PhantomJS<2\r\n // push.apply(_, arraylike) throws on ancient WebKit\r\n jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\r\n\r\n // Convert non-html into a text node\r\n } else if ( !rhtml.test( elem ) ) {\r\n nodes.push( context.createTextNode( elem ) );\r\n\r\n // Convert html into DOM nodes\r\n } else {\r\n tmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\r\n\r\n // Deserialize a standard representation\r\n tag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\r\n wrap = wrapMap[ tag ] || wrapMap._default;\r\n tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\r\n\r\n // Descend through wrappers to the right content\r\n j = wrap[ 0 ];\r\n while ( j-- ) {\r\n tmp = tmp.lastChild;\r\n }\r\n\r\n // Support: Android<4.1, PhantomJS<2\r\n // push.apply(_, arraylike) throws on ancient WebKit\r\n jQuery.merge( nodes, tmp.childNodes );\r\n\r\n // Remember the top-level container\r\n tmp = fragment.firstChild;\r\n\r\n // Ensure the created nodes are orphaned (#12392)\r\n tmp.textContent = \"\";\r\n }\r\n }\r\n }\r\n\r\n // Remove wrapper from fragment\r\n fragment.textContent = \"\";\r\n\r\n i = 0;\r\n while ( ( elem = nodes[ i++ ] ) ) {\r\n\r\n // Skip elements already in the context collection (trac-4087)\r\n if ( selection && jQuery.inArray( elem, selection ) > -1 ) {\r\n if ( ignored ) {\r\n ignored.push( elem );\r\n }\r\n continue;\r\n }\r\n\r\n contains = jQuery.contains( elem.ownerDocument, elem );\r\n\r\n // Append to fragment\r\n tmp = getAll( fragment.appendChild( elem ), \"script\" );\r\n\r\n // Preserve script evaluation history\r\n if ( contains ) {\r\n setGlobalEval( tmp );\r\n }\r\n\r\n // Capture executables\r\n if ( scripts ) {\r\n j = 0;\r\n while ( ( elem = tmp[ j++ ] ) ) {\r\n if ( rscriptType.test( elem.type || \"\" ) ) {\r\n scripts.push( elem );\r\n }\r\n }\r\n }\r\n }\r\n\r\n return fragment;\r\n }\r\n\r\n\r\n ( function() {\r\n var fragment = document.createDocumentFragment(),\r\n div = fragment.appendChild( document.createElement( \"div\" ) ),\r\n input = document.createElement( \"input\" );\r\n\r\n // Support: Android 4.0-4.3, Safari<=5.1\r\n // Check state lost if the name is set (#11217)\r\n // Support: Windows Web Apps (WWA)\r\n // `name` and `type` must use .setAttribute for WWA (#14901)\r\n input.setAttribute( \"type\", \"radio\" );\r\n input.setAttribute( \"checked\", \"checked\" );\r\n input.setAttribute( \"name\", \"t\" );\r\n\r\n div.appendChild( input );\r\n\r\n // Support: Safari<=5.1, Android<4.2\r\n // Older WebKit doesn't clone checked state correctly in fragments\r\n support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\r\n\r\n // Support: IE<=11+\r\n // Make sure textarea (and checkbox) defaultValue is properly cloned\r\n div.innerHTML = \"\";\r\n support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\r\n } )();\r\n\r\n\r\n var\r\n rkeyEvent = /^key/,\r\n rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\r\n rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\r\n\r\n function returnTrue() {\r\n return true;\r\n }\r\n\r\n function returnFalse() {\r\n return false;\r\n }\r\n\r\n// Support: IE9\r\n// See #13393 for more info\r\n function safeActiveElement() {\r\n try {\r\n return document.activeElement;\r\n } catch ( err ) { }\r\n }\r\n\r\n function on( elem, types, selector, data, fn, one ) {\r\n var origFn, type;\r\n\r\n // Types can be a map of types/handlers\r\n if ( typeof types === \"object\" ) {\r\n\r\n // ( types-Object, selector, data )\r\n if ( typeof selector !== \"string\" ) {\r\n\r\n // ( types-Object, data )\r\n data = data || selector;\r\n selector = undefined;\r\n }\r\n for ( type in types ) {\r\n on( elem, type, selector, data, types[ type ], one );\r\n }\r\n return elem;\r\n }\r\n\r\n if ( data == null && fn == null ) {\r\n\r\n // ( types, fn )\r\n fn = selector;\r\n data = selector = undefined;\r\n } else if ( fn == null ) {\r\n if ( typeof selector === \"string\" ) {\r\n\r\n // ( types, selector, fn )\r\n fn = data;\r\n data = undefined;\r\n } else {\r\n\r\n // ( types, data, fn )\r\n fn = data;\r\n data = selector;\r\n selector = undefined;\r\n }\r\n }\r\n if ( fn === false ) {\r\n fn = returnFalse;\r\n } else if ( !fn ) {\r\n return elem;\r\n }\r\n\r\n if ( one === 1 ) {\r\n origFn = fn;\r\n fn = function( event ) {\r\n\r\n // Can use an empty set, since event contains the info\r\n jQuery().off( event );\r\n return origFn.apply( this, arguments );\r\n };\r\n\r\n // Use same guid so caller can remove using origFn\r\n fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\r\n }\r\n return elem.each( function() {\r\n jQuery.event.add( this, types, fn, data, selector );\r\n } );\r\n }\r\n\r\n /*\r\n * Helper functions for managing events -- not part of the public interface.\r\n * Props to Dean Edwards' addEvent library for many of the ideas.\r\n */\r\n jQuery.event = {\r\n\r\n global: {},\r\n\r\n add: function( elem, types, handler, data, selector ) {\r\n\r\n var handleObjIn, eventHandle, tmp,\r\n events, t, handleObj,\r\n special, handlers, type, namespaces, origType,\r\n elemData = dataPriv.get( elem );\r\n\r\n // Don't attach events to noData or text/comment nodes (but allow plain objects)\r\n if ( !elemData ) {\r\n return;\r\n }\r\n\r\n // Caller can pass in an object of custom data in lieu of the handler\r\n if ( handler.handler ) {\r\n handleObjIn = handler;\r\n handler = handleObjIn.handler;\r\n selector = handleObjIn.selector;\r\n }\r\n\r\n // Make sure that the handler has a unique ID, used to find/remove it later\r\n if ( !handler.guid ) {\r\n handler.guid = jQuery.guid++;\r\n }\r\n\r\n // Init the element's event structure and main handler, if this is the first\r\n if ( !( events = elemData.events ) ) {\r\n events = elemData.events = {};\r\n }\r\n if ( !( eventHandle = elemData.handle ) ) {\r\n eventHandle = elemData.handle = function( e ) {\r\n\r\n // Discard the second event of a jQuery.event.trigger() and\r\n // when an event is called after a page has unloaded\r\n return typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\r\n jQuery.event.dispatch.apply( elem, arguments ) : undefined;\r\n };\r\n }\r\n\r\n // Handle multiple events separated by a space\r\n types = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\r\n t = types.length;\r\n while ( t-- ) {\r\n tmp = rtypenamespace.exec( types[ t ] ) || [];\r\n type = origType = tmp[ 1 ];\r\n namespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\r\n\r\n // There *must* be a type, no attaching namespace-only handlers\r\n if ( !type ) {\r\n continue;\r\n }\r\n\r\n // If event changes its type, use the special event handlers for the changed type\r\n special = jQuery.event.special[ type ] || {};\r\n\r\n // If selector defined, determine special event api type, otherwise given type\r\n type = ( selector ? special.delegateType : special.bindType ) || type;\r\n\r\n // Update special based on newly reset type\r\n special = jQuery.event.special[ type ] || {};\r\n\r\n // handleObj is passed to all event handlers\r\n handleObj = jQuery.extend( {\r\n type: type,\r\n origType: origType,\r\n data: data,\r\n handler: handler,\r\n guid: handler.guid,\r\n selector: selector,\r\n needsContext: selector && jQuery.expr.match.needsContext.test( selector ),\r\n namespace: namespaces.join( \".\" )\r\n }, handleObjIn );\r\n\r\n // Init the event handler queue if we're the first\r\n if ( !( handlers = events[ type ] ) ) {\r\n handlers = events[ type ] = [];\r\n handlers.delegateCount = 0;\r\n\r\n // Only use addEventListener if the special events handler returns false\r\n if ( !special.setup ||\r\n special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\r\n\r\n if ( elem.addEventListener ) {\r\n elem.addEventListener( type, eventHandle );\r\n }\r\n }\r\n }\r\n\r\n if ( special.add ) {\r\n special.add.call( elem, handleObj );\r\n\r\n if ( !handleObj.handler.guid ) {\r\n handleObj.handler.guid = handler.guid;\r\n }\r\n }\r\n\r\n // Add to the element's handler list, delegates in front\r\n if ( selector ) {\r\n handlers.splice( handlers.delegateCount++, 0, handleObj );\r\n } else {\r\n handlers.push( handleObj );\r\n }\r\n\r\n // Keep track of which events have ever been used, for event optimization\r\n jQuery.event.global[ type ] = true;\r\n }\r\n\r\n },\r\n\r\n // Detach an event or set of events from an element\r\n remove: function( elem, types, handler, selector, mappedTypes ) {\r\n\r\n var j, origCount, tmp,\r\n events, t, handleObj,\r\n special, handlers, type, namespaces, origType,\r\n elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\r\n\r\n if ( !elemData || !( events = elemData.events ) ) {\r\n return;\r\n }\r\n\r\n // Once for each type.namespace in types; type may be omitted\r\n types = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\r\n t = types.length;\r\n while ( t-- ) {\r\n tmp = rtypenamespace.exec( types[ t ] ) || [];\r\n type = origType = tmp[ 1 ];\r\n namespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\r\n\r\n // Unbind all events (on this namespace, if provided) for the element\r\n if ( !type ) {\r\n for ( type in events ) {\r\n jQuery.event.remove( elem, type + types[ t ], handler, selector, true );\r\n }\r\n continue;\r\n }\r\n\r\n special = jQuery.event.special[ type ] || {};\r\n type = ( selector ? special.delegateType : special.bindType ) || type;\r\n handlers = events[ type ] || [];\r\n tmp = tmp[ 2 ] &&\r\n new RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\r\n\r\n // Remove matching events\r\n origCount = j = handlers.length;\r\n while ( j-- ) {\r\n handleObj = handlers[ j ];\r\n\r\n if ( ( mappedTypes || origType === handleObj.origType ) &&\r\n ( !handler || handler.guid === handleObj.guid ) &&\r\n ( !tmp || tmp.test( handleObj.namespace ) ) &&\r\n ( !selector || selector === handleObj.selector ||\r\n selector === \"**\" && handleObj.selector ) ) {\r\n handlers.splice( j, 1 );\r\n\r\n if ( handleObj.selector ) {\r\n handlers.delegateCount--;\r\n }\r\n if ( special.remove ) {\r\n special.remove.call( elem, handleObj );\r\n }\r\n }\r\n }\r\n\r\n // Remove generic event handler if we removed something and no more handlers exist\r\n // (avoids potential for endless recursion during removal of special event handlers)\r\n if ( origCount && !handlers.length ) {\r\n if ( !special.teardown ||\r\n special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\r\n\r\n jQuery.removeEvent( elem, type, elemData.handle );\r\n }\r\n\r\n delete events[ type ];\r\n }\r\n }\r\n\r\n // Remove data and the expando if it's no longer used\r\n if ( jQuery.isEmptyObject( events ) ) {\r\n dataPriv.remove( elem, \"handle events\" );\r\n }\r\n },\r\n\r\n dispatch: function( event ) {\r\n\r\n // Make a writable jQuery.Event from the native event object\r\n event = jQuery.event.fix( event );\r\n\r\n var i, j, ret, matched, handleObj,\r\n handlerQueue = [],\r\n args = slice.call( arguments ),\r\n handlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\r\n special = jQuery.event.special[ event.type ] || {};\r\n\r\n // Use the fix-ed jQuery.Event rather than the (read-only) native event\r\n args[ 0 ] = event;\r\n event.delegateTarget = this;\r\n\r\n // Call the preDispatch hook for the mapped type, and let it bail if desired\r\n if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\r\n return;\r\n }\r\n\r\n // Determine handlers\r\n handlerQueue = jQuery.event.handlers.call( this, event, handlers );\r\n\r\n // Run delegates first; they may want to stop propagation beneath us\r\n i = 0;\r\n while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\r\n event.currentTarget = matched.elem;\r\n\r\n j = 0;\r\n while ( ( handleObj = matched.handlers[ j++ ] ) &&\r\n !event.isImmediatePropagationStopped() ) {\r\n\r\n // Triggered event must either 1) have no namespace, or 2) have namespace(s)\r\n // a subset or equal to those in the bound event (both can have no namespace).\r\n if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\r\n\r\n event.handleObj = handleObj;\r\n event.data = handleObj.data;\r\n\r\n ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\r\n handleObj.handler ).apply( matched.elem, args );\r\n\r\n if ( ret !== undefined ) {\r\n if ( ( event.result = ret ) === false ) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Call the postDispatch hook for the mapped type\r\n if ( special.postDispatch ) {\r\n special.postDispatch.call( this, event );\r\n }\r\n\r\n return event.result;\r\n },\r\n\r\n handlers: function( event, handlers ) {\r\n var i, matches, sel, handleObj,\r\n handlerQueue = [],\r\n delegateCount = handlers.delegateCount,\r\n cur = event.target;\r\n\r\n // Support (at least): Chrome, IE9\r\n // Find delegate handlers\r\n // Black-hole SVG instance trees (#13180)\r\n //\r\n // Support: Firefox<=42+\r\n // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)\r\n if ( delegateCount && cur.nodeType &&\r\n ( event.type !== \"click\" || isNaN( event.button ) || event.button < 1 ) ) {\r\n\r\n for ( ; cur !== this; cur = cur.parentNode || this ) {\r\n\r\n // Don't check non-elements (#13208)\r\n // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\r\n if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== \"click\" ) ) {\r\n matches = [];\r\n for ( i = 0; i < delegateCount; i++ ) {\r\n handleObj = handlers[ i ];\r\n\r\n // Don't conflict with Object.prototype properties (#13203)\r\n sel = handleObj.selector + \" \";\r\n\r\n if ( matches[ sel ] === undefined ) {\r\n matches[ sel ] = handleObj.needsContext ?\r\n jQuery( sel, this ).index( cur ) > -1 :\r\n jQuery.find( sel, this, null, [ cur ] ).length;\r\n }\r\n if ( matches[ sel ] ) {\r\n matches.push( handleObj );\r\n }\r\n }\r\n if ( matches.length ) {\r\n handlerQueue.push( { elem: cur, handlers: matches } );\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Add the remaining (directly-bound) handlers\r\n if ( delegateCount < handlers.length ) {\r\n handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );\r\n }\r\n\r\n return handlerQueue;\r\n },\r\n\r\n // Includes some event props shared by KeyEvent and MouseEvent\r\n props: ( \"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase \" +\r\n \"metaKey relatedTarget shiftKey target timeStamp view which\" ).split( \" \" ),\r\n\r\n fixHooks: {},\r\n\r\n keyHooks: {\r\n props: \"char charCode key keyCode\".split( \" \" ),\r\n filter: function( event, original ) {\r\n\r\n // Add which for key events\r\n if ( event.which == null ) {\r\n event.which = original.charCode != null ? original.charCode : original.keyCode;\r\n }\r\n\r\n return event;\r\n }\r\n },\r\n\r\n mouseHooks: {\r\n props: ( \"button buttons clientX clientY offsetX offsetY pageX pageY \" +\r\n \"screenX screenY toElement\" ).split( \" \" ),\r\n filter: function( event, original ) {\r\n var eventDoc, doc, body,\r\n button = original.button;\r\n\r\n // Calculate pageX/Y if missing and clientX/Y available\r\n if ( event.pageX == null && original.clientX != null ) {\r\n eventDoc = event.target.ownerDocument || document;\r\n doc = eventDoc.documentElement;\r\n body = eventDoc.body;\r\n\r\n event.pageX = original.clientX +\r\n ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -\r\n ( doc && doc.clientLeft || body && body.clientLeft || 0 );\r\n event.pageY = original.clientY +\r\n ( doc && doc.scrollTop || body && body.scrollTop || 0 ) -\r\n ( doc && doc.clientTop || body && body.clientTop || 0 );\r\n }\r\n\r\n // Add which for click: 1 === left; 2 === middle; 3 === right\r\n // Note: button is not normalized, so don't use it\r\n if ( !event.which && button !== undefined ) {\r\n event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\r\n }\r\n\r\n return event;\r\n }\r\n },\r\n\r\n fix: function( event ) {\r\n if ( event[ jQuery.expando ] ) {\r\n return event;\r\n }\r\n\r\n // Create a writable copy of the event object and normalize some properties\r\n var i, prop, copy,\r\n type = event.type,\r\n originalEvent = event,\r\n fixHook = this.fixHooks[ type ];\r\n\r\n if ( !fixHook ) {\r\n this.fixHooks[ type ] = fixHook =\r\n rmouseEvent.test( type ) ? this.mouseHooks :\r\n rkeyEvent.test( type ) ? this.keyHooks :\r\n {};\r\n }\r\n copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\r\n\r\n event = new jQuery.Event( originalEvent );\r\n\r\n i = copy.length;\r\n while ( i-- ) {\r\n prop = copy[ i ];\r\n event[ prop ] = originalEvent[ prop ];\r\n }\r\n\r\n // Support: Cordova 2.5 (WebKit) (#13255)\r\n // All events should have a target; Cordova deviceready doesn't\r\n if ( !event.target ) {\r\n event.target = document;\r\n }\r\n\r\n // Support: Safari 6.0+, Chrome<28\r\n // Target should not be a text node (#504, #13143)\r\n if ( event.target.nodeType === 3 ) {\r\n event.target = event.target.parentNode;\r\n }\r\n\r\n return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\r\n },\r\n\r\n special: {\r\n load: {\r\n\r\n // Prevent triggered image.load events from bubbling to window.load\r\n noBubble: true\r\n },\r\n focus: {\r\n\r\n // Fire native event if possible so blur/focus sequence is correct\r\n trigger: function() {\r\n if ( this !== safeActiveElement() && this.focus ) {\r\n this.focus();\r\n return false;\r\n }\r\n },\r\n delegateType: \"focusin\"\r\n },\r\n blur: {\r\n trigger: function() {\r\n if ( this === safeActiveElement() && this.blur ) {\r\n this.blur();\r\n return false;\r\n }\r\n },\r\n delegateType: \"focusout\"\r\n },\r\n click: {\r\n\r\n // For checkbox, fire native event so checked state will be right\r\n trigger: function() {\r\n if ( this.type === \"checkbox\" && this.click && jQuery.nodeName( this, \"input\" ) ) {\r\n this.click();\r\n return false;\r\n }\r\n },\r\n\r\n // For cross-browser consistency, don't fire native .click() on links\r\n _default: function( event ) {\r\n return jQuery.nodeName( event.target, \"a\" );\r\n }\r\n },\r\n\r\n beforeunload: {\r\n postDispatch: function( event ) {\r\n\r\n // Support: Firefox 20+\r\n // Firefox doesn't alert if the returnValue field is not set.\r\n if ( event.result !== undefined && event.originalEvent ) {\r\n event.originalEvent.returnValue = event.result;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n jQuery.removeEvent = function( elem, type, handle ) {\r\n\r\n // This \"if\" is needed for plain objects\r\n if ( elem.removeEventListener ) {\r\n elem.removeEventListener( type, handle );\r\n }\r\n };\r\n\r\n jQuery.Event = function( src, props ) {\r\n\r\n // Allow instantiation without the 'new' keyword\r\n if ( !( this instanceof jQuery.Event ) ) {\r\n return new jQuery.Event( src, props );\r\n }\r\n\r\n // Event object\r\n if ( src && src.type ) {\r\n this.originalEvent = src;\r\n this.type = src.type;\r\n\r\n // Events bubbling up the document may have been marked as prevented\r\n // by a handler lower down the tree; reflect the correct value.\r\n this.isDefaultPrevented = src.defaultPrevented ||\r\n src.defaultPrevented === undefined &&\r\n\r\n // Support: Android<4.0\r\n src.returnValue === false ?\r\n returnTrue :\r\n returnFalse;\r\n\r\n // Event type\r\n } else {\r\n this.type = src;\r\n }\r\n\r\n // Put explicitly provided properties onto the event object\r\n if ( props ) {\r\n jQuery.extend( this, props );\r\n }\r\n\r\n // Create a timestamp if incoming event doesn't have one\r\n this.timeStamp = src && src.timeStamp || jQuery.now();\r\n\r\n // Mark it as fixed\r\n this[ jQuery.expando ] = true;\r\n };\r\n\r\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\r\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\r\n jQuery.Event.prototype = {\r\n constructor: jQuery.Event,\r\n isDefaultPrevented: returnFalse,\r\n isPropagationStopped: returnFalse,\r\n isImmediatePropagationStopped: returnFalse,\r\n isSimulated: false,\r\n\r\n preventDefault: function() {\r\n var e = this.originalEvent;\r\n\r\n this.isDefaultPrevented = returnTrue;\r\n\r\n if ( e && !this.isSimulated ) {\r\n e.preventDefault();\r\n }\r\n },\r\n stopPropagation: function() {\r\n var e = this.originalEvent;\r\n\r\n this.isPropagationStopped = returnTrue;\r\n\r\n if ( e && !this.isSimulated ) {\r\n e.stopPropagation();\r\n }\r\n },\r\n stopImmediatePropagation: function() {\r\n var e = this.originalEvent;\r\n\r\n this.isImmediatePropagationStopped = returnTrue;\r\n\r\n if ( e && !this.isSimulated ) {\r\n e.stopImmediatePropagation();\r\n }\r\n\r\n this.stopPropagation();\r\n }\r\n };\r\n\r\n// Create mouseenter/leave events using mouseover/out and event-time checks\r\n// so that event delegation works in jQuery.\r\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\r\n//\r\n// Support: Safari 7 only\r\n// Safari sends mouseenter too often; see:\r\n// https://code.google.com/p/chromium/issues/detail?id=470258\r\n// for the description of the bug (it existed in older Chrome versions as well).\r\n jQuery.each( {\r\n mouseenter: \"mouseover\",\r\n mouseleave: \"mouseout\",\r\n pointerenter: \"pointerover\",\r\n pointerleave: \"pointerout\"\r\n }, function( orig, fix ) {\r\n jQuery.event.special[ orig ] = {\r\n delegateType: fix,\r\n bindType: fix,\r\n\r\n handle: function( event ) {\r\n var ret,\r\n target = this,\r\n related = event.relatedTarget,\r\n handleObj = event.handleObj;\r\n\r\n // For mouseenter/leave call the handler if related is outside the target.\r\n // NB: No relatedTarget if the mouse left/entered the browser window\r\n if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\r\n event.type = handleObj.origType;\r\n ret = handleObj.handler.apply( this, arguments );\r\n event.type = fix;\r\n }\r\n return ret;\r\n }\r\n };\r\n } );\r\n\r\n jQuery.fn.extend( {\r\n on: function( types, selector, data, fn ) {\r\n return on( this, types, selector, data, fn );\r\n },\r\n one: function( types, selector, data, fn ) {\r\n return on( this, types, selector, data, fn, 1 );\r\n },\r\n off: function( types, selector, fn ) {\r\n var handleObj, type;\r\n if ( types && types.preventDefault && types.handleObj ) {\r\n\r\n // ( event ) dispatched jQuery.Event\r\n handleObj = types.handleObj;\r\n jQuery( types.delegateTarget ).off(\r\n handleObj.namespace ?\r\n handleObj.origType + \".\" + handleObj.namespace :\r\n handleObj.origType,\r\n handleObj.selector,\r\n handleObj.handler\r\n );\r\n return this;\r\n }\r\n if ( typeof types === \"object\" ) {\r\n\r\n // ( types-object [, selector] )\r\n for ( type in types ) {\r\n this.off( type, selector, types[ type ] );\r\n }\r\n return this;\r\n }\r\n if ( selector === false || typeof selector === \"function\" ) {\r\n\r\n // ( types [, fn] )\r\n fn = selector;\r\n selector = undefined;\r\n }\r\n if ( fn === false ) {\r\n fn = returnFalse;\r\n }\r\n return this.each( function() {\r\n jQuery.event.remove( this, types, fn, selector );\r\n } );\r\n }\r\n } );\r\n\r\n\r\n var\r\n rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:-]+)[^>]*)\\/>/gi,\r\n\r\n // Support: IE 10-11, Edge 10240+\r\n // In IE/Edge using regex groups here causes severe slowdowns.\r\n // See https://connect.microsoft.com/IE/feedback/details/1736512/\r\n rnoInnerhtml = /\\s*$/g;\r\n\r\n// Manipulating tables requires a tbody\r\n function manipulationTarget( elem, content ) {\r\n return jQuery.nodeName( elem, \"table\" ) &&\r\n jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ?\r\n\r\n elem.getElementsByTagName( \"tbody\" )[ 0 ] ||\r\n elem.appendChild( elem.ownerDocument.createElement( \"tbody\" ) ) :\r\n elem;\r\n }\r\n\r\n// Replace/restore the type attribute of script elements for safe DOM manipulation\r\n function disableScript( elem ) {\r\n elem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\r\n return elem;\r\n }\r\n function restoreScript( elem ) {\r\n var match = rscriptTypeMasked.exec( elem.type );\r\n\r\n if ( match ) {\r\n elem.type = match[ 1 ];\r\n } else {\r\n elem.removeAttribute( \"type\" );\r\n }\r\n\r\n return elem;\r\n }\r\n\r\n function cloneCopyEvent( src, dest ) {\r\n var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\r\n\r\n if ( dest.nodeType !== 1 ) {\r\n return;\r\n }\r\n\r\n // 1. Copy private data: events, handlers, etc.\r\n if ( dataPriv.hasData( src ) ) {\r\n pdataOld = dataPriv.access( src );\r\n pdataCur = dataPriv.set( dest, pdataOld );\r\n events = pdataOld.events;\r\n\r\n if ( events ) {\r\n delete pdataCur.handle;\r\n pdataCur.events = {};\r\n\r\n for ( type in events ) {\r\n for ( i = 0, l = events[ type ].length; i < l; i++ ) {\r\n jQuery.event.add( dest, type, events[ type ][ i ] );\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 2. Copy user data\r\n if ( dataUser.hasData( src ) ) {\r\n udataOld = dataUser.access( src );\r\n udataCur = jQuery.extend( {}, udataOld );\r\n\r\n dataUser.set( dest, udataCur );\r\n }\r\n }\r\n\r\n// Fix IE bugs, see support tests\r\n function fixInput( src, dest ) {\r\n var nodeName = dest.nodeName.toLowerCase();\r\n\r\n // Fails to persist the checked state of a cloned checkbox or radio button.\r\n if ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\r\n dest.checked = src.checked;\r\n\r\n // Fails to return the selected option to the default selected state when cloning options\r\n } else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\r\n dest.defaultValue = src.defaultValue;\r\n }\r\n }\r\n\r\n function domManip( collection, args, callback, ignored ) {\r\n\r\n // Flatten any nested arrays\r\n args = concat.apply( [], args );\r\n\r\n var fragment, first, scripts, hasScripts, node, doc,\r\n i = 0,\r\n l = collection.length,\r\n iNoClone = l - 1,\r\n value = args[ 0 ],\r\n isFunction = jQuery.isFunction( value );\r\n\r\n // We can't cloneNode fragments that contain checked, in WebKit\r\n if ( isFunction ||\r\n ( l > 1 && typeof value === \"string\" &&\r\n !support.checkClone && rchecked.test( value ) ) ) {\r\n return collection.each( function( index ) {\r\n var self = collection.eq( index );\r\n if ( isFunction ) {\r\n args[ 0 ] = value.call( this, index, self.html() );\r\n }\r\n domManip( self, args, callback, ignored );\r\n } );\r\n }\r\n\r\n if ( l ) {\r\n fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\r\n first = fragment.firstChild;\r\n\r\n if ( fragment.childNodes.length === 1 ) {\r\n fragment = first;\r\n }\r\n\r\n // Require either new content or an interest in ignored elements to invoke the callback\r\n if ( first || ignored ) {\r\n scripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\r\n hasScripts = scripts.length;\r\n\r\n // Use the original fragment for the last item\r\n // instead of the first because it can end up\r\n // being emptied incorrectly in certain situations (#8070).\r\n for ( ; i < l; i++ ) {\r\n node = fragment;\r\n\r\n if ( i !== iNoClone ) {\r\n node = jQuery.clone( node, true, true );\r\n\r\n // Keep references to cloned scripts for later restoration\r\n if ( hasScripts ) {\r\n\r\n // Support: Android<4.1, PhantomJS<2\r\n // push.apply(_, arraylike) throws on ancient WebKit\r\n jQuery.merge( scripts, getAll( node, \"script\" ) );\r\n }\r\n }\r\n\r\n callback.call( collection[ i ], node, i );\r\n }\r\n\r\n if ( hasScripts ) {\r\n doc = scripts[ scripts.length - 1 ].ownerDocument;\r\n\r\n // Reenable scripts\r\n jQuery.map( scripts, restoreScript );\r\n\r\n // Evaluate executable scripts on first document insertion\r\n for ( i = 0; i < hasScripts; i++ ) {\r\n node = scripts[ i ];\r\n if ( rscriptType.test( node.type || \"\" ) &&\r\n !dataPriv.access( node, \"globalEval\" ) &&\r\n jQuery.contains( doc, node ) ) {\r\n\r\n if ( node.src ) {\r\n\r\n // Optional AJAX dependency, but won't run scripts if not present\r\n if ( jQuery._evalUrl ) {\r\n jQuery._evalUrl( node.src );\r\n }\r\n } else {\r\n jQuery.globalEval( node.textContent.replace( rcleanScript, \"\" ) );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return collection;\r\n }\r\n\r\n function remove( elem, selector, keepData ) {\r\n var node,\r\n nodes = selector ? jQuery.filter( selector, elem ) : elem,\r\n i = 0;\r\n\r\n for ( ; ( node = nodes[ i ] ) != null; i++ ) {\r\n if ( !keepData && node.nodeType === 1 ) {\r\n jQuery.cleanData( getAll( node ) );\r\n }\r\n\r\n if ( node.parentNode ) {\r\n if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\r\n setGlobalEval( getAll( node, \"script\" ) );\r\n }\r\n node.parentNode.removeChild( node );\r\n }\r\n }\r\n\r\n return elem;\r\n }\r\n\r\n jQuery.extend( {\r\n htmlPrefilter: function( html ) {\r\n return html.replace( rxhtmlTag, \"<$1>\" );\r\n },\r\n\r\n clone: function( elem, dataAndEvents, deepDataAndEvents ) {\r\n var i, l, srcElements, destElements,\r\n clone = elem.cloneNode( true ),\r\n inPage = jQuery.contains( elem.ownerDocument, elem );\r\n\r\n // Fix IE cloning issues\r\n if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\r\n !jQuery.isXMLDoc( elem ) ) {\r\n\r\n // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\r\n destElements = getAll( clone );\r\n srcElements = getAll( elem );\r\n\r\n for ( i = 0, l = srcElements.length; i < l; i++ ) {\r\n fixInput( srcElements[ i ], destElements[ i ] );\r\n }\r\n }\r\n\r\n // Copy the events from the original to the clone\r\n if ( dataAndEvents ) {\r\n if ( deepDataAndEvents ) {\r\n srcElements = srcElements || getAll( elem );\r\n destElements = destElements || getAll( clone );\r\n\r\n for ( i = 0, l = srcElements.length; i < l; i++ ) {\r\n cloneCopyEvent( srcElements[ i ], destElements[ i ] );\r\n }\r\n } else {\r\n cloneCopyEvent( elem, clone );\r\n }\r\n }\r\n\r\n // Preserve script evaluation history\r\n destElements = getAll( clone, \"script\" );\r\n if ( destElements.length > 0 ) {\r\n setGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\r\n }\r\n\r\n // Return the cloned set\r\n return clone;\r\n },\r\n\r\n cleanData: function( elems ) {\r\n var data, elem, type,\r\n special = jQuery.event.special,\r\n i = 0;\r\n\r\n for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\r\n if ( acceptData( elem ) ) {\r\n if ( ( data = elem[ dataPriv.expando ] ) ) {\r\n if ( data.events ) {\r\n for ( type in data.events ) {\r\n if ( special[ type ] ) {\r\n jQuery.event.remove( elem, type );\r\n\r\n // This is a shortcut to avoid jQuery.event.remove's overhead\r\n } else {\r\n jQuery.removeEvent( elem, type, data.handle );\r\n }\r\n }\r\n }\r\n\r\n // Support: Chrome <= 35-45+\r\n // Assign undefined instead of using delete, see Data#remove\r\n elem[ dataPriv.expando ] = undefined;\r\n }\r\n if ( elem[ dataUser.expando ] ) {\r\n\r\n // Support: Chrome <= 35-45+\r\n // Assign undefined instead of using delete, see Data#remove\r\n elem[ dataUser.expando ] = undefined;\r\n }\r\n }\r\n }\r\n }\r\n } );\r\n\r\n jQuery.fn.extend( {\r\n\r\n // Keep domManip exposed until 3.0 (gh-2225)\r\n domManip: domManip,\r\n\r\n detach: function( selector ) {\r\n return remove( this, selector, true );\r\n },\r\n\r\n remove: function( selector ) {\r\n return remove( this, selector );\r\n },\r\n\r\n text: function( value ) {\r\n return access( this, function( value ) {\r\n return value === undefined ?\r\n jQuery.text( this ) :\r\n this.empty().each( function() {\r\n if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\r\n this.textContent = value;\r\n }\r\n } );\r\n }, null, value, arguments.length );\r\n },\r\n\r\n append: function() {\r\n return domManip( this, arguments, function( elem ) {\r\n if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\r\n var target = manipulationTarget( this, elem );\r\n target.appendChild( elem );\r\n }\r\n } );\r\n },\r\n\r\n prepend: function() {\r\n return domManip( this, arguments, function( elem ) {\r\n if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\r\n var target = manipulationTarget( this, elem );\r\n target.insertBefore( elem, target.firstChild );\r\n }\r\n } );\r\n },\r\n\r\n before: function() {\r\n return domManip( this, arguments, function( elem ) {\r\n if ( this.parentNode ) {\r\n this.parentNode.insertBefore( elem, this );\r\n }\r\n } );\r\n },\r\n\r\n after: function() {\r\n return domManip( this, arguments, function( elem ) {\r\n if ( this.parentNode ) {\r\n this.parentNode.insertBefore( elem, this.nextSibling );\r\n }\r\n } );\r\n },\r\n\r\n empty: function() {\r\n var elem,\r\n i = 0;\r\n\r\n for ( ; ( elem = this[ i ] ) != null; i++ ) {\r\n if ( elem.nodeType === 1 ) {\r\n\r\n // Prevent memory leaks\r\n jQuery.cleanData( getAll( elem, false ) );\r\n\r\n // Remove any remaining nodes\r\n elem.textContent = \"\";\r\n }\r\n }\r\n\r\n return this;\r\n },\r\n\r\n clone: function( dataAndEvents, deepDataAndEvents ) {\r\n dataAndEvents = dataAndEvents == null ? false : dataAndEvents;\r\n deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\r\n\r\n return this.map( function() {\r\n return jQuery.clone( this, dataAndEvents, deepDataAndEvents );\r\n } );\r\n },\r\n\r\n html: function( value ) {\r\n return access( this, function( value ) {\r\n var elem = this[ 0 ] || {},\r\n i = 0,\r\n l = this.length;\r\n\r\n if ( value === undefined && elem.nodeType === 1 ) {\r\n return elem.innerHTML;\r\n }\r\n\r\n // See if we can take a shortcut and just use innerHTML\r\n if ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\r\n !wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\r\n\r\n value = jQuery.htmlPrefilter( value );\r\n\r\n try {\r\n for ( ; i < l; i++ ) {\r\n elem = this[ i ] || {};\r\n\r\n // Remove element nodes and prevent memory leaks\r\n if ( elem.nodeType === 1 ) {\r\n jQuery.cleanData( getAll( elem, false ) );\r\n elem.innerHTML = value;\r\n }\r\n }\r\n\r\n elem = 0;\r\n\r\n // If using innerHTML throws an exception, use the fallback method\r\n } catch ( e ) {}\r\n }\r\n\r\n if ( elem ) {\r\n this.empty().append( value );\r\n }\r\n }, null, value, arguments.length );\r\n },\r\n\r\n replaceWith: function() {\r\n var ignored = [];\r\n\r\n // Make the changes, replacing each non-ignored context element with the new content\r\n return domManip( this, arguments, function( elem ) {\r\n var parent = this.parentNode;\r\n\r\n if ( jQuery.inArray( this, ignored ) < 0 ) {\r\n jQuery.cleanData( getAll( this ) );\r\n if ( parent ) {\r\n parent.replaceChild( elem, this );\r\n }\r\n }\r\n\r\n // Force callback invocation\r\n }, ignored );\r\n }\r\n } );\r\n\r\n jQuery.each( {\r\n appendTo: \"append\",\r\n prependTo: \"prepend\",\r\n insertBefore: \"before\",\r\n insertAfter: \"after\",\r\n replaceAll: \"replaceWith\"\r\n }, function( name, original ) {\r\n jQuery.fn[ name ] = function( selector ) {\r\n var elems,\r\n ret = [],\r\n insert = jQuery( selector ),\r\n last = insert.length - 1,\r\n i = 0;\r\n\r\n for ( ; i <= last; i++ ) {\r\n elems = i === last ? this : this.clone( true );\r\n jQuery( insert[ i ] )[ original ]( elems );\r\n\r\n // Support: QtWebKit\r\n // .get() because push.apply(_, arraylike) throws\r\n push.apply( ret, elems.get() );\r\n }\r\n\r\n return this.pushStack( ret );\r\n };\r\n } );\r\n\r\n\r\n var iframe,\r\n elemdisplay = {\r\n\r\n // Support: Firefox\r\n // We have to pre-define these values for FF (#10227)\r\n HTML: \"block\",\r\n BODY: \"block\"\r\n };\r\n\r\n /**\r\n * Retrieve the actual display of a element\r\n * @param {String} name nodeName of the element\r\n * @param {Object} doc Document object\r\n */\r\n\r\n// Called only from within defaultDisplay\r\n function actualDisplay( name, doc ) {\r\n var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\r\n\r\n display = jQuery.css( elem[ 0 ], \"display\" );\r\n\r\n // We don't have any data stored on the element,\r\n // so use \"detach\" method as fast way to get rid of the element\r\n elem.detach();\r\n\r\n return display;\r\n }\r\n\r\n /**\r\n * Try to determine the default display value of an element\r\n * @param {String} nodeName\r\n */\r\n function defaultDisplay( nodeName ) {\r\n var doc = document,\r\n display = elemdisplay[ nodeName ];\r\n\r\n if ( !display ) {\r\n display = actualDisplay( nodeName, doc );\r\n\r\n // If the simple way fails, read from inside an iframe\r\n if ( display === \"none\" || !display ) {\r\n\r\n // Use the already-created iframe if possible\r\n iframe = ( iframe || jQuery( \"'),this.preview.append(this.iframe),this.iframe[0].contentWindow.document.open(),this.iframe[0].contentWindow.document.close(),this.preview.container=UI.$(this.iframe[0].contentWindow.document).find(\"body\"),\"string\"==typeof this.options.iframe&&this.preview.container.parent().append('')):this.preview.container=this.preview,UI.$win.on(\"resize load\",UI.Utils.debounce(function(){$this.fit()},200));var previewContainer=this.iframe?this.preview.container:$this.preview.parent(),codeContent=this.code.find(\".CodeMirror-sizer\"),codeScroll=this.code.find(\".CodeMirror-scroll\").on(\"scroll\",UI.Utils.debounce(function(){if(\"tab\"!=$this.htmleditor.attr(\"data-mode\")){var codeHeight=codeContent.height()-codeScroll.height(),ratio=(previewContainer[0].scrollHeight-($this.iframe?$this.iframe.height():previewContainer.height()))/codeHeight,previewPosition=codeScroll.scrollTop()*ratio;previewContainer.scrollTop(previewPosition)}},10));this.htmleditor.on(\"click\",\".uk-htmleditor-button-code, .uk-htmleditor-button-preview\",function(e){e.preventDefault(),\"tab\"==$this.htmleditor.attr(\"data-mode\")&&($this.htmleditor.find(\".uk-htmleditor-button-code, .uk-htmleditor-button-preview\").removeClass(\"uk-active\").filter(this).addClass(\"uk-active\"),$this.activetab=UI.$(this).hasClass(\"uk-htmleditor-button-code\")?\"code\":\"preview\",$this.htmleditor.attr(\"data-active-tab\",$this.activetab),$this.editor.refresh())}),this.htmleditor.on(\"click\",\"a[data-htmleditor-button]\",function(){$this.code.is(\":visible\")&&$this.trigger(\"action.\"+UI.$(this).data(\"htmleditor-button\"),[$this.editor])}),this.preview.parent().css(\"height\",this.code.height()),this.options.autocomplete&&this.CodeMirror.showHint&&this.CodeMirror.hint&&this.CodeMirror.hint.html&&this.editor.on(\"inputRead\",UI.Utils.debounce(function(){var POS=$this.editor.getDoc().getCursor();if(\"xml\"==$this.CodeMirror.innerMode($this.editor.getMode(),$this.editor.getTokenAt(POS).state).mode.name){var cur=$this.editor.getCursor(),token=$this.editor.getTokenAt(cur);\"<\"!=token.string.charAt(0)&&\"attribute\"!=token.type||$this.CodeMirror.showHint($this.editor,$this.CodeMirror.hint.html,{completeSingle:!1})}},100)),this.debouncedRedraw=UI.Utils.debounce(function(){$this.redraw()},5),this.on(\"init.uk.component\",function(){$this.debouncedRedraw()}),this.element.attr(\"data-uk-check-display\",1).on(\"display.uk.check\",function(e){this.htmleditor.is(\":visible\")&&this.fit()}.bind(this)),editors.push(this)},addButton:function(name,button){this.buttons[name]=button},addButtons:function(buttons){UI.$.extend(this.buttons,buttons)},replaceInPreview:function(regexp,callback){var editor=this.editor,results=[],value=editor.getValue(),offset=-1,index=0;function translateOffset(offset){var result=editor.getValue().substring(0,offset).split(\"\\n\");return{line:result.length-1,ch:result[result.length-1].length}}return this.currentvalue=this.currentvalue.replace(regexp,function(){var match={matches:arguments,from:translateOffset(offset=value.indexOf(arguments[0],++offset)),to:translateOffset(offset+arguments[0].length),replace:function(value){editor.replaceRange(value,match.from,match.to)},inRange:function(cursor){return cursor.line===match.from.line&&cursor.line===match.to.line?cursor.ch>=match.from.ch&&cursor.ch=match.from.ch||cursor.line>match.from.line&&cursor.line'+$this.buttons[button].label+\"\")}}),this.toolbar.html(bar.join(\"\\n\"))}},fit:function(){var mode=this.options.mode;\"split\"==mode&&this.htmleditor.width()','
      ','
        ','
        ','\",\"
        \",\"
        \",'
        ','
        ','
        ',\"
        \",\"
        \"].join(\"\"),UI.plugin(\"htmleditor\",\"base\",{init:function(editor){editor.addButtons({fullscreen:{title:\"Fullscreen\",label:''},bold:{title:\"Bold\",label:''},italic:{title:\"Italic\",label:''},strike:{title:\"Strikethrough\",label:''},blockquote:{title:\"Blockquote\",label:''},link:{title:\"Link\",label:''},image:{title:\"Image\",label:''},listUl:{title:\"Unordered List\",label:''},listOl:{title:\"Ordered List\",label:''}}),addAction(\"bold\",\"$1\"),addAction(\"italic\",\"$1\"),addAction(\"strike\",\"$1\"),addAction(\"blockquote\",\"

        $1

        \",\"replaceLine\"),addAction(\"link\",'$1'),addAction(\"image\",'\"$1\"');var listfn=function(){if(\"html\"==editor.getCursorMode()){for(var cm=editor.editor,pos=cm.getDoc().getCursor(!0),posend=cm.getDoc().getCursor(!1),i=pos.line;i\"+cm.getLine(i)+\"\",{line:i,ch:0},{line:i,ch:cm.getLine(i).length});cm.setCursor({line:posend.line,ch:cm.getLine(posend.line).length}),cm.focus()}};function addAction(name,replace,mode){editor.on(\"action.\"+name,function(){\"html\"==editor.getCursorMode()&&editor[\"replaceLine\"==mode?\"replaceLine\":\"replaceSelection\"](replace)})}editor.on(\"action.listUl\",function(){listfn()}),editor.on(\"action.listOl\",function(){listfn()}),editor.htmleditor.on(\"click\",'a[data-htmleditor-button=\"fullscreen\"]',function(){editor.htmleditor.toggleClass(\"uk-htmleditor-fullscreen\");var wrap=editor.editor.getWrapperElement();if(editor.htmleditor.hasClass(\"uk-htmleditor-fullscreen\"))editor.editor.state.fullScreenRestore={scrollTop:window.pageYOffset,scrollLeft:window.pageXOffset,width:wrap.style.width,height:wrap.style.height},wrap.style.width=\"\",wrap.style.height=editor.content.height()+\"px\",document.documentElement.style.overflow=\"hidden\";else{document.documentElement.style.overflow=\"\";var info=editor.editor.state.fullScreenRestore;wrap.style.width=info.width,wrap.style.height=info.height,window.scrollTo(info.scrollLeft,info.scrollTop)}setTimeout(function(){editor.fit(),UI.$win.trigger(\"resize\")},50)}),editor.addShortcut([\"Ctrl-S\",\"Cmd-S\"],function(){editor.element.trigger(\"htmleditor-save\",[editor])}),editor.addShortcutAction(\"bold\",[\"Ctrl-B\",\"Cmd-B\"])}}),UI.plugin(\"htmleditor\",\"markdown\",{init:function(editor){var parser=editor.options.mdparser||marked||null;function enableMarkdown(){editor.editor.setOption(\"mode\",\"gfm\"),editor.htmleditor.find(\".uk-htmleditor-button-code a\").html(editor.options.lblMarkedview)}function addAction(name,replace,mode){editor.on(\"action.\"+name,function(){\"markdown\"==editor.getCursorMode()&&editor[\"replaceLine\"==mode?\"replaceLine\":\"replaceSelection\"](replace)})}parser&&(editor.options.markdown&&enableMarkdown(),addAction(\"bold\",\"**$1**\"),addAction(\"italic\",\"*$1*\"),addAction(\"strike\",\"~~$1~~\"),addAction(\"blockquote\",\"> $1\",\"replaceLine\"),addAction(\"link\",\"[$1](http://)\"),addAction(\"image\",\"![$1](http://)\"),editor.on(\"action.listUl\",function(){if(\"markdown\"==editor.getCursorMode()){for(var cm=editor.editor,pos=cm.getDoc().getCursor(!0),posend=cm.getDoc().getCursor(!1),i=pos.line;i','
        ','','
        ','
        ',\"
        \",\"
        \"].join(\"\")).appendTo(\"body\")).dialog=modal.find(\".uk-modal-dialog:first\"),modal.content=modal.find(\".uk-lightbox-content:first\"),modal.loader=modal.find(\".uk-modal-spinner:first\"),modal.closer=modal.find(\".uk-close.uk-close-alt\"),modal.modal=UI.modal(modal,{modal:!1}),modal.on(\"swipeRight swipeLeft\",function(e){modal.lightbox[\"swipeLeft\"==e.type?\"next\":\"previous\"]()}).on(\"click\",\"[data-lightbox-previous], [data-lightbox-next]\",function(e){e.preventDefault(),modal.lightbox[UI.$(this).is(\"[data-lightbox-next]\")?\"next\":\"previous\"]()}),modal.on(\"hide.uk.modal\",function(e){modal.content.html(\"\")}),UI.$win.on(\"load resize orientationchange\",UI.Utils.debounce(function(e){modal.is(\":visible\")&&!UI.Utils.isFullscreen()&&modal.lightbox.fitSize()}.bind(this),100)),modal.lightbox=lightbox,modal}(this),this.modal.dialog.stop(),this.modal.content.stop();var data,item,$this=this,promise=UI.$.Deferred();\"object\"==typeof(index=index||0)&&this.siblings.forEach(function(s,idx){index[0]===s.link[0]&&(index=idx)}),index<0?index=this.siblings.length-index:this.siblings[index]||(index=0),item=this.siblings[index],data={lightbox:$this,source:item.source,type:item.type,index:index,promise:promise,title:item.title,item:item,meta:{content:\"\",width:null,height:null}},this.index=index,this.modal.content.empty(),this.modal.is(\":visible\")||(this.modal.content.css({width:\"\",height:\"\"}).empty(),this.modal.modal.show()),this.modal.loader.removeClass(\"uk-hidden\"),promise.promise().done(function(){$this.data=data,$this.fitSize(data)}).fail(function(){data.meta.content='
        Loading resource failed!
        ',data.meta.width=400,data.meta.height=300,$this.data=data,$this.fitSize(data)}),$this.trigger(\"showitem.uk.lightbox\",[data])},fitSize:function(){var $this=this,data=this.data,pad=this.modal.dialog.outerWidth()-this.modal.dialog.width(),dpad=parseInt(this.modal.dialog.css(\"margin-top\"),10)+parseInt(this.modal.dialog.css(\"margin-bottom\"),10),content=data.meta.content,duration=$this.options.duration;1',''].join(\"\"));var maxwidth,maxheight,tmp=UI.$(\"
         
        \").css({opacity:0,position:\"absolute\",top:0,left:0,width:\"100%\",\"max-width\":$this.modal.dialog.css(\"max-width\"),padding:$this.modal.dialog.css(\"padding\"),margin:$this.modal.dialog.css(\"margin\")}),w=data.meta.width,h=data.meta.height;tmp.appendTo(\"body\").width(),maxwidth=tmp.width(),maxheight=window.innerHeight-dpad,tmp.remove(),this.modal.dialog.find(\".uk-modal-caption\").remove(),data.title&&(this.modal.dialog.append('
        '+data.title+\"
        \"),maxheight-=this.modal.dialog.find(\".uk-modal-caption\").outerHeight()),maxwidth',width:width,height:height},data.type=\"image\",data.promise.resolve()};if(cache[data.source])resolve(data.source,cache[data.source].width,cache[data.source].height);else{var img=new Image;img.onerror=function(){data.promise.reject(\"Loading image failed\")},img.onload=function(){cache[data.source]={width:img.width,height:img.height},resolve(data.source,cache[data.source].width,cache[data.source].height)},img.src=data.source}}})}}),UI.plugin(\"lightbox\",\"youtube\",{init:function(lightbox){var youtubeRegExp=/(\\/\\/.*?youtube\\.[a-z]+)\\/watch\\?v=([^&]+)&?(.*)/,youtubeRegExpShort=/youtu\\.be\\/(.*)/;lightbox.on(\"showitem.uk.lightbox\",function(e,data){var id,matches,resolve=function(id,width,height){data.meta={content:'',width:width,height:height},data.type=\"iframe\",data.promise.resolve()};if((matches=data.source.match(youtubeRegExp))&&(id=matches[2]),(matches=data.source.match(youtubeRegExpShort))&&(id=matches[1]),id){if(cache[id])resolve(id,cache[id].width,cache[id].height);else{var img=new Image,lowres=!1;img.onerror=function(){cache[id]={width:640,height:320},resolve(id,cache[id].width,cache[id].height)},img.onload=function(){120==img.width&&90==img.height?lowres?(cache[id]={width:640,height:320},resolve(id,cache[id].width,cache[id].height)):(lowres=!0,img.src=\"//img.youtube.com/vi/\"+id+\"/0.jpg\"):(cache[id]={width:img.width,height:img.height},resolve(id,img.width,img.height))},img.src=\"//img.youtube.com/vi/\"+id+\"/maxresdefault.jpg\"}e.stopImmediatePropagation()}})}}),UI.plugin(\"lightbox\",\"vimeo\",{init:function(lightbox){var matches,regex=/(\\/\\/.*?)vimeo\\.[a-z]+\\/([0-9]+).*?/;lightbox.on(\"showitem.uk.lightbox\",function(e,data){var id,resolve=function(id,width,height){data.meta={content:'',width:width,height:height},data.type=\"iframe\",data.promise.resolve()};(matches=data.source.match(regex))&&(id=matches[2],cache[id]?resolve(id,cache[id].width,cache[id].height):UI.$.ajax({type:\"GET\",url:\"http://vimeo.com/api/oembed.json?url=\"+encodeURI(data.source),jsonp:\"callback\",dataType:\"jsonp\",success:function(data){cache[id]={width:data.width,height:data.height},resolve(id,cache[id].width,cache[id].height)}}),e.stopImmediatePropagation())})}}),UI.plugin(\"lightbox\",\"video\",{init:function(lightbox){lightbox.on(\"showitem.uk.lightbox\",function(e,data){var resolve=function(source,width,height){data.meta={content:'',width:width,height:height},data.type=\"video\",data.promise.resolve()};if(\"video\"==data.type||data.source.match(/\\.(mp4|webm|ogv)$/i))if(cache[data.source])resolve(data.source,cache[data.source].width,cache[data.source].height);else var vid=UI.$('').attr(\"src\",data.source).appendTo(\"body\"),idle=setInterval(function(){vid[0].videoWidth&&(clearInterval(idle),cache[data.source]={width:vid[0].videoWidth,height:vid[0].videoHeight},resolve(data.source,cache[data.source].width,cache[data.source].height),vid.remove())},20)})}}),UI.lightbox.create=function(items,options){if(items){var group=[];return items.forEach(function(item){group.push(UI.$.extend({source:\"\",title:\"\",type:\"auto\",link:!1},\"string\"==typeof item?{source:item}:item))}),UI.lightbox(UI.$.extend({},options,{group:group}))}},UI.lightbox}),function(addon){var component;window.UIkit&&(component=addon(UIkit)), true&&!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__WEBPACK_LOCAL_MODULE_0__], __WEBPACK_AMD_DEFINE_RESULT__ = (function(){return component||addon(UIkit)}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))}(function(UI){\"use strict\";var draggingElement,hasTouch=\"ontouchstart\"in window,html=UI.$html,touchedlists=[],$win=UI.$win,eStart=hasTouch?\"touchstart\":\"mousedown\",eMove=hasTouch?\"touchmove\":\"mousemove\",eEnd=hasTouch?\"touchend\":\"mouseup\",eCancel=hasTouch?\"touchcancel\":\"mouseup\";return UI.component(\"nestable\",{defaults:{listBaseClass:\"uk-nestable\",listClass:\"uk-nestable-list\",listItemClass:\"uk-nestable-item\",dragClass:\"uk-nestable-dragged\",movingClass:\"uk-nestable-moving\",noChildrenClass:\"uk-nestable-nochildren\",emptyClass:\"uk-nestable-empty\",handleClass:\"\",collapsedClass:\"uk-collapsed\",placeholderClass:\"uk-nestable-placeholder\",noDragClass:\"uk-nestable-nodrag\",group:!1,maxDepth:10,threshold:20,idlethreshold:10},boot:function(){UI.$html.on(\"mousemove touchmove\",function(e){if(draggingElement){var top=draggingElement.offset().top;topwindow.innerHeight+UI.$win.scrollTop()&&UI.$win.scrollTop(UI.$win.scrollTop()+Math.ceil(draggingElement.height()/2))}}),UI.ready(function(context){UI.$(\"[data-uk-nestable]\",context).each(function(){var ele=UI.$(this);ele.data(\"nestable\")||UI.nestable(ele,UI.Utils.options(ele.attr(\"data-uk-nestable\")))})})},init:function(){var $this=this;Object.keys(this.options).forEach(function(key){-1!=String(key).indexOf(\"Class\")&&($this.options[\"_\"+key]=\".\"+$this.options[key])}),this.find(this.options._listItemClass).find(\">ul\").addClass(this.options.listClass),this.checkEmptyList(),this.reset(),this.element.data(\"nestable-group\",this.options.group||UI.Utils.uid(\"nestable-group\")),this.find(this.options._listItemClass).each(function(){$this.setParent(UI.$(this))}),this.on(\"click\",\"[data-nestable-action]\",function(e){if(!$this.dragEl&&(hasTouch||0===e.button)){e.preventDefault();var target=UI.$(e.currentTarget),action=target.data(\"nestableAction\"),item=target.closest($this.options._listItemClass);\"collapse\"===action&&$this.collapseItem(item),\"expand\"===action&&$this.expandItem(item),\"toggle\"===action&&$this.toggleItem(item)}});var onStartEvent=function(e){var handle=UI.$(e.target);e.target!==$this.element[0]&&(handle.is($this.options._noDragClass)||handle.closest($this.options._noDragClass).length||handle.is(\"[data-nestable-action]\")||handle.closest(\"[data-nestable-action]\").length||($this.options.handleClass&&!handle.hasClass($this.options.handleClass)&&$this.options.handleClass&&(handle=handle.closest($this.options._handleClass)),!handle.length||$this.dragEl||!hasTouch&&0!==e.button||hasTouch&&1!==e.touches.length||(e.originalEvent&&e.originalEvent.touches&&(e=evt.originalEvent.touches[0]),$this.delayMove=function(evt){evt.preventDefault(),$this.dragStart(e),$this.trigger(\"start.uk.nestable\",[$this]),$this.delayMove=!1},$this.delayMove.x=parseInt(e.pageX,10),$this.delayMove.y=parseInt(e.pageY,10),$this.delayMove.threshold=$this.options.idlethreshold,e.preventDefault())))},onMoveEvent=function(e){e.originalEvent&&e.originalEvent.touches&&(e=e.originalEvent.touches[0]),$this.delayMove&&(Math.abs(e.pageX-$this.delayMove.x)>$this.delayMove.threshold||Math.abs(e.pageY-$this.delayMove.y)>$this.delayMove.threshold)&&(window.getSelection().toString()?$this.delayMove=!1:$this.delayMove(e)),$this.dragEl&&(e.preventDefault(),$this.dragMove(e),$this.trigger(\"move.uk.nestable\",[$this]))},onEndEvent=function(e){$this.dragEl&&(e.preventDefault(),$this.dragStop(hasTouch?e.touches[0]:e)),draggingElement=!1,$this.delayMove=!1};hasTouch?(this.element[0].addEventListener(eStart,onStartEvent,!1),window.addEventListener(eMove,onMoveEvent,!1),window.addEventListener(eEnd,onEndEvent,!1),window.addEventListener(eCancel,onEndEvent,!1)):(this.on(eStart,onStartEvent),$win.on(eMove,onMoveEvent),$win.on(eEnd,onEndEvent))},serialize:function(){var list=this,step=function(level,depth){var array=[];return level.children(list.options._listItemClass).each(function(){for(var attribute,li=UI.$(this),item={},sub=li.children(list.options._listClass),i=0;i\").addClass(this.options.listClass+\" \"+this.options.dragClass).append(dragItem.clone()),this.dragEl.css(\"width\",dragItem.width()),this.placeEl.addClass(this.options.placeholderClass),draggingElement=this.dragEl,this.tmpDragOnSiblings=[dragItem[0].previousSibling,dragItem[0].nextSibling],UI.$body.append(this.dragEl),this.dragEl.css({left:offset.left,top:offset.top});var i,depth,items=this.dragEl.find(this.options._listItemClass);for(i=0;ithis.dragDepth&&(this.dragDepth=depth);html.addClass(this.options.movingClass)},dragStop:function(e){var el=UI.$(this.placeEl),root=this.placeEl.parents(this.options._listBaseClass+\":first\");this.placeEl.removeClass(this.options.placeholderClass),this.dragEl.remove(),this.element[0]!==root[0]?(root.trigger(\"change.uk.nestable\",[root.data(\"nestable\"),el,\"added\"]),this.element.trigger(\"change.uk.nestable\",[this,el,\"removed\"])):this.element.trigger(\"change.uk.nestable\",[this,el,\"moved\"]),this.trigger(\"stop.uk.nestable\",[this,el]),this.reset(),html.removeClass(this.options.movingClass)},dragMove:function(e){var list,parent,prev,opt=this.options,mouse=this.mouse,maxDepth=this.dragRootEl?this.dragRootEl.data(\"nestable\").options.maxDepth:opt.maxDepth;this.dragEl.css({left:e.pageX-mouse.offsetX,top:e.pageY-mouse.offsetY}),mouse.lastX=mouse.nowX,mouse.lastY=mouse.nowY,mouse.nowX=e.pageX,mouse.nowY=e.pageY,mouse.distX=mouse.nowX-mouse.lastX,mouse.distY=mouse.nowY-mouse.lastY,mouse.lastDirX=mouse.dirX,mouse.lastDirY=mouse.dirY,mouse.dirX=0===mouse.distX?0:0Math.abs(mouse.distY)?1:0;if(!mouse.moving)return mouse.dirAx=newAx,void(mouse.moving=!0);if(mouse.dirAx!==newAx?(mouse.distAxX=0,mouse.distAxY=0):(mouse.distAxX+=Math.abs(mouse.distX),0!==mouse.dirX&&mouse.dirX!==mouse.lastDirX&&(mouse.distAxX=0),mouse.distAxY+=Math.abs(mouse.distY),0!==mouse.dirY&&mouse.dirY!==mouse.lastDirY&&(mouse.distAxY=0)),mouse.dirAx=newAx,mouse.dirAx&&mouse.distAxX>=opt.threshold&&(mouse.distAxX=0,prev=this.placeEl.prev(\"li\"),0\").addClass(opt.listClass)).append(this.placeEl),prev.append(list),this.setParent(prev)))),mouse.distX<0&&!this.placeEl.next(opt._listItemClass).length)){var parentUl=this.placeEl.closest([opt._listBaseClass,opt._listClass].join(\",\")),surroundingLi=parentUl.closest(opt._listItemClass);surroundingLi.length&&(surroundingLi.after(this.placeEl),parentUl.children().length||this.unsetParent(surroundingLi))}var isEmpty=!1,pointX=e.pageX-(window.pageXOffset||document.scrollLeft||0),pointY=e.pageY-(window.pageYOffset||document.documentElement.scrollTop);if(this.pointEl=UI.$(document.elementFromPoint(pointX,pointY)),opt.handleClass&&this.pointEl.hasClass(opt.handleClass))this.pointEl=this.pointEl.closest(opt._listItemClass);else{var nestableitem=this.pointEl.closest(opt._listItemClass);nestableitem.length&&(this.pointEl=nestableitem)}if(!this.placeEl.find(this.pointEl).length){if(this.pointEl.data(\"nestable\")&&!this.pointEl.children().length)isEmpty=!0,this.checkEmptyList(this.pointEl);else if(!this.pointEl.length||!this.pointEl.hasClass(opt.listItemClass))return;var pointElRoot=this.element,tmpRoot=this.pointEl.closest(this.options._listBaseClass),isNewRoot=pointElRoot[0]!=tmpRoot[0];if(!mouse.dirAx||isNewRoot||isEmpty){if(isNewRoot&&opt.group!==tmpRoot.data(\"nestable-group\"))return;if(touchedlists.push(pointElRoot),maxDepth','',\"
        \",\"
        \"].join(\"\")).data(\"notifyMessage\",this),this.content(this.options.message),this.options.status&&(this.element.addClass(\"uk-notify-message-\"+this.options.status),this.currentstatus=this.options.status),this.group=this.options.group,messages[this.uuid]=this,containers[this.options.pos]||(containers[this.options.pos]=UI.$('
        ').appendTo(\"body\").on(\"click\",\".uk-notify-message\",function(){var message=UI.$(this).data(\"notifyMessage\");message.element.trigger(\"manualclose.uk.notify\",[message]),message.close()}))};return UI.$.extend(Message.prototype,{uuid:!1,element:!1,timout:!1,currentstatus:\"\",group:!1,show:function(){if(!this.element.is(\":visible\")){var $this=this;containers[this.options.pos].show().prepend(this.element);var marginbottom=parseInt(this.element.css(\"margin-bottom\"),10);return this.element.css({opacity:0,\"margin-top\":-1*this.element.outerHeight(),\"margin-bottom\":0}).animate({opacity:1,\"margin-top\":0,\"margin-bottom\":marginbottom},function(){if($this.options.timeout){var closefn=function(){$this.close()};$this.timeout=setTimeout(closefn,$this.options.timeout),$this.element.hover(function(){clearTimeout($this.timeout)},function(){$this.timeout=setTimeout(closefn,$this.options.timeout)})}}),this}},close:function(instantly){var $this=this,finalize=function(){$this.element.remove(),containers[$this.options.pos].children().length||containers[$this.options.pos].hide(),$this.options.onClose.apply($this,[]),$this.element.trigger(\"close.uk.notify\",[$this]),delete messages[$this.uuid]};this.timeout&&clearTimeout(this.timeout),instantly?finalize():this.element.animate({opacity:0,\"margin-top\":-1*this.element.outerHeight(),\"margin-bottom\":0},function(){finalize()})},content:function(html){var container=this.element.find(\">div\");return html?(container.html(html),this):container.html()},status:function(status){return status?(this.element.removeClass(\"uk-notify-message-\"+this.currentstatus).addClass(\"uk-notify-message-\"+status),this.currentstatus=status,this):this.currentstatus}}),Message.defaults={message:\"\",status:\"\",timeout:5e3,group:null,pos:\"top-center\",onClose:function(){}},UI.notify=notify,UI.notify.message=Message,UI.notify.closeAll=function(group,instantly){var id;if(group)for(id in messages)group===messages[id].group&&messages[id].close(instantly);else for(id in messages)messages[id].close(instantly)},notify}),function(addon){var component;window.UIkit&&(component=addon(UIkit)), true&&!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__WEBPACK_LOCAL_MODULE_0__], __WEBPACK_AMD_DEFINE_RESULT__ = (function(){return component||addon(UIkit)}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))}(function(UI){\"use strict\";return UI.component(\"pagination\",{defaults:{items:1,itemsOnPage:1,pages:0,displayedPages:7,edges:1,currentPage:0,lblPrev:!1,lblNext:!1,onSelectPage:function(){}},boot:function(){UI.ready(function(context){UI.$(\"[data-uk-pagination]\",context).each(function(){var ele=UI.$(this);ele.data(\"pagination\")||UI.pagination(ele,UI.Utils.options(ele.attr(\"data-uk-pagination\")))})})},init:function(){var $this=this;this.pages=this.options.pages?this.options.pages:Math.ceil(this.options.items/this.options.itemsOnPage)?Math.ceil(this.options.items/this.options.itemsOnPage):1,this.currentPage=this.options.currentPage,this.halfDisplayed=this.options.displayedPages/2,this.on(\"click\",\"a[data-page]\",function(e){e.preventDefault(),$this.selectPage(UI.$(this).data(\"page\"))}),this._render()},_getInterval:function(){return{start:Math.ceil(this.currentPage>this.halfDisplayed?Math.max(Math.min(this.currentPage-this.halfDisplayed,this.pages-this.options.displayedPages),0):0),end:Math.ceil(this.currentPage>this.halfDisplayed?Math.min(this.currentPage+this.halfDisplayed,this.pages):Math.min(this.options.displayedPages,this.pages))}},render:function(pages){this.pages=pages||this.pages,this._render()},selectPage:function(pageIndex,pages){this.currentPage=pageIndex,this.render(pages),this.options.onSelectPage.apply(this,[pageIndex]),this.trigger(\"select.uk.pagination\",[pageIndex,this])},_render:function(){var i,o=this.options,interval=this._getInterval();if(this.element.empty(),o.lblPrev&&this._append(this.currentPage-1,{text:o.lblPrev}),0...\"):interval.start-o.edges==1&&this._append(o.edges)}for(i=interval.start;iinterval.end&&this.pages-o.edges-interval.end!=1?this.element.append(\"
      • ...
      • \"):this.pages-o.edges-interval.end==1&&this._append(interval.end++),i=Math.max(this.pages-o.edges,interval.end);i'+options.text+\"\":'
      • '+options.text+\"
      • \",this.element.append(item)}}),UI.pagination}),function(addon){var component;window.UIkit&&(component=addon(UIkit)), true&&!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__WEBPACK_LOCAL_MODULE_0__], __WEBPACK_AMD_DEFINE_RESULT__ = (function(){return component||addon(UIkit)}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))}(function(UI){\"use strict\";var parallaxes=[],supports3d=!1,scrolltop=0,wh=window.innerHeight,checkParallaxes=function(){scrolltop=UI.$win.scrollTop(),window.requestAnimationFrame(function(){for(var i=0;iwindow.innerHeight&&(width*=1.2,height*=1.2)):(width=w,height=Math.ceil(w/ratio)),element.css({\"background-size\":width+\"px \"+height+\"px\"}).data(\"bgsize\",{w:width,h:height})},img.onerror=function(){},img.onload=function(){size={w:img.width,h:img.height},ratio=img.width/img.height,UI.$win.on(\"load resize orientationchange\",UI.Utils.debounce(function(){check()},50)),check()},img.src=url,!0}(this,prop,opts)),prop){case\"x\":css.transform+=supports3d?\" translate3d(\"+val+\"px, 0, 0)\":\" translateX(\"+val+\"px)\";break;case\"xp\":css.transform+=supports3d?\" translate3d(\"+val+\"%, 0, 0)\":\" translateX(\"+val+\"%)\";break;case\"y\":css.transform+=supports3d?\" translate3d(0, \"+val+\"px, 0)\":\" translateY(\"+val+\"px)\";break;case\"yp\":css.transform+=supports3d?\" translate3d(0, \"+val+\"%, 0)\":\" translateY(\"+val+\"%)\";break;case\"rotate\":css.transform+=\" rotate(\"+val+\"deg)\";break;case\"scale\":css.transform+=\" scale(\"+val+\")\";break;case\"bg\":css[\"background-position\"]=\"50% \"+val+\"px\";break;case\"bgp\":css[\"background-position\"]=\"50% \"+val+\"%\";break;case\"color\":case\"background-color\":case\"border-color\":css[prop]=(start=opts.start,end=opts.end,pos=compercent,start=parseColor(start),end=parseColor(end),function(begin,end,pos){var color=\"rgba(\"+parseInt(begin[0]+pos*(end[0]-begin[0]),10)+\",\"+parseInt(begin[1]+pos*(end[1]-begin[1]),10)+\",\"+parseInt(begin[2]+pos*(end[2]-begin[2]),10)+\",\"+(begin&&end?parseFloat(begin[3]+pos*(end[3]-begin[3])):1);return color+=\")\"}(start,end,pos=pos||0));break;default:css[prop]=val}var start,end,pos}.bind(this)),this.element.css(css),this._percent=compercent)},_getStartValue:function(prop){var value=0;switch(prop){case\"scale\":value=1;break;default:value=this.element.css(prop)}return value||0}});var colors={black:[0,0,0,1],blue:[0,0,255,1],brown:[165,42,42,1],cyan:[0,255,255,1],fuchsia:[255,0,255,1],gold:[255,215,0,1],green:[0,128,0,1],indigo:[75,0,130,1],khaki:[240,230,140,1],lime:[0,255,0,1],magenta:[255,0,255,1],maroon:[128,0,0,1],navy:[0,0,128,1],olive:[128,128,0,1],orange:[255,165,0,1],pink:[255,192,203,1],purple:[128,0,128,1],violet:[128,0,128,1],red:[255,0,0,1],silver:[192,192,192,1],white:[255,255,255,1],yellow:[255,255,0,1],transparent:[255,255,255,0]};function parseColor(color){var match;return(match=/#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})/.exec(color))?[parseInt(match[1],16),parseInt(match[2],16),parseInt(match[3],16),1]:(match=/#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/.exec(color))?[17*parseInt(match[1],16),17*parseInt(match[2],16),17*parseInt(match[3],16),1]:(match=/rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/.exec(color))?[parseInt(match[1]),parseInt(match[2]),parseInt(match[3]),1]:(match=/rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9\\.]*)\\s*\\)/.exec(color))?[parseInt(match[1],10),parseInt(match[2],10),parseInt(match[3],10),parseFloat(match[4])]:colors[color]||[255,255,255,0]}return UI.parallax}),function(addon){var component;window.UIkit&&(component=addon(UIkit)), true&&!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__WEBPACK_LOCAL_MODULE_0__], __WEBPACK_AMD_DEFINE_RESULT__ = (function(){return component||addon(UIkit)}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))}(function(UI){var parallaxes=[],checkParallaxes=function(){requestAnimationFrame(function(){for(var i=0;i=top);column++);return column||1}UI.component(\"gridparallax\",{defaults:{target:!1,smooth:150,translate:150},boot:function(){UI.$doc.on(\"scrolling.uk.document\",checkParallaxes),UI.$win.on(\"load resize orientationchange\",UI.Utils.debounce(function(){checkParallaxes()},50)),UI.ready(function(context){UI.$(\"[data-uk-grid-parallax]\",context).each(function(){var parallax=UI.$(this);parallax.data(\"gridparallax\")||UI.gridparallax(parallax,UI.Utils.options(parallax.attr(\"data-uk-grid-parallax\")))})})},init:function(){var fn,$this=this;this.initItems().process(),parallaxes.push(this),UI.$win.on(\"load resize orientationchange\",(fn=function(){var columns=getcolumns($this.element);$this.element.css(\"margin-bottom\",\"\"),1 {{#msgResultsHeader}}
      • {{msgResultsHeader}}
      • {{/msgResultsHeader}} {{#items && items.length}} {{~items}}
      • {{{$item.title}}} {{#$item.text}}
        {{{$item.text}}}
        {{/$item.text}}
      • {{/items}} {{#msgMoreResults}}
      • {{msgMoreResults}}
      • {{/msgMoreResults}} {{/end}} {{^items.length}} {{#msgNoResults}}
      • {{msgNoResults}}
      • {{/msgNoResults}} {{/end}} ',renderer:function(data){var opts=this.options;this.dropdown.append(this.template({items:data.results||[],msgResultsHeader:opts.msgResultsHeader,msgMoreResults:opts.msgMoreResults,msgNoResults:opts.msgNoResults})),this.show()}},boot:function(){UI.$html.on(\"focus.search.uikit\",\"[data-uk-search]\",function(e){var ele=UI.$(this);ele.data(\"search\")||UI.search(ele,UI.Utils.options(ele.attr(\"data-uk-search\")))})},init:function(){var $this=this;this.autocomplete=UI.autocomplete(this.element,this.options),this.autocomplete.dropdown.addClass(\"uk-dropdown-search\"),this.autocomplete.input.on(\"keyup\",function(){$this.element[$this.autocomplete.input.val()?\"addClass\":\"removeClass\"](\"uk-active\")}).closest(\"form\").on(\"reset\",function(){$this.value=\"\",$this.element.removeClass(\"uk-active\")}),this.on(\"selectitem.uk.autocomplete\",function(e,data){data.url?location.href=data.url:data.moreresults&&$this.autocomplete.input.closest(\"form\").submit()}),this.element.data(\"search\",this)}})}),function(addon){var component;window.UIkit&&(component=addon(UIkit)), true&&!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__WEBPACK_LOCAL_MODULE_0__], __WEBPACK_AMD_DEFINE_RESULT__ = (function(){return component||addon(UIkit)}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))}(function(UI){\"use strict\";var dragging,delayIdle,anchor,dragged,store={};return UI.component(\"slider\",{defaults:{center:!1,threshold:10,infinite:!0,autoplay:!1,autoplayInterval:7e3,pauseOnHover:!0,activecls:\"uk-active\"},boot:function(){UI.ready(function(context){setTimeout(function(){UI.$(\"[data-uk-slider]\",context).each(function(){var ele=UI.$(this);ele.data(\"slider\")||UI.slider(ele,UI.Utils.options(ele.attr(\"data-uk-slider\")))})},0)})},init:function(){var $this=this;this.container=this.element.find(\".uk-slider\"),this.focus=0,UI.$win.on(\"resize load\",UI.Utils.debounce(function(){$this.resize(!0)},100)),this.on(\"click.uk.slider\",\"[data-uk-slider-item]\",function(e){e.preventDefault();var item=UI.$(this).attr(\"data-uk-slider-item\");if($this.focus!=item)switch($this.stop(),item){case\"next\":case\"previous\":$this[\"next\"==item?\"next\":\"previous\"]();break;default:$this.updateFocus(parseInt(item,10))}}),this.container.on({\"touchstart mousedown\":function(evt){evt.originalEvent&&evt.originalEvent.touches&&(evt=evt.originalEvent.touches[0]),evt.button&&2==evt.button||!$this.active||($this.stop(),anchor=UI.$(evt.target).is(\"a\")?UI.$(evt.target):UI.$(evt.target).parents(\"a:first\"),dragged=!1,anchor.length&&anchor.one(\"click\",function(e){dragged&&e.preventDefault()}),(delayIdle=function(e){dragged=!0,dragging=$this,store={touchx:parseInt(e.pageX,10),dir:1,focus:$this.focus,base:$this.options.center?\"center\":\"area\"},e.originalEvent&&e.originalEvent.touches&&(e=e.originalEvent.touches[0]),dragging.element.data({\"pointer-start\":{x:parseInt(e.pageX,10),y:parseInt(e.pageY,10)},\"pointer-pos-start\":$this.pos}),$this.container.addClass(\"uk-drag\"),delayIdle=!1}).x=parseInt(evt.pageX,10),delayIdle.threshold=$this.options.threshold)},mouseenter:function(){$this.options.pauseOnHover&&($this.hovering=!0)},mouseleave:function(){$this.hovering=!1}}),this.resize(!0),this.on(\"display.uk.check\",function(){$this.element.is(\":visible\")&&$this.resize(!0)}),this.element.find(\"a,img\").attr(\"draggable\",\"false\"),this.options.autoplay&&this.start()},resize:function(focus){var item,width,cwidth,size,$this=this,pos=0,maxheight=0;if(this.items=this.container.children().filter(\":visible\"),this.vp=this.element[0].getBoundingClientRect().width,this.container.css({\"min-width\":\"\",\"min-height\":\"\"}),this.items.each(function(idx){item=UI.$(this),size=item.css({left:\"\",width:\"\"})[0].getBoundingClientRect(),width=size.width,cwidth=item.width(),maxheight=Math.max(maxheight,size.height),item.css({left:pos,width:width}).data({idx:idx,left:pos,width:width,cwidth:cwidth,area:pos+width,center:pos-($this.vp/2-cwidth/2)}),pos+=width}),this.container.css({\"min-width\":pos,\"min-height\":maxheight}),this.options.infinite&&(pos<=2*this.vp||this.items.length<5)&&!this.itemsResized)return this.container.children().each(function(idx){$this.container.append($this.items.eq(idx).clone(!0).attr(\"id\",\"\"))}).each(function(idx){$this.container.append($this.items.eq(idx).clone(!0).attr(\"id\",\"\"))}),this.itemsResized=!0,this.resize();this.cw=pos,this.pos=0,this.active=pos>=this.vp,this.container.css({\"-ms-transform\":\"\",\"-webkit-transform\":\"\",transform:\"\"}),focus&&this.updateFocus(this.focus)},updatePos:function(pos){this.pos=pos,this.container.css({\"-ms-transform\":\"translateX(\"+pos+\"px)\",\"-webkit-transform\":\"translateX(\"+pos+\"px)\",transform:\"translateX(\"+pos+\"px)\"})},updateFocus:function(idx,dir){if(this.active){dir=dir||(idx>this.focus?1:-1);var area,i,item=this.items.eq(idx);if(this.options.infinite&&this.infinite(idx,dir),this.options.center)this.updatePos(-1*item.data(\"center\")),this.items.filter(\".\"+this.options.activecls).removeClass(this.options.activecls),item.addClass(this.options.activecls);else if(this.options.infinite)this.updatePos(-1*item.data(\"left\"));else{for(area=0,i=idx;ithis.vp)this.updatePos(-1*item.data(\"left\"));else if(1==dir){for(area=0,i=this.items.length-1;0<=i;i--){if((area+=this.items.eq(i).data(\"width\"))==this.vp){idx=i;break}if(area>this.vp){idx=ithis.vp?this.updatePos(-1*(this.container.width()-this.vp)):this.updatePos(-1*this.items.eq(idx).data(\"left\"))}}var left=this.items.eq(idx).data(\"left\");this.items.removeClass(\"uk-slide-before uk-slide-after\").each(function(i){i!==idx&&UI.$(this).addClass(UI.$(this).data(\"left\")this.vp));i++)z=z+1==this.items.length?0:z+1;move.length&&move.forEach(function(itm){var left=item.data(\"area\");itm.css({left:left}).data({left:left,area:left+itm.data(\"width\"),center:left-($this.vp/2-itm.data(\"cwidth\")/2)}),item=itm})}else{for(i=this.items.length-1;-1this.vp));i--)z=z-1==-1?this.items.length-1:z-1;move.length&&move.forEach(function(itm){var left=item.data(\"left\")-itm.data(\"width\");itm.css({left:left}).data({left:left,area:left+itm.data(\"width\"),center:left-($this.vp/2-itm.data(\"cwidth\")/2)}),item=itm})}}}),UI.$doc.on(\"mousemove.uk.slider touchmove.uk.slider\",function(e){if(e.originalEvent&&e.originalEvent.touches&&(e=e.originalEvent.touches[0]),delayIdle&&Math.abs(e.pageX-delayIdle.x)>delayIdle.threshold&&(window.getSelection().toString()?dragging=delayIdle=!1:delayIdle(e)),dragging){var x,xDiff,pos,dir,focus,item,diff,i,z,itm;if(e.clientX||e.clientY?x=e.clientX:(e.pageX||e.pageY)&&(x=e.pageX-document.body.scrollLeft-document.documentElement.scrollLeft),focus=store.focus,xDiff=x-dragging.element.data(\"pointer-start\").x,pos=dragging.element.data(\"pointer-pos-start\")+xDiff,dir=x>dragging.element.data(\"pointer-start\").x?-1:1,item=dragging.items.eq(store.focus),1==dir)for(diff=item.data(\"left\")+Math.abs(xDiff),i=0,z=store.focus;idiff){focus=z;break}z=z+1==dragging.items.length?0:z+1}else for(diff=item.data(\"left\")-Math.abs(xDiff),i=0,z=store.focus;istore.diff){focus=z;break}z=z+1==dragging.items.length?0:z+1}else for(i=0,z=store.focus;i').css({\"background-image\":\"url(\"+media.attr(\"src\")+\")\"});media.attr(\"width\")&&media.attr(\"height\")&&(placeholder=UI.$(\"\").attr({width:media.attr(\"width\"),height:media.attr(\"height\")}),media.replaceWith(placeholder),media=placeholder,placeholder=void 0),media.css({width:\"100%\",height:\"auto\",opacity:0}),slide.prepend(cover).data(\"cover\",cover);break;case\"IFRAME\":var src=media[0].src,iframeId=\"sw-\"+ ++playerId;media.attr(\"src\",\"\").on(\"load\",function(){if((index!==$this.current||index==$this.current&&!$this.options.videoautoplay)&&$this.pausemedia(media),$this.options.videomute){$this.mutemedia(media);var inv=setInterval((ic=0,function(){$this.mutemedia(media),4<=++ic&&clearInterval(inv)}),250)}var ic}).data(\"slideshow\",$this).attr(\"data-player-id\",iframeId).attr(\"src\",[src,-1\").attr({width:media[0].width,height:media[0].height});var img=UI.$('').attr(\"src\",canvas[0].toDataURL());slide.prepend(img),slide.data(\"sizer\",img)}}else slide.data(\"sizer\",slide);$this.hasKenBurns(slide)&&slide.data(\"cover\").css({\"-webkit-animation-duration\":kbanimduration,\"animation-duration\":kbanimduration})}),this.on(\"click.uk.slideshow\",\"[data-uk-slideshow-item]\",function(e){e.preventDefault();var slide=UI.$(this).attr(\"data-uk-slideshow-item\");if($this.current!=slide){switch(slide){case\"next\":case\"previous\":$this[\"next\"==slide?\"next\":\"previous\"]();break;default:$this.show(parseInt(slide,10))}$this.stop()}}),this.slides.attr(\"aria-hidden\",\"true\").eq(this.current).addClass(\"uk-active\").attr(\"aria-hidden\",\"false\"),this.triggers.filter('[data-uk-slideshow-item=\"'+this.current+'\"]').addClass(\"uk-active\"),UI.$win.on(\"resize load\",UI.Utils.debounce(function(){$this.resize(),$this.fixFullscreen&&($this.container.css(\"height\",window.innerHeight),$this.slides.css(\"height\",window.innerHeight))},100)),setTimeout(function(){$this.resize()},80),this.options.autoplay&&this.start(),this.options.videoautoplay&&this.slides.eq(this.current).data(\"media\")&&this.playmedia(this.slides.eq(this.current).data(\"media\")),this.options.kenburns&&this.applyKenBurns(this.slides.eq(this.current)),this.container.on({mouseenter:function(){$this.options.pauseOnHover&&($this.hovering=!0)},mouseleave:function(){$this.hovering=!1}}),this.on(\"swipeRight swipeLeft\",function(e){$this[\"swipeLeft\"==e.type?\"next\":\"previous\"]()}),this.on(\"display.uk.check\",function(){$this.element.is(\":visible\")&&($this.resize(),$this.fixFullscreen&&($this.container.css(\"height\",window.innerHeight),$this.slides.css(\"height\",window.innerHeight)))})},resize:function(){if(!this.container.hasClass(\"uk-slideshow-fullscreen\")){var height=this.options.height;\"auto\"===this.options.height&&(height=0,this.slides.css(\"height\",\"\").each(function(){height=Math.max(height,UI.$(this).height())})),this.container.css(\"height\",height),this.slides.css(\"height\",height)}},show:function(index,direction){if(!this.animating&&this.current!=index){this.animating=!0;var $this=this,current=this.slides.eq(this.current),next=this.slides.eq(index),dir=direction||(this.current\").css({top:0,left:0,width:this.container.width(),height:this.container.height(),opacity:1,zIndex:15}),ghostWidth=ghost.width(),ghostHeight=ghost.height(),i=0;i').css({position:\"absolute\",top:0,left:0,width:ghostWidth,height:ghostHeight,\"background-image\":bgimage,clip:clipfrom,opacity:0,transition:\"all \"+this.options.duration+\"ms ease-in-out \"+60*i+\"ms\",\"-webkit-transition\":\"all \"+this.options.duration+\"ms ease-in-out \"+60*i+\"ms\"}).data(\"clip\",clipto),ghost.append(bar)}return this.container.append(ghost),ghost.children().last().on(UI.support.transition.end,function(){ghost.remove(),d.resolve()}),ghost.width(),ghost.children().each(function(){var bar=UI.$(this);bar.css({clip:bar.data(\"clip\"),opacity:1})}),d.promise()},\"slice-up\":function(current,next,dir){return Animations.slice.apply(this,[current,next,dir,\"slice-up\"])},\"slice-down\":function(current,next,dir){return Animations.slice.apply(this,[current,next,dir,\"slice-down\"])},\"slice-up-down\":function(current,next,dir){return Animations.slice.apply(this,[current,next,dir,\"slice-up-down\"])},fold:function(current,next,dir){if(!next.data(\"cover\"))return Animations.fade.apply(this,arguments);for(var bar,d=UI.$.Deferred(),sliceWidth=Math.ceil(this.element.width()/this.options.slices),bgimage=next.data(\"cover\").css(\"background-image\"),ghost=UI.$(\"
      • \").css({width:next.width(),height:next.height(),opacity:1,zIndex:15}),ghostWidth=next.width(),ghostHeight=next.height(),i=0;i').css({position:\"absolute\",top:0,left:0,width:ghostWidth,height:ghostHeight,\"background-image\":bgimage,\"transform-origin\":sliceWidth*i+\"px 0 0\",clip:\"rect(0px, \"+sliceWidth*(i+1)+\"px, \"+ghostHeight+\"px, \"+sliceWidth*i+\"px)\",opacity:0,transform:\"scaleX(0.000001)\",transition:\"all \"+this.options.duration+\"ms ease-in-out \"+(100+60*i)+\"ms\",\"-webkit-transition\":\"all \"+this.options.duration+\"ms ease-in-out \"+(100+60*i)+\"ms\"}),ghost.prepend(bar);return this.container.append(ghost),ghost.width(),ghost.children().first().on(UI.support.transition.end,function(){ghost.remove(),d.resolve()}).end().css({transform:\"scaleX(1)\",opacity:1}),d.promise()},puzzle:function(current,next,dir){if(!next.data(\"cover\"))return Animations.fade.apply(this,arguments);for(var box,rect,d=UI.$.Deferred(),$this=this,boxCols=Math.round(this.options.slices/2),boxWidth=Math.round(next.width()/boxCols),boxRows=Math.round(next.height()/boxWidth),boxHeight=Math.round(next.height()/boxRows)+1,bgimage=next.data(\"cover\").css(\"background-image\"),ghost=UI.$(\"
      • \").css({width:this.container.width(),height:this.container.height(),opacity:1,zIndex:15}),ghostWidth=this.container.width(),ghostHeight=this.container.height(),rows=0;rows').css({position:\"absolute\",top:0,left:0,opacity:0,width:ghostWidth,height:ghostHeight,\"background-image\":bgimage,clip:\"rect(\"+rect.join(\",\")+\")\",\"-webkit-transform\":\"translateZ(0)\",transform:\"translateZ(0)\"}),ghost.append(box);this.container.append(ghost);var boxes=shuffle(ghost.children());return boxes.each(function(i){UI.$(this).css({transition:\"all \"+$this.options.duration+\"ms ease-in-out \"+(50+25*i)+\"ms\",\"-webkit-transition\":\"all \"+$this.options.duration+\"ms ease-in-out \"+(50+25*i)+\"ms\"})}).last().on(UI.support.transition.end,function(){ghost.remove(),d.resolve()}),ghost.width(),boxes.css({opacity:1}),d.promise()},boxes:function(current,next,dir,fromfx){if(!next.data(\"cover\"))return Animations.fade.apply(this,arguments);for(var box,rect,cols,d=UI.$.Deferred(),boxCols=Math.round(this.options.slices/2),boxWidth=Math.round(next.width()/boxCols),boxRows=Math.round(next.height()/boxWidth),boxHeight=Math.round(next.height()/boxRows)+1,bgimage=next.data(\"cover\").css(\"background-image\"),ghost=UI.$(\"
      • \").css({width:next.width(),height:next.height(),opacity:1,zIndex:15}),ghostWidth=next.width(),ghostHeight=next.height(),rows=0;rows').css({position:\"absolute\",top:0,left:0,opacity:1,width:ghostWidth,height:ghostHeight,\"background-image\":bgimage,\"transform-origin\":rect[3]+\" \"+rect[0]+\" 0\",clip:\"rect(\"+rect.join(\",\")+\")\",\"-webkit-transform\":\"scale(0.0000000000000001)\",transform:\"scale(0.0000000000000001)\"}),ghost.append(box);this.container.append(ghost);var prevCol,rowIndex=0,colIndex=0,timeBuff=0,box2Darr=[[]],boxes=ghost.children();for(\"boxes-reverse\"==fromfx&&(boxes=[].reverse.apply(boxes)),boxes.each(function(){box2Darr[rowIndex][colIndex]=UI.$(this),++colIndex==boxCols&&(colIndex=0,box2Darr[++rowIndex]=[])}),prevCol=cols=0;colsdelayIdle.threshold||Math.abs(src.pageY-delayIdle.pos.y)>delayIdle.threshold)&&delayIdle.apply(src)}if(draggingPlaceholder){moving||(moving=!0,draggingPlaceholder.show(),draggingPlaceholder.$current.addClass(draggingPlaceholder.$sortable.options.placeholderClass),draggingPlaceholder.$sortable.element.children().addClass(draggingPlaceholder.$sortable.options.childClass),UI.$html.addClass(draggingPlaceholder.$sortable.options.dragMovingClass));var offset=draggingPlaceholder.data(\"mouse-offset\"),left=parseInt(e.originalEvent.pageX,10)+offset.left,top=parseInt(e.originalEvent.pageY,10)+offset.top;if(draggingPlaceholder.css({left:left,top:top}),top+draggingPlaceholder.height()/3>document.body.offsetHeight)return;topwindow.innerHeight+UI.$win.scrollTop()&&UI.$win.scrollTop(UI.$win.scrollTop()+Math.ceil(draggingPlaceholder.height()/3))}}),UI.$html.on(\"mouseup touchend\",function(e){if(delayIdle=!1,currentlyDraggingElement&&draggingPlaceholder){var sortable=function(ele){ele=UI.$(ele);do{if(ele.data(\"sortable\"))return ele;ele=UI.$(ele).parent()}while(ele.length);return ele}(currentlyDraggingElement),component=draggingPlaceholder.$sortable,ev={type:e.type};sortable[0]&&component.dragDrop(ev,component.element),component.dragEnd(ev,component.element)}else currentlyDraggingElement=draggingPlaceholder=null})},init:function(){var $this=this,element=this.element[0];touchedlists=[],this.checkEmptyList(),this.element.data(\"sortable-group\",this.options.group?this.options.group:UI.Utils.uid(\"sortable-group\"));var handleDragStart=delegate(function(e){if(!e.data||!e.data.sortable){var $target=UI.$(e.target),$link=$target.is(\"a[href]\")?$target:$target.parents(\"a[href]\");if(!$target.is(\":input\"))return e.preventDefault(),!supportsTouch&&$link.length&&$link.one(\"click\",function(e){e.preventDefault()}).one(\"mouseup\",function(){moved||$link.trigger(\"click\")}),e.data=e.data||{},e.data.sortable=element,$this.dragStart(e,this)}}),handleDragEnter=delegate(UI.Utils.debounce(function(e){return $this.dragEnter(e,this)})),handleDragLeave=delegate(function(e){var previousCounter=$this.dragenterData(this);$this.dragenterData(this,previousCounter-1),$this.dragenterData(this)||(UI.$(this).removeClass($this.options.overClass),$this.dragenterData(this,!1))}),handleTouchMove=delegate(function(e){return!currentlyDraggingElement||currentlyDraggingElement===this||currentlyDraggingTarget===this||($this.element.children().removeClass($this.options.overClass),currentlyDraggingTarget=this,$this.moveElementNextTo(currentlyDraggingElement,this),function(e){e.stopPropagation&&e.stopPropagation();e.preventDefault&&e.preventDefault();e.returnValue=!1}(e))});function delegate(fn){return function(e){var target,context;e&&(target=(supportsTouch&&e.touches&&e.touches[0]||{}).target||e.target,supportsTouch&&document.elementFromPoint&&(target=document.elementFromPoint(e.pageX-document.body.scrollLeft,e.pageY-document.body.scrollTop)),overElement=UI.$(target)),UI.$(target).hasClass($this.options.childClass)?fn.apply(target,[e]):target!==element&&(context=function(parent,child){var cur=child;if(cur==parent)return null;for(;cur;){if(cur.parentNode===parent)return cur;if(!(cur=cur.parentNode)||!cur.ownerDocument||11===cur.nodeType)break}return null}(element,target))&&fn.apply(context,[e])}}this.addDragHandlers=function(){supportsTouch?element.addEventListener(\"touchmove\",handleTouchMove,!1):(element.addEventListener(\"mouseover\",handleDragEnter,!1),element.addEventListener(\"mouseout\",handleDragLeave,!1))},this.removeDragHandlers=function(){supportsTouch?element.removeEventListener(\"touchmove\",handleTouchMove,!1):(element.removeEventListener(\"mouseover\",handleDragEnter,!1),element.removeEventListener(\"mouseout\",handleDragLeave,!1))},window.addEventListener(supportsTouch?\"touchmove\":\"mousemove\",function(e){currentlyDraggingElement&&$this.dragMove(e,$this)},!1),element.addEventListener(supportsTouch?\"touchstart\":\"mousedown\",handleDragStart,!1)},dragStart:function(e,elem){moving=moved=!1;var $this=this,target=UI.$(e.target);if(supportsTouch||2!=e.button){if($this.options.handleClass)if(!(target.hasClass($this.options.handleClass)?target:target.closest(\".\"+$this.options.handleClass,$this.element)).length)return;if(!target.is(\".\"+$this.options.noDragClass)&&!target.closest(\".\"+$this.options.noDragClass).length&&!target.is(\":input\")){currentlyDraggingElement=elem,draggingPlaceholder&&draggingPlaceholder.remove();var $current=UI.$(currentlyDraggingElement),offset=$current.offset();delayIdle={pos:{x:e.pageX,y:e.pageY},threshold:$this.options.threshold,apply:function(evt){(draggingPlaceholder=UI.$('
        ').css({display:\"none\",top:offset.top,left:offset.left,width:$current.width(),height:$current.height(),padding:$current.css(\"padding\")}).data({\"mouse-offset\":{left:offset.left-parseInt(evt.pageX,10),top:offset.top-parseInt(evt.pageY,10)},origin:$this.element,index:$current.index()}).append($current.html()).appendTo(\"body\")).$current=$current,draggingPlaceholder.$sortable=$this,$current.data({\"start-list\":$current.parent(),\"start-index\":$current.index(),\"sortable-group\":$this.options.group}),$this.addDragHandlers(),$this.options.start(this,currentlyDraggingElement),$this.trigger(\"start.uk.sortable\",[$this,currentlyDraggingElement]),delayIdle=!(moved=!0)}}}}},dragMove:function(e,elem){var overChild,overRoot=(overElement=UI.$(document.elementFromPoint(e.pageX-(document.body.scrollLeft||document.scrollLeft||0),e.pageY-(document.body.scrollTop||document.documentElement.scrollTop||0)))).closest(\".\"+this.options.baseClass),groupOver=overRoot.data(\"sortable-group\"),$current=UI.$(currentlyDraggingElement),currentRoot=$current.parent(),groupCurrent=$current.data(\"sortable-group\");overRoot[0]!==currentRoot[0]&&void 0!==groupCurrent&&groupOver===groupCurrent&&(overRoot.data(\"sortable\").addDragHandlers(),touchedlists.push(overRoot),overRoot.children().addClass(this.options.childClass),0documentHeight-containerBottom-(sticky.top<0?0:sticky.top)?documentHeight-containerBottom-(scrollTop+stickyHeight):newTop}if(sticky.currentTop!=newTop){if(sticky.element.css({position:\"fixed\",top:newTop,width:sticky.getWidthFrom.length?sticky.getWidthFrom.width():sticky.element.width()}),!sticky.init&&(sticky.element.addClass(sticky.options.clsinit),location.hash&&0').parent(),this.computeWrapper(),this.element.css(\"margin\",0),boundary&&(!0===boundary||\"!\"===boundary[0]?(boundary=!0===boundary?this.wrapper.parent():this.wrapper.closest(boundary.substr(1)),boundtoparent=!0):\"string\"==typeof boundary&&(boundary=UI.$(boundary))),this.sticky={self:this,options:this.options,element:this.element,currentTop:null,wrapper:this.wrapper,init:!1,getWidthFrom:UI.$(this.options.getWidthFrom||this.wrapper),boundary:boundary,boundtoparent:boundtoparent,top:0,calcTop:function(){var top=this.options.top;if(this.options.top&&\"string\"==typeof this.options.top)if(this.options.top.match(/^(-|)(\\d+)vh$/))top=window.innerHeight*parseInt(this.options.top,10)/100;else{var topElement=UI.$(this.options.top).first();topElement.length&&topElement.is(\":visible\")&&(top=-1*(topElement.offset().top+topElement.outerHeight()-this.wrapper.offset().top))}this.top=top},reset:function(force){this.calcTop();var finalize=function(){this.element.css({position:\"\",top:\"\",width:\"\",left:\"\",margin:\"0\"}),this.element.removeClass([this.options.animation,\"uk-animation-reverse\",this.options.clsactive].join(\" \")),this.element.addClass(this.options.clsinactive),this.element.trigger(\"inactive.uk.sticky\"),this.currentTop=null,this.animate=!1}.bind(this);!force&&this.options.animation&&UI.support.animation&&!UI.Utils.isInView(this.wrapper)?(this.animate=!0,this.element.removeClass(this.options.animation).one(UI.support.animation.end,function(){finalize()}).width(),this.element.addClass(this.options.animation+\" uk-animation-reverse\")):finalize()},check:function(){if(this.options.disabled)return!1;if(this.options.media)switch(typeof this.options.media){case\"number\":if(window.innerWidth{{~items}}
      • {{$item.value}}
      • {{/items}}',this.options.source=function(release){release(times[$this.options.format]||times[\"12h\"])},container=this.element.is(\"input\")?(this.element.wrap('
        '),this.element.parent()):this.element.addClass(\"uk-autocomplete\"),this.autocomplete=UI.autocomplete(container,this.options),this.autocomplete.dropdown.addClass(\"uk-dropdown-small uk-dropdown-scrollable\"),this.autocomplete.on(\"show.uk.autocomplete\",function(){var selected=$this.autocomplete.dropdown.find('[data-value=\"'+$this.autocomplete.input.val()+'\"]');setTimeout(function(){$this.autocomplete.pick(selected,!0)},10)}),this.autocomplete.input.on(\"focus\",function(){$this.autocomplete.value=Math.random(),$this.autocomplete.triggercomplete()}).on(\"blur\",UI.Utils.debounce(function(){$this.checkTime()},100)),this.element.data(\"timepicker\",this)},checkTime:function(){var arr,timeArray,hour,minute,meridian=\"AM\",time=this.autocomplete.input.val();\"12h\"==this.options.format?(timeArray=(arr=time.split(\" \"))[0].split(\":\"),meridian=arr[1]):timeArray=time.split(\":\"),hour=parseInt(timeArray[0],10),minute=parseInt(timeArray[1],10),isNaN(hour)&&(hour=0),isNaN(minute)&&(minute=0),\"12h\"==this.options.format?(12').appendTo(\"body\")),this.on({focus:function(e){$this.show()},blur:function(e){$this.hide()},mouseenter:function(e){$this.show()},mouseleave:function(e){$this.hide()}})},show:function(){if(this.tip=\"function\"==typeof this.options.src?this.options.src(this.element):this.options.src,tooltipdelay&&clearTimeout(tooltipdelay),checkdelay&&clearTimeout(checkdelay),\"string\"==typeof this.tip&&this.tip.length){$tooltip.stop().css({top:-2e3,visibility:\"hidden\"}).removeClass(this.options.activeClass).show(),$tooltip.html('
        '+this.tip+\"
        \");var $this=this,pos=UI.$.extend({},this.element.offset(),{width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}),width=$tooltip[0].offsetWidth,height=$tooltip[0].offsetHeight,offset=\"function\"==typeof this.options.offset?this.options.offset.call(this.element):this.options.offset,position=\"function\"==typeof this.options.pos?this.options.pos.call(this.element):this.options.pos,tmppos=position.split(\"-\"),tcss={display:\"none\",visibility:\"visible\",top:pos.top+pos.height+height,left:pos.left};if(\"fixed\"==UI.$html.css(\"position\")||\"fixed\"==UI.$body.css(\"position\")){var bodyoffset=UI.$(\"body\").offset(),htmloffset=UI.$(\"html\").offset(),docoffset_top=htmloffset.top+bodyoffset.top,docoffset_left=htmloffset.left+bodyoffset.left;pos.left-=docoffset_left,pos.top-=docoffset_top}\"left\"!=tmppos[0]&&\"right\"!=tmppos[0]||\"right\"!=UI.langdirection||(tmppos[0]=\"left\"==tmppos[0]?\"right\":\"left\");var variants={bottom:{top:pos.top+pos.height+offset,left:pos.left+pos.width/2-width/2},top:{top:pos.top-height-offset,left:pos.left+pos.width/2-width/2},left:{top:pos.top+pos.height/2-height/2,left:pos.left-width-offset},right:{top:pos.top+pos.height/2-height/2,left:pos.left+pos.width+offset}};UI.$.extend(tcss,variants[tmppos[0]]),2==tmppos.length&&(tcss.left=\"left\"==tmppos[1]?pos.left:pos.left+pos.width-width);var boundary=this.checkBoundary(tcss.left,tcss.top,width,height);if(boundary){switch(boundary){case\"x\":position=2==tmppos.length?tmppos[0]+\"-\"+(tcss.left<0?\"left\":\"right\"):tcss.left<0?\"right\":\"left\";break;case\"y\":position=2==tmppos.length?(tcss.top<0?\"bottom\":\"top\")+\"-\"+tmppos[1]:tcss.top<0?\"bottom\":\"top\";break;case\"xy\":position=2==tmppos.length?(tcss.top<0?\"bottom\":\"top\")+\"-\"+(tcss.left<0?\"left\":\"right\"):tcss.left<0?\"right\":\"left\"}tmppos=position.split(\"-\"),UI.$.extend(tcss,variants[tmppos[0]]),2==tmppos.length&&(tcss.left=\"left\"==tmppos[1]?pos.left:pos.left+pos.width-width)}tcss.left-=UI.$body.position().left,tooltipdelay=setTimeout(function(){$tooltip.css(tcss).attr(\"class\",[\"uk-tooltip\",\"uk-tooltip-\"+position,$this.options.cls].join(\" \")),$this.options.animation?$tooltip.css({opacity:0,display:\"block\"}).addClass($this.options.activeClass).animate({opacity:1},parseInt($this.options.animation,10)||400):$tooltip.show().addClass($this.options.activeClass),tooltipdelay=!1,checkdelay=setInterval(function(){$this.element.is(\":visible\")||$this.hide()},150)},parseInt(this.options.delay,10)||0)}},hide:function(){if(!this.element.is(\"input\")||this.element[0]!==document.activeElement)if(tooltipdelay&&clearTimeout(tooltipdelay),checkdelay&&clearTimeout(checkdelay),$tooltip.stop(),this.options.animation){var $this=this;$tooltip.fadeOut(parseInt(this.options.animation,10)||400,function(){$tooltip.removeClass($this.options.activeClass)})}else $tooltip.hide().removeClass(this.options.activeClass)},content:function(){return this.tip},checkBoundary:function(left,top,width,height){var axis=\"\";return(left<0||left-UI.$win.scrollLeft()+width>window.innerWidth)&&(axis+=\"x\"),(top<0||top-UI.$win.scrollTop()+height>window.innerHeight)&&(axis+=\"y\"),axis}}),UI.tooltip}),function(addon){var component;window.UIkit&&(component=addon(UIkit)), true&&!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__WEBPACK_LOCAL_MODULE_0__], __WEBPACK_AMD_DEFINE_RESULT__ = (function(){return component||addon(UIkit)}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))}(function(UI){\"use strict\";var xhr,fi;function xhrupload(files,settings){if(!UI.support.ajaxupload)return this;if(settings=UI.$.extend({},xhrupload.defaults,settings),files.length){if(\"*.*\"!==settings.allow)for(var file,i=0;file=files[i];i++)if(!matchName(settings.allow,file.name))return void(\"string\"==typeof settings.notallowed?alert(settings.notallowed):settings.notallowed(file,settings));var complete=settings.complete;if(settings.single){var count=files.length,uploaded=0,allow=!0;settings.beforeAll(files),settings.complete=function(response,xhr){uploaded+=1,complete(response,xhr),settings.filelimit&&uploaded>=settings.filelimit&&(allow=!1),allow&&uploaded
        ',$body.on(\"show.uk.modal\",\".uk-modal-dialog-replace\",function(){setTimeout(function(){var dialogReplace=$(\".uk-modal-dialog-replace\");if(dialogReplace.find(\".uk-button-primary\").length){var actionBtn=dialogReplace.find(\".uk-button-primary\").toggleClass(\"uk-button-primary md-btn-flat-primary\");actionBtn.next(\"button\")&&actionBtn.next(\"button\").after(actionBtn)}dialogReplace.find(\".uk-button\").length&&dialogReplace.find(\".uk-button\").toggleClass(\"uk-button md-btn md-btn-flat\"),dialogReplace.find(\".uk-margin-small-top\").length&&dialogReplace.find(\".uk-margin-small-top\").toggleClass(\"uk-margin-small-top uk-margin-top\"),dialogReplace.find(\"input.uk-width-1-1\").length&&dialogReplace.find(\"input.uk-width-1-1\").toggleClass(\"uk-width-1-1 md-input\"),dialogReplace.find(\".uk-form\").length&&dialogReplace.find(\".uk-form\").removeClass(\"uk-form\")},50)})}void 0!==UIkit.components.tooltip&&$.extend(UIkit.components.tooltip.prototype.defaults,{animation:280,offset:8}),void 0!==UIkit.components.sortable&&Modernizr.touch&&$(\"[data-uk-sortable]\").children().addClass(\"needsclick\")});\n\n/*** EXPORTS FROM exports-loader ***/\nmodule.exports = UIkit;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! moment */ \"./src/public/js/vendor/moment/moment.js\"), __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! modernizr */ \"./src/public/js/vendor/modernizr/modernizr.js\")))\n\n//# sourceURL=webpack:///./src/public/js/vendor/uikit/js/uikit_combined.min.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/underscore/underscore.js": -/*!*******************************************************!*\ - !*** ./src/public/js/vendor/underscore/underscore.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Underscore.js 1.8.3\r\n// http://underscorejs.org\r\n// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n// Underscore may be freely distributed under the MIT license.\r\n(function(){function n(n){function t(t,r,e,u,i,o){for(;i>=0&&o>i;i+=n){var a=u?u[i]:i;e=r(e,t[a],a,t)}return e}return function(r,e,u,i){e=b(e,i,4);var o=!k(r)&&m.keys(r),a=(o||r).length,c=n>0?0:a-1;return arguments.length<3&&(u=r[o?o[c]:c],c+=n),t(r,e,u,o,c,a)}}function t(n){return function(t,r,e){r=x(r,e);for(var u=O(t),i=n>0?0:u-1;i>=0&&u>i;i+=n)if(r(t[i],i,t))return i;return-1}}function r(n,t,r){return function(e,u,i){var o=0,a=O(e);if(\"number\"==typeof i)n>0?o=i>=0?i:Math.max(i+a,o):a=i>=0?Math.min(i+1,a):i+a+1;else if(r&&i&&a)return i=r(e,u),e[i]===u?i:-1;if(u!==u)return i=t(l.call(e,o,a),m.isNaN),i>=0?i+o:-1;for(i=n>0?o:a-1;i>=0&&a>i;i+=n)if(e[i]===u)return i;return-1}}function e(n,t){var r=I.length,e=n.constructor,u=m.isFunction(e)&&e.prototype||a,i=\"constructor\";for(m.has(n,i)&&!m.contains(t,i)&&t.push(i);r--;)i=I[r],i in n&&n[i]!==u[i]&&!m.contains(t,i)&&t.push(i)}var u=this,i=u._,o=Array.prototype,a=Object.prototype,c=Function.prototype,f=o.push,l=o.slice,s=a.toString,p=a.hasOwnProperty,h=Array.isArray,v=Object.keys,g=c.bind,y=Object.create,d=function(){},m=function(n){return n instanceof m?n:this instanceof m?void(this._wrapped=n):new m(n)}; true?( true&&module.exports&&(exports=module.exports=m),exports._=m):undefined,m.VERSION=\"1.8.3\";var b=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}},x=function(n,t,r){return null==n?m.identity:m.isFunction(n)?b(n,t,r):m.isObject(n)?m.matcher(n):m.property(n)};m.iteratee=function(n,t){return x(n,t,1/0)};var _=function(n,t){return function(r){var e=arguments.length;if(2>e||null==r)return r;for(var u=1;e>u;u++)for(var i=arguments[u],o=n(i),a=o.length,c=0;a>c;c++){var f=o[c];t&&r[f]!==void 0||(r[f]=i[f])}return r}},j=function(n){if(!m.isObject(n))return{};if(y)return y(n);d.prototype=n;var t=new d;return d.prototype=null,t},w=function(n){return function(t){return null==t?void 0:t[n]}},A=Math.pow(2,53)-1,O=w(\"length\"),k=function(n){var t=O(n);return\"number\"==typeof t&&t>=0&&A>=t};m.each=m.forEach=function(n,t,r){t=b(t,r);var e,u;if(k(n))for(e=0,u=n.length;u>e;e++)t(n[e],e,n);else{var i=m.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},m.map=m.collect=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=Array(u),o=0;u>o;o++){var a=e?e[o]:o;i[o]=t(n[a],a,n)}return i},m.reduce=m.foldl=m.inject=n(1),m.reduceRight=m.foldr=n(-1),m.find=m.detect=function(n,t,r){var e;return e=k(n)?m.findIndex(n,t,r):m.findKey(n,t,r),e!==void 0&&e!==-1?n[e]:void 0},m.filter=m.select=function(n,t,r){var e=[];return t=x(t,r),m.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e},m.reject=function(n,t,r){return m.filter(n,m.negate(x(t)),r)},m.every=m.all=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(!t(n[o],o,n))return!1}return!0},m.some=m.any=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(t(n[o],o,n))return!0}return!1},m.contains=m.includes=m.include=function(n,t,r,e){return k(n)||(n=m.values(n)),(\"number\"!=typeof r||e)&&(r=0),m.indexOf(n,t,r)>=0},m.invoke=function(n,t){var r=l.call(arguments,2),e=m.isFunction(t);return m.map(n,function(n){var u=e?t:n[t];return null==u?u:u.apply(n,r)})},m.pluck=function(n,t){return m.map(n,m.property(t))},m.where=function(n,t){return m.filter(n,m.matcher(t))},m.findWhere=function(n,t){return m.find(n,m.matcher(t))},m.max=function(n,t,r){var e,u,i=-1/0,o=-1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],e>i&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(u>o||u===-1/0&&i===-1/0)&&(i=n,o=u)});return i},m.min=function(n,t,r){var e,u,i=1/0,o=1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],i>e&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(o>u||1/0===u&&1/0===i)&&(i=n,o=u)});return i},m.shuffle=function(n){for(var t,r=k(n)?n:m.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=m.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},m.sample=function(n,t,r){return null==t||r?(k(n)||(n=m.values(n)),n[m.random(n.length-1)]):m.shuffle(n).slice(0,Math.max(0,t))},m.sortBy=function(n,t,r){return t=x(t,r),m.pluck(m.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),\"value\")};var F=function(n){return function(t,r,e){var u={};return r=x(r,e),m.each(t,function(e,i){var o=r(e,i,t);n(u,e,o)}),u}};m.groupBy=F(function(n,t,r){m.has(n,r)?n[r].push(t):n[r]=[t]}),m.indexBy=F(function(n,t,r){n[r]=t}),m.countBy=F(function(n,t,r){m.has(n,r)?n[r]++:n[r]=1}),m.toArray=function(n){return n?m.isArray(n)?l.call(n):k(n)?m.map(n,m.identity):m.values(n):[]},m.size=function(n){return null==n?0:k(n)?n.length:m.keys(n).length},m.partition=function(n,t,r){t=x(t,r);var e=[],u=[];return m.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},m.first=m.head=m.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:m.initial(n,n.length-t)},m.initial=function(n,t,r){return l.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},m.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:m.rest(n,Math.max(0,n.length-t))},m.rest=m.tail=m.drop=function(n,t,r){return l.call(n,null==t||r?1:t)},m.compact=function(n){return m.filter(n,m.identity)};var S=function(n,t,r,e){for(var u=[],i=0,o=e||0,a=O(n);a>o;o++){var c=n[o];if(k(c)&&(m.isArray(c)||m.isArguments(c))){t||(c=S(c,t,r));var f=0,l=c.length;for(u.length+=l;l>f;)u[i++]=c[f++]}else r||(u[i++]=c)}return u};m.flatten=function(n,t){return S(n,t,!1)},m.without=function(n){return m.difference(n,l.call(arguments,1))},m.uniq=m.unique=function(n,t,r,e){m.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=x(r,e));for(var u=[],i=[],o=0,a=O(n);a>o;o++){var c=n[o],f=r?r(c,o,n):c;t?(o&&i===f||u.push(c),i=f):r?m.contains(i,f)||(i.push(f),u.push(c)):m.contains(u,c)||u.push(c)}return u},m.union=function(){return m.uniq(S(arguments,!0,!0))},m.intersection=function(n){for(var t=[],r=arguments.length,e=0,u=O(n);u>e;e++){var i=n[e];if(!m.contains(t,i)){for(var o=1;r>o&&m.contains(arguments[o],i);o++);o===r&&t.push(i)}}return t},m.difference=function(n){var t=S(arguments,!0,!0,1);return m.filter(n,function(n){return!m.contains(t,n)})},m.zip=function(){return m.unzip(arguments)},m.unzip=function(n){for(var t=n&&m.max(n,O).length||0,r=Array(t),e=0;t>e;e++)r[e]=m.pluck(n,e);return r},m.object=function(n,t){for(var r={},e=0,u=O(n);u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},m.findIndex=t(1),m.findLastIndex=t(-1),m.sortedIndex=function(n,t,r,e){r=x(r,e,1);for(var u=r(t),i=0,o=O(n);o>i;){var a=Math.floor((i+o)/2);r(n[a])i;i++,n+=r)u[i]=n;return u};var E=function(n,t,r,e,u){if(!(e instanceof t))return n.apply(r,u);var i=j(n.prototype),o=n.apply(i,u);return m.isObject(o)?o:i};m.bind=function(n,t){if(g&&n.bind===g)return g.apply(n,l.call(arguments,1));if(!m.isFunction(n))throw new TypeError(\"Bind must be called on a function\");var r=l.call(arguments,2),e=function(){return E(n,e,t,this,r.concat(l.call(arguments)))};return e},m.partial=function(n){var t=l.call(arguments,1),r=function(){for(var e=0,u=t.length,i=Array(u),o=0;u>o;o++)i[o]=t[o]===m?arguments[e++]:t[o];for(;e=e)throw new Error(\"bindAll must be passed function names\");for(t=1;e>t;t++)r=arguments[t],n[r]=m.bind(n[r],n);return n},m.memoize=function(n,t){var r=function(e){var u=r.cache,i=\"\"+(t?t.apply(this,arguments):e);return m.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},m.delay=function(n,t){var r=l.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},m.defer=m.partial(m.delay,m,1),m.throttle=function(n,t,r){var e,u,i,o=null,a=0;r||(r={});var c=function(){a=r.leading===!1?0:m.now(),o=null,i=n.apply(e,u),o||(e=u=null)};return function(){var f=m.now();a||r.leading!==!1||(a=f);var l=t-(f-a);return e=this,u=arguments,0>=l||l>t?(o&&(clearTimeout(o),o=null),a=f,i=n.apply(e,u),o||(e=u=null)):o||r.trailing===!1||(o=setTimeout(c,l)),i}},m.debounce=function(n,t,r){var e,u,i,o,a,c=function(){var f=m.now()-o;t>f&&f>=0?e=setTimeout(c,t-f):(e=null,r||(a=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,o=m.now();var f=r&&!e;return e||(e=setTimeout(c,t)),f&&(a=n.apply(i,u),i=u=null),a}},m.wrap=function(n,t){return m.partial(t,n)},m.negate=function(n){return function(){return!n.apply(this,arguments)}},m.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},m.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},m.before=function(n,t){var r;return function(){return--n>0&&(r=t.apply(this,arguments)),1>=n&&(t=null),r}},m.once=m.partial(m.before,2);var M=!{toString:null}.propertyIsEnumerable(\"toString\"),I=[\"valueOf\",\"isPrototypeOf\",\"toString\",\"propertyIsEnumerable\",\"hasOwnProperty\",\"toLocaleString\"];m.keys=function(n){if(!m.isObject(n))return[];if(v)return v(n);var t=[];for(var r in n)m.has(n,r)&&t.push(r);return M&&e(n,t),t},m.allKeys=function(n){if(!m.isObject(n))return[];var t=[];for(var r in n)t.push(r);return M&&e(n,t),t},m.values=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},m.mapObject=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=u.length,o={},a=0;i>a;a++)e=u[a],o[e]=t(n[e],e,n);return o},m.pairs=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},m.invert=function(n){for(var t={},r=m.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},m.functions=m.methods=function(n){var t=[];for(var r in n)m.isFunction(n[r])&&t.push(r);return t.sort()},m.extend=_(m.allKeys),m.extendOwn=m.assign=_(m.keys),m.findKey=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=0,o=u.length;o>i;i++)if(e=u[i],t(n[e],e,n))return e},m.pick=function(n,t,r){var e,u,i={},o=n;if(null==o)return i;m.isFunction(t)?(u=m.allKeys(o),e=b(t,r)):(u=S(arguments,!1,!1,1),e=function(n,t,r){return t in r},o=Object(o));for(var a=0,c=u.length;c>a;a++){var f=u[a],l=o[f];e(l,f,o)&&(i[f]=l)}return i},m.omit=function(n,t,r){if(m.isFunction(t))t=m.negate(t);else{var e=m.map(S(arguments,!1,!1,1),String);t=function(n,t){return!m.contains(e,t)}}return m.pick(n,t,r)},m.defaults=_(m.allKeys,!0),m.create=function(n,t){var r=j(n);return t&&m.extendOwn(r,t),r},m.clone=function(n){return m.isObject(n)?m.isArray(n)?n.slice():m.extend({},n):n},m.tap=function(n,t){return t(n),n},m.isMatch=function(n,t){var r=m.keys(t),e=r.length;if(null==n)return!e;for(var u=Object(n),i=0;e>i;i++){var o=r[i];if(t[o]!==u[o]||!(o in u))return!1}return!0};var N=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof m&&(n=n._wrapped),t instanceof m&&(t=t._wrapped);var u=s.call(n);if(u!==s.call(t))return!1;switch(u){case\"[object RegExp]\":case\"[object String]\":return\"\"+n==\"\"+t;case\"[object Number]\":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case\"[object Date]\":case\"[object Boolean]\":return+n===+t}var i=\"[object Array]\"===u;if(!i){if(\"object\"!=typeof n||\"object\"!=typeof t)return!1;var o=n.constructor,a=t.constructor;if(o!==a&&!(m.isFunction(o)&&o instanceof o&&m.isFunction(a)&&a instanceof a)&&\"constructor\"in n&&\"constructor\"in t)return!1}r=r||[],e=e||[];for(var c=r.length;c--;)if(r[c]===n)return e[c]===t;if(r.push(n),e.push(t),i){if(c=n.length,c!==t.length)return!1;for(;c--;)if(!N(n[c],t[c],r,e))return!1}else{var f,l=m.keys(n);if(c=l.length,m.keys(t).length!==c)return!1;for(;c--;)if(f=l[c],!m.has(t,f)||!N(n[f],t[f],r,e))return!1}return r.pop(),e.pop(),!0};m.isEqual=function(n,t){return N(n,t)},m.isEmpty=function(n){return null==n?!0:k(n)&&(m.isArray(n)||m.isString(n)||m.isArguments(n))?0===n.length:0===m.keys(n).length},m.isElement=function(n){return!(!n||1!==n.nodeType)},m.isArray=h||function(n){return\"[object Array]\"===s.call(n)},m.isObject=function(n){var t=typeof n;return\"function\"===t||\"object\"===t&&!!n},m.each([\"Arguments\",\"Function\",\"String\",\"Number\",\"Date\",\"RegExp\",\"Error\"],function(n){m[\"is\"+n]=function(t){return s.call(t)===\"[object \"+n+\"]\"}}),m.isArguments(arguments)||(m.isArguments=function(n){return m.has(n,\"callee\")}), true&&\"object\"!=typeof Int8Array&&(m.isFunction=function(n){return\"function\"==typeof n||!1}),m.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},m.isNaN=function(n){return m.isNumber(n)&&n!==+n},m.isBoolean=function(n){return n===!0||n===!1||\"[object Boolean]\"===s.call(n)},m.isNull=function(n){return null===n},m.isUndefined=function(n){return n===void 0},m.has=function(n,t){return null!=n&&p.call(n,t)},m.noConflict=function(){return u._=i,this},m.identity=function(n){return n},m.constant=function(n){return function(){return n}},m.noop=function(){},m.property=w,m.propertyOf=function(n){return null==n?function(){}:function(t){return n[t]}},m.matcher=m.matches=function(n){return n=m.extendOwn({},n),function(t){return m.isMatch(t,n)}},m.times=function(n,t,r){var e=Array(Math.max(0,n));t=b(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},m.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},m.now=Date.now||function(){return(new Date).getTime()};var B={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\",\"'\":\"'\",\"`\":\"`\"},T=m.invert(B),R=function(n){var t=function(t){return n[t]},r=\"(?:\"+m.keys(n).join(\"|\")+\")\",e=RegExp(r),u=RegExp(r,\"g\");return function(n){return n=null==n?\"\":\"\"+n,e.test(n)?n.replace(u,t):n}};m.escape=R(B),m.unescape=R(T),m.result=function(n,t,r){var e=null==n?void 0:n[t];return e===void 0&&(e=r),m.isFunction(e)?e.call(n):e};var q=0;m.uniqueId=function(n){var t=++q+\"\";return n?n+t:t},m.templateSettings={evaluate:/<%([\\s\\S]+?)%>/g,interpolate:/<%=([\\s\\S]+?)%>/g,escape:/<%-([\\s\\S]+?)%>/g};var K=/(.)^/,z={\"'\":\"'\",\"\\\\\":\"\\\\\",\"\\r\":\"r\",\"\\n\":\"n\",\"\\u2028\":\"u2028\",\"\\u2029\":\"u2029\"},D=/\\\\|'|\\r|\\n|\\u2028|\\u2029/g,L=function(n){return\"\\\\\"+z[n]};m.template=function(n,t,r){!t&&r&&(t=r),t=m.defaults({},t,m.templateSettings);var e=RegExp([(t.escape||K).source,(t.interpolate||K).source,(t.evaluate||K).source].join(\"|\")+\"|$\",\"g\"),u=0,i=\"__p+='\";n.replace(e,function(t,r,e,o,a){return i+=n.slice(u,a).replace(D,L),u=a+t.length,r?i+=\"'+\\n((__t=(\"+r+\"))==null?'':_.escape(__t))+\\n'\":e?i+=\"'+\\n((__t=(\"+e+\"))==null?'':__t)+\\n'\":o&&(i+=\"';\\n\"+o+\"\\n__p+='\"),t}),i+=\"';\\n\",t.variable||(i=\"with(obj||{}){\\n\"+i+\"}\\n\"),i=\"var __t,__p='',__j=Array.prototype.join,\"+\"print=function(){__p+=__j.call(arguments,'');};\\n\"+i+\"return __p;\\n\";try{var o=new Function(t.variable||\"obj\",\"_\",i)}catch(a){throw a.source=i,a}var c=function(n){return o.call(this,n,m)},f=t.variable||\"obj\";return c.source=\"function(\"+f+\"){\\n\"+i+\"}\",c},m.chain=function(n){var t=m(n);return t._chain=!0,t};var P=function(n,t){return n._chain?m(t).chain():t};m.mixin=function(n){m.each(m.functions(n),function(t){var r=m[t]=n[t];m.prototype[t]=function(){var n=[this._wrapped];return f.apply(n,arguments),P(this,r.apply(m,n))}})},m.mixin(m),m.each([\"pop\",\"push\",\"reverse\",\"shift\",\"sort\",\"splice\",\"unshift\"],function(n){var t=o[n];m.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),\"shift\"!==n&&\"splice\"!==n||0!==r.length||delete r[0],P(this,r)}}),m.each([\"concat\",\"join\",\"slice\"],function(n){var t=o[n];m.prototype[n]=function(){return P(this,t.apply(this._wrapped,arguments))}}),m.prototype.value=function(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return\"\"+this._wrapped}, true&&!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function(){return m}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))}).call(this);\n\n//# sourceURL=webpack:///./src/public/js/vendor/underscore/underscore.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/velocity/velocity.min.js": -/*!*******************************************************!*\ - !*** ./src/public/js/vendor/velocity/velocity.min.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function(__webpack_provided_window_dot_jQuery, jQuery) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! VelocityJS.org (1.2.3). (C) 2014 Julian Shapiro. MIT @license: en.wikipedia.org/wiki/MIT_License */\r\n/*! VelocityJS.org jQuery Shim (1.0.1). (C) 2014 The jQuery Foundation. MIT @license: en.wikipedia.org/wiki/MIT_License. */\r\n!function(a){function b(a){var b=a.length,d=c.type(a);return\"function\"===d||c.isWindow(a)?!1:1===a.nodeType&&b?!0:\"array\"===d||0===b||\"number\"==typeof b&&b>0&&b-1 in a}if(!__webpack_provided_window_dot_jQuery){var c=function(a,b){return new c.fn.init(a,b)};c.isWindow=function(a){return null!=a&&a==a.window},c.type=function(a){return null==a?a+\"\":\"object\"==typeof a||\"function\"==typeof a?e[g.call(a)]||\"object\":typeof a},c.isArray=Array.isArray||function(a){return\"array\"===c.type(a)},c.isPlainObject=function(a){var b;if(!a||\"object\"!==c.type(a)||a.nodeType||c.isWindow(a))return!1;try{if(a.constructor&&!f.call(a,\"constructor\")&&!f.call(a.constructor.prototype,\"isPrototypeOf\"))return!1}catch(d){return!1}for(b in a);return void 0===b||f.call(a,b)},c.each=function(a,c,d){var e,f=0,g=a.length,h=b(a);if(d){if(h)for(;g>f&&(e=c.apply(a[f],d),e!==!1);f++);else for(f in a)if(e=c.apply(a[f],d),e===!1)break}else if(h)for(;g>f&&(e=c.call(a[f],f,a[f]),e!==!1);f++);else for(f in a)if(e=c.call(a[f],f,a[f]),e===!1)break;return a},c.data=function(a,b,e){if(void 0===e){var f=a[c.expando],g=f&&d[f];if(void 0===b)return g;if(g&&b in g)return g[b]}else if(void 0!==b){var f=a[c.expando]||(a[c.expando]=++c.uuid);return d[f]=d[f]||{},d[f][b]=e,e}},c.removeData=function(a,b){var e=a[c.expando],f=e&&d[e];f&&c.each(b,function(a,b){delete f[b]})},c.extend=function(){var a,b,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;for(\"boolean\"==typeof h&&(k=h,h=arguments[i]||{},i++),\"object\"!=typeof h&&\"function\"!==c.type(h)&&(h={}),i===j&&(h=this,i--);j>i;i++)if(null!=(f=arguments[i]))for(e in f)a=h[e],d=f[e],h!==d&&(k&&d&&(c.isPlainObject(d)||(b=c.isArray(d)))?(b?(b=!1,g=a&&c.isArray(a)?a:[]):g=a&&c.isPlainObject(a)?a:{},h[e]=c.extend(k,g,d)):void 0!==d&&(h[e]=d));return h},c.queue=function(a,d,e){function f(a,c){var d=c||[];return null!=a&&(b(Object(a))?!function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;)a[e++]=b[d++];if(c!==c)for(;void 0!==b[d];)a[e++]=b[d++];return a.length=e,a}(d,\"string\"==typeof a?[a]:a):[].push.call(d,a)),d}if(a){d=(d||\"fx\")+\"queue\";var g=c.data(a,d);return e?(!g||c.isArray(e)?g=c.data(a,d,f(e)):g.push(e),g):g||[]}},c.dequeue=function(a,b){c.each(a.nodeType?[a]:a,function(a,d){b=b||\"fx\";var e=c.queue(d,b),f=e.shift();\"inprogress\"===f&&(f=e.shift()),f&&(\"fx\"===b&&e.unshift(\"inprogress\"),f.call(d,function(){c.dequeue(d,b)}))})},c.fn=c.prototype={init:function(a){if(a.nodeType)return this[0]=a,this;throw new Error(\"Not a DOM node.\")},offset:function(){var b=this[0].getBoundingClientRect?this[0].getBoundingClientRect():{top:0,left:0};return{top:b.top+(a.pageYOffset||document.scrollTop||0)-(document.clientTop||0),left:b.left+(a.pageXOffset||document.scrollLeft||0)-(document.clientLeft||0)}},position:function(){function a(){for(var a=this.offsetParent||document;a&&\"html\"===!a.nodeType.toLowerCase&&\"static\"===a.style.position;)a=a.offsetParent;return a||document}var b=this[0],a=a.apply(b),d=this.offset(),e=/^(?:body|html)$/i.test(a.nodeName)?{top:0,left:0}:c(a).offset();return d.top-=parseFloat(b.style.marginTop)||0,d.left-=parseFloat(b.style.marginLeft)||0,a.style&&(e.top+=parseFloat(a.style.borderTopWidth)||0,e.left+=parseFloat(a.style.borderLeftWidth)||0),{top:d.top-e.top,left:d.left-e.left}}};var d={};c.expando=\"velocity\"+(new Date).getTime(),c.uuid=0;for(var e={},f=e.hasOwnProperty,g=e.toString,h=\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"),i=0;ie;++e){var f=j(c,a,d);if(0===f)return c;var g=i(c,a,d)-b;c-=g/f}return c}function l(){for(var b=0;t>b;++b)x[b]=i(b*u,a,d)}function m(b,c,e){var f,g,h=0;do g=c+(e-c)/2,f=i(g,a,d)-b,f>0?e=g:c=g;while(Math.abs(f)>r&&++h=q?k(b,h):0==i?h:m(b,c,c+u)}function o(){y=!0,(a!=c||d!=e)&&l()}var p=4,q=.001,r=1e-7,s=10,t=11,u=1/(t-1),v=\"Float32Array\"in b;if(4!==arguments.length)return!1;for(var w=0;4>w;++w)if(\"number\"!=typeof arguments[w]||isNaN(arguments[w])||!isFinite(arguments[w]))return!1;a=Math.min(a,1),d=Math.min(d,1),a=Math.max(a,0),d=Math.max(d,0);var x=v?new Float32Array(t):new Array(t),y=!1,z=function(b){return y||o(),a===c&&d===e?b:0===b?0:1===b?1:i(n(b),c,e)};z.getControlPoints=function(){return[{x:a,y:c},{x:d,y:e}]};var A=\"generateBezier(\"+[a,c,d,e]+\")\";return z.toString=function(){return A},z}function j(a,b){var c=a;return p.isString(a)?t.Easings[a]||(c=!1):c=p.isArray(a)&&1===a.length?h.apply(null,a):p.isArray(a)&&2===a.length?u.apply(null,a.concat([b])):p.isArray(a)&&4===a.length?i.apply(null,a):!1,c===!1&&(c=t.Easings[t.defaults.easing]?t.defaults.easing:s),c}function k(a){if(a){var b=(new Date).getTime(),c=t.State.calls.length;c>1e4&&(t.State.calls=e(t.State.calls));for(var f=0;c>f;f++)if(t.State.calls[f]){var h=t.State.calls[f],i=h[0],j=h[2],n=h[3],o=!!n,q=null;n||(n=t.State.calls[f][3]=b-16);for(var r=Math.min((b-n)/j.duration,1),s=0,u=i.length;u>s;s++){var w=i[s],y=w.element;if(g(y)){var z=!1;if(j.display!==d&&null!==j.display&&\"none\"!==j.display){if(\"flex\"===j.display){var A=[\"-webkit-box\",\"-moz-box\",\"-ms-flexbox\",\"-webkit-flex\"];m.each(A,function(a,b){v.setPropertyValue(y,\"display\",b)})}v.setPropertyValue(y,\"display\",j.display)}j.visibility!==d&&\"hidden\"!==j.visibility&&v.setPropertyValue(y,\"visibility\",j.visibility);for(var B in w)if(\"element\"!==B){var C,D=w[B],E=p.isString(D.easing)?t.Easings[D.easing]:D.easing;if(1===r)C=D.endValue;else{var F=D.endValue-D.startValue;if(C=D.startValue+F*E(r,j,F),!o&&C===D.currentValue)continue}if(D.currentValue=C,\"tween\"===B)q=C;else{if(v.Hooks.registered[B]){var G=v.Hooks.getRoot(B),H=g(y).rootPropertyValueCache[G];H&&(D.rootPropertyValue=H)}var I=v.setPropertyValue(y,B,D.currentValue+(0===parseFloat(C)?\"\":D.unitType),D.rootPropertyValue,D.scrollData);v.Hooks.registered[B]&&(g(y).rootPropertyValueCache[G]=v.Normalizations.registered[G]?v.Normalizations.registered[G](\"extract\",null,I[1]):I[1]),\"transform\"===I[0]&&(z=!0)}}j.mobileHA&&g(y).transformCache.translate3d===d&&(g(y).transformCache.translate3d=\"(0px, 0px, 0px)\",z=!0),z&&v.flushTransformCache(y)}}j.display!==d&&\"none\"!==j.display&&(t.State.calls[f][2].display=!1),j.visibility!==d&&\"hidden\"!==j.visibility&&(t.State.calls[f][2].visibility=!1),j.progress&&j.progress.call(h[1],h[1],r,Math.max(0,n+j.duration-b),n,q),1===r&&l(f)}}t.State.isTicking&&x(k)}function l(a,b){if(!t.State.calls[a])return!1;for(var c=t.State.calls[a][0],e=t.State.calls[a][1],f=t.State.calls[a][2],h=t.State.calls[a][4],i=!1,j=0,k=c.length;k>j;j++){var l=c[j].element;if(b||f.loop||(\"none\"===f.display&&v.setPropertyValue(l,\"display\",f.display),\"hidden\"===f.visibility&&v.setPropertyValue(l,\"visibility\",f.visibility)),f.loop!==!0&&(m.queue(l)[1]===d||!/\\.velocityQueueEntryFlag/i.test(m.queue(l)[1]))&&g(l)){g(l).isAnimating=!1,g(l).rootPropertyValueCache={};var n=!1;m.each(v.Lists.transforms3D,function(a,b){var c=/^scale/.test(b)?1:0,e=g(l).transformCache[b];g(l).transformCache[b]!==d&&new RegExp(\"^\\\\(\"+c+\"[^.]\").test(e)&&(n=!0,delete g(l).transformCache[b])}),f.mobileHA&&(n=!0,delete g(l).transformCache.translate3d),n&&v.flushTransformCache(l),v.Values.removeClass(l,\"velocity-animating\")}if(!b&&f.complete&&!f.loop&&j===k-1)try{f.complete.call(e,e)}catch(o){setTimeout(function(){throw o},1)}h&&f.loop!==!0&&h(e),g(l)&&f.loop===!0&&!b&&(m.each(g(l).tweensContainer,function(a,b){/^rotate/.test(a)&&360===parseFloat(b.endValue)&&(b.endValue=0,b.startValue=360),/^backgroundPosition/.test(a)&&100===parseFloat(b.endValue)&&\"%\"===b.unitType&&(b.endValue=0,b.startValue=100)}),t(l,\"reverse\",{loop:!0,delay:f.delay})),f.queue!==!1&&m.dequeue(l,f.queue)}t.State.calls[a]=!1;for(var p=0,q=t.State.calls.length;q>p;p++)if(t.State.calls[p]!==!1){i=!0;break}i===!1&&(t.State.isTicking=!1,delete t.State.calls,t.State.calls=[])}var m,n=function(){if(c.documentMode)return c.documentMode;for(var a=7;a>4;a--){var b=c.createElement(\"div\");if(b.innerHTML=\"\",b.getElementsByTagName(\"span\").length)return b=null,a}return d}(),o=function(){var a=0;return b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||function(b){var c,d=(new Date).getTime();return c=Math.max(0,16-(d-a)),a=d+c,setTimeout(function(){b(d+c)},c)}}(),p={isString:function(a){return\"string\"==typeof a},isArray:Array.isArray||function(a){return\"[object Array]\"===Object.prototype.toString.call(a)},isFunction:function(a){return\"[object Function]\"===Object.prototype.toString.call(a)},isNode:function(a){return a&&a.nodeType},isNodeList:function(a){return\"object\"==typeof a&&/^\\[object (HTMLCollection|NodeList|Object)\\]$/.test(Object.prototype.toString.call(a))&&a.length!==d&&(0===a.length||\"object\"==typeof a[0]&&a[0].nodeType>0)},isWrapped:function(a){return a&&(a.jquery||b.Zepto&&b.Zepto.zepto.isZ(a))},isSVG:function(a){return b.SVGElement&&a instanceof b.SVGElement},isEmptyObject:function(a){for(var b in a)return!1;return!0}},q=!1;if(a.fn&&a.fn.jquery?(m=a,q=!0):m=b.Velocity.Utilities,8>=n&&!q)throw new Error(\"Velocity: IE8 and below require jQuery to be loaded before Velocity.\");if(7>=n)return void(jQuery.fn.velocity=jQuery.fn.animate);var r=400,s=\"swing\",t={State:{isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),isAndroid:/Android/i.test(navigator.userAgent),isGingerbread:/Android 2\\.3\\.[3-7]/i.test(navigator.userAgent),isChrome:b.chrome,isFirefox:/Firefox/i.test(navigator.userAgent),prefixElement:c.createElement(\"div\"),prefixMatches:{},scrollAnchor:null,scrollPropertyLeft:null,scrollPropertyTop:null,isTicking:!1,calls:[]},CSS:{},Utilities:m,Redirects:{},Easings:{},Promise:b.Promise,defaults:{queue:\"\",duration:r,easing:s,begin:d,complete:d,progress:d,display:d,visibility:d,loop:!1,delay:!1,mobileHA:!0,_cacheValues:!0},init:function(a){m.data(a,\"velocity\",{isSVG:p.isSVG(a),isAnimating:!1,computedStyle:null,tweensContainer:null,rootPropertyValueCache:{},transformCache:{}})},hook:null,mock:!1,version:{major:1,minor:2,patch:2},debug:!1};b.pageYOffset!==d?(t.State.scrollAnchor=b,t.State.scrollPropertyLeft=\"pageXOffset\",t.State.scrollPropertyTop=\"pageYOffset\"):(t.State.scrollAnchor=c.documentElement||c.body.parentNode||c.body,t.State.scrollPropertyLeft=\"scrollLeft\",t.State.scrollPropertyTop=\"scrollTop\");var u=function(){function a(a){return-a.tension*a.x-a.friction*a.v}function b(b,c,d){var e={x:b.x+d.dx*c,v:b.v+d.dv*c,tension:b.tension,friction:b.friction};return{dx:e.v,dv:a(e)}}function c(c,d){var e={dx:c.v,dv:a(c)},f=b(c,.5*d,e),g=b(c,.5*d,f),h=b(c,d,g),i=1/6*(e.dx+2*(f.dx+g.dx)+h.dx),j=1/6*(e.dv+2*(f.dv+g.dv)+h.dv);return c.x=c.x+i*d,c.v=c.v+j*d,c}return function d(a,b,e){var f,g,h,i={x:-1,v:0,tension:null,friction:null},j=[0],k=0,l=1e-4,m=.016;for(a=parseFloat(a)||500,b=parseFloat(b)||20,e=e||null,i.tension=a,i.friction=b,f=null!==e,f?(k=d(a,b),g=k/e*m):g=m;;)if(h=c(h||i,g),j.push(1+h.x),k+=16,!(Math.abs(h.x)>l&&Math.abs(h.v)>l))break;return f?function(a){return j[a*(j.length-1)|0]}:k}}();t.Easings={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},spring:function(a){return 1-Math.cos(4.5*a*Math.PI)*Math.exp(6*-a)}},m.each([[\"ease\",[.25,.1,.25,1]],[\"ease-in\",[.42,0,1,1]],[\"ease-out\",[0,0,.58,1]],[\"ease-in-out\",[.42,0,.58,1]],[\"easeInSine\",[.47,0,.745,.715]],[\"easeOutSine\",[.39,.575,.565,1]],[\"easeInOutSine\",[.445,.05,.55,.95]],[\"easeInQuad\",[.55,.085,.68,.53]],[\"easeOutQuad\",[.25,.46,.45,.94]],[\"easeInOutQuad\",[.455,.03,.515,.955]],[\"easeInCubic\",[.55,.055,.675,.19]],[\"easeOutCubic\",[.215,.61,.355,1]],[\"easeInOutCubic\",[.645,.045,.355,1]],[\"easeInQuart\",[.895,.03,.685,.22]],[\"easeOutQuart\",[.165,.84,.44,1]],[\"easeInOutQuart\",[.77,0,.175,1]],[\"easeInQuint\",[.755,.05,.855,.06]],[\"easeOutQuint\",[.23,1,.32,1]],[\"easeInOutQuint\",[.86,0,.07,1]],[\"easeInExpo\",[.95,.05,.795,.035]],[\"easeOutExpo\",[.19,1,.22,1]],[\"easeInOutExpo\",[1,0,0,1]],[\"easeInCirc\",[.6,.04,.98,.335]],[\"easeOutCirc\",[.075,.82,.165,1]],[\"easeInOutCirc\",[.785,.135,.15,.86]]],function(a,b){t.Easings[b[0]]=i.apply(null,b[1])});var v=t.CSS={RegEx:{isHex:/^#([A-f\\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\\((.*)\\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\\(.+\\))|(([A-z0-9#-.]+?)(?=\\s|$))/gi},Lists:{colors:[\"fill\",\"stroke\",\"stopColor\",\"color\",\"backgroundColor\",\"borderColor\",\"borderTopColor\",\"borderRightColor\",\"borderBottomColor\",\"borderLeftColor\",\"outlineColor\"],transformsBase:[\"translateX\",\"translateY\",\"scale\",\"scaleX\",\"scaleY\",\"skewX\",\"skewY\",\"rotateZ\"],transforms3D:[\"transformPerspective\",\"translateZ\",\"scaleZ\",\"rotateX\",\"rotateY\"]},Hooks:{templates:{textShadow:[\"Color X Y Blur\",\"black 0px 0px 0px\"],boxShadow:[\"Color X Y Blur Spread\",\"black 0px 0px 0px 0px\"],clip:[\"Top Right Bottom Left\",\"0px 0px 0px 0px\"],backgroundPosition:[\"X Y\",\"0% 0%\"],transformOrigin:[\"X Y Z\",\"50% 50% 0px\"],perspectiveOrigin:[\"X Y\",\"50% 50%\"]},registered:{},register:function(){for(var a=0;a=n)switch(a){case\"name\":return\"filter\";case\"extract\":var d=c.toString().match(/alpha\\(opacity=(.*)\\)/i);return c=d?d[1]/100:1;case\"inject\":return b.style.zoom=1,parseFloat(c)>=1?\"\":\"alpha(opacity=\"+parseInt(100*parseFloat(c),10)+\")\"}else switch(a){case\"name\":return\"opacity\";case\"extract\":return c;case\"inject\":return c}}},register:function(){9>=n||t.State.isGingerbread||(v.Lists.transformsBase=v.Lists.transformsBase.concat(v.Lists.transforms3D));for(var a=0;ae&&(e=1),f=!/(\\d)$/i.test(e);break;case\"skew\":f=!/(deg|\\d)$/i.test(e);break;case\"rotate\":f=!/(deg|\\d)$/i.test(e)}return f||(g(c).transformCache[b]=\"(\"+e+\")\"),g(c).transformCache[b]}}}();for(var a=0;a=n||3!==f.split(\" \").length||(f+=\" 1\"),f;case\"inject\":return 8>=n?4===e.split(\" \").length&&(e=e.split(/\\s+/).slice(0,3).join(\" \")):3===e.split(\" \").length&&(e+=\" 1\"),(8>=n?\"rgb\":\"rgba\")+\"(\"+e.replace(/\\s+/g,\",\").replace(/\\.(\\d)+(?=,)/g,\"\")+\")\"}}}()}},Names:{camelCase:function(a){return a.replace(/-(\\w)/g,function(a,b){return b.toUpperCase()})},SVGAttribute:function(a){var b=\"width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2\";return(n||t.State.isAndroid&&!t.State.isChrome)&&(b+=\"|transform\"),new RegExp(\"^(\"+b+\")$\",\"i\").test(a)},prefixCheck:function(a){if(t.State.prefixMatches[a])return[t.State.prefixMatches[a],!0];for(var b=[\"\",\"Webkit\",\"Moz\",\"ms\",\"O\"],c=0,d=b.length;d>c;c++){var e;if(e=0===c?a:b[c]+a.replace(/^\\w/,function(a){return a.toUpperCase()}),p.isString(t.State.prefixElement.style[e]))return t.State.prefixMatches[a]=e,[e,!0]}return[a,!1]}},Values:{hexToRgb:function(a){var b,c=/^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i,d=/^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i;return a=a.replace(c,function(a,b,c,d){return b+b+c+c+d+d}),b=d.exec(a),b?[parseInt(b[1],16),parseInt(b[2],16),parseInt(b[3],16)]:[0,0,0]},isCSSNullValue:function(a){return 0==a||/^(none|auto|transparent|(rgba\\(0, ?0, ?0, ?0\\)))$/i.test(a)},getUnitType:function(a){return/^(rotate|skew)/i.test(a)?\"deg\":/(^(scale|scaleX|scaleY|scaleZ|alpha|flexGrow|flexHeight|zIndex|fontWeight)$)|((opacity|red|green|blue|alpha)$)/i.test(a)?\"\":\"px\"},getDisplayType:function(a){var b=a&&a.tagName.toString().toLowerCase();return/^(b|big|i|small|tt|abbr|acronym|cite|code|dfn|em|kbd|strong|samp|var|a|bdo|br|img|map|object|q|script|span|sub|sup|button|input|label|select|textarea)$/i.test(b)?\"inline\":/^(li)$/i.test(b)?\"list-item\":/^(tr)$/i.test(b)?\"table-row\":/^(table)$/i.test(b)?\"table\":/^(tbody)$/i.test(b)?\"table-row-group\":\"block\"},addClass:function(a,b){a.classList?a.classList.add(b):a.className+=(a.className.length?\" \":\"\")+b},removeClass:function(a,b){a.classList?a.classList.remove(b):a.className=a.className.toString().replace(new RegExp(\"(^|\\\\s)\"+b.split(\" \").join(\"|\")+\"(\\\\s|$)\",\"gi\"),\" \")}},getPropertyValue:function(a,c,e,f){function h(a,c){function e(){j&&v.setPropertyValue(a,\"display\",\"none\")}var i=0;if(8>=n)i=m.css(a,c);else{var j=!1;if(/^(width|height)$/.test(c)&&0===v.getPropertyValue(a,\"display\")&&(j=!0,v.setPropertyValue(a,\"display\",v.Values.getDisplayType(a))),!f){if(\"height\"===c&&\"border-box\"!==v.getPropertyValue(a,\"boxSizing\").toString().toLowerCase()){var k=a.offsetHeight-(parseFloat(v.getPropertyValue(a,\"borderTopWidth\"))||0)-(parseFloat(v.getPropertyValue(a,\"borderBottomWidth\"))||0)-(parseFloat(v.getPropertyValue(a,\"paddingTop\"))||0)-(parseFloat(v.getPropertyValue(a,\"paddingBottom\"))||0);return e(),k}if(\"width\"===c&&\"border-box\"!==v.getPropertyValue(a,\"boxSizing\").toString().toLowerCase()){var l=a.offsetWidth-(parseFloat(v.getPropertyValue(a,\"borderLeftWidth\"))||0)-(parseFloat(v.getPropertyValue(a,\"borderRightWidth\"))||0)-(parseFloat(v.getPropertyValue(a,\"paddingLeft\"))||0)-(parseFloat(v.getPropertyValue(a,\"paddingRight\"))||0);return e(),l}}var o;o=g(a)===d?b.getComputedStyle(a,null):g(a).computedStyle?g(a).computedStyle:g(a).computedStyle=b.getComputedStyle(a,null),\"borderColor\"===c&&(c=\"borderTopColor\"),i=9===n&&\"filter\"===c?o.getPropertyValue(c):o[c],(\"\"===i||null===i)&&(i=a.style[c]),e()}if(\"auto\"===i&&/^(top|right|bottom|left)$/i.test(c)){var p=h(a,\"position\");(\"fixed\"===p||\"absolute\"===p&&/top|left/i.test(c))&&(i=m(a).position()[c]+\"px\")}return i}var i;if(v.Hooks.registered[c]){var j=c,k=v.Hooks.getRoot(j);e===d&&(e=v.getPropertyValue(a,v.Names.prefixCheck(k)[0])),v.Normalizations.registered[k]&&(e=v.Normalizations.registered[k](\"extract\",a,e)),i=v.Hooks.extractValue(j,e)}else if(v.Normalizations.registered[c]){var l,o;l=v.Normalizations.registered[c](\"name\",a),\"transform\"!==l&&(o=h(a,v.Names.prefixCheck(l)[0]),v.Values.isCSSNullValue(o)&&v.Hooks.templates[c]&&(o=v.Hooks.templates[c][1])),i=v.Normalizations.registered[c](\"extract\",a,o)}if(!/^[\\d-]/.test(i))if(g(a)&&g(a).isSVG&&v.Names.SVGAttribute(c))if(/^(height|width)$/i.test(c))try{i=a.getBBox()[c]}catch(p){i=0}else i=a.getAttribute(c);else i=h(a,v.Names.prefixCheck(c)[0]);return v.Values.isCSSNullValue(i)&&(i=0),t.debug>=2&&console.log(\"Get \"+c+\": \"+i),i},setPropertyValue:function(a,c,d,e,f){var h=c;if(\"scroll\"===c)f.container?f.container[\"scroll\"+f.direction]=d:\"Left\"===f.direction?b.scrollTo(d,f.alternateValue):b.scrollTo(f.alternateValue,d);else if(v.Normalizations.registered[c]&&\"transform\"===v.Normalizations.registered[c](\"name\",a))v.Normalizations.registered[c](\"inject\",a,d),h=\"transform\",d=g(a).transformCache[c];else{if(v.Hooks.registered[c]){var i=c,j=v.Hooks.getRoot(c);e=e||v.getPropertyValue(a,j),d=v.Hooks.injectValue(i,d,e),c=j}if(v.Normalizations.registered[c]&&(d=v.Normalizations.registered[c](\"inject\",a,d),c=v.Normalizations.registered[c](\"name\",a)),h=v.Names.prefixCheck(c)[0],8>=n)try{a.style[h]=d}catch(k){t.debug&&console.log(\"Browser does not support [\"+d+\"] for [\"+h+\"]\")}else g(a)&&g(a).isSVG&&v.Names.SVGAttribute(c)?a.setAttribute(c,d):a.style[h]=d;t.debug>=2&&console.log(\"Set \"+c+\" (\"+h+\"): \"+d)}return[h,d]},flushTransformCache:function(a){function b(b){return parseFloat(v.getPropertyValue(a,b))}var c=\"\";if((n||t.State.isAndroid&&!t.State.isChrome)&&g(a).isSVG){var d={translate:[b(\"translateX\"),b(\"translateY\")],skewX:[b(\"skewX\")],skewY:[b(\"skewY\")],scale:1!==b(\"scale\")?[b(\"scale\"),b(\"scale\")]:[b(\"scaleX\"),b(\"scaleY\")],rotate:[b(\"rotateZ\"),0,0]};m.each(g(a).transformCache,function(a){/^translate/i.test(a)?a=\"translate\":/^scale/i.test(a)?a=\"scale\":/^rotate/i.test(a)&&(a=\"rotate\"),d[a]&&(c+=a+\"(\"+d[a].join(\" \")+\") \",delete d[a])})}else{var e,f;m.each(g(a).transformCache,function(b){return e=g(a).transformCache[b],\"transformPerspective\"===b?(f=e,!0):(9===n&&\"rotateZ\"===b&&(b=\"rotate\"),void(c+=b+e+\" \"))}),f&&(c=\"perspective\"+f+\" \"+c)}v.setPropertyValue(a,\"transform\",c)}};v.Hooks.register(),v.Normalizations.register(),t.hook=function(a,b,c){var e=d;return a=f(a),m.each(a,function(a,f){if(g(f)===d&&t.init(f),c===d)e===d&&(e=t.CSS.getPropertyValue(f,b));else{var h=t.CSS.setPropertyValue(f,b,c);\"transform\"===h[0]&&t.CSS.flushTransformCache(f),e=h}}),e};var w=function(){function a(){return h?B.promise||null:i}function e(){function a(){function a(a,b){var c=d,e=d,g=d;return p.isArray(a)?(c=a[0],!p.isArray(a[1])&&/^[\\d-]/.test(a[1])||p.isFunction(a[1])||v.RegEx.isHex.test(a[1])?g=a[1]:(p.isString(a[1])&&!v.RegEx.isHex.test(a[1])||p.isArray(a[1]))&&(e=b?a[1]:j(a[1],h.duration),a[2]!==d&&(g=a[2]))):c=a,b||(e=e||h.easing),p.isFunction(c)&&(c=c.call(f,y,x)),p.isFunction(g)&&(g=g.call(f,y,x)),[c||0,e,g]}function l(a,b){var c,d;return d=(b||\"0\").toString().toLowerCase().replace(/[%A-z]+$/,function(a){return c=a,\"\"}),c||(c=v.Values.getUnitType(a)),[d,c]}function n(){var a={myParent:f.parentNode||c.body,position:v.getPropertyValue(f,\"position\"),fontSize:v.getPropertyValue(f,\"fontSize\")},d=a.position===I.lastPosition&&a.myParent===I.lastParent,e=a.fontSize===I.lastFontSize;I.lastParent=a.myParent,I.lastPosition=a.position,I.lastFontSize=a.fontSize;var h=100,i={};if(e&&d)i.emToPx=I.lastEmToPx,i.percentToPxWidth=I.lastPercentToPxWidth,i.percentToPxHeight=I.lastPercentToPxHeight;else{var j=g(f).isSVG?c.createElementNS(\"http://www.w3.org/2000/svg\",\"rect\"):c.createElement(\"div\");t.init(j),a.myParent.appendChild(j),m.each([\"overflow\",\"overflowX\",\"overflowY\"],function(a,b){t.CSS.setPropertyValue(j,b,\"hidden\")}),t.CSS.setPropertyValue(j,\"position\",a.position),t.CSS.setPropertyValue(j,\"fontSize\",a.fontSize),t.CSS.setPropertyValue(j,\"boxSizing\",\"content-box\"),m.each([\"minWidth\",\"maxWidth\",\"width\",\"minHeight\",\"maxHeight\",\"height\"],function(a,b){t.CSS.setPropertyValue(j,b,h+\"%\")}),t.CSS.setPropertyValue(j,\"paddingLeft\",h+\"em\"),i.percentToPxWidth=I.lastPercentToPxWidth=(parseFloat(v.getPropertyValue(j,\"width\",null,!0))||1)/h,i.percentToPxHeight=I.lastPercentToPxHeight=(parseFloat(v.getPropertyValue(j,\"height\",null,!0))||1)/h,i.emToPx=I.lastEmToPx=(parseFloat(v.getPropertyValue(j,\"paddingLeft\"))||1)/h,a.myParent.removeChild(j)}return null===I.remToPx&&(I.remToPx=parseFloat(v.getPropertyValue(c.body,\"fontSize\"))||16),null===I.vwToPx&&(I.vwToPx=parseFloat(b.innerWidth)/100,I.vhToPx=parseFloat(b.innerHeight)/100),i.remToPx=I.remToPx,i.vwToPx=I.vwToPx,i.vhToPx=I.vhToPx,t.debug>=1&&console.log(\"Unit ratios: \"+JSON.stringify(i),f),i}if(h.begin&&0===y)try{h.begin.call(o,o)}catch(r){setTimeout(function(){throw r},1)}if(\"scroll\"===C){var u,w,z,A=/^x$/i.test(h.axis)?\"Left\":\"Top\",D=parseFloat(h.offset)||0;h.container?p.isWrapped(h.container)||p.isNode(h.container)?(h.container=h.container[0]||h.container,u=h.container[\"scroll\"+A],z=u+m(f).position()[A.toLowerCase()]+D):h.container=null:(u=t.State.scrollAnchor[t.State[\"scrollProperty\"+A]],w=t.State.scrollAnchor[t.State[\"scrollProperty\"+(\"Left\"===A?\"Top\":\"Left\")]],z=m(f).offset()[A.toLowerCase()]+D),i={scroll:{rootPropertyValue:!1,startValue:u,currentValue:u,endValue:z,unitType:\"\",easing:h.easing,scrollData:{container:h.container,direction:A,alternateValue:w}},element:f},t.debug&&console.log(\"tweensContainer (scroll): \",i.scroll,f)}else if(\"reverse\"===C){if(!g(f).tweensContainer)return void m.dequeue(f,h.queue);\"none\"===g(f).opts.display&&(g(f).opts.display=\"auto\"),\"hidden\"===g(f).opts.visibility&&(g(f).opts.visibility=\"visible\"),g(f).opts.loop=!1,g(f).opts.begin=null,g(f).opts.complete=null,s.easing||delete h.easing,s.duration||delete h.duration,h=m.extend({},g(f).opts,h);var E=m.extend(!0,{},g(f).tweensContainer);for(var F in E)if(\"element\"!==F){var G=E[F].startValue;E[F].startValue=E[F].currentValue=E[F].endValue,E[F].endValue=G,p.isEmptyObject(s)||(E[F].easing=h.easing),t.debug&&console.log(\"reverse tweensContainer (\"+F+\"): \"+JSON.stringify(E[F]),f)}i=E}else if(\"start\"===C){var E;g(f).tweensContainer&&g(f).isAnimating===!0&&(E=g(f).tweensContainer),m.each(q,function(b,c){if(RegExp(\"^\"+v.Lists.colors.join(\"$|^\")+\"$\").test(b)){var e=a(c,!0),f=e[0],g=e[1],h=e[2];if(v.RegEx.isHex.test(f)){for(var i=[\"Red\",\"Green\",\"Blue\"],j=v.Values.hexToRgb(f),k=h?v.Values.hexToRgb(h):d,l=0;lL;L++){var M={delay:E.delay,progress:E.progress};L===K-1&&(M.display=E.display,M.visibility=E.visibility,M.complete=E.complete),w(o,\"reverse\",M)}return a()}};t=m.extend(w,t),t.animate=w;var x=b.requestAnimationFrame||o;return t.State.isMobile||c.hidden===d||c.addEventListener(\"visibilitychange\",function(){c.hidden?(x=function(a){return setTimeout(function(){a(!0)},16)},k()):x=b.requestAnimationFrame||o}),a.Velocity=t,a!==b&&(a.fn.velocity=w,a.fn.velocity.defaults=t.defaults),m.each([\"Down\",\"Up\"],function(a,b){t.Redirects[\"slide\"+b]=function(a,c,e,f,g,h){var i=m.extend({},c),j=i.begin,k=i.complete,l={height:\"\",marginTop:\"\",marginBottom:\"\",paddingTop:\"\",paddingBottom:\"\"},n={};i.display===d&&(i.display=\"Down\"===b?\"inline\"===t.CSS.Values.getDisplayType(a)?\"inline-block\":\"block\":\"none\"),i.begin=function(){j&&j.call(g,g);for(var c in l){n[c]=a.style[c];var d=t.CSS.getPropertyValue(a,c);l[c]=\"Down\"===b?[d,0]:[0,d]}n.overflow=a.style.overflow,a.style.overflow=\"hidden\"},i.complete=function(){for(var b in n)a.style[b]=n[b];k&&k.call(g,g),h&&h.resolver(g)},t(a,l,i)}}),m.each([\"In\",\"Out\"],function(a,b){t.Redirects[\"fade\"+b]=function(a,c,e,f,g,h){var i=m.extend({},c),j={opacity:\"In\"===b?1:0},k=i.complete;i.complete=e!==f-1?i.begin=null:function(){k&&k.call(g,g),h&&h.resolver(g)},i.display===d&&(i.display=\"In\"===b?\"auto\":\"none\"),t(this,j,i)}}),t}(__webpack_provided_window_dot_jQuery||window.Zepto||window,window,document)});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\")))\n\n//# sourceURL=webpack:///./src/public/js/vendor/velocity/velocity.min.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/waves/waves.js": -/*!*********************************************!*\ - !*** ./src/public/js/vendor/waves/waves.js ***! - \*********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function(global) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Waves v0.7.4\r\n * http://fian.my.id/Waves\r\n *\r\n * Copyright 2014 Alfiana E. Sibuea and other contributors\r\n * Released under the MIT license\r\n * https://github.com/fians/Waves/blob/master/LICENSE\r\n */\r\n\r\n;(function(window, factory) {\r\n 'use strict';\r\n\r\n // AMD. Register as an anonymous module. Wrap in function so we have access\r\n // to root via `this`.\r\n if (true) {\r\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\r\n return factory.apply(window);\r\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n }\r\n\r\n // Node. Does not work with strict CommonJS, but only CommonJS-like\r\n // environments that support module.exports, like Node.\r\n else {}\r\n})(typeof global === 'object' ? global : this, function() {\r\n 'use strict';\r\n\r\n var Waves = Waves || {};\r\n var $$ = document.querySelectorAll.bind(document);\r\n var toString = Object.prototype.toString;\r\n var isTouchAvailable = 'ontouchstart' in window;\r\n\r\n\r\n // Find exact position of element\r\n function isWindow(obj) {\r\n return obj !== null && obj === obj.window;\r\n }\r\n\r\n function getWindow(elem) {\r\n return isWindow(elem) ? elem : elem.nodeType === 9 && elem.defaultView;\r\n }\r\n\r\n function isObject(value) {\r\n var type = typeof value;\r\n return type === 'function' || type === 'object' && !!value;\r\n }\r\n\r\n function isDOMNode(obj) {\r\n return isObject(obj) && obj.nodeType > 0;\r\n }\r\n\r\n function getWavesElements(nodes) {\r\n var stringRepr = toString.call(nodes);\r\n\r\n if (stringRepr === '[object String]') {\r\n return $$(nodes);\r\n } else if (isObject(nodes) && /^\\[object (HTMLCollection|NodeList|Object)\\]$/.test(stringRepr) && nodes.hasOwnProperty('length')) {\r\n return nodes;\r\n } else if (isDOMNode(nodes)) {\r\n return [nodes];\r\n }\r\n\r\n return [];\r\n }\r\n\r\n function offset(elem) {\r\n var docElem, win,\r\n box = { top: 0, left: 0 },\r\n doc = elem && elem.ownerDocument;\r\n\r\n docElem = doc.documentElement;\r\n\r\n if (typeof elem.getBoundingClientRect !== typeof undefined) {\r\n box = elem.getBoundingClientRect();\r\n }\r\n win = getWindow(doc);\r\n return {\r\n top: box.top + win.pageYOffset - docElem.clientTop,\r\n left: box.left + win.pageXOffset - docElem.clientLeft\r\n };\r\n }\r\n\r\n function convertStyle(styleObj) {\r\n var style = '';\r\n\r\n for (var prop in styleObj) {\r\n if (styleObj.hasOwnProperty(prop)) {\r\n style += (prop + ':' + styleObj[prop] + ';');\r\n }\r\n }\r\n\r\n return style;\r\n }\r\n\r\n var Effect = {\r\n\r\n // Effect duration\r\n duration: 750,\r\n\r\n // Effect delay (check for scroll before showing effect)\r\n delay: 200,\r\n\r\n show: function(e, element, velocity) {\r\n\r\n // Disable right click\r\n if (e.button === 2) {\r\n return false;\r\n }\r\n\r\n element = element || this;\r\n\r\n // Create ripple\r\n var ripple = document.createElement('div');\r\n ripple.className = 'waves-ripple waves-rippling';\r\n element.appendChild(ripple);\r\n\r\n // Get click coordinate and element width\r\n var pos = offset(element);\r\n var relativeY = 0;\r\n var relativeX = 0;\r\n // Support for touch devices\r\n if('touches' in e && e.touches.length) {\r\n relativeY = (e.touches[0].pageY - pos.top);\r\n relativeX = (e.touches[0].pageX - pos.left);\r\n }\r\n //Normal case\r\n else {\r\n relativeY = (e.pageY - pos.top);\r\n relativeX = (e.pageX - pos.left);\r\n }\r\n // Support for synthetic events\r\n relativeX = relativeX >= 0 ? relativeX : 0;\r\n relativeY = relativeY >= 0 ? relativeY : 0;\r\n\r\n var scale = 'scale(' + ((element.clientWidth / 100) * 3) + ')';\r\n var translate = 'translate(0,0)';\r\n\r\n if (velocity) {\r\n translate = 'translate(' + (velocity.x) + 'px, ' + (velocity.y) + 'px)';\r\n }\r\n\r\n // Attach data to element\r\n ripple.setAttribute('data-hold', Date.now());\r\n ripple.setAttribute('data-x', relativeX);\r\n ripple.setAttribute('data-y', relativeY);\r\n ripple.setAttribute('data-scale', scale);\r\n ripple.setAttribute('data-translate', translate);\r\n\r\n // Set ripple position\r\n var rippleStyle = {\r\n top: relativeY + 'px',\r\n left: relativeX + 'px'\r\n };\r\n\r\n ripple.classList.add('waves-notransition');\r\n ripple.setAttribute('style', convertStyle(rippleStyle));\r\n ripple.classList.remove('waves-notransition');\r\n\r\n // Scale the ripple\r\n rippleStyle['-webkit-transform'] = scale + ' ' + translate;\r\n rippleStyle['-moz-transform'] = scale + ' ' + translate;\r\n rippleStyle['-ms-transform'] = scale + ' ' + translate;\r\n rippleStyle['-o-transform'] = scale + ' ' + translate;\r\n rippleStyle.transform = scale + ' ' + translate;\r\n rippleStyle.opacity = '1';\r\n\r\n var duration = e.type === 'mousemove' ? 2500 : Effect.duration;\r\n rippleStyle['-webkit-transition-duration'] = duration + 'ms';\r\n rippleStyle['-moz-transition-duration'] = duration + 'ms';\r\n rippleStyle['-o-transition-duration'] = duration + 'ms';\r\n rippleStyle['transition-duration'] = duration + 'ms';\r\n\r\n ripple.setAttribute('style', convertStyle(rippleStyle));\r\n },\r\n\r\n hide: function(e, element) {\r\n element = element || this;\r\n\r\n var ripples = element.getElementsByClassName('waves-rippling');\r\n\r\n for (var i = 0, len = ripples.length; i < len; i++) {\r\n removeRipple(e, element, ripples[i]);\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Collection of wrapper for HTML element that only have single tag\r\n * like and \r\n */\r\n var TagWrapper = {\r\n\r\n // Wrap tag so it can perform the effect\r\n input: function(element) {\r\n\r\n var parent = element.parentNode;\r\n\r\n // If input already have parent just pass through\r\n if (parent.tagName.toLowerCase() === 'i' && parent.classList.contains('waves-effect')) {\r\n return;\r\n }\r\n\r\n // Put element class and style to the specified parent\r\n var wrapper = document.createElement('i');\r\n wrapper.className = element.className + ' waves-input-wrapper';\r\n element.className = 'waves-button-input';\r\n\r\n // Put element as child\r\n parent.replaceChild(wrapper, element);\r\n wrapper.appendChild(element);\r\n\r\n // Apply element color and background color to wrapper\r\n var elementStyle = window.getComputedStyle(element, null);\r\n var color = elementStyle.color;\r\n var backgroundColor = elementStyle.backgroundColor;\r\n\r\n wrapper.setAttribute('style', 'color:' + color + ';background:' + backgroundColor);\r\n element.setAttribute('style', 'background-color:rgba(0,0,0,0);');\r\n\r\n },\r\n\r\n // Wrap tag so it can perform the effect\r\n img: function(element) {\r\n\r\n var parent = element.parentNode;\r\n\r\n // If input already have parent just pass through\r\n if (parent.tagName.toLowerCase() === 'i' && parent.classList.contains('waves-effect')) {\r\n return;\r\n }\r\n\r\n // Put element as child\r\n var wrapper = document.createElement('i');\r\n parent.replaceChild(wrapper, element);\r\n wrapper.appendChild(element);\r\n\r\n }\r\n };\r\n\r\n /**\r\n * Hide the effect and remove the ripple. Must be\r\n * a separate function to pass the JSLint...\r\n */\r\n function removeRipple(e, el, ripple) {\r\n\r\n // Check if the ripple still exist\r\n if (!ripple) {\r\n return;\r\n }\r\n\r\n ripple.classList.remove('waves-rippling');\r\n\r\n var relativeX = ripple.getAttribute('data-x');\r\n var relativeY = ripple.getAttribute('data-y');\r\n var scale = ripple.getAttribute('data-scale');\r\n var translate = ripple.getAttribute('data-translate');\r\n\r\n // Get delay beetween mousedown and mouse leave\r\n var diff = Date.now() - Number(ripple.getAttribute('data-hold'));\r\n var delay = 350 - diff;\r\n\r\n if (delay < 0) {\r\n delay = 0;\r\n }\r\n\r\n if (e.type === 'mousemove') {\r\n delay = 150;\r\n }\r\n\r\n // Fade out ripple after delay\r\n var duration = e.type === 'mousemove' ? 2500 : Effect.duration;\r\n\r\n setTimeout(function() {\r\n\r\n var style = {\r\n top: relativeY + 'px',\r\n left: relativeX + 'px',\r\n opacity: '0',\r\n\r\n // Duration\r\n '-webkit-transition-duration': duration + 'ms',\r\n '-moz-transition-duration': duration + 'ms',\r\n '-o-transition-duration': duration + 'ms',\r\n 'transition-duration': duration + 'ms',\r\n '-webkit-transform': scale + ' ' + translate,\r\n '-moz-transform': scale + ' ' + translate,\r\n '-ms-transform': scale + ' ' + translate,\r\n '-o-transform': scale + ' ' + translate,\r\n 'transform': scale + ' ' + translate\r\n };\r\n\r\n ripple.setAttribute('style', convertStyle(style));\r\n\r\n setTimeout(function() {\r\n try {\r\n el.removeChild(ripple);\r\n } catch (e) {\r\n return false;\r\n }\r\n }, duration);\r\n\r\n }, delay);\r\n }\r\n\r\n\r\n /**\r\n * Disable mousedown event for 500ms during and after touch\r\n */\r\n var TouchHandler = {\r\n\r\n /* uses an integer rather than bool so there's no issues with\r\n * needing to clear timeouts if another touch event occurred\r\n * within the 500ms. Cannot mouseup between touchstart and\r\n * touchend, nor in the 500ms after touchend. */\r\n touches: 0,\r\n\r\n allowEvent: function(e) {\r\n\r\n var allow = true;\r\n\r\n if (/^(mousedown|mousemove)$/.test(e.type) && TouchHandler.touches) {\r\n allow = false;\r\n }\r\n\r\n return allow;\r\n },\r\n registerEvent: function(e) {\r\n var eType = e.type;\r\n\r\n if (eType === 'touchstart') {\r\n\r\n TouchHandler.touches += 1; // push\r\n\r\n } else if (/^(touchend|touchcancel)$/.test(eType)) {\r\n\r\n setTimeout(function() {\r\n if (TouchHandler.touches) {\r\n TouchHandler.touches -= 1; // pop after 500ms\r\n }\r\n }, 500);\r\n\r\n }\r\n }\r\n };\r\n\r\n\r\n /**\r\n * Delegated click handler for .waves-effect element.\r\n * returns null when .waves-effect element not in \"click tree\"\r\n */\r\n function getWavesEffectElement(e) {\r\n\r\n if (TouchHandler.allowEvent(e) === false) {\r\n return null;\r\n }\r\n\r\n var element = null;\r\n var target = e.target || e.srcElement;\r\n\r\n while (target.parentElement !== null) {\r\n if (target.classList.contains('waves-effect') && (!(target instanceof SVGElement))) {\r\n element = target;\r\n break;\r\n }\r\n target = target.parentElement;\r\n }\r\n\r\n return element;\r\n }\r\n\r\n /**\r\n * Bubble the click and show effect if .waves-effect elem was found\r\n */\r\n function showEffect(e) {\r\n\r\n // Disable effect if element has \"disabled\" property on it\r\n // In some cases, the event is not triggered by the current element\r\n // if (e.target.getAttribute('disabled') !== null) {\r\n // return;\r\n // }\r\n\r\n var element = getWavesEffectElement(e);\r\n\r\n if (element !== null) {\r\n\r\n // Make it sure the element has either disabled property, disabled attribute or 'disabled' class\r\n if (element.disabled || element.getAttribute('disabled') || element.classList.contains('disabled')) {\r\n return;\r\n }\r\n\r\n TouchHandler.registerEvent(e);\r\n\r\n if (e.type === 'touchstart' && Effect.delay) {\r\n\r\n var hidden = false;\r\n\r\n var timer = setTimeout(function () {\r\n timer = null;\r\n Effect.show(e, element);\r\n }, Effect.delay);\r\n\r\n var hideEffect = function(hideEvent) {\r\n\r\n // if touch hasn't moved, and effect not yet started: start effect now\r\n if (timer) {\r\n clearTimeout(timer);\r\n timer = null;\r\n Effect.show(e, element);\r\n }\r\n if (!hidden) {\r\n hidden = true;\r\n Effect.hide(hideEvent, element);\r\n }\r\n };\r\n\r\n var touchMove = function(moveEvent) {\r\n if (timer) {\r\n clearTimeout(timer);\r\n timer = null;\r\n }\r\n hideEffect(moveEvent);\r\n };\r\n\r\n element.addEventListener('touchmove', touchMove, false);\r\n element.addEventListener('touchend', hideEffect, false);\r\n element.addEventListener('touchcancel', hideEffect, false);\r\n\r\n } else {\r\n\r\n Effect.show(e, element);\r\n\r\n if (isTouchAvailable) {\r\n element.addEventListener('touchend', Effect.hide, false);\r\n element.addEventListener('touchcancel', Effect.hide, false);\r\n }\r\n\r\n element.addEventListener('mouseup', Effect.hide, false);\r\n element.addEventListener('mouseleave', Effect.hide, false);\r\n }\r\n }\r\n }\r\n\r\n Waves.init = function(options) {\r\n var body = document.body;\r\n\r\n options = options || {};\r\n\r\n if ('duration' in options) {\r\n Effect.duration = options.duration;\r\n }\r\n\r\n if ('delay' in options) {\r\n Effect.delay = options.delay;\r\n }\r\n\r\n if (isTouchAvailable) {\r\n body.addEventListener('touchstart', showEffect, false);\r\n body.addEventListener('touchcancel', TouchHandler.registerEvent, false);\r\n body.addEventListener('touchend', TouchHandler.registerEvent, false);\r\n }\r\n\r\n body.addEventListener('mousedown', showEffect, false);\r\n };\r\n\r\n\r\n /**\r\n * Attach Waves to dynamically loaded inputs, or add .waves-effect and other\r\n * waves classes to a set of elements. Set drag to true if the ripple mouseover\r\n * or skimming effect should be applied to the elements.\r\n */\r\n Waves.attach = function(elements, classes) {\r\n\r\n elements = getWavesElements(elements);\r\n\r\n if (toString.call(classes) === '[object Array]') {\r\n classes = classes.join(' ');\r\n }\r\n\r\n classes = classes ? ' ' + classes : '';\r\n\r\n var element, tagName;\r\n\r\n for (var i = 0, len = elements.length; i < len; i++) {\r\n\r\n element = elements[i];\r\n tagName = element.tagName.toLowerCase();\r\n\r\n if (['input', 'img'].indexOf(tagName) !== -1) {\r\n TagWrapper[tagName](element);\r\n element = element.parentElement;\r\n }\r\n\r\n if (element.className.indexOf('waves-effect') === -1) {\r\n element.className += ' waves-effect' + classes;\r\n }\r\n }\r\n };\r\n\r\n\r\n /**\r\n * Cause a ripple to appear in an element via code.\r\n */\r\n Waves.ripple = function(elements, options) {\r\n elements = getWavesElements(elements);\r\n var elementsLen = elements.length;\r\n\r\n options = options || {};\r\n options.wait = options.wait || 0;\r\n options.position = options.position || null; // default = centre of element\r\n\r\n\r\n if (elementsLen) {\r\n var element, pos, off, centre = {}, i = 0;\r\n var mousedown = {\r\n type: 'mousedown',\r\n button: 1\r\n };\r\n var hideRipple = function(mouseup, element) {\r\n return function() {\r\n Effect.hide(mouseup, element);\r\n };\r\n };\r\n\r\n for (; i < elementsLen; i++) {\r\n element = elements[i];\r\n pos = options.position || {\r\n x: element.clientWidth / 2,\r\n y: element.clientHeight / 2\r\n };\r\n\r\n off = offset(element);\r\n centre.x = off.left + pos.x;\r\n centre.y = off.top + pos.y;\r\n\r\n mousedown.pageX = centre.x;\r\n mousedown.pageY = centre.y;\r\n\r\n Effect.show(mousedown, element);\r\n\r\n if (options.wait >= 0 && options.wait !== null) {\r\n var mouseup = {\r\n type: 'mouseup',\r\n button: 1\r\n };\r\n\r\n setTimeout(hideRipple(mouseup, element), options.wait);\r\n }\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Remove all ripples from an element.\r\n */\r\n Waves.calm = function(elements) {\r\n elements = getWavesElements(elements);\r\n var mouseup = {\r\n type: 'mouseup',\r\n button: 1\r\n };\r\n\r\n for (var i = 0, len = elements.length; i < len; i++) {\r\n Effect.hide(mouseup, elements[i]);\r\n }\r\n };\r\n\r\n /**\r\n * Deprecated API fallback\r\n */\r\n Waves.displayEffect = function(options) {\r\n console.error('Waves.displayEffect() has been deprecated and will be removed in future version. Please use Waves.init() to initialize Waves effect');\r\n Waves.init(options);\r\n };\r\n\r\n return Waves;\r\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack:///./src/public/js/vendor/waves/waves.js?"); - -/***/ }) - -}]); \ No newline at end of file diff --git a/public/js/2.js b/public/js/2.js deleted file mode 100644 index 08fabd726..000000000 --- a/public/js/2.js +++ /dev/null @@ -1,36 +0,0 @@ -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[2],{ - -/***/ "./node_modules/process/browser.js": -/*!*****************************************!*\ - !*** ./node_modules/process/browser.js ***! - \*****************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n//# sourceURL=webpack:///./node_modules/process/browser.js?"); - -/***/ }), - -/***/ "./node_modules/webpack/buildin/global.js": -/*!***********************************!*\ - !*** (webpack)/buildin/global.js ***! - \***********************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n//# sourceURL=webpack:///(webpack)/buildin/global.js?"); - -/***/ }), - -/***/ "./node_modules/webpack/buildin/module.js": -/*!***********************************!*\ - !*** (webpack)/buildin/module.js ***! - \***********************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n\n\n//# sourceURL=webpack:///(webpack)/buildin/module.js?"); - -/***/ }) - -}]); \ No newline at end of file diff --git a/public/js/3.js b/public/js/3.js deleted file mode 100644 index 1d8ecb75c..000000000 --- a/public/js/3.js +++ /dev/null @@ -1,520 +0,0 @@ -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[3],{ - -/***/ "./src/public/js/angularjs/controllers.js": -/*!************************************************!*\ - !*** ./src/public/js/angularjs/controllers.js ***! - \************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n.o8 \"888 `888\r\n.o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n\"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n========================================================================\r\nCreated: 02/10/2015\r\nAuthor: Chris Brame\r\n\r\n**/\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\r\n __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"),\r\n __webpack_require__(/*! angular */ \"./src/public/js/vendor/angular/angular.min.js\"),\r\n __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"),\r\n\r\n __webpack_require__(/*! angularjs/controllers/common */ \"./src/public/js/angularjs/controllers/common.js\"),\r\n __webpack_require__(/*! angularjs/controllers/profile */ \"./src/public/js/angularjs/controllers/profile.js\"),\r\n __webpack_require__(/*! angularjs/controllers/accounts */ \"./src/public/js/angularjs/controllers/accounts.js\"),\r\n __webpack_require__(/*! angularjs/controllers/groups */ \"./src/public/js/angularjs/controllers/groups.js\"),\r\n __webpack_require__(/*! angularjs/controllers/tickets */ \"./src/public/js/angularjs/controllers/tickets.js\"),\r\n __webpack_require__(/*! angularjs/controllers/singleTicket */ \"./src/public/js/angularjs/controllers/singleTicket.js\"),\r\n __webpack_require__(/*! angularjs/controllers/messages */ \"./src/public/js/angularjs/controllers/messages.js\"),\r\n __webpack_require__(/*! angularjs/controllers/notices */ \"./src/public/js/angularjs/controllers/notices.js\"),\r\n __webpack_require__(/*! angularjs/controllers/plugins */ \"./src/public/js/angularjs/controllers/plugins.js\"),\r\n __webpack_require__(/*! angularjs/controllers/reports */ \"./src/public/js/angularjs/controllers/reports.js\"),\r\n __webpack_require__(/*! angularjs/controllers/settings */ \"./src/public/js/angularjs/controllers/settings.js\"),\r\n __webpack_require__(/*! angularjs/controllers/settings-backup */ \"./src/public/js/angularjs/controllers/settings-backup.js\"),\r\n __webpack_require__(/*! angularjs/controllers/editor */ \"./src/public/js/angularjs/controllers/editor.js\")\r\n], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($, angular, _) {\r\n return angular\r\n .module('trudesk.controllers', [\r\n 'trudesk.controllers.common',\r\n\r\n 'trudesk.controllers.profile',\r\n 'trudesk.controllers.accounts',\r\n 'trudesk.controllers.groups',\r\n 'trudesk.controllers.tickets',\r\n 'trudesk.controllers.singleTicket',\r\n 'trudesk.controllers.messages',\r\n 'trudesk.controllers.notices',\r\n 'trudesk.controllers.plugins',\r\n 'trudesk.controllers.reports',\r\n 'trudesk.controllers.settings',\r\n 'trudesk.controllers.settings.backup',\r\n 'trudesk.controllers.editor'\r\n ])\r\n .controller('TrudeskController', function ($rootScope, $scope) {\r\n $scope.submitForm = function (formName, $event) {\r\n if (_.isNull(formName) || _.isUndefined(formName)) return true\r\n\r\n $event.preventDefault()\r\n\r\n var form = $('#' + formName)\r\n if (!_.isUndefined(form)) {\r\n form.submit()\r\n }\r\n }\r\n })\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/angularjs/controllers.js?"); - -/***/ }), - -/***/ "./src/public/js/angularjs/controllers/accounts.js": -/*!*********************************************************!*\ - !*** ./src/public/js/angularjs/controllers/accounts.js ***! - \*********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 02/10/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\r\n __webpack_require__(/*! angular */ \"./src/public/js/vendor/angular/angular.min.js\"),\r\n __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"),\r\n __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"),\r\n __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"),\r\n __webpack_require__(/*! uikit */ \"./src/public/js/vendor/uikit/js/uikit_combined.min.js\"),\r\n __webpack_require__(/*! pages/accounts */ \"./src/public/js/pages/accounts.js\"),\r\n __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\"),\r\n __webpack_require__(/*! selectize */ \"./src/public/js/vendor/selectize/selectize.js\"),\r\n __webpack_require__(/*! formvalidator */ \"./src/public/js/vendor/formvalidator/jquery.form-validator.js\"),\r\n __webpack_require__(/*! multiselect */ \"./src/public/js/vendor/multiselect/js/jquery.multi-select.js\")\r\n], __WEBPACK_AMD_DEFINE_RESULT__ = (function (angular, _, $, helpers, UIkit, accountsPage) {\r\n return angular\r\n .module('trudesk.controllers.accounts', [])\r\n .controller('accountsCtrl', function ($scope, $http, $timeout, $window, $log) {\r\n function checkGroupValidation () {\r\n var data = {}\r\n var form = $('#createAccountForm')\r\n data.aGrps = form.find('select[name=\"caGrps[]\"]').val()\r\n\r\n if (!data.aGrps || data.aGrps.length < 1) {\r\n // Validate Group\r\n $('label[for=\"caGrps\"]').css('color', '#d85030')\r\n $('select[name=\"caGrps[]\"] + .selectize-control > .selectize-input').css('border-bottom', '1px solid #d85030')\r\n $('.aGrps-error-message')\r\n .removeClass('hide')\r\n .css('display', 'block')\r\n .css('color', '#d85030')\r\n .css('font-weight', 'bold')\r\n return false\r\n }\r\n\r\n $('label[for=\"caGrps\"]').css('color', '#4d4d4d')\r\n $('select[name=\"caGrps[]\"] + .selectize-control > .selectize-input').css(\r\n 'border-bottom',\r\n '1px solid rgba(0,0,0,.12)'\r\n )\r\n $('.aGrps-error-message').addClass('hide')\r\n return true\r\n }\r\n\r\n $scope.createAccount = function (event) {\r\n var data = {}\r\n var form = $('#createAccountForm')\r\n // if (!form.isValid(null, null, false)) return true;\r\n if (!form.isValid(null, null, false)) {\r\n checkGroupValidation()\r\n return false\r\n }\r\n\r\n if (!checkGroupValidation()) {\r\n event.preventDefault()\r\n return false\r\n }\r\n\r\n event.preventDefault()\r\n form.serializeArray().map(function (x) {\r\n data[x.name] = x.value\r\n })\r\n data.aGrps = form.find('select[name=\"caGrps[]\"]').val()\r\n $http({\r\n method: 'POST',\r\n url: '/api/v1/users/create',\r\n data: data,\r\n headers: { 'Content-Type': 'application/json' }\r\n })\r\n .success(function (data) {\r\n if (!data.success) {\r\n if (data.error) {\r\n helpers.UI.showSnackbar('Error: ' + data.error, true)\r\n return\r\n }\r\n\r\n helpers.UI.showSnackbar('Error Creating Account', true)\r\n }\r\n\r\n helpers.UI.showSnackbar({ text: 'Account Created' })\r\n\r\n // Refresh UserGrid\r\n History.pushState(\r\n null,\r\n null,\r\n '/accounts/?refresh=' + (Math.floor(Math.random() * (99999 - 10000 + 1)) + 10000)\r\n )\r\n\r\n UIkit.modal('#accountCreateModal').hide()\r\n })\r\n .error(function (err) {\r\n $log.log('[trudesk:accounts:createAccount]', err)\r\n helpers.UI.showSnackbar('An error occurred while creating the account. Check Console.', true)\r\n })\r\n }\r\n\r\n var running = false\r\n $scope.deleteAccount = function ($event) {\r\n if (running) {\r\n return true\r\n }\r\n\r\n $event.preventDefault()\r\n var self = $($event.target)\r\n var username = self.attr('data-username')\r\n if (_.isUndefined(username)) {\r\n return true\r\n }\r\n\r\n running = true\r\n $http\r\n .delete('/api/v1/users/' + username)\r\n .success(function (data) {\r\n if (!data.success) {\r\n helpers.UI.showSnackbar(data.error, true)\r\n running = false\r\n return true\r\n }\r\n\r\n if (data.disabled) {\r\n self.parents('.tru-card-head').addClass('tru-card-head-deleted')\r\n self.addClass('hide')\r\n self\r\n .parents('.uk-nav')\r\n .find('.enable-account-action')\r\n .removeClass('hide')\r\n\r\n helpers.UI.showSnackbar('Account ' + username + ' Successfully Disabled', false)\r\n } else {\r\n self\r\n .parents('.tru-card[data-card-username]')\r\n .parent()\r\n .remove()\r\n UIkit.$html.trigger('changed.uk.dom')\r\n\r\n helpers.UI.showSnackbar('Account ' + username + ' Successfully Deleted', false)\r\n }\r\n\r\n running = false\r\n })\r\n .error(function (err) {\r\n $log.log('[trudesk:accounts:deleteAccount] - Error: ' + err.error)\r\n helpers.UI.showSnackbar(err.error, true)\r\n\r\n running = false\r\n })\r\n }\r\n\r\n $scope.enableAccount = function ($event) {\r\n $event.preventDefault()\r\n var self = $($event.target)\r\n var username = self.attr('data-username')\r\n if (_.isUndefined(username)) {\r\n return true\r\n }\r\n\r\n $http\r\n .get('/api/v1/users/' + username + '/enable')\r\n .success(function (data) {\r\n if (!data.success) {\r\n helpers.UI.showSnackbar(data.error, true)\r\n return\r\n }\r\n\r\n self.parents('.tru-card-head').removeClass('tru-card-head-deleted')\r\n self.addClass('hide')\r\n self\r\n .parents('.uk-nav')\r\n .find('.delete-account-action')\r\n .removeClass('hide')\r\n\r\n helpers.UI.showSnackbar('Account successfully enabled', false)\r\n })\r\n .error(function (err) {\r\n $log.log('[trudesk:accounts:enableAccount] - Error: ' + err.error)\r\n helpers.UI.showSnackbar(err.error, true)\r\n })\r\n }\r\n\r\n $scope.editAccount = function ($event) {\r\n $event.preventDefault()\r\n\r\n var self = $($event.target)\r\n var username = self.attr('data-username')\r\n if (_.isUndefined(username)) return true\r\n\r\n var $menu = self.parents('.tru-card-head-menu')\r\n if (!_.isUndefined($menu)) {\r\n $menu.find('.uk-dropdown').removeClass('uk-dropdown-shown uk-dropdown-active')\r\n }\r\n\r\n $http\r\n .get('/api/v1/users/' + username)\r\n .success(function (data) {\r\n var editAccountModal = $('#editAccountModal')\r\n var form = editAccountModal.find('form#editAccountForm')\r\n var user = data.user\r\n if (_.isUndefined(user) || _.isNull(user)) return true\r\n\r\n var loggedInAccount = $window.trudeskSessionService.getUser()\r\n if (loggedInAccount === null) return true\r\n\r\n var $userHeadingContent = $('.user-heading-content')\r\n $userHeadingContent.find('.js-username').text(user.username)\r\n if (!user.title) {\r\n $userHeadingContent.find('.js-user-title').text('')\r\n } else {\r\n $userHeadingContent.find('.js-user-title').text(user.title)\r\n }\r\n\r\n var isEditingSelf = false\r\n if (user.username === loggedInAccount.username) {\r\n isEditingSelf = true\r\n }\r\n\r\n if (\r\n !isEditingSelf &&\r\n (loggedInAccount.role === 'user' || loggedInAccount.role === 'support') &&\r\n (user.role === 'admin' || user.role === 'mod')\r\n ) {\r\n // Disable editing user with higher roles.\r\n form\r\n .find('#aPass')\r\n .parent()\r\n .hide()\r\n form\r\n .find('#aPassConfirm')\r\n .parent()\r\n .hide()\r\n form\r\n .find('#aRole')\r\n .parent()\r\n .hide()\r\n form.find('#aFullname').attr('disabled', 'disabled')\r\n form.find('#aTitle').attr('disabled', 'disabled')\r\n form.find('#aEmail').attr('disabled', 'disabled')\r\n form.find('#aGrps').attr('disabled', 'disabled')\r\n form\r\n .find('#aSaveButton')\r\n .addClass('disabled')\r\n .attr('disabled', 'disabled')\r\n } else {\r\n form\r\n .find('#aPass')\r\n .parent()\r\n .show()\r\n form\r\n .find('#aPassConfirm')\r\n .parent()\r\n .show()\r\n form\r\n .find('#aRole')\r\n .parent()\r\n .show()\r\n form.find('#aFullname').attr('disabled', false)\r\n form.find('#aTitle').attr('disabled', false)\r\n form.find('#aEmail').attr('disabled', false)\r\n form.find('#aGrps').attr('disabled', false)\r\n form\r\n .find('#aSaveButton')\r\n .removeClass('disabled')\r\n .attr('disabled', false)\r\n }\r\n\r\n form.find('#aId').val(user._id)\r\n form\r\n .find('#aUsername')\r\n .val(user.username)\r\n .prop('disabled', true)\r\n .parent()\r\n .addClass('md-input-filled')\r\n form\r\n .find('#aFullname')\r\n .val(user.fullname)\r\n .parent()\r\n .addClass('md-input-filled')\r\n form\r\n .find('#aTitle')\r\n .val(user.title)\r\n .parent()\r\n .addClass('md-input-filled')\r\n form\r\n .find('#aEmail')\r\n .val(user.email)\r\n .parent()\r\n .addClass('md-input-filled')\r\n form.find('#aRole option[value=\"' + user.role + '\"]').prop('selected', true)\r\n if (form.find('#aRole').length > 0) {\r\n var $selectizeRole = form.find('#aRole')[0].selectize\r\n $selectizeRole.setValue(user.role, true)\r\n\r\n if (loggedInAccount.role === 'support' || loggedInAccount.role === 'user') {\r\n $selectizeRole.removeOption('admin')\r\n $selectizeRole.removeOption('mod')\r\n }\r\n\r\n if (loggedInAccount.role === 'mod') {\r\n $selectizeRole.removeOption('admin')\r\n }\r\n\r\n $selectizeRole.refreshItems()\r\n }\r\n\r\n form.find('#aGrps').multiSelect('deselect_all')\r\n form.find('#aGrps').multiSelect('select', data.groups)\r\n form.find('#aGrps').multiSelect('refresh')\r\n\r\n // Profile Picture\r\n var aImageUploadForm = $('form#aUploadImageForm')\r\n var image = aImageUploadForm.find('img')\r\n var inputId = aImageUploadForm.find('input#imageUpload_id')\r\n var inputUsername = aImageUploadForm.find('input#imageUpload_username')\r\n inputId.val(user._id)\r\n inputUsername.val(user.username)\r\n if (user.image) {\r\n image.attr(\r\n 'src',\r\n '/uploads/users/' + user.image + '?r=' + (Math.floor(Math.random() * (99999 - 10000 + 1)) + 10000)\r\n )\r\n } else {\r\n image.attr(\r\n 'src',\r\n '/uploads/users/defaultProfile.jpg?r=' + (Math.floor(Math.random() * (99999 - 10000 + 1)) + 10000)\r\n )\r\n }\r\n\r\n var modal = UIkit.modal('#editAccountModal')\r\n if (!modal.isActive()) modal.show()\r\n })\r\n .error(function (err) {\r\n $log.log('[trudesk:Accounts:editAccount] - Error: ' + err.error)\r\n helpers.UI.showSnackbar(err.error, true)\r\n })\r\n }\r\n\r\n $scope.saveAccount = function () {\r\n var form = $('#editAccountForm')\r\n var data = form.serializeObject()\r\n data.aUsername = form.find('#aUsername').val()\r\n data.aGrps = form.find('#aGrps').val()\r\n data.saveGroups = true\r\n data.aRole = form.find('#aRole').val().length > 0 ? form.find('#aRole').val() : undefined\r\n data.aPass = form.find('#aPass').val().length > 0 ? form.find('#aPass').val() : undefined\r\n data.aPassConfirm = form.find('#aPassConfirm').val().length > 0 ? form.find('#aPassConfirm').val() : undefined\r\n\r\n $http({\r\n method: 'PUT',\r\n url: '/api/v1/users/' + data.aUsername,\r\n data: data,\r\n headers: { 'Content-Type': 'application/json' }\r\n })\r\n .success(function (data) {\r\n if (!data.success) {\r\n if (data.error) {\r\n helpers.UI.showSnackbar('Error: ' + data.error, true)\r\n return\r\n }\r\n\r\n helpers.UI.showSnackbar('Error Saving Account', true)\r\n }\r\n\r\n helpers.UI.showSnackbar('Account Saved', false)\r\n\r\n UIkit.modal('#editAccountModal').hide()\r\n\r\n accountsPage.init(null, true)\r\n })\r\n .error(function (err) {\r\n $log.log('[trudesk:accounts:saveAccount] - ' + err.error.message)\r\n helpers.UI.showSnackbar('Error: ' + err.error.message, true)\r\n })\r\n }\r\n\r\n $scope.accountEditPic = function () {\r\n throttledAccountPicClick()\r\n }\r\n\r\n $scope.selectAccountsImport = function (event, type) {\r\n if ($(event.currentTarget).hasClass('card-disabled')) {\r\n return false\r\n }\r\n\r\n switch (type) {\r\n case 'csv':\r\n $('#csv_wizard_card').removeClass('uk-hidden')\r\n $('#json-import-selector').addClass('card-disabled')\r\n $('#ldap-import-selector').addClass('card-disabled')\r\n break\r\n case 'json':\r\n $('#json_wizard_card').removeClass('uk-hidden')\r\n $('#csv-import-selector').addClass('card-disabled')\r\n $('#ldap-import-selector').addClass('card-disabled')\r\n break\r\n case 'ldap':\r\n $('#ldap_wizard_card').removeClass('uk-hidden')\r\n $('#csv-import-selector').addClass('card-disabled')\r\n $('#json-import-selector').addClass('card-disabled')\r\n }\r\n }\r\n\r\n $scope.resetWizardSelection = function () {\r\n $('#csv_wizard_card').addClass('uk-hidden')\r\n $('#json_wizard_card').addClass('uk-hidden')\r\n $('#ldap_wizard_card').addClass('uk-hidden')\r\n\r\n $('#csv-import-selector').removeClass('card-disabled')\r\n $('#json-import-selector').removeClass('card-disabled')\r\n $('#ldap-import-selector').removeClass('card-disabled')\r\n }\r\n\r\n function throttledAccountPicClick () {\r\n $timeout(function () {\r\n var $profileImageInput = $('#profileImageInput')\r\n $profileImageInput.on('click', function (event) {\r\n // This function is a firefox hack to stop it from spawning 100000 file dialogs\r\n event.stopPropagation()\r\n })\r\n\r\n $profileImageInput.trigger('click')\r\n }, 0)\r\n }\r\n })\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/angularjs/controllers/accounts.js?"); - -/***/ }), - -/***/ "./src/public/js/angularjs/controllers/common.js": -/*!*******************************************************!*\ - !*** ./src/public/js/angularjs/controllers/common.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 02/10/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\r\n __webpack_require__(/*! angular */ \"./src/public/js/vendor/angular/angular.min.js\"),\r\n __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"),\r\n __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"),\r\n __webpack_require__(/*! modules/socket */ \"./src/public/js/modules/socket.js\"),\r\n __webpack_require__(/*! uikit */ \"./src/public/js/vendor/uikit/js/uikit_combined.min.js\"),\r\n __webpack_require__(/*! modules/tour */ \"./src/public/js/modules/tour.js\"),\r\n __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"),\r\n __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\")\r\n], __WEBPACK_AMD_DEFINE_RESULT__ = (function (angular, _, $, socket, UI, tour, helpers) {\r\n return angular\r\n .module('trudesk.controllers.common', ['trudesk.controllers.messages'])\r\n .controller('commonCtrl', function ($scope, $window, $http, $cookies, $timeout, $log) {\r\n $scope.showCreateTagWindow = function ($event) {\r\n $event.preventDefault()\r\n var createTagModal = $('#createTagModal')\r\n if (createTagModal.length > 0) {\r\n UI.modal(createTagModal, { bgclose: false }).show()\r\n }\r\n }\r\n\r\n $scope.createTag = function (page, $event) {\r\n $event.preventDefault()\r\n var form = $('#createTagForm')\r\n if (!form.isValid(null, null, false)) {\r\n return true\r\n }\r\n\r\n var tagName = form.find('input[name=\"tagName\"]').val()\r\n if (!tagName || tagName.length < 2) return true\r\n\r\n $http\r\n .post(\r\n '/api/v1/tags/create',\r\n {\r\n tag: tagName\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback (response) {\r\n var data = response.data\r\n helpers.UI.showSnackbar('Tag: ' + tagName + ' created successfully', false)\r\n if (page === 'settings') {\r\n var time = new Date().getTime()\r\n History.pushState(null, null, '/settings/tickets/?refresh=' + time)\r\n } else if (page === 'singleticket') {\r\n var tagModal = $('#createTagModal')\r\n var tagFormField = $('select#tags')\r\n tagFormField.append(\r\n ''\r\n )\r\n tagFormField.find('option#TAG__' + data.tag._id).prop('selected', true)\r\n tagFormField.trigger('chosen:updated')\r\n form.find('#tag').val('')\r\n if (tagModal.length > 0) UI.modal(tagModal).hide()\r\n $timeout(function () {\r\n $scope.showTags($event)\r\n }, 250)\r\n }\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar('Unable to create tag. Check console', true)\r\n $log.error(err)\r\n }\r\n )\r\n }\r\n\r\n // NG Init function\r\n $scope.setDefaultCreateTicketValues = function () {\r\n $timeout(\r\n function () {\r\n UI.$html.on('show.uk.modal', function (event) {\r\n var modal = $(event.target)\r\n var options\r\n\r\n var first\r\n if (modal.length > 0 && modal.attr('id') === 'ticketCreateModal') {\r\n var codeMirror = modal.find('form#createTicketForm').find('.CodeMirror')[0].CodeMirror\r\n codeMirror.setValue('')\r\n modal.find('.error-border-wrap').css({ border: 'none' })\r\n modal.find('.mde-error').remove()\r\n\r\n // Needed on a timeout to allow blinking cursor to render\r\n $timeout(function () {\r\n codeMirror.refresh()\r\n }, 150)\r\n\r\n var $group = modal.find('select#group')\r\n if (angular.isDefined($group[0])) {\r\n var $groupSelectize = $group[0].selectize\r\n options = $groupSelectize.options\r\n first = _.chain(options)\r\n .map(function (v, k) {\r\n if (angular.isDefined(v.$order) && v.$order === 1) {\r\n return k\r\n }\r\n })\r\n .first()\r\n .value()\r\n if (first) {\r\n $groupSelectize.addItem(first, true)\r\n }\r\n\r\n $groupSelectize.refreshItems()\r\n }\r\n\r\n var $type = modal.find('select#type')\r\n var $priorities = modal.find('#priority-wrapper')\r\n if (angular.isDefined($priorities[0])) {\r\n $priorities.empty()\r\n }\r\n\r\n if (angular.isDefined($type[0])) {\r\n var $typeSelectize = $type[0].selectize\r\n $typeSelectize.on('change', function (value) {\r\n // Load Priorities on Change.\r\n var $priorityLoader = $('#priorityLoader')\r\n $priorityLoader.show()\r\n $priorities.empty()\r\n $timeout(function () {\r\n $http.get('/api/v1/tickets/type/' + value).then(\r\n function success (response) {\r\n if (\r\n response.data &&\r\n response.data.type &&\r\n response.data.type.priorities &&\r\n response.data.success\r\n ) {\r\n var typePriorities = response.data.type.priorities\r\n if (angular.isUndefined($priorities[0])) {\r\n return\r\n }\r\n\r\n var priorities = _.sortBy(typePriorities, 'migrationNum')\r\n $priorities.empty()\r\n _.each(priorities, function (priority, idx) {\r\n var checked = idx === 0 ? 'checked' : ''\r\n if (angular.isUndefined(priority.htmlColor)) {\r\n priority.htmlColor = '#29b955'\r\n }\r\n\r\n var html =\r\n '' +\r\n '' +\r\n '' +\r\n ''\r\n\r\n $priorities.append(html)\r\n })\r\n\r\n $priorityLoader.hide()\r\n }\r\n },\r\n function error (err) {\r\n $log.error(err)\r\n }\r\n )\r\n }, 250)\r\n })\r\n\r\n options = $typeSelectize.options\r\n var defaultType = $type.attr('data-default')\r\n if (defaultType) {\r\n var selectDefault = _.find(options, { value: defaultType }).value\r\n\r\n if (selectDefault) {\r\n $typeSelectize.addItem(selectDefault, true)\r\n }\r\n } else {\r\n first = _.chain(options)\r\n .map(function (v, k) {\r\n if (angular.isDefined(v.$order) && v.$order === 1) return k\r\n })\r\n .first()\r\n .value()\r\n\r\n if (first) {\r\n $typeSelectize.addItem(first, true)\r\n }\r\n }\r\n\r\n $typeSelectize.refreshItems()\r\n }\r\n\r\n // Now load priorities for the given type...\r\n // NOTE: This ends up being handled in the onChange event during modal load.\r\n // if (angular.isDefined($priorities[0])) {\r\n // $priorities.empty();\r\n // var json = $priorities.attr('data-default-priorities');\r\n // var parsedPriorities = angular.fromJson(json);\r\n // var priorities = _.sortBy(parsedPriorities, 'migrationNum');\r\n // _.each(priorities, function(priority, idx) {\r\n // var checked = (idx === 0) ? 'checked' : '';\r\n // if (angular.isUndefined(priority.htmlColor))\r\n // priority.htmlColor = '#29b955';\r\n //\r\n // var html = '\\n' +\r\n // '\\n' +\r\n // '\\n' +\r\n // '';\r\n //\r\n // $priorities.append(html);\r\n // });\r\n // }\r\n }\r\n })\r\n },\r\n 0,\r\n false\r\n )\r\n }\r\n\r\n $scope.loadNoticeAlertWindow = function () {\r\n // Load the function In the next Tick...\r\n $timeout(\r\n function () {\r\n // Bind to Events\r\n UI.$html.on('hide.uk.modal', function (event) {\r\n var modal = $(event.target)\r\n if (modal.length > 0) {\r\n var form = modal.find('form')[0]\r\n if (!_.isUndefined(form)) {\r\n form.reset()\r\n }\r\n modal.find('option').prop('selected', false)\r\n var $select = modal.find('form').find('select')\r\n $select.each(function () {\r\n var vm = this\r\n var self = $(vm)\r\n var $selectize = self[0].selectize\r\n // $selectize.addOption({value: -1, text: \"Select Group...\"});\r\n // $selectize.refreshOptions();\r\n // $selectize.setValue(-1);\r\n if (!_.isUndefined($selectize)) {\r\n $selectize.clear()\r\n }\r\n })\r\n var $mdInputFilled = modal.find('*.md-input-filled')\r\n $mdInputFilled.each(function () {\r\n var vm = this\r\n var self = $(vm)\r\n self.removeClass('md-input-filled')\r\n })\r\n }\r\n })\r\n\r\n $scope.noticeAlertWindow = $('#noticeAlertWindow')\r\n if ($scope.noticeAlertWindow.length > 0) {\r\n var cookieName = $('#__noticeCookieName').text()\r\n if (angular.isUndefined(cookieName) || _.isEmpty(cookieName)) return true\r\n var shouldShowNotice =\r\n $cookies.get(cookieName) === 'true' || angular.isUndefined($cookies.get(cookieName))\r\n\r\n if (shouldShowNotice) {\r\n var modal = UI.modal($scope.noticeAlertWindow, {\r\n bgclose: false\r\n })\r\n\r\n modal.show()\r\n }\r\n }\r\n },\r\n 0,\r\n false\r\n )\r\n }\r\n\r\n $scope.confirmNoticeClick = function () {\r\n if ($scope.noticeAlertWindow.length < 1) return\r\n var cookieName = $('#__noticeCookieName').text()\r\n var expiresDate = new Date()\r\n expiresDate.setDate(expiresDate.getDate() + 1)\r\n $cookies.put(cookieName, 'false', { expires: expiresDate })\r\n\r\n UI.modal($scope.noticeAlertWindow).hide()\r\n }\r\n\r\n $scope.clearNotifications = function ($event) {\r\n $event.preventDefault()\r\n $event.stopPropagation()\r\n\r\n socket.ui.clearNotifications()\r\n }\r\n\r\n // Fired from Topbar.hbs\r\n $scope.loadTour = function () {\r\n $timeout(\r\n function () {\r\n var showTour = $('#__tourEnabled').text() === 'true'\r\n if (showTour) {\r\n if ($window.location.pathname !== '/dashboard') {\r\n $window.location.href = '/dashboard'\r\n } else {\r\n tour.init()\r\n }\r\n }\r\n },\r\n 0,\r\n false\r\n )\r\n }\r\n\r\n $scope.markRead = function ($event) {\r\n var $id = $($event.currentTarget).attr('data-notificationid')\r\n if ($id.length < 1) return\r\n\r\n socket.ui.markNotificationRead($id)\r\n }\r\n\r\n $scope.closeNoticeAlert = function ($event) {\r\n $event.preventDefault()\r\n UI.modal('#noticeAlertWindow').hide()\r\n }\r\n\r\n $scope.showPrivacyPolicyModal = function ($event) {\r\n $event.preventDefault()\r\n\r\n $scope.privacyPolicyWindow = $('#privacyPolicyWindow')\r\n if ($scope.privacyPolicyWindow.length > 0) {\r\n var modal = UI.modal($scope.privacyPolicyWindow, {\r\n bgclose: true\r\n })\r\n\r\n modal.show()\r\n }\r\n }\r\n\r\n $scope.showAllNotifications = function ($event) {\r\n $event.preventDefault()\r\n\r\n $scope.showAllNotificationsWindow = $('#viewAllNotificationsModal')\r\n if ($scope.showAllNotificationsWindow.length > 0) {\r\n socket.ui.emitUpdateAllNotifications()\r\n\r\n var modal = UI.modal($scope.showAllNotificationsWindow, {\r\n bgclose: true\r\n })\r\n\r\n helpers.hideAllpDropDowns()\r\n modal.show()\r\n }\r\n }\r\n })\r\n .directive('closeUkDropdown', function ($document, $timeout) {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element) {\r\n // $document.off('mouseup', mouseup);\r\n // $document.on('mouseup', mouseup);\r\n\r\n element.off('mouseup', mouseup)\r\n element.on('mouseup', mouseup)\r\n\r\n function mouseup () {\r\n var thisDropdown = element.parents('.uk-dropdown')\r\n\r\n thisDropdown.removeClass('uk-dropdown-shown')\r\n\r\n $timeout(function () {\r\n thisDropdown.removeClass('uk-dropdown-active')\r\n thisDropdown\r\n .parents('*[data-uk-dropdown]')\r\n .removeClass('uk-open')\r\n .attr('aria-expanded', false)\r\n }, 280)\r\n }\r\n }\r\n }\r\n })\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/angularjs/controllers/common.js?"); - -/***/ }), - -/***/ "./src/public/js/angularjs/controllers/editor.js": -/*!*******************************************************!*\ - !*** ./src/public/js/angularjs/controllers/editor.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\r\n * . .o8 oooo\r\n * .o8 \"888 `888\r\n * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n * 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n * 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n * \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n * ========================================================================\r\n * Author: Chris Brame\r\n * Updated: 1/20/19 10:03 PM\r\n * Copyright (c) 2014-2019. All rights reserved.\r\n */\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\r\n __webpack_require__(/*! angular */ \"./src/public/js/vendor/angular/angular.min.js\"),\r\n __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"),\r\n __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"),\r\n __webpack_require__(/*! modules/socket */ \"./src/public/js/modules/socket.js\"),\r\n __webpack_require__(/*! uikit */ \"./src/public/js/vendor/uikit/js/uikit_combined.min.js\"),\r\n __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"),\r\n __webpack_require__(/*! grapesjs */ \"./src/public/js/vendor/grapesjs/grapes.min.js\"),\r\n __webpack_require__(/*! grapesjsEmail */ \"./src/public/js/vendor/grapesjs/grapesjs-preset-email.min.js\"),\r\n __webpack_require__(/*! handlebars */ \"./src/public/js/vendor/handlebars/handlebars.js\"),\r\n __webpack_require__(/*! moment */ \"./src/public/js/vendor/moment/moment.js\"),\r\n __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\")\r\n], __WEBPACK_AMD_DEFINE_RESULT__ = (function (angular, _, $, socket, UIKit, helpers, grapesjs, grapesjsEmail, Handlebars, moment) {\r\n return angular\r\n .module('trudesk.controllers.editor', [])\r\n .controller('editorController', function ($scope, $window, $http, $cookies, $timeout, $log) {\r\n $timeout(function () {\r\n Handlebars.registerHelper('formatDate', function (date, format) {\r\n return moment\r\n .utc(date)\r\n .tz(helpers.getTimezone())\r\n .format(format)\r\n })\r\n\r\n var longDateFormat = helpers.getLongDateFormat()\r\n var timeFormat = helpers.getTimeFormat()\r\n var longDateWithTimeFormat = longDateFormat + ' ' + timeFormat\r\n\r\n $(document).ready(function () {\r\n var template = $scope.template\r\n var editor = grapesjs.init({\r\n container: '#web-editor',\r\n plugins: ['gjs-preset-newsletter'],\r\n pluginOpts: {\r\n 'gjs-preset-newsletter': {\r\n modalTitleImport: 'Import template'\r\n }\r\n },\r\n canvas: {\r\n // Workaround for a bug preventing links from being deleted\r\n // https://github.com/artf/grapesjs/issues/1699\r\n notTextable: ['button', 'a', 'input[type=checkbox]', 'input[type=radio]']\r\n },\r\n storageManager: {\r\n type: 'remote',\r\n autosave: false,\r\n urlStore: '/api/v1/editor/save',\r\n urlLoad: '/api/v1/editor/load/' + template,\r\n contentTypeJson: true,\r\n storeStyles: false,\r\n storeComponents: false,\r\n params: { template: template }\r\n },\r\n assetManager: {\r\n upload: '/api/v1/editor/assets/upload',\r\n multiUpload: false\r\n },\r\n commands: {\r\n defaults: [\r\n {\r\n id: 'store-data',\r\n run: function (editor, sender) {\r\n sender.set('active', 0)\r\n editor.store()\r\n }\r\n }\r\n ]\r\n }\r\n })\r\n\r\n // Make sure the editor is really fresh\r\n editor.DomComponents.clear()\r\n editor.CssComposer.clear()\r\n editor.UndoManager.clear()\r\n editor.setComponents()\r\n editor.setStyle()\r\n\r\n var pfx = editor.getConfig().stylePrefix\r\n var modal = editor.Modal\r\n var cmdm = editor.Commands\r\n var codeViewer = editor.CodeManager.getViewer('CodeMirror').clone()\r\n var pnm = editor.Panels\r\n var container = document.createElement('div')\r\n var btnEdit = document.createElement('button')\r\n\r\n codeViewer.set({\r\n codeName: 'htmlmixed',\r\n readOnly: 0,\r\n theme: 'hopscotch',\r\n autoBeautify: true,\r\n autoCloseTags: true,\r\n autoCloseBrackets: true,\r\n lineWrapping: true,\r\n styleActiveLine: true,\r\n smartIndent: true,\r\n indentWithTabs: true\r\n })\r\n\r\n btnEdit.innerHTML = 'Edit'\r\n btnEdit.className = pfx + 'btn-prim ' + pfx + 'btn-import'\r\n btnEdit.onclick = function () {\r\n var code = codeViewer.editor.getValue()\r\n editor.DomComponents.getWrapper().set('content', '')\r\n editor.setComponents(code.trim())\r\n modal.close()\r\n }\r\n\r\n cmdm.add('html-edit', {\r\n run: function (editor, sender) {\r\n sender && sender.set('active', 0)\r\n var viewer = codeViewer.editor\r\n modal.setTitle('Edit code')\r\n if (!viewer) {\r\n var txtarea = document.createElement('textarea')\r\n container.appendChild(txtarea)\r\n container.appendChild(btnEdit)\r\n codeViewer.init(txtarea)\r\n viewer = codeViewer.editor\r\n }\r\n var InnerHtml = editor.getHtml()\r\n var Css = editor.getCss()\r\n modal.setContent('')\r\n modal.setContent(container)\r\n codeViewer.setContent('' + InnerHtml)\r\n modal.open()\r\n viewer.refresh()\r\n }\r\n })\r\n\r\n // pnm.addButton('options', [\r\n // {\r\n // id: 'edit',\r\n // className: 'fa fa-edit',\r\n // command: 'html-edit',\r\n // attributes: {\r\n // title: 'Edit'\r\n // }\r\n // }\r\n // ])\r\n\r\n var comps = editor.DomComponents\r\n var defaultType = comps.getType('default')\r\n var defaultModel = defaultType.model\r\n\r\n var context = {\r\n ticket: {\r\n owner: {},\r\n priority: {\r\n name: 'Normal',\r\n htmlColor: 'green'\r\n },\r\n issue: '{{{ticket.issue}}}',\r\n comments: [\r\n {\r\n date: new Date(),\r\n owner: {\r\n fullname: '{{FULLNAME}}',\r\n email: '{{EMAIL}}'\r\n },\r\n comment: '{{COMMENT TEXT}}'\r\n },\r\n {\r\n date: new Date(),\r\n owner: {\r\n fullname: '{{FULLNAME}}',\r\n email: '{{EMAIL}}'\r\n },\r\n comment: '{{COMMENT TEXT}}'\r\n }\r\n ]\r\n }\r\n }\r\n\r\n comps.addType('handlebars', {\r\n model: defaultModel.extend(\r\n {\r\n defaults: Object.assign({}, defaultModel.prototype.defaults, {\r\n tagName: 'handlebars',\r\n droppable: true,\r\n editable: true\r\n }),\r\n toHTML: function () {\r\n // If I have components I'll follow the original method\r\n // otherwise return the template\r\n if (this.components().length) {\r\n return defaultModel.prototype.toHTML.apply(this, arguments)\r\n } else {\r\n return this.get('components')\r\n }\r\n }\r\n },\r\n {\r\n // isComponent is mandatory when you define new components\r\n isComponent: function (el) {\r\n if (el.tagName === 'HANDLEBARS') return { type: 'handlebars' }\r\n }\r\n }\r\n ),\r\n view: defaultType.view.extend({\r\n onRender: function () {\r\n var $el = this.$el\r\n var model = this.model\r\n var html = model.toHTML()\r\n var template = Handlebars.compile(html)\r\n $el.empty()\r\n $el.append(template(context))\r\n return this\r\n }\r\n })\r\n })\r\n\r\n editor.BlockManager.add('profilePicture', {\r\n label: 'Ticket Owner-Profile Pic',\r\n category: 'Ticket Components',\r\n attributes: { class: 'fa fa-image' },\r\n content: {\r\n type: 'handlebars',\r\n components:\r\n '\\n' +\r\n '{{#if ticket.owner.image}}\\n' +\r\n '\\n' +\r\n '{{else}}\\n' +\r\n '\\n' +\r\n '{{/if}}\\n' +\r\n '\\n'\r\n }\r\n })\r\n\r\n editor.BlockManager.add('ticket-comments', {\r\n label: 'Ticket Comments Loop',\r\n category: 'Ticket Components',\r\n attributes: { class: 'fa fa-comment' },\r\n content: {\r\n type: 'handlebars',\r\n style: { width: '100%' },\r\n components:\r\n '
        \\n' +\r\n '{{#each ticket.comments}}' +\r\n '\\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n '
        \\n' +\r\n ' \\n' +\r\n ' {{#if owner.image}}\\n' +\r\n ' \\n' +\r\n ' {{else}}\\n' +\r\n ' \\n' +\r\n ' {{/if}}\\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n '
        {{owner.fullname}}\\n' +\r\n '
        \\n' +\r\n ' {{owner.email}}\\n' +\r\n '
        {{formatDate date \"' +\r\n longDateWithTimeFormat +\r\n '\"}}
        \\n' +\r\n '
        {{{comment}}}\\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '{{/each}}\\n' +\r\n '
        '\r\n }\r\n })\r\n\r\n editor.BlockManager.add('email-with-fullname', {\r\n label: 'Owner Fullname - Email',\r\n category: 'Ticket Components',\r\n attributes: { class: 'fa fa-envelope' },\r\n content: {\r\n editable: true,\r\n type: 'link',\r\n style: {\r\n color: 'rgb(231, 76, 60)',\r\n 'font-size': '13px',\r\n display: 'inline-block'\r\n },\r\n attributes: { href: 'mailto:{{ticket.owner.email}}' },\r\n content: '{{ticket.owner.fullname}} - {{ticket.owner.email}}'\r\n }\r\n })\r\n\r\n editor.BlockManager.add('view-ticket-button', {\r\n label: 'View Ticket Button',\r\n category: 'Ticket Components',\r\n attributes: { class: 'fa fa-hand-pointer-o' },\r\n content: {\r\n type: 'link',\r\n style: {\r\n padding: '10px 20px',\r\n display: 'inline-block',\r\n color: 'rgb(255, 255, 255)',\r\n 'font-size': '16px',\r\n 'font-weight': 'bold',\r\n 'text-align': 'center',\r\n 'text-decoration': 'none',\r\n background: 'rgb(231, 76, 60)',\r\n 'border-radius': '3px'\r\n },\r\n attributes: { href: '{{base_url}}/tickets/{{ticket.uid}}' },\r\n content: 'View Ticket #{{ticket.uid}}'\r\n }\r\n })\r\n\r\n pnm.addButton('options', {\r\n id: 'save',\r\n className: 'fa fa-save',\r\n command: 'store-data',\r\n attributes: { title: 'Save' }\r\n })\r\n\r\n $http.get('/api/v1/editor/assets').then(\r\n function (res) {\r\n editor.AssetManager.add(res.data.assets)\r\n },\r\n function (err) {\r\n $log.error(err)\r\n helpers.UI.showSnackbar(err.error, true)\r\n }\r\n )\r\n\r\n editor.AssetManager.addType('image', {\r\n view: {\r\n onRemove: function (e) {\r\n var model = this.model\r\n\r\n UIKit.modal.confirm(\r\n 'Are you sure you want to delete asset?',\r\n function () {\r\n $http\r\n .post(\r\n '/api/v1/editor/assets/remove',\r\n {\r\n fileUrl: model.id\r\n },\r\n {\r\n headers: { 'Content-Type': 'application/json' }\r\n }\r\n )\r\n .then(\r\n function () {\r\n model.collection.remove(model)\r\n },\r\n function (err) {\r\n $log.error(err)\r\n helpers.UI.showSnackbar(err.error, true)\r\n }\r\n )\r\n },\r\n {\r\n labels: { Ok: 'Yes', Cancel: 'No' },\r\n confirmButtonClass: 'md-btn-danger'\r\n }\r\n )\r\n }\r\n }\r\n })\r\n\r\n editor.on('asset:upload:error', function (err) {\r\n var errObj = angular.fromJson(err)\r\n $log.error(errObj)\r\n helpers.UI.showSnackbar('Error: ' + errObj.error.message, true)\r\n })\r\n\r\n editor.on('storage:start:store', function (objectToStore) {\r\n objectToStore.assets = '[]'\r\n objectToStore.fullHtml =\r\n '\\n' +\r\n '\\n' +\r\n '\\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n '\\n' +\r\n '' +\r\n editor.runCommand('gjs-get-inlined-html') +\r\n '\\n' +\r\n ''\r\n })\r\n\r\n editor.on('storage:end:store', function (result) {\r\n if (result.success) {\r\n helpers.UI.showSnackbar('Saved template successfully.')\r\n }\r\n })\r\n\r\n editor.on('storage:error', function (err) {\r\n var errObj = angular.fromJson(err)\r\n $log.error(errObj)\r\n helpers.UI.showSnackbar('Error: ' + errObj.error.message, true)\r\n if (errObj.invalid) {\r\n $('#web-editor').remove()\r\n $('#web-editor-invalid-notification')\r\n .removeClass('hide')\r\n .parent()\r\n .css('position', 'relative')\r\n setTimeout(function () {\r\n $window.location.href = '/settings/mailer'\r\n }, 3000)\r\n }\r\n })\r\n })\r\n }, 0)\r\n })\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/angularjs/controllers/editor.js?"); - -/***/ }), - -/***/ "./src/public/js/angularjs/controllers/groups.js": -/*!*******************************************************!*\ - !*** ./src/public/js/angularjs/controllers/groups.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 02/10/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\r\n __webpack_require__(/*! angular */ \"./src/public/js/vendor/angular/angular.min.js\"),\r\n __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"),\r\n __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"),\r\n __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"),\r\n __webpack_require__(/*! uikit */ \"./src/public/js/vendor/uikit/js/uikit_combined.min.js\"),\r\n __webpack_require__(/*! jquery_custom */ \"./src/public/js/plugins/jquery.custom.js\"),\r\n __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\"),\r\n __webpack_require__(/*! multiselect */ \"./src/public/js/vendor/multiselect/js/jquery.multi-select.js\")\r\n], __WEBPACK_AMD_DEFINE_RESULT__ = (function (angular, _, $, helpers, UIkit) {\r\n return angular\r\n .module('trudesk.controllers.groups', [])\r\n .controller('groupsCtrl', function ($scope, $http, $timeout, $log) {\r\n $scope.editGroup = function ($event) {\r\n if (_.isNull($event.target) || _.isUndefined($event.target)) {\r\n return false\r\n }\r\n var self = $($event.target)\r\n var groupId = self.attr('data-group-id')\r\n\r\n $http\r\n .get('/api/v1/groups/' + groupId)\r\n .success(function (data) {\r\n var group = data.group\r\n var form = $('#editGroupForm')\r\n form.find('#__EditId').text(group._id)\r\n form\r\n .find('#gName')\r\n .val(group.name)\r\n .parent()\r\n .addClass('md-input-filled')\r\n var mappedMembers = _.map(group.members, '_id')\r\n var mappedSendMailTo = _.map(group.sendMailTo, '_id')\r\n\r\n form.find('#gMembers').multiSelect('deselect_all')\r\n form.find('#gMembers').multiSelect('select', mappedMembers)\r\n form.find('#gSendMailTo').multiSelect('deselect_all')\r\n form.find('#gSendMailTo').multiSelect('select', mappedSendMailTo)\r\n\r\n UIkit.modal('#groupEditModal').show()\r\n })\r\n .error(function (err) {\r\n $log.log('[trudesk:groups:editGroup] - Error: ' + err)\r\n helpers.UI.showSnackbar(err, true)\r\n })\r\n }\r\n\r\n $scope.saveEditGroup = function ($event) {\r\n var id = $($event.target)\r\n .parents('form')\r\n .find('#__EditId')\r\n .text()\r\n if (_.isUndefined(id)) {\r\n helpers.UI.showSnackbar('Unable to get Group ID', true)\r\n return false\r\n }\r\n var $form = $('#editGroupForm')\r\n var formData = $form.serializeObject()\r\n var members = $form.find('#gMembers').val()\r\n var sendMailTo = $form.find('#gSendMailTo').val()\r\n\r\n var apiData = {\r\n name: formData.gName,\r\n members: members,\r\n sendMailTo: sendMailTo\r\n }\r\n\r\n $http({\r\n method: 'PUT',\r\n url: '/api/v1/groups/' + id,\r\n data: apiData,\r\n headers: { 'Content-Type': 'application/json' }\r\n })\r\n .success(function () {\r\n helpers.UI.showSnackbar('Group Saved Successfully', false)\r\n UIkit.modal('#groupEditModal').hide()\r\n // Refresh Grid\r\n refreshGrid()\r\n })\r\n .error(function (err) {\r\n $log.log('[trudesk:groups:saveEditGroup] - Error: ' + err)\r\n helpers.UI.showSnackbar(err.error, true)\r\n })\r\n }\r\n\r\n $scope.createGroup = function () {\r\n var formData = $('#createGroupForm').serializeObject()\r\n var apiData = {\r\n name: formData.gName,\r\n members: formData.gMembers,\r\n sendMailTo: formData.gSendMailTo\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: '/api/v1/groups/create',\r\n data: apiData,\r\n headers: { 'Content-Type': 'application/json' }\r\n })\r\n .success(function () {\r\n helpers.UI.showSnackbar('Group Created Successfully', false)\r\n UIkit.modal('#groupCreateModal').hide()\r\n // Refresh Grid\r\n $timeout(function () {\r\n refreshGrid()\r\n }, 0)\r\n })\r\n .error(function (err) {\r\n $log.log('[trudesk:groups:createGroup] - Error: ' + err)\r\n helpers.UI.showSnackbar(err, true)\r\n })\r\n }\r\n\r\n $scope.deleteGroup = function (event) {\r\n event.preventDefault()\r\n var self = $(event.currentTarget)\r\n var groupID = self.attr('data-group-id')\r\n var card = self.parents('.tru-card-wrapper')\r\n if (groupID) {\r\n UIkit.modal.confirm(\r\n 'Are you sure you want to delete group: ' + card.find('h3').attr('data-group-name') + '',\r\n function () {\r\n helpers.showLoader(0.8)\r\n $http\r\n .delete('/api/v1/groups/' + groupID)\r\n .success(function () {\r\n helpers.hideLoader()\r\n helpers.UI.showSnackbar('Group Successfully Deleted', false)\r\n\r\n card.remove()\r\n UIkit.$html.trigger('changed.uk.dom')\r\n })\r\n .error(function (err) {\r\n helpers.hideLoader()\r\n $log.log('[trudesk:groups:deleteGroup] - Error: ' + err.error)\r\n helpers.UI.showSnackbar(err.error, true)\r\n })\r\n },\r\n {\r\n labels: { Ok: 'Yes', Cancel: 'No' },\r\n confirmButtonClass: 'md-btn-danger'\r\n }\r\n )\r\n }\r\n }\r\n\r\n function refreshGrid () {\r\n var $cards = $('#group_list').find('.tru-card-wrapper')\r\n $cards.each(function () {\r\n var vm = this\r\n var self = $(vm)\r\n self.remove()\r\n })\r\n\r\n $http\r\n .get('/api/v1/groups/all')\r\n .success(function (data) {\r\n var $groupList = $('#group_list')\r\n\r\n var html = ''\r\n _.each(data.groups, function (group) {\r\n html += buildHTML(group)\r\n })\r\n\r\n var $injector = angular.injector(['ng', 'trudesk'])\r\n $injector.invoke([\r\n '$compile',\r\n '$rootScope',\r\n function ($compile, $rootScope) {\r\n var $scope = $groupList.append(html).scope()\r\n $compile($groupList)($scope || $rootScope)\r\n $rootScope.$digest()\r\n }\r\n ])\r\n\r\n UIkit.$html.trigger('changed.uk.dom')\r\n })\r\n .error(function (err) {\r\n $log.log('[trudesk:groups:refreshGrid] - Error: ' + err.error)\r\n helpers.UI.showSnackbar(err.error, true)\r\n })\r\n }\r\n\r\n function buildHTML (group) {\r\n var html = ''\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n html += ''\r\n html += '
        '\r\n html += '
          '\r\n html +=\r\n '
        • Edit
        • '\r\n html +=\r\n '
        • Remove
        • '\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n html += '

        '\r\n html += group.name\r\n html += ''\r\n html += _.size(group.members).toString() + ' ' + (_.size(group.members) === 1 ? 'member' : 'members')\r\n html += ''\r\n html += '

        '\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n\r\n return html\r\n }\r\n })\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/angularjs/controllers/groups.js?"); - -/***/ }), - -/***/ "./src/public/js/angularjs/controllers/messages.js": -/*!*********************************************************!*\ - !*** ./src/public/js/angularjs/controllers/messages.js ***! - \*********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 05/22/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\r\n __webpack_require__(/*! angular */ \"./src/public/js/vendor/angular/angular.min.js\"),\r\n __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"),\r\n __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"),\r\n __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"),\r\n __webpack_require__(/*! modules/socket */ \"./src/public/js/modules/socket.js\"),\r\n __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\"),\r\n __webpack_require__(/*! angularjs/services/session */ \"./src/public/js/angularjs/services/session.js\")\r\n], __WEBPACK_AMD_DEFINE_RESULT__ = (function (angular, _, $, helpers, socket) {\r\n return angular\r\n .module('trudesk.controllers.messages', ['trudesk.services.session'])\r\n .controller('messagesCtrl', function (SessionService, $scope, $document, $http, $window, $cookies, $timeout, $log) {\r\n $scope.loadConversation = function (convoId) {\r\n History.pushState(null, null, '/messages/' + convoId)\r\n }\r\n\r\n $scope.sendChatMessage = function (cid, toUserId, event) {\r\n var form = $(event.target)\r\n if (form.length < 1) return false\r\n\r\n var input = form.find('input[name=\"chatMessage\"]')\r\n\r\n if (input.val().length < 1) {\r\n return false\r\n }\r\n\r\n socket.chat.sendChatMessage(cid, toUserId, input.val(), function (err) {\r\n if (err) $log.warn(err)\r\n input.val('')\r\n\r\n socket.chat.stopTyping(cid, toUserId)\r\n })\r\n\r\n event.preventDefault()\r\n }\r\n\r\n $scope.onKeyDown = function (cid, toUserId, $event) {\r\n if ($event.keyCode !== 13) {\r\n socket.chat.startTyping(cid, toUserId)\r\n }\r\n }\r\n\r\n $scope.showUserList = function ($event, callback) {\r\n if (!_.isUndefined($event)) {\r\n $event.preventDefault()\r\n }\r\n var convoList = $document[0].getElementById('convo-list')\r\n convoList.style.transition = 'opacity 0.25s'\r\n convoList.style.opacity = 0\r\n\r\n var allUserList = $document[0].getElementById('new-convo-user-list')\r\n allUserList.style.opacity = 0\r\n allUserList.classList.remove('hide')\r\n allUserList.style.display = 'block'\r\n allUserList.style.transition = 'opacity 0.25s'\r\n\r\n $timeout(function () {\r\n convoList.style.display = 'none'\r\n\r\n allUserList.style.opacity = 1\r\n\r\n var actions = $document[0].getElementById('convo-actions').children\r\n ;[].forEach.call(actions, function (el) {\r\n if (el.style.display === 'none') {\r\n el.style.display = 'block'\r\n } else {\r\n el.style.display = 'none'\r\n }\r\n })\r\n\r\n // if ($('.all-user-list').getNiceScroll(0) != false) {\r\n // $('.all-user-list').getNiceScroll(0).resize();\r\n // }\r\n\r\n if (_.isFunction(callback)) {\r\n return callback()\r\n }\r\n }, 200)\r\n }\r\n\r\n $scope.hideUserList = function ($event) {\r\n if (!_.isUndefined($event)) {\r\n $event.preventDefault()\r\n }\r\n var allUserList = $document[0].getElementById('new-convo-user-list')\r\n allUserList.style.transition = 'opacity 0.25s'\r\n allUserList.style.opacity = 0\r\n\r\n var convoList = $document[0].getElementById('convo-list')\r\n convoList.style.transition = 'opacity 0.25s'\r\n convoList.style.opacity = 0\r\n\r\n $timeout(function () {\r\n allUserList.style.display = 'none'\r\n convoList.style.display = 'block'\r\n\r\n convoList.style.opacity = 1\r\n\r\n $document[0].querySelector('.search-box > input').value = ''\r\n $('.all-user-list li').each(function () {\r\n var vm = this\r\n $(vm).show()\r\n })\r\n\r\n var actions = $document[0].getElementById('convo-actions').children\r\n ;[].forEach.call(actions, function (el) {\r\n if (el.style.display === 'none') {\r\n el.style.display = 'block'\r\n } else {\r\n el.style.display = 'none'\r\n }\r\n })\r\n }, 200)\r\n }\r\n\r\n $scope.showNewConvo = $('#__showNewConvo').text()\r\n if ($scope.showNewConvo.length > 0) {\r\n $scope.showUserList(undefined, function () {\r\n return _.defer(function () {\r\n helpers.resizeFullHeight()\r\n helpers.hideAllpDropDowns()\r\n }, 500)\r\n })\r\n }\r\n\r\n $scope.startNewConversation = function (userId) {\r\n var $loggedInAccountId = SessionService.getUser()._id\r\n $http\r\n .post('/api/v1/messages/conversation/start', {\r\n owner: $loggedInAccountId,\r\n participants: [userId, $loggedInAccountId]\r\n })\r\n .then(\r\n function (response) {\r\n var conversation = response.data.conversation\r\n if (!_.isUndefined(conversation)) {\r\n History.pushState(null, null, '/messages/' + conversation._id)\r\n }\r\n },\r\n function (err) {\r\n $log.error('[trudesk.Messages.startNewConversation()] - Error: ')\r\n $log.error(err)\r\n }\r\n )\r\n }\r\n })\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/angularjs/controllers/messages.js?"); - -/***/ }), - -/***/ "./src/public/js/angularjs/controllers/notices.js": -/*!********************************************************!*\ - !*** ./src/public/js/angularjs/controllers/notices.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 02/10/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! angular */ \"./src/public/js/vendor/angular/angular.min.js\"), __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"), __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"), __webpack_require__(/*! modules/socket */ \"./src/public/js/modules/socket.js\"), __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (\r\n angular,\r\n _,\r\n $,\r\n helpers,\r\n socketClient\r\n) {\r\n return angular.module('trudesk.controllers.notices', []).controller('noticesCtrl', function ($scope, $http, $log) {\r\n $scope.editNotice = function ($event) {\r\n if (\r\n _.isNull($event.target) ||\r\n _.isUndefined($event.target) ||\r\n $event.target.tagName.toLowerCase() === 'label' ||\r\n $event.target.tagName.toLowerCase() === 'input'\r\n ) {\r\n return true\r\n }\r\n\r\n // currentTarget = ng-click() bound to. \"\"\r\n var id = $event.currentTarget.dataset.noticeoid\r\n if (!id) return true\r\n\r\n History.pushState(null, null, '/notices/' + id)\r\n }\r\n\r\n $scope.submitCreateNoticeForm = function (event) {\r\n event.preventDefault()\r\n var formData = $('#createNoticeForm').serializeObject()\r\n if (!formData.nName || !formData.nMessage) return false\r\n var apiData = {\r\n name: formData.nName,\r\n message: formData.nMessage,\r\n color: formData.nColor,\r\n fontColor: formData.nFontColor,\r\n alertWindow: formData.nAlertWindow === 'on'\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: '/api/v1/notices/create',\r\n data: apiData,\r\n headers: { 'Content-Type': 'application/json' }\r\n })\r\n .success(function () {\r\n helpers.UI.showSnackbar('Notice Created Successfully.', false)\r\n\r\n History.pushState(null, null, '/notices/')\r\n })\r\n .error(function (err) {\r\n $log.log('[trudesk:notices:submitCreateNoticeForm] - ' + err)\r\n helpers.UI.showSnackbar(err, true)\r\n })\r\n }\r\n\r\n $scope.submitEditNoticeForm = function (event) {\r\n event.preventDefault()\r\n var noticeId = $('#__noticeId').text()\r\n var formData = $('#editNoticeForm').serializeObject()\r\n var apiData = {\r\n name: formData.nName,\r\n message: formData.nMessage,\r\n color: formData.nColor,\r\n fontColor: formData.nFontColor,\r\n alertWindow: formData.nAlertWindow === 'on'\r\n }\r\n\r\n $http({\r\n method: 'PUT',\r\n url: '/api/v1/notices/' + noticeId,\r\n data: apiData,\r\n headers: { 'Content-Type': 'application/json' }\r\n })\r\n .success(function () {\r\n helpers.UI.showSnackbar('Notice Saved Successfully.', false)\r\n\r\n History.pushState(null, null, '/notices/')\r\n })\r\n .error(function (err) {\r\n $log.log('[trudesk:notices:submitEditNoticeForm] - ' + err)\r\n helpers.UI.showSnackbar(err, true)\r\n })\r\n }\r\n\r\n $scope.activateNotice = function () {\r\n var id = getChecked()\r\n if (id.length < 1) return true\r\n id = id[0]\r\n var $data = { active: true }\r\n\r\n $http\r\n .get('/api/v1/notices/clearactive')\r\n .success(function () {\r\n $http({\r\n method: 'PUT',\r\n url: '/api/v1/notices/' + id,\r\n data: $data,\r\n headers: { 'Content-Type': 'application/json' }\r\n })\r\n .success(function () {\r\n socketClient.ui.setShowNotice(id)\r\n\r\n helpers.UI.showSnackbar('Notice has been activated', false)\r\n\r\n clearChecked()\r\n History.pushState(null, null, '/notices/')\r\n })\r\n .error(function (err) {\r\n $log.log('[trudesk:notices:activateNotice] - ' + err)\r\n helpers.UI.showSnackbar(err, true)\r\n })\r\n })\r\n .error(function () {})\r\n\r\n helpers.hideAllpDropDowns()\r\n }\r\n\r\n $scope.clearNotice = function () {\r\n $http\r\n .get('/api/v1/notices/clearactive')\r\n .success(function () {\r\n socketClient.ui.setClearNotice()\r\n\r\n helpers.UI.showSnackbar('Notice has been deactivated', false)\r\n })\r\n .error(function (err) {\r\n $log.log('[trudesk:notices:clearNotice] - ' + err)\r\n helpers.UI.showSnackbar({\r\n text: 'Error: ' + err.message,\r\n actionTextColor: '#B92929'\r\n })\r\n })\r\n\r\n helpers.hideAllpDropDowns()\r\n }\r\n\r\n $scope.deleteNotices = function () {\r\n var ids = getChecked()\r\n _.each(ids, function (id) {\r\n $http\r\n .delete('/api/v1/notices/' + id)\r\n .success(function (data) {\r\n if (!data.success) {\r\n helpers.UI.showSnackbar({\r\n text: 'Error: ' + data.error,\r\n actionTextColor: '#B92929'\r\n })\r\n return\r\n }\r\n\r\n removeCheckedFromGrid(id)\r\n helpers.resizeDataTables('.noticesList')\r\n helpers.UI.showSnackbar({ text: 'Notice Successfully Deleted' })\r\n })\r\n .error(function (err) {\r\n $log.log('[trudesk:notices:deleteNotices] - ' + err)\r\n helpers.UI.showSnackbar({\r\n text: 'Error: ' + err,\r\n actionTextColor: '#B92929'\r\n })\r\n })\r\n })\r\n }\r\n\r\n function clearChecked () {\r\n $('#noticesTable input[type=\"checkbox\"]:checked').each(function () {\r\n var vm = this\r\n\r\n var self = $(vm)\r\n\r\n self.prop('checked', false)\r\n })\r\n }\r\n\r\n function getChecked () {\r\n var checkedIds = []\r\n $('#noticesTable input[type=\"checkbox\"]:checked').each(function () {\r\n var vm = this\r\n\r\n var self = $(vm)\r\n\r\n var $noticeTR = self.parents('tr')\r\n if (!_.isUndefined($noticeTR)) {\r\n var noticeOId = $noticeTR.attr('data-noticeOId')\r\n\r\n if (!_.isUndefined(noticeOId) && noticeOId.length > 0) {\r\n checkedIds.push(noticeOId)\r\n }\r\n }\r\n })\r\n\r\n return checkedIds\r\n }\r\n\r\n function removeCheckedFromGrid (id) {\r\n $('#noticesTable #c_' + id + '[type=\"checkbox\"]:checked').each(function () {\r\n var vm = this\r\n\r\n var self = $(vm)\r\n\r\n var $noticeTR = self.parents('tr')\r\n if (!_.isUndefined($noticeTR)) {\r\n $noticeTR.remove()\r\n }\r\n })\r\n }\r\n })\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/angularjs/controllers/notices.js?"); - -/***/ }), - -/***/ "./src/public/js/angularjs/controllers/plugins.js": -/*!********************************************************!*\ - !*** ./src/public/js/angularjs/controllers/plugins.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 02/10/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! angular */ \"./src/public/js/vendor/angular/angular.min.js\"), __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"), __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"), __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (angular, _, $, helpers) {\r\n return angular\r\n .module('trudesk.controllers.plugins', [])\r\n .controller('pluginsCtrl', function ($scope, $http, $log, $timeout, $window) {\r\n var $tableBody = $('#plugin_list_table > tbody')\r\n\r\n $scope.installedPlugins = []\r\n\r\n var pluginUrl = 'http://_plugins.trudesk.io'\r\n\r\n $scope.init = function () {\r\n $scope.installedPlugins = angular.fromJson($scope.installedPlugins)\r\n $http({\r\n method: 'GET',\r\n url: pluginUrl + '/api/plugins',\r\n headers: { 'Content-Type': 'apllication/json' }\r\n })\r\n .success(function (data) {\r\n if (!data.success) {\r\n if (data.error) {\r\n helpers.UI.showSnackbar({\r\n text: 'Error: ' + data.error,\r\n actionTextColor: '#B92929'\r\n })\r\n return\r\n }\r\n\r\n helpers.UI.showSnackbar({\r\n text: 'Error getting plugin list!',\r\n actionTextColor: '#B92929'\r\n })\r\n }\r\n\r\n var plugins = _.sortBy(data.plugins, 'name')\r\n $tableBody.children().remove()\r\n var html = ''\r\n\r\n _.each(plugins, function (p) {\r\n var description = 'No Description Set'\r\n if (p.pluginjson.description) description = p.pluginjson.description\r\n\r\n var loadedPlugin = _.findWhere($scope.installedPlugins, {\r\n name: p.name\r\n })\r\n var hasPluginInstalled = angular.isDefined(loadedPlugin)\r\n var update = false\r\n if (hasPluginInstalled) {\r\n update = compareVersions(loadedPlugin.version, '<', p.pluginjson.version)\r\n }\r\n var canUserManage = helpers.canUser('plugins:manage')\r\n\r\n html += ''\r\n html += '' + p.name.toLowerCase() + ''\r\n html += '' + description + ''\r\n html += '' + p.pluginjson.version + ''\r\n if (canUserManage) {\r\n if (hasPluginInstalled) {\r\n html +=\r\n ''\r\n if (update) {\r\n html +=\r\n ''\r\n }\r\n html += ''\r\n } else {\r\n html +=\r\n ''\r\n }\r\n } else {\r\n html += ''\r\n }\r\n\r\n html += ''\r\n })\r\n\r\n var $injector = angular.injector(['ng', 'trudesk'])\r\n $injector.invoke([\r\n '$compile',\r\n '$rootScope',\r\n function ($compile, $rootScope) {\r\n var $scope = $tableBody.append(html).scope()\r\n $compile($tableBody)($scope || $rootScope)\r\n $rootScope.$digest()\r\n }\r\n ])\r\n })\r\n .error(function (err) {\r\n if (err) {\r\n $log.error('[trudesk:plugins:init] - ' + err.error.message)\r\n helpers.UI.showSnackbar({\r\n text: 'Error: ' + err.error.message,\r\n actionTextColor: '#B92929'\r\n })\r\n }\r\n\r\n var html =\r\n 'Unable to load plugin list!'\r\n\r\n $tableBody.children().remove()\r\n $tableBody.append(html)\r\n })\r\n }\r\n\r\n $scope.installPlugin = function (pluginId) {\r\n $http({\r\n url: '/api/v1/plugins/install/' + pluginId,\r\n method: 'GET',\r\n headers: { 'Content-Type': 'apllication/json' }\r\n })\r\n .success(function (data) {\r\n if (!data.success) {\r\n if (data.error) {\r\n helpers.UI.showSnackbar({\r\n text: 'Error: ' + data.error,\r\n actionTextColor: '#B92929'\r\n })\r\n return\r\n }\r\n\r\n helpers.UI.showSnackbar({\r\n text: 'Error installing plugin!',\r\n actionTextColor: '#B92929'\r\n })\r\n }\r\n\r\n // Real Success\r\n helpers.UI.showSnackbar({\r\n text: 'Installed Plugin. Restarting Server...'\r\n })\r\n $('#serverRestarting').removeClass('hide')\r\n $timeout(function () {\r\n $window.location.reload()\r\n }, 5000)\r\n })\r\n .error(function (err) {\r\n if (err) {\r\n $log.error('[trudesk:plugins:installPlugin] - ' + err.error.message)\r\n helpers.UI.showSnackbar({\r\n text: 'Error: ' + err.error.message,\r\n actionTextColor: '#B92929'\r\n })\r\n }\r\n })\r\n }\r\n\r\n $scope.removePlugin = function (pluginId) {\r\n $http({\r\n url: '/api/v1/plugins/remove/' + pluginId,\r\n method: 'DELETE'\r\n })\r\n .success(function (data) {\r\n if (!data.success) {\r\n if (data.error) {\r\n helpers.UI.showSnackbar({\r\n text: 'Error: ' + data.error,\r\n actionTextColor: '#B92929'\r\n })\r\n return\r\n }\r\n\r\n helpers.UI.showSnackbar({\r\n text: 'Error removing plugin!',\r\n actionTextColor: '#B92929'\r\n })\r\n }\r\n\r\n // Real Success\r\n helpers.UI.showSnackbar({\r\n text: 'Removed Plugin. Restarting Server...'\r\n })\r\n $('#serverRestarting').removeClass('hide')\r\n $timeout(function () {\r\n $window.location.reload()\r\n }, 5000)\r\n })\r\n .error(function (err) {\r\n if (err) {\r\n $log.error('[trudesk:plugins:removePlugin] - ' + err.error.message)\r\n helpers.UI.showSnackbar({\r\n text: 'Error: ' + err.error.message,\r\n actionTextColor: '#B92929'\r\n })\r\n }\r\n })\r\n }\r\n\r\n function compareVersions (v1, comparator, v2) {\r\n 'use strict'\r\n comparator = comparator === '=' ? '==' : comparator\r\n if (['==', '===', '<', '<=', '>', '>=', '!=', '!=='].indexOf(comparator) === -1) {\r\n throw new Error('Invalid comparator. ' + comparator)\r\n }\r\n\r\n var v1parts = v1.split('.')\r\n var v2parts = v2.split('.')\r\n var maxLen = Math.max(v1parts.length, v2parts.length)\r\n var part1, part2\r\n var cmp = 0\r\n for (var i = 0; i < maxLen && !cmp; i++) {\r\n part1 = parseInt(v1parts[i], 10) || 0\r\n part2 = parseInt(v2parts[i], 10) || 0\r\n if (part1 < part2) {\r\n cmp = 1\r\n }\r\n if (part1 > part2) {\r\n cmp = -1\r\n }\r\n }\r\n // eslint-disable-next-line\r\n return eval('0' + comparator + cmp)\r\n }\r\n })\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/angularjs/controllers/plugins.js?"); - -/***/ }), - -/***/ "./src/public/js/angularjs/controllers/profile.js": -/*!********************************************************!*\ - !*** ./src/public/js/angularjs/controllers/profile.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 02/10/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\r\n __webpack_require__(/*! angular */ \"./src/public/js/vendor/angular/angular.min.js\"),\r\n __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"),\r\n __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"),\r\n __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"),\r\n __webpack_require__(/*! uikit */ \"./src/public/js/vendor/uikit/js/uikit_combined.min.js\"),\r\n __webpack_require__(/*! qrcode */ \"./src/public/js/vendor/qrcode/jquery.qrcode.min.js\"),\r\n __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\"),\r\n __webpack_require__(/*! angularjs/services/session */ \"./src/public/js/angularjs/services/session.js\")\r\n], __WEBPACK_AMD_DEFINE_RESULT__ = (function (angular, _, $, helpers, UIKit) {\r\n return angular\r\n .module('trudesk.controllers.profile', ['trudesk.services.session'])\r\n .controller('profileCtrl', function (SessionService, $scope, $window, $http, $log, $timeout) {\r\n $scope.init = function () {\r\n // Fix Inputs if input is preloaded with a value\r\n fixInputLabels()\r\n }\r\n\r\n function fixInputLabels () {\r\n $timeout(function () {\r\n $('input.md-input').each(function () {\r\n var vm = this\r\n var self = $(vm)\r\n if (!_.isEmpty(self.val())) {\r\n var s = self.parent('.md-input-wrapper')\r\n if (s.length > 0) {\r\n s.addClass('md-input-filled')\r\n }\r\n }\r\n })\r\n }, 0)\r\n }\r\n\r\n $scope.updateUser = function ($event) {\r\n $event.preventDefault()\r\n\r\n var id = $('div[data-user_id]').attr('data-user_id')\r\n if (_.isUndefined(id)) return\r\n var data = getFormData()\r\n\r\n $http\r\n .put('/api/v1/users/' + data.username, {\r\n aId: id,\r\n aFullname: data.fullname,\r\n aPass: data.password,\r\n aPassConfirm: data.cPassword,\r\n aEmail: data.email,\r\n\r\n saveGroups: false\r\n })\r\n .success(function () {\r\n resetForm()\r\n helpers.UI.showSnackbar({\r\n text: 'Profile Successfully Saved',\r\n textColor: '#f8f8f2'\r\n })\r\n })\r\n .error(function (e) {\r\n $log.log('[trudesk:profile:updateUser] - ' + e.error.message)\r\n helpers.UI.showSnackbar('Error ' + e.error.message, true)\r\n })\r\n }\r\n\r\n $scope.showTour = function () {\r\n var username = SessionService.getUser().username\r\n $http\r\n .put('/api/v1/users/' + username + '/updatepreferences', {\r\n preference: 'tourCompleted',\r\n value: false\r\n })\r\n .success(function () {\r\n $window.location.href = '/'\r\n })\r\n .error(function (e) {\r\n $log.log('[trudesk:profile:showTour] - ' + e.error.message)\r\n helpers.UI.showSnackbar('Error ' + e.error.message, true)\r\n })\r\n }\r\n\r\n $scope.back = function ($event) {\r\n History.go(-1)\r\n $event.preventDefault()\r\n }\r\n\r\n $scope.generateApiKey = function ($event) {\r\n $event.preventDefault()\r\n\r\n var id = $('div[data-user_id]').attr('data-user_id')\r\n if (_.isUndefined(id)) return\r\n\r\n $http\r\n .post('/api/v1/users/' + id + '/generateapikey')\r\n .success(function (tokenJson) {\r\n $('#aApiKey').val(tokenJson.token)\r\n $('.removeApiButton').removeClass('hide')\r\n $('.generateApiButton').addClass('hide')\r\n // helpers.showFlash('API Key Successfully Generated');\r\n helpers.UI.showSnackbar('API Key Successfully Generated', false)\r\n })\r\n .error(function (e) {\r\n $log.log('[trudesk:profile:generateApiKey] - ' + e)\r\n // helpers.showFlash('Error: ' + e, true);\r\n helpers.UI.showSnackbar('Error: Unable to generate API Key!', true)\r\n })\r\n }\r\n\r\n $scope.removeApiKey = function ($event) {\r\n $event.preventDefault()\r\n\r\n var id = $('div[data-user_id]').attr('data-user_id')\r\n if (_.isUndefined(id)) return\r\n\r\n $http\r\n .post('/api/v1/users/' + id + '/removeapikey')\r\n .success(function () {\r\n $('#aApiKey').val('')\r\n $('.generateApiButton').removeClass('hide')\r\n $('.removeApiButton').addClass('hide')\r\n helpers.UI.showSnackbar('API Key Successfully Revoked', false)\r\n })\r\n .error(function (e) {\r\n $log.log('[trudesk:profile:removeApiKey]', e)\r\n helpers.UI.showSnackbar('Error: Unable to remove API Key!', true)\r\n })\r\n }\r\n\r\n $scope.otpChange = function (event) {\r\n var $totpSettings = $('.totp-settings-wrap')\r\n var $totpPanel = $totpSettings.find('.panel-body2')\r\n var $tOTPKey = $totpSettings.find('#tOTPKey')\r\n var $qrCode = $totpSettings.find('#totp-qrcode')\r\n event.preventDefault()\r\n\r\n if ($scope.otpEnabled) {\r\n UIKit.modal.confirm(\r\n 'WARNING: Disabling Two Factor Authentication will remove your shared secret. A new key will generate when re-enabled.
        ' +\r\n 'Are you sure you want to disable two factor authentication?',\r\n function () {\r\n removeL2Auth(function (err) {\r\n if (err) {\r\n $log.error(err)\r\n }\r\n\r\n angular.element(event.target).attr('checked', false)\r\n $totpPanel.slideUp(400, function () {\r\n $totpPanel.css({ overflow: 'hidden', margin: 0 })\r\n $qrCode.find('canvas').remove()\r\n $tOTPKey.val()\r\n $timeout(function () {\r\n $scope.otpEnabled = false\r\n }, 0)\r\n })\r\n })\r\n },\r\n {\r\n labels: { Ok: 'Yes', Cancel: 'No' }\r\n }\r\n )\r\n } else {\r\n generateL2Auth(function (err, key) {\r\n if (err) {\r\n $log.error(err)\r\n helpers.UI.showSnackbar('An unknown error occurred. Check console.', true)\r\n return\r\n }\r\n\r\n $timeout(function () {\r\n $scope.otpEnabled = true\r\n angular.element(event.target).prop('checked', true)\r\n }, 0)\r\n\r\n var host = $('div[data-host]').attr('data-host')\r\n var username = SessionService.getUser().username\r\n var qrKey =\r\n 'otpauth://totp/' +\r\n host +\r\n '-' +\r\n username +\r\n ':' +\r\n host +\r\n '-' +\r\n username +\r\n '?secret=' +\r\n key +\r\n '&issuer=Trudesk'\r\n $qrCode.qrcode({ width: 242, height: 242, text: qrKey })\r\n $tOTPKey.val(key)\r\n $totpPanel.css({ margin: '10px 7px 7px 7px' })\r\n $totpPanel.find('input').removeClass('hide')\r\n $totpPanel.removeClass('hide')\r\n fixInputLabels()\r\n $totpPanel.slideDown()\r\n // }\r\n })\r\n }\r\n }\r\n\r\n function generateL2Auth (completed) {\r\n var id = SessionService.getUser()._id\r\n if (_.isUndefined(id)) {\r\n return helpers.UI.showSnackbar('Unable to get user ID.', true)\r\n }\r\n\r\n $http.post('/api/v1/users/' + id + '/generatel2auth').then(\r\n function success (response) {\r\n if (!response.data.success) {\r\n helpers.UI.showSnackbar('Error: Unknown error has occurred.', true)\r\n if (_.isFunction(completed)) {\r\n return completed('Error: Unknown error has occurred.')\r\n }\r\n } else {\r\n // Success\r\n if (_.isFunction(completed)) {\r\n completed(null, response.data.generatedKey)\r\n }\r\n }\r\n },\r\n function error (err) {\r\n $log.error('[trudesk:profile:generateL2Auth]')\r\n $log.error(err)\r\n helpers.UI.showSnackbar('Error: Could not generate new secret! Check Console', true)\r\n if (_.isFunction(completed)) {\r\n completed(err)\r\n }\r\n }\r\n )\r\n }\r\n\r\n function removeL2Auth (completed) {\r\n var id = SessionService.getUser()._id\r\n if (_.isUndefined(id)) {\r\n return helpers.UI.showSnackbar('Unable to get user ID.', true)\r\n }\r\n\r\n $http\r\n .post('/api/v1/users/' + id + '/removel2auth')\r\n .success(function () {\r\n if (_.isFunction(completed)) {\r\n completed()\r\n }\r\n })\r\n .error(function (e) {\r\n $log.error('[trudesk:profile:removeL2Auth]')\r\n $log.error(e)\r\n helpers.UI.showSnackbar('Error: Could not remove. Check Console', true)\r\n if (_.isFunction(completed)) {\r\n completed(e)\r\n }\r\n })\r\n }\r\n\r\n function getFormData () {\r\n var data = {}\r\n data.username = $('#aUsername').val()\r\n data.fullname = $('#aFullname').val()\r\n data.password = $('#aPass').val()\r\n data.cPassword = $('#aPassConfirm').val()\r\n data.email = $('#aEmail').val()\r\n\r\n return data\r\n }\r\n\r\n function resetForm () {\r\n $('#aPass').val('')\r\n $('#aPassConfirm').val('')\r\n }\r\n })\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/angularjs/controllers/profile.js?"); - -/***/ }), - -/***/ "./src/public/js/angularjs/controllers/reports.js": -/*!********************************************************!*\ - !*** ./src/public/js/angularjs/controllers/reports.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 01/24/2016\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! angular */ \"./src/public/js/vendor/angular/angular.min.js\"), __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"), __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! moment */ \"./src/public/js/vendor/moment/moment.js\"), __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"), __webpack_require__(/*! formvalidator */ \"./src/public/js/vendor/formvalidator/jquery.form-validator.js\"), __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (\r\n angular,\r\n _,\r\n $,\r\n moment,\r\n helpers\r\n) {\r\n return angular\r\n .module('trudesk.controllers.reports', [])\r\n .controller('reportsCtrl', function ($scope, $http, $log, $timeout, $window) {\r\n $.formUtils.addValidator({\r\n name: 'shortDate',\r\n validatorFunction: function (value) {\r\n return moment(value, helpers.getShortDateFormat(), true).isValid()\r\n },\r\n errorMessage: 'Invalid Date (' + helpers.getShortDateFormat() + ')',\r\n errorMessageKey: 'invalidShortDate'\r\n })\r\n\r\n var $filterDateStart = $('.filterDate_Start')\r\n $filterDateStart.each(function (index, element) {\r\n var $e = $(element)\r\n $e.off('hide.uk.datepicker')\r\n $e.on('hide.uk.datepicker', function (e) {\r\n $timeout(function () {\r\n $(e.target).validate()\r\n }, 0)\r\n })\r\n })\r\n\r\n var $filterDateEnd = $('.filterDate_End')\r\n $filterDateEnd.each(function (index, element) {\r\n var $e = $(element)\r\n $e.off('hide.uk.datepicker')\r\n $e.on('hide.uk.datepicker', function (e) {\r\n $timeout(function () {\r\n $(e.target).validate()\r\n }, 0)\r\n })\r\n })\r\n\r\n function changeView (selector) {\r\n var $activeReportType = $('.active_report_type')\r\n var $selector = $(selector)\r\n if ($selector.hasClass('active_report_type')) return true\r\n $activeReportType.animate({ opacity: 0 }, 100, function () {\r\n $activeReportType.removeClass('active_report_type')\r\n $activeReportType.addClass('hide')\r\n $selector.css({ opacity: 0 })\r\n $selector.removeClass('hide')\r\n $selector.addClass('active_report_type')\r\n helpers.resizeFullHeight()\r\n $selector.animate({ opacity: 1 }, 600)\r\n })\r\n }\r\n\r\n $scope.selectReport = function (event, type) {\r\n event.preventDefault()\r\n\r\n switch (type.toLowerCase()) {\r\n case 'tickets_by_group':\r\n changeView('#report_tickets_by_group')\r\n break\r\n case 'tickets_by_priorities':\r\n changeView('#report_tickets_by_priorities')\r\n break\r\n case 'tickets_by_status':\r\n changeView('#report_tickets_by_status')\r\n break\r\n case 'tickets_by_tags':\r\n changeView('#report_tickets_by_tags')\r\n break\r\n case 'tickets_by_types':\r\n changeView('#report_tickets_by_types')\r\n break\r\n case 'tickets_by_users':\r\n changeView('#report_tickets_by_users')\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n $scope.submitGenerateReport = function (event, type) {\r\n var form = $(event.target).parents('form')\r\n if (!form.isValid(null, null, false)) return true\r\n\r\n event.preventDefault()\r\n\r\n var data = {}\r\n form.serializeArray().map(function (x) {\r\n data[x.name] = x.value\r\n })\r\n\r\n // Standardize the Dates\r\n var startDate = moment(data['filterDate_Start'], helpers.getShortDateFormat()).format('MM-DD-YYYY')\r\n var endDate = moment(data['filterDate_End'], helpers.getShortDateFormat()).format('MM-DD-YYYY')\r\n\r\n var groups = []\r\n\r\n switch (type.toLowerCase()) {\r\n case 'group':\r\n showLoader()\r\n groups = form.find('select#groups').val()\r\n $http({\r\n method: 'POST',\r\n url: '/api/v1/reports/generate/tickets_by_group',\r\n data: {\r\n startDate: startDate,\r\n endDate: endDate,\r\n groups: groups\r\n },\r\n headers: { 'Content-Type': 'application/json' }\r\n })\r\n .then(\r\n function successCallback (response) {\r\n downloadReport(response, 'report_tickets_by_group__' + data['filterDate_Start'])\r\n },\r\n function errorCallback (response) {\r\n $log.log(response.statusText)\r\n $log.error(response)\r\n }\r\n )\r\n .then(function () {\r\n hideLoader()\r\n })\r\n break\r\n case 'priorities':\r\n showLoader()\r\n var priorities = form.find('select#priorities').val()\r\n groups = form.find('select#groups').val()\r\n $http({\r\n method: 'POST',\r\n url: '/api/v1/reports/generate/tickets_by_priority',\r\n data: {\r\n startDate: startDate,\r\n endDate: endDate,\r\n groups: groups,\r\n priorities: priorities\r\n },\r\n headers: { 'Content-Type': 'application/json' }\r\n })\r\n .then(\r\n function successCallback (response) {\r\n downloadReport(response, 'report_tickets_by_priorities__' + data['filterDate_Start'])\r\n },\r\n function errorCallback (response) {\r\n $log.log(response.statusText)\r\n }\r\n )\r\n .then(function () {\r\n hideLoader()\r\n })\r\n break\r\n case 'status':\r\n showLoader()\r\n var status = form.find('select#status').val()\r\n groups = form.find('select#groups').val()\r\n $http({\r\n method: 'POST',\r\n url: '/api/v1/reports/generate/tickets_by_status',\r\n data: {\r\n startDate: startDate,\r\n endDate: endDate,\r\n groups: groups,\r\n status: status\r\n },\r\n headers: { 'Content-Type': 'application/json' }\r\n })\r\n .then(\r\n function successCallback (response) {\r\n downloadReport(response, 'report_tickets_by_status__' + data['filterDate_Start'])\r\n },\r\n function errorCallback (response) {\r\n $log.log(response.statusText)\r\n }\r\n )\r\n .then(function () {\r\n hideLoader()\r\n })\r\n break\r\n case 'tags':\r\n showLoader()\r\n var tags = form.find('select#tags').val()\r\n groups = form.find('select#groups').val()\r\n $http({\r\n method: 'POST',\r\n url: '/api/v1/reports/generate/tickets_by_tags',\r\n data: {\r\n startDate: startDate,\r\n endDate: endDate,\r\n groups: groups,\r\n tags: tags\r\n },\r\n headers: { 'Content-Type': 'application/json' }\r\n })\r\n .then(\r\n function successCallback (response) {\r\n downloadReport(response, 'report_tickets_by_tags__' + data['filterDate_Start'])\r\n },\r\n function errorCallback (response) {\r\n $log.log(response.statusText)\r\n }\r\n )\r\n .then(function () {\r\n hideLoader()\r\n })\r\n break\r\n case 'types':\r\n showLoader()\r\n var types = form.find('select#types').val()\r\n groups = form.find('select#groups').val()\r\n $http({\r\n method: 'POST',\r\n url: '/api/v1/reports/generate/tickets_by_type',\r\n data: {\r\n startDate: startDate,\r\n endDate: endDate,\r\n groups: groups,\r\n types: types\r\n },\r\n headers: { 'Content-Type': 'application/json' }\r\n })\r\n .then(\r\n function successCallback (response) {\r\n downloadReport(response, 'report_tickets_by_types__' + data['filterDate_Start'])\r\n },\r\n function errorCallback (response) {\r\n $log.log(response.statusText)\r\n }\r\n )\r\n .then(function () {\r\n hideLoader()\r\n })\r\n break\r\n case 'users':\r\n showLoader()\r\n var users = form.find('select#users').val()\r\n groups = form.find('select#groups').val()\r\n $http({\r\n method: 'POST',\r\n url: '/api/v1/reports/generate/tickets_by_user',\r\n data: {\r\n startDate: startDate,\r\n endDate: endDate,\r\n groups: groups,\r\n users: users\r\n },\r\n headers: { 'Content-Type': 'application/json' }\r\n })\r\n .then(\r\n function successCallback (response) {\r\n downloadReport(response, 'report_tickets_by_users__' + data['filterDate_Start'])\r\n },\r\n function errorCallback (response) {\r\n $log.log(response.statusText)\r\n }\r\n )\r\n .then(function () {\r\n hideLoader()\r\n })\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n function showLoader () {\r\n var $loader = $('#loader-wrapper')\r\n $loader.css({ opacity: 0, display: 'block' })\r\n $loader.animate({ opacity: 0.8 }, 600)\r\n }\r\n\r\n function hideLoader () {\r\n var $loader = $('#loader-wrapper')\r\n $loader.animate({ opacity: 0 }, 200, function () {\r\n $loader.hide()\r\n })\r\n }\r\n\r\n function downloadReport (response, filename) {\r\n var headers = response.headers()\r\n var blob = new Blob([response.data], { type: headers['content-type'] })\r\n var link = $window.document.createElement('a')\r\n link.href = $window.URL.createObjectURL(blob)\r\n link.download = filename + '.csv'\r\n link.click()\r\n link.remove()\r\n }\r\n })\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/angularjs/controllers/reports.js?"); - -/***/ }), - -/***/ "./src/public/js/angularjs/controllers/settings-backup.js": -/*!****************************************************************!*\ - !*** ./src/public/js/angularjs/controllers/settings-backup.js ***! - \****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 12/19/2018\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! angular */ \"./src/public/js/vendor/angular/angular.min.js\"), __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"), __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"), __webpack_require__(/*! modules/socket */ \"./src/public/js/modules/socket.js\"), __webpack_require__(/*! uikit */ \"./src/public/js/vendor/uikit/js/uikit_combined.min.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (\r\n angular,\r\n _,\r\n $,\r\n helpers,\r\n socket,\r\n UIkit\r\n) {\r\n return angular\r\n .module('trudesk.controllers.settings.backup', ['ngSanitize'])\r\n .controller('BackupCtrl', function ($scope, $http, $timeout, $log) {\r\n function initBackupUpload () {\r\n var progressbar = $('#backupUploadProgress')\r\n\r\n var $backupUploadSelect = $('#backup-upload-select')\r\n\r\n var $uploadButton = $backupUploadSelect.parent()\r\n\r\n var bar = progressbar.find('.uk-progress-bar')\r\n\r\n var settings = {\r\n action: '/api/v1/backup/upload',\r\n allow: '*.zip',\r\n type: 'json',\r\n\r\n loadstart: function () {\r\n bar.css('width', '0%').text('0%')\r\n progressbar.removeClass('hide')\r\n $uploadButton.addClass('hide')\r\n },\r\n notallowed: function () {\r\n helpers.UI.showSnackbar('Invalid File Type. Please upload a Zip file.', true)\r\n },\r\n error: function (err) {\r\n $log.error(err)\r\n helpers.UI.showSnackbar('An unknown error occurred. Check Console', true)\r\n },\r\n progress: function (percent) {\r\n percent = Math.ceil(percent)\r\n bar.css('width', percent + '%').text(percent + '%')\r\n },\r\n\r\n allcomplete: function (response) {\r\n $log.log(response)\r\n if (!response.success) {\r\n helpers.UI.showSnackbar(response.error, true)\r\n }\r\n\r\n bar.css('width', '100%').text('100%')\r\n\r\n $timeout(function () {\r\n progressbar.addClass('hide')\r\n $uploadButton.removeClass('hide')\r\n $scope.getBackups()\r\n $backupUploadSelect.val(null)\r\n helpers.UI.playSound('success')\r\n }, 1500)\r\n }\r\n }\r\n\r\n UIkit.uploadSelect($backupUploadSelect, settings)\r\n }\r\n\r\n $scope.init = function () {\r\n $timeout(function () {\r\n initBackupUpload()\r\n\r\n $scope.checkTools()\r\n $scope.getBackups()\r\n $scope.getDeletedTickets()\r\n }, 0)\r\n }\r\n\r\n $scope.backupFiles = []\r\n\r\n $scope.loadingTools = true\r\n $scope.checkTools = function () {\r\n $http\r\n .get('/api/v1/backup/hastools')\r\n .then(\r\n function success (res) {\r\n $scope.hasTools = res.data && res.data.success\r\n },\r\n function error () {\r\n $scope.hasTools = false\r\n }\r\n )\r\n .then(function () {\r\n $scope.loadingTools = false\r\n $scope.showNoTools = !$scope.loading && !$scope.hasTools\r\n })\r\n }\r\n\r\n $scope.getBackups = function () {\r\n $http.get('/api/v1/backups').then(\r\n function success (res) {\r\n if (res.data && res.data.success === true) {\r\n $scope.backupFiles = res.data.files\r\n }\r\n },\r\n function error (err) {\r\n $log.error(err)\r\n }\r\n )\r\n }\r\n\r\n $scope.startbackup = function (e) {\r\n var $button = $(e.currentTarget)\r\n // $button.prop('disabled', true).addClass('disabled').text('Please Wait...');\r\n $button\r\n .hide()\r\n .parent()\r\n .find('.uk-progress')\r\n .removeClass('hide')\r\n $http.post('/api/v1/backup').then(\r\n function success (res) {\r\n $log.log(res)\r\n $button\r\n .parent()\r\n .find('.uk-progress')\r\n .addClass('hide')\r\n $button.show()\r\n helpers.UI.showSnackbar('Backup completed successfully.', false)\r\n helpers.UI.playSound('success')\r\n $scope.getBackups()\r\n },\r\n function error (err) {\r\n helpers.UI.playSound('error')\r\n helpers.UI.showSnackbar('Error: ' + err, true)\r\n $log.error(err)\r\n }\r\n )\r\n }\r\n\r\n $scope.deleteBackup = function (idx) {\r\n var file = $scope.backupFiles[idx]\r\n if (!file) {\r\n return false\r\n }\r\n\r\n var filename = file.filename\r\n\r\n UIkit.modal.confirm(\r\n '

        Are you sure?

        This action is permanent and will destroy the backup file: ' +\r\n filename +\r\n '

        ',\r\n function () {\r\n $http.delete('/api/v1/backup/' + filename).then(\r\n function success (res) {\r\n $log.log(res)\r\n if (res.data && res.data.success) {\r\n $scope.getBackups()\r\n helpers.UI.showSnackbar('Backup successfully deleted', false)\r\n } else {\r\n helpers.UI.showSnackbar('Unable to delete backup', true)\r\n }\r\n },\r\n function error (err) {\r\n $log.error(err)\r\n }\r\n )\r\n },\r\n {\r\n labels: { Ok: 'Yes', Cancel: 'No' },\r\n confirmButtonClass: 'md-btn-danger'\r\n }\r\n )\r\n }\r\n\r\n $scope.restoreFile = function (idx) {\r\n var file = $scope.backupFiles[idx]\r\n if (!file) {\r\n return false\r\n }\r\n\r\n var filename = file.filename\r\n\r\n UIkit.modal.confirm(\r\n '

        Are you sure?

        ' +\r\n '

        This is a permanent action. All data will be wiped from the database and restored with the selected backup file: ' +\r\n filename +\r\n '

        ' +\r\n '

        Any users currently logged in will be presented with a blocking restore page. Preventing any further actions.' +\r\n 'Once complete all users are required to log in again.


        This process may take a while depending on the size of the backup.

        ',\r\n function () {\r\n socket.ui.emitShowRestoreOverlay()\r\n\r\n $http\r\n .post('/api/v1/backup/restore', {\r\n file: filename\r\n })\r\n .then(\r\n function success (res) {\r\n $log.log(res)\r\n helpers.UI.showSnackbar('Restore Complete. Logging all users out...', false)\r\n $timeout(function () {\r\n socket.ui.emitRestoreComplete()\r\n }, 2000)\r\n },\r\n function error (err) {\r\n $log.error(err)\r\n helpers.UI.showSnackbar('An Error Occurred. Check Console.', true)\r\n }\r\n )\r\n },\r\n {\r\n labels: { Ok: 'Yes', Cancel: 'No' },\r\n confirmButtonClass: 'md-btn-danger'\r\n }\r\n )\r\n }\r\n\r\n $scope.deletedTickets = []\r\n $scope.allDeletedTickets = []\r\n $scope.getDeletedTickets = function () {\r\n $http.get('/api/v1/tickets/deleted').then(\r\n function successCallback (response) {\r\n if (!response.data || !response.data.deletedTickets) return\r\n\r\n $scope.allDeletedTickets = response.data.deletedTickets\r\n $scope.deletedTickets = $scope.allDeletedTickets.slice(0, 25)\r\n\r\n var $deletedTicketPagination = $('.deletedTicketPagination')\r\n UIkit.pagination($deletedTicketPagination, {\r\n items: $scope.allDeletedTickets.length,\r\n itemsOnPage: 25\r\n })\r\n\r\n $deletedTicketPagination.on('select.uk.pagination', function (e, pageIndex) {\r\n $timeout(function () {\r\n $scope.deletedTickets = $scope.allDeletedTickets.slice(pageIndex * 25, (pageIndex + 1) * 25)\r\n }, 0)\r\n })\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar('Error: ' + err.error, true)\r\n $log.error(err)\r\n }\r\n )\r\n }\r\n\r\n $scope.restoreDeletedTicket = function (idx) {\r\n var ticket = $scope.deletedTickets[idx]\r\n if (!ticket) return false\r\n\r\n $http\r\n .post(\r\n '/api/v1/tickets/deleted/restore',\r\n {\r\n _id: ticket._id\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback (response) {\r\n if (response.data.success) {\r\n helpers.UI.showSnackbar('Ticket #' + ticket.uid + ' restored')\r\n $scope.deletedTickets.splice(idx, 1)\r\n }\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar('Error: ' + err.error)\r\n $log.error(err)\r\n }\r\n )\r\n }\r\n })\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/angularjs/controllers/settings-backup.js?"); - -/***/ }), - -/***/ "./src/public/js/angularjs/controllers/settings.js": -/*!*********************************************************!*\ - !*** ./src/public/js/angularjs/controllers/settings.js ***! - \*********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 02/10/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\r\n __webpack_require__(/*! angular */ \"./src/public/js/vendor/angular/angular.min.js\"),\r\n __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"),\r\n __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"),\r\n __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"),\r\n __webpack_require__(/*! modules/ui */ \"./src/public/js/modules/ui.js\"),\r\n __webpack_require__(/*! uikit */ \"./src/public/js/vendor/uikit/js/uikit_combined.min.js\"),\r\n __webpack_require__(/*! easymde */ \"./src/public/js/vendor/easymde/dist/easymde.min.js\"),\r\n __webpack_require__(/*! moment */ \"./src/public/js/vendor/moment/moment.js\"),\r\n __webpack_require__(/*! moment_timezone */ \"./src/public/js/vendor/moment/moment-timezone-with-data.js\"),\r\n __webpack_require__(/*! velocity */ \"./src/public/js/vendor/velocity/velocity.min.js\"),\r\n __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\"),\r\n __webpack_require__(/*! angularjs/services */ \"./src/public/js/angularjs/services.js\")\r\n], __WEBPACK_AMD_DEFINE_RESULT__ = (function (angular, _, $, helpers, ui, UIkit, EasyMDE, moment) {\r\n return angular\r\n .module('trudesk.controllers.settings', ['ngSanitize', 'trudesk.services.settings'])\r\n .directive('selectize', function ($timeout) {\r\n return {\r\n restrict: 'A',\r\n require: '?ngModel',\r\n link: function (scope, element, attrs, ngModel) {\r\n $timeout(function () {\r\n // var $element = $(element).selectize(scope.$eval(attrs.selectize));\r\n if (!ngModel) return\r\n $(element)\r\n .selectize()\r\n .on('change', function () {\r\n scope.$apply(function () {\r\n var newValue = $(element)\r\n .selectize()\r\n .val()\r\n ngModel.$setViewValue(newValue)\r\n })\r\n })\r\n })\r\n }\r\n }\r\n })\r\n .controller('settingsCtrl', function (SettingsService, $scope, $http, $timeout, $log, $window) {\r\n var mdeToolbarItems = [\r\n {\r\n name: 'bold',\r\n action: EasyMDE.toggleBold,\r\n className: 'material-icons mi-bold no-ajaxy',\r\n title: 'Bold'\r\n },\r\n {\r\n name: 'italic',\r\n action: EasyMDE.toggleItalic,\r\n className: 'material-icons mi-italic no-ajaxy',\r\n title: 'Italic'\r\n },\r\n {\r\n name: 'Title',\r\n action: EasyMDE.toggleHeadingSmaller,\r\n className: 'material-icons mi-title no-ajaxy',\r\n title: 'Title'\r\n },\r\n '|',\r\n {\r\n name: 'Code',\r\n action: EasyMDE.toggleCodeBlock,\r\n className: 'material-icons mi-code no-ajaxy',\r\n title: 'Code'\r\n },\r\n {\r\n name: 'Quote',\r\n action: EasyMDE.toggleBlockquote,\r\n className: 'material-icons mi-quote no-ajaxy',\r\n title: 'Quote'\r\n },\r\n {\r\n name: 'Generic List',\r\n action: EasyMDE.toggleUnorderedList,\r\n className: 'material-icons mi-list no-ajaxy',\r\n title: 'Generic List'\r\n },\r\n {\r\n name: 'Numbered List',\r\n action: EasyMDE.toggleOrderedList,\r\n className: 'material-icons mi-numlist no-ajaxy',\r\n title: 'Numbered List'\r\n },\r\n '|',\r\n {\r\n name: 'Create Link',\r\n action: EasyMDE.drawLink,\r\n className: 'material-icons mi-link no-ajaxy',\r\n title: 'Create Link'\r\n },\r\n '|',\r\n {\r\n name: 'Toggle Preview',\r\n action: EasyMDE.togglePreview,\r\n className: 'material-icons mi-preview no-disable no-mobile no-ajaxy',\r\n title: 'Toggle Preview'\r\n }\r\n ]\r\n\r\n var privacyPolicyMDE = null\r\n\r\n $scope.init = function () {\r\n // Set using Service due to handlebars escaping backslashes\r\n $scope.timeFormat = SettingsService.getSettings().timeFormat.value\r\n $scope.shortDateFormat = SettingsService.getSettings().shortDateFormat.value\r\n $scope.longDateFormat = SettingsService.getSettings().longDateFormat.value\r\n\r\n $scope.mailerCheckPolling = $scope.mailerCheckPolling / 60000\r\n\r\n var $uploadButton = $('#logo-upload-select').parent()\r\n var uploadLogoSettings = {\r\n action: '/settings/general/uploadlogo',\r\n allow: '*.(jpg|jpeg|gif|png)',\r\n loadstart: function () {\r\n $uploadButton.text('Uploading...')\r\n $uploadButton.attr('disabled', true)\r\n $uploadButton.addClass('disable')\r\n },\r\n allcomplete: function () {\r\n $uploadButton.text('Upload Logo')\r\n $uploadButton.attr('disabled', false)\r\n $uploadButton.removeClass('disable')\r\n helpers.UI.showSnackbar('Upload Complete', false)\r\n // remove page refresh once SettingsService merge\r\n // $('img.site-logo').attr('src', '/assets/topLogo.png?refresh=' + new Date().getTime());\r\n $window.location.reload()\r\n $('button#remove-custom-logo-btn').removeClass('hide')\r\n }\r\n }\r\n\r\n UIkit.uploadSelect($('#logo-upload-select'), uploadLogoSettings)\r\n\r\n var $pageUploadButton = $('#page-logo-upload-select').parent()\r\n var pageUploadLogoSettings = {\r\n action: '/settings/general/uploadpagelogo',\r\n allow: '*.(jpg|jpeg|gif|png)',\r\n loadstart: function () {\r\n $uploadButton.text('Uploading...')\r\n $uploadButton.attr('disabled', true)\r\n $uploadButton.addClass('disable')\r\n },\r\n allcomplete: function () {\r\n $pageUploadButton.text('Upload Logo')\r\n $pageUploadButton.attr('disabled', false)\r\n $pageUploadButton.removeClass('disable')\r\n helpers.UI.showSnackbar('Upload Complete', false)\r\n // remove page refresh once SettingsService merge\r\n // $('img.site-logo').attr('src', '/assets/topLogo.png?refresh=' + new Date().getTime());\r\n $window.location.reload()\r\n $('button#remove-custom-page-logo-btn').removeClass('hide')\r\n }\r\n }\r\n\r\n UIkit.uploadSelect($('#page-logo-upload-select'), pageUploadLogoSettings)\r\n\r\n var uploadFaviconSettings = {\r\n action: '/settings/general/uploadfavicon',\r\n allow: '*.(jpg|jpeg|gif|png|ico)',\r\n loadstart: function () {\r\n $uploadButton.text('Uploading...')\r\n $uploadButton.attr('disabled', true)\r\n $uploadButton.addClass('disable')\r\n },\r\n allcomplete: function () {\r\n $uploadButton.text('Upload Logo')\r\n $uploadButton.attr('disabled', false)\r\n $uploadButton.removeClass('disable')\r\n helpers.UI.showSnackbar('Upload Complete', false)\r\n // remove page refresh once SettingsService merge\r\n // $('img.site-logo').attr('src', '/assets/topLogo.png?refresh=' + new Date().getTime());\r\n $window.location.reload()\r\n $('button#remove-custom-logo-btn').removeClass('hide')\r\n }\r\n }\r\n\r\n UIkit.uploadSelect($('#favicon-upload-select'), uploadFaviconSettings)\r\n\r\n // Fix Inputs if input is preloaded with a value\r\n $timeout(function () {\r\n $('input.md-input').each(function () {\r\n var vm = this\r\n var self = $(vm)\r\n if (!_.isEmpty(self.val())) {\r\n var s = self.parent('.md-input-wrapper')\r\n if (s.length > 0) {\r\n s.addClass('md-input-filled')\r\n }\r\n }\r\n })\r\n\r\n // TimeZones\r\n $scope.timeZones = moment.tz\r\n .names()\r\n .map(function (name) {\r\n var year = new Date().getUTCFullYear()\r\n var timezoneAtBeginningOfyear = moment.tz(year + '-01-01', name)\r\n return {\r\n utc: timezoneAtBeginningOfyear.utcOffset(),\r\n label: '(GMT' + timezoneAtBeginningOfyear.format('Z') + ') ' + name,\r\n value: name\r\n }\r\n })\r\n .sort(function (a, b) {\r\n return a.utc - b.utc\r\n })\r\n\r\n $timeout(function () {\r\n // Call in next cycle - Timezones generated dynamically\r\n helpers.UI.selectize($('select#tz').parent())\r\n })\r\n\r\n var $privacyPolicy = $('#privacyPolicy')\r\n if ($privacyPolicy.length > 0) {\r\n privacyPolicyMDE = new EasyMDE({\r\n element: $privacyPolicy[0],\r\n forceSync: true,\r\n minHeight: '220px', // Slighty smaller to adjust the scroll\r\n toolbar: mdeToolbarItems,\r\n autoDownloadFontAwesome: false\r\n })\r\n\r\n privacyPolicyMDE.codemirror.off('change')\r\n privacyPolicyMDE.codemirror.on('change', function () {\r\n $scope.privacyPolicy = privacyPolicyMDE.value()\r\n })\r\n }\r\n\r\n // Color Scheme Select\r\n var $colorSchemeSelect = $('#colorSchemeSelect')\r\n if ($scope.colorSecondary === '#2f3640') {\r\n $colorSchemeSelect[0].selectize.setValue('dark', true)\r\n } else if ($scope.colorTertiary === '#ee2b47') {\r\n $colorSchemeSelect[0].selectize.setValue('midnight', true)\r\n } else if ($scope.colorHeaderBG === '#2e3238') {\r\n $colorSchemeSelect[0].selectize.setValue('moonlight', true)\r\n } else if ($scope.colorTertiary === '#f67280') {\r\n $colorSchemeSelect[0].selectize.setValue('purplerain', true)\r\n } else if ($scope.colorHeaderBG === '#112d4e') {\r\n $colorSchemeSelect[0].selectize.setValue('bluejean', true)\r\n } else if ($scope.colorHeaderBG === '#625757') {\r\n $colorSchemeSelect[0].selectize.setValue('sandstone', true)\r\n } else if ($scope.colorHeaderBG === '#404969') {\r\n $colorSchemeSelect[0].selectize.setValue('winterfire', true)\r\n }\r\n\r\n $colorSchemeSelect.on('change', function (e) {\r\n $scope.$apply(function () {\r\n var val = $colorSchemeSelect.val()\r\n switch (val) {\r\n case 'light':\r\n $scope.revertColor('colorHeaderBG', '#42464d')\r\n $scope.revertColor('colorHeaderPrimary', '#f6f7f8')\r\n $scope.revertColor('colorPrimary', '#606771')\r\n $scope.revertColor('colorSecondary', '#f7f8fa')\r\n $scope.revertColor('colorTertiary', '#e74c3c')\r\n $scope.revertColor('colorQuaternary', '#e6e7e8')\r\n break\r\n case 'dark':\r\n $scope.revertColor('colorHeaderBG', '#242a31')\r\n $scope.revertColor('colorHeaderPrimary', '#f6f7f8')\r\n $scope.revertColor('colorPrimary', '#f6f7f8')\r\n $scope.revertColor('colorSecondary', '#2f3640')\r\n $scope.revertColor('colorTertiary', '#e74c3c')\r\n $scope.revertColor('colorQuaternary', '#454f5d')\r\n break\r\n case 'bluejean':\r\n $scope.revertColor('colorHeaderBG', '#112d4e')\r\n $scope.revertColor('colorHeaderPrimary', '#f9f7f7')\r\n $scope.revertColor('colorPrimary', '#112d4e')\r\n $scope.revertColor('colorSecondary', '#f9f7f7')\r\n $scope.revertColor('colorTertiary', '#3f72af')\r\n $scope.revertColor('colorQuaternary', '#dbe2ef')\r\n break\r\n case 'midnight':\r\n $scope.revertColor('colorHeaderBG', '#2c2e3e')\r\n $scope.revertColor('colorHeaderPrimary', '#f6f6f6')\r\n $scope.revertColor('colorPrimary', '#444a54')\r\n $scope.revertColor('colorSecondary', '#c8c8c8')\r\n $scope.revertColor('colorTertiary', '#ee2b47')\r\n $scope.revertColor('colorQuaternary', '#2c2e3e')\r\n break\r\n case 'moonlight':\r\n $scope.revertColor('colorHeaderBG', '#2e3238')\r\n $scope.revertColor('colorHeaderPrimary', '#eeeeee')\r\n $scope.revertColor('colorPrimary', '#444a54')\r\n $scope.revertColor('colorSecondary', '#c8c8c8')\r\n $scope.revertColor('colorTertiary', '#7971ea')\r\n $scope.revertColor('colorQuaternary', '#444a54')\r\n break\r\n case 'purplerain':\r\n $scope.revertColor('colorHeaderBG', '#393041')\r\n $scope.revertColor('colorHeaderPrimary', '#f6f6f6')\r\n $scope.revertColor('colorPrimary', '#393041')\r\n $scope.revertColor('colorSecondary', '#d2cbd8')\r\n $scope.revertColor('colorTertiary', '#f67280')\r\n $scope.revertColor('colorQuaternary', '#52455f')\r\n break\r\n case 'sandstone':\r\n $scope.revertColor('colorHeaderBG', '#625757')\r\n $scope.revertColor('colorHeaderPrimary', '#f9f9f9')\r\n $scope.revertColor('colorPrimary', '#625757')\r\n $scope.revertColor('colorSecondary', '#dfdfdf')\r\n $scope.revertColor('colorTertiary', '#ef5a5a')\r\n $scope.revertColor('colorQuaternary', '#6f6363')\r\n break\r\n case 'winterfire':\r\n $scope.revertColor('colorHeaderBG', '#404969')\r\n $scope.revertColor('colorHeaderPrimary', '#ebf0f6')\r\n $scope.revertColor('colorPrimary', '#404969')\r\n $scope.revertColor('colorSecondary', '#ebf0f6')\r\n $scope.revertColor('colorTertiary', '#ff7f50')\r\n $scope.revertColor('colorQuaternary', '#4a5479')\r\n break\r\n }\r\n\r\n $scope.saveColorScheme(e)\r\n })\r\n })\r\n\r\n // Load MailCheckTicketType from settings\r\n var $mailerCheckTicketTypeSelect = $('#mailerCheckTicketType')\r\n var $selectizeTicketType = $mailerCheckTicketTypeSelect[0].selectize\r\n if ($mailerCheckTicketTypeSelect.length > 0) {\r\n if ($scope.mailerCheckTicketType !== '') {\r\n // empty string is reading as '? string: ?' ????\r\n $mailerCheckTicketTypeSelect\r\n .find('option[value=\"' + $scope.mailerCheckTicketType + '\"]')\r\n .prop('selected', true)\r\n\r\n $selectizeTicketType.setValue($scope.mailerCheckTicketType, true)\r\n $selectizeTicketType.refreshItems()\r\n } else {\r\n // Set default to first option.....\r\n var first = _.first(_.values($selectizeTicketType.options)).value\r\n\r\n $selectizeTicketType.setValue(first, true)\r\n $selectizeTicketType.refreshItems()\r\n\r\n $scope.mailerCheckTicketType = $mailerCheckTicketTypeSelect.val()\r\n }\r\n }\r\n\r\n // Load MailCheckTicketPriority from settings\r\n var $mailCheckTicketPrioritySelect = $('#mailerCheckTicketPriority')\r\n if ($mailCheckTicketPrioritySelect.length > 0) {\r\n // Build out priority Options based on selected ticket type\r\n loadTypePrioritySelect($scope.mailerCheckTicketType)\r\n }\r\n\r\n // Pagination on ticket Tags\r\n loadTicketTagPagination(null, 0)\r\n var $ticketTagPagination = $('.ticket-tags-pagination')\r\n UIkit.pagination($ticketTagPagination, {\r\n items: $scope.ticketTagsCount,\r\n itemsOnPage: 16\r\n })\r\n $ticketTagPagination.on('select.uk.pagination', loadTicketTagPagination)\r\n }, 0)\r\n }\r\n\r\n function loadTypePrioritySelect (typeId) {\r\n var $mailCheckTicketPrioritySelect = $('#mailerCheckTicketPriority')\r\n if ($mailCheckTicketPrioritySelect.length < 1) {\r\n return\r\n }\r\n\r\n $http\r\n .get('/api/v1/tickets/type/' + typeId)\r\n .success(function (response) {\r\n if (response.success) {\r\n $timeout(function () {\r\n var type = response.type\r\n if ($scope.mailerCheckTicketPriority === '') {\r\n $scope.mailerCheckTicketPriority = _.first(type.priorities)._id\r\n }\r\n\r\n var holdPriorityValue = $scope.mailerCheckTicketPriority\r\n\r\n if (\r\n !_.some(type.priorities, function (i) {\r\n return i._id.toString() === holdPriorityValue.toString()\r\n })\r\n ) {\r\n holdPriorityValue = _.first(type.priorities)._id\r\n }\r\n\r\n var $selectizeTicketPriority = $mailCheckTicketPrioritySelect[0].selectize\r\n $selectizeTicketPriority.clearOptions()\r\n\r\n type.priorities.forEach(function (priority) {\r\n $selectizeTicketPriority.addOption({\r\n value: priority._id,\r\n text: priority.name\r\n })\r\n })\r\n\r\n $selectizeTicketPriority.setValue(holdPriorityValue, true)\r\n $selectizeTicketPriority.refreshOptions(false)\r\n $selectizeTicketPriority.refreshItems()\r\n }, 0)\r\n }\r\n })\r\n .error(function (err) {\r\n helpers.UI.showSnackbar('Error: ' + err, true)\r\n $log.error(err)\r\n })\r\n }\r\n\r\n function loadTicketTagPagination (e, pageIndex) {\r\n if (e) {\r\n e.preventDefault()\r\n }\r\n\r\n $http\r\n .get('/api/v1/tags/limit?limit=16&page=' + pageIndex)\r\n .success(function (response) {\r\n var tags = []\r\n var $tagWrapper = $('.ticket-tags-wrapper')\r\n if ($tagWrapper.length < 1) {\r\n return\r\n }\r\n\r\n $tagWrapper.empty()\r\n if (response.success) {\r\n tags = response.tags\r\n // tags = [];\r\n if (tags.length === 0) {\r\n $tagWrapper.append(\r\n '

        No Tags Found

        '\r\n )\r\n $('.ticket-tags-pagination').hide()\r\n } else {\r\n tags.forEach(function (tag) {\r\n var html = ''\r\n html +=\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        ' +\r\n tag.name +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n ' edit\\n' +\r\n ' remove\\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n // ' \\n' +\r\n ' \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n ' Cancel\\n' +\r\n ' \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        '\r\n\r\n $tagWrapper.append(html)\r\n })\r\n\r\n // Bootstrap Angular dynamically...\r\n var $injector = angular.injector(['ng', 'trudesk'])\r\n $injector.invoke([\r\n '$compile',\r\n '$rootScope',\r\n function ($compile, $rootScope) {\r\n var $scope = $tagWrapper.scope()\r\n $compile($tagWrapper)($scope || $rootScope)\r\n $rootScope.$digest()\r\n }\r\n ])\r\n\r\n // Fix filled inputs\r\n helpers.UI.inputs()\r\n helpers.UI.reRenderInputs()\r\n }\r\n }\r\n })\r\n .error(function (err) {\r\n $log.error(err)\r\n })\r\n }\r\n\r\n $scope.$watch('mailerEnabled', function (newVal) {\r\n $('input#mailerHost')\r\n .attr('disabled', !newVal)\r\n .parent()\r\n .toggleClass('md-input-wrapper-disabled', !newVal)\r\n $('input#mailerSSL')\r\n .attr('disabled', !newVal)\r\n .parent()\r\n .toggleClass('md-input-wrapper-disabled', !newVal)\r\n $('input#mailerPort')\r\n .attr('disabled', !newVal)\r\n .parent()\r\n .toggleClass('md-input-wrapper-disabled', !newVal)\r\n $('input#mailerUsername')\r\n .attr('disabled', !newVal)\r\n .parent()\r\n .toggleClass('md-input-wrapper-disabled', !newVal)\r\n $('input#mailerPassword')\r\n .attr('disabled', !newVal)\r\n .parent()\r\n .toggleClass('md-input-wrapper-disabled', !newVal)\r\n $('input#mailerFrom')\r\n .attr('disabled', !newVal)\r\n .parent()\r\n .toggleClass('md-input-wrapper-disabled', !newVal)\r\n $('button#mailerSubmit')\r\n .attr('disabled', !newVal)\r\n .parent()\r\n .toggleClass('md-input-wrapper-disabled', !newVal)\r\n })\r\n\r\n $scope.defaultTicketTypeChanged = function () {\r\n if (!$scope.defaultTicketType) {\r\n return\r\n }\r\n\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'ticket:type:default',\r\n value: $scope.defaultTicketType\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {},\r\n function errorCallback (err) {\r\n $log.error(err)\r\n helpers.UI.showSnackbar('Error: ' + err, true)\r\n }\r\n )\r\n }\r\n\r\n $scope.mailerCheckTicketTypeChanged = function () {\r\n loadTypePrioritySelect($scope.mailerCheckTicketType)\r\n }\r\n\r\n $scope.switchSettings = function (event, settings) {\r\n if (settings) {\r\n var currentTarget = $(event.currentTarget)\r\n var $target = $('div[data-settings-id=\"' + settings + '\"]')\r\n var $settingsWrap = $('.settings-wrap')\r\n if ($target.length > 0) {\r\n // Hide Them\r\n $('.settings-categories > li').each(function () {\r\n var vm = this\r\n $(vm).removeClass('active')\r\n })\r\n\r\n $settingsWrap.find('div[data-settings-id]').each(function () {\r\n var vm = this\r\n $(vm).removeClass('active')\r\n })\r\n\r\n $('.page-wrapper').scrollTop(0)\r\n\r\n // Show Selected\r\n $target.addClass('active')\r\n if (currentTarget.length > 0) {\r\n currentTarget.addClass('active')\r\n }\r\n\r\n if (settings === 'settings-tickets') {\r\n $scope.switchTicketType(\r\n {\r\n currentTarget: $target.find('ul>li[data-key]').first()\r\n },\r\n false\r\n )\r\n }\r\n\r\n if (settings === 'settings-mailer') {\r\n $scope.switchTicketType(\r\n {\r\n currentTarget: $target.find('ul>li[data-key]').first()\r\n },\r\n false\r\n )\r\n }\r\n\r\n if (settings === 'settings-legal' && privacyPolicyMDE) {\r\n privacyPolicyMDE.codemirror.refresh()\r\n }\r\n }\r\n }\r\n }\r\n\r\n $scope.timezoneChanged = function () {\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'gen:timezone',\r\n value: $scope.selectedTimezone.replace('string:', '')\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n helpers.UI.showSnackbar('Timezone Updated. Please restart server.', false)\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar('Error: ' + err, true)\r\n $log.error(err)\r\n }\r\n )\r\n }\r\n\r\n $scope.saveTimeFormatClicked = function () {\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'gen:timeFormat',\r\n value: $scope.timeFormat\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n SettingsService.getSettings().timeFormat.value = $scope.timeFormat\r\n helpers.UI.showSnackbar('Setting Saved.', false)\r\n },\r\n function errorCallback (err) {\r\n helpers.showSnackbar('Error: ' + err, true)\r\n $log.error(err)\r\n }\r\n )\r\n }\r\n\r\n $scope.saveShortDateFormatClicked = function () {\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'gen:shortDateFormat',\r\n value: $scope.shortDateFormat\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n SettingsService.getSettings().shortDateFormat.value = $scope.shortDateFormat\r\n helpers.UI.showSnackbar('Setting Saved.', false)\r\n },\r\n function errorCallback (err) {\r\n helpers.showSnackbar('Error: ' + err, true)\r\n $log.error(err)\r\n }\r\n )\r\n }\r\n\r\n $scope.saveLongDateFormatClicked = function () {\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'gen:longDateFormat',\r\n value: $scope.longDateFormat\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n SettingsService.getSettings().longDateFormat.value = $scope.longDateFormat\r\n helpers.UI.showSnackbar('Setting Saved.', false)\r\n },\r\n function errorCallback (err) {\r\n helpers.showSnackbar('Error: ' + err, true)\r\n $log.error(err)\r\n }\r\n )\r\n }\r\n\r\n $scope.saveSiteTitleClicked = function () {\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'gen:sitetitle',\r\n value: $scope.siteTitle\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n helpers.UI.showSnackbar('Site title saved successfully.', false)\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar('Error: ' + err, true)\r\n $log.error(err)\r\n }\r\n )\r\n }\r\n\r\n $scope.saveSiteUrlClicked = function () {\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'gen:siteurl',\r\n value: $scope.siteUrl\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n helpers.UI.showSnackbar('Site URL saved successfully.', false)\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar('Error: ' + err, true)\r\n $log.error(err)\r\n }\r\n )\r\n }\r\n\r\n $scope.removeCustomLogo = function (event) {\r\n event.preventDefault()\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'gen:customlogo',\r\n value: false\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n $window.location.reload()\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar('Error: ' + err, true)\r\n $log.error(err)\r\n }\r\n )\r\n }\r\n\r\n $scope.removeCustomPageLogo = function (event) {\r\n event.preventDefault()\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'gen:custompagelogo',\r\n value: false\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n $window.location.reload()\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar('Error: ' + err, true)\r\n $log.error(err)\r\n }\r\n )\r\n }\r\n\r\n $scope.removeCustomFavicon = function (event) {\r\n event.preventDefault()\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'gen:customfavicon',\r\n value: false\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n $window.location.reload()\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar('Error: ' + err, true)\r\n $log.error(err)\r\n }\r\n )\r\n }\r\n\r\n $scope.mailerEnabledChange = function () {\r\n var vm = this\r\n $scope.mailerEnabled = vm.mailerEnabled\r\n\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'mailer:enable',\r\n value: $scope.mailerEnabled\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {},\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar('Error: ' + err, true)\r\n }\r\n )\r\n }\r\n\r\n $scope.mailerSSLChange = function () {\r\n var vm = this\r\n $scope.mailerSSL = vm.mailerSSL\r\n\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'mailer:ssl',\r\n value: $scope.mailerSSL\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {},\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar('Error: ' + err, true)\r\n }\r\n )\r\n }\r\n\r\n $scope.submitTestMailer = function ($event) {\r\n $event.preventDefault()\r\n helpers.UI.showSnackbar('Testing...', false)\r\n $http\r\n .post(\r\n '/api/v1/settings/testmailer',\r\n {\r\n // Empty\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n helpers.UI.showSnackbar('Successfully Connected', false)\r\n },\r\n function errorCallback (response) {\r\n helpers.UI.showSnackbar('Error: ' + response.data.error, true)\r\n }\r\n )\r\n }\r\n\r\n $scope.mailerFormSubmit = function ($event) {\r\n $event.preventDefault()\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n [\r\n { name: 'mailer:host', value: $scope.mailerHost },\r\n { name: 'mailer:ssl', value: $scope.mailerSSL },\r\n { name: 'mailer:port', value: $scope.mailerPort },\r\n { name: 'mailer:username', value: $scope.mailerUsername },\r\n { name: 'mailer:password', value: $scope.mailerPassword },\r\n { name: 'mailer:from', value: $scope.mailerFrom }\r\n ],\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n helpers.UI.showSnackbar('Mailer Settings Saved', false)\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err, true)\r\n }\r\n )\r\n }\r\n\r\n $scope.tpsEnabledChange = function () {\r\n var vm = this\r\n $scope.tpsEnabled = vm.tpsEnabled\r\n\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'tps:enable',\r\n value: $scope.tpsEnabled\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {},\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err, true)\r\n }\r\n )\r\n }\r\n\r\n $scope.tpsFormSubmit = function ($event) {\r\n $event.preventDefault()\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n [{ name: 'tps:username', value: $scope.tpsUsername }, { name: 'tps:apikey', value: $scope.tpsApiKey }],\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n helpers.UI.showSnackbar('TPS Settings Saved', false)\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err, true)\r\n }\r\n )\r\n }\r\n\r\n $scope.$watch('mailerCheckEnabled', function (newVal) {\r\n var $mailerCheckTicketTypeSelectize = $('select#mailerCheckTicketType').selectize()[0]\r\n var $mailerCheckTicketPrioritySelectize = $('select#mailerCheckTicketPriority').selectize()[0]\r\n\r\n $('input#mailerCheckHost')\r\n .attr('disabled', !newVal)\r\n .parent()\r\n .toggleClass('md-input-wrapper-disabled', !newVal)\r\n $('input#mailerCheckPort')\r\n .attr('disabled', !newVal)\r\n .parent()\r\n .toggleClass('md-input-wrapper-disabled', !newVal)\r\n $('input#mailerCheckUsername')\r\n .attr('disabled', !newVal)\r\n .parent()\r\n .toggleClass('md-input-wrapper-disabled', !newVal)\r\n $('input#mailerCheckPassword')\r\n .attr('disabled', !newVal)\r\n .parent()\r\n .toggleClass('md-input-wrapper-disabled', !newVal)\r\n $('input#mailerCheckPolling')\r\n .attr('disabled', !newVal)\r\n .parent()\r\n .toggleClass('md-input-wrapper-disabled', !newVal)\r\n $('button#mailerCheckSubmit')\r\n .attr('disabled', !newVal)\r\n .parent()\r\n .toggleClass('md-input-wrapper-disabled', !newVal)\r\n if (!_.isUndefined($mailerCheckTicketTypeSelectize)) {\r\n if (!newVal) {\r\n $mailerCheckTicketTypeSelectize.selectize.disable()\r\n } else {\r\n $mailerCheckTicketTypeSelectize.selectize.enable()\r\n }\r\n }\r\n if (!_.isUndefined($mailerCheckTicketPrioritySelectize)) {\r\n if (!newVal) {\r\n $mailerCheckTicketPrioritySelectize.selectize.disable()\r\n } else {\r\n $mailerCheckTicketPrioritySelectize.selectize.enable()\r\n }\r\n }\r\n })\r\n\r\n $scope.mailerCheckEnabledChange = function () {\r\n var vm = this\r\n $scope.mailerCheckEnabled = vm.mailerCheckEnabled\r\n\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'mailer:check:enable',\r\n value: $scope.mailerCheckEnabled\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n if (!$scope.mailerCheckEnabled) {\r\n UIkit.modal.confirm(\r\n 'Settings will take affect after server restart.

        Would you like to restart the server now?',\r\n function () {\r\n $http\r\n .get('/api/v1/admin/restart')\r\n .success(function () {})\r\n .error(function (err) {\r\n helpers.hideLoader()\r\n $log.log('[trudesk:settings:mailerCheckSubmit] - Error: ' + err.error)\r\n $log.error(err)\r\n })\r\n },\r\n {\r\n labels: { Ok: 'Yes', Cancel: 'No' },\r\n confirmButtonClass: 'md-btn-primary'\r\n }\r\n )\r\n }\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err, true)\r\n }\r\n )\r\n }\r\n\r\n $scope.mailerCheckFormSubmit = function ($event) {\r\n $event.preventDefault()\r\n var mailerCheckTicketTypeValue = $('#mailerCheckTicketType option[selected]').val()\r\n var mailerCheckTicketPriorityValue = $('#mailerCheckTicketPriority option[selected]').val()\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n [\r\n { name: 'mailer:check:polling', value: $scope.mailerCheckPolling * 60000 },\r\n { name: 'mailer:check:host', value: $scope.mailerCheckHost },\r\n { name: 'mailer:check:port', value: $scope.mailerCheckPort },\r\n {\r\n name: 'mailer:check:username',\r\n value: $scope.mailerCheckUsername\r\n },\r\n {\r\n name: 'mailer:check:password',\r\n value: $scope.mailerCheckPassword\r\n },\r\n {\r\n name: 'mailer:check:ticketype',\r\n value: mailerCheckTicketTypeValue\r\n },\r\n {\r\n name: 'mailer:check:ticketpriority',\r\n value: mailerCheckTicketPriorityValue\r\n },\r\n {\r\n name: 'mailer:check:createaccount',\r\n value: $scope.mailerCheckCreateAccount\r\n },\r\n {\r\n name: 'mailer:check:deletemessage',\r\n value: $scope.mailerCheckDeleteMessage\r\n }\r\n ],\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n helpers.UI.showSnackbar('Mail Check Settings Saved', false)\r\n\r\n UIkit.modal.confirm(\r\n 'Settings will take affect after server restart.

        Would you like to restart the server now?',\r\n function () {\r\n $http\r\n .get('/api/v1/admin/restart')\r\n .success(function () {})\r\n .error(function (err) {\r\n helpers.hideLoader()\r\n $log.log('[trudesk:settings:mailerCheckSubmit] - Error: ' + err.error)\r\n $log.error(err)\r\n })\r\n },\r\n {\r\n labels: { Ok: 'Yes', Cancel: 'No' },\r\n confirmButtonClass: 'md-btn-primary'\r\n }\r\n )\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err.data.error, true)\r\n $log.error(err)\r\n }\r\n )\r\n }\r\n\r\n $scope.savePrivacyPolicy = function ($event) {\r\n $event.preventDefault()\r\n\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'legal:privacypolicy',\r\n value: $scope.privacyPolicy\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n helpers.UI.showSnackbar('Privacy Policy Updated', false)\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err, true)\r\n }\r\n )\r\n }\r\n\r\n $scope.showTourChanged = function () {\r\n var vm = this\r\n $scope.showTour = vm.showTour\r\n\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'showTour:enable',\r\n value: $scope.showTour\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {},\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err, true)\r\n }\r\n )\r\n }\r\n\r\n $scope.showOverdueTicketsChanged = function () {\r\n var vm = this\r\n $scope.showOverdueTickets = vm.showOverdueTickets\r\n\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'showOverdueTickets:enable',\r\n value: $scope.showOverdueTickets\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {},\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err, true)\r\n }\r\n )\r\n }\r\n\r\n $scope.allowPublicTicketsChanged = function () {\r\n var vm = this\r\n $scope.allowPublicTickets = vm.allowPublicTickets\r\n\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'allowPublicTickets:enable',\r\n value: $scope.allowPublicTickets\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {},\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err, true)\r\n }\r\n )\r\n }\r\n\r\n function saveMinLength (settingName, length) {\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: settingName,\r\n value: length\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n helpers.UI.showSnackbar('Setting Saved.', false)\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err, true)\r\n }\r\n )\r\n }\r\n\r\n $scope.saveMinSubjectLengthClick = function () {\r\n saveMinLength('ticket:minlength:subject', $scope.minSubjectLength)\r\n }\r\n\r\n $scope.saveMinIssueLengthClick = function () {\r\n saveMinLength('ticket:minlength:issue', $scope.minIssueLength)\r\n }\r\n\r\n $scope.allowUserRegistrationChanged = function () {\r\n var vm = this\r\n $scope.allowUserRegistration = vm.allowUserRegistration\r\n\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'allowUserRegistration:enable',\r\n value: $scope.allowUserRegistration\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {},\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err, true)\r\n }\r\n )\r\n }\r\n\r\n $scope.emailBetaChanged = function () {\r\n var vm = this\r\n $scope.emailBeta = vm.emailBeta\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n {\r\n name: 'beta:email',\r\n value: $scope.emailBeta\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {},\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err, true)\r\n }\r\n )\r\n }\r\n\r\n $scope.showCreateTicketTypeWindow = function ($event) {\r\n $event.preventDefault()\r\n var createTicketTypeModal = $('#createTicketTypeModal')\r\n if (createTicketTypeModal.length > 0) {\r\n UIkit.modal(createTicketTypeModal, { bgclose: false }).show()\r\n }\r\n }\r\n\r\n $scope.switchTicketType = function ($event, animation) {\r\n var $currentTarget = $($event.currentTarget)\r\n animation = angular.isUndefined(animation) ? true : animation\r\n if ($currentTarget) {\r\n if ($currentTarget.hasClass('active')) return true\r\n var key = $currentTarget.attr('data-key')\r\n var $keyWindow = $currentTarget\r\n .parent()\r\n .parent()\r\n .parent()\r\n .find('div[data-ticket-type-id=\"' + key + '\"]')\r\n if ($keyWindow) {\r\n $currentTarget\r\n .parent()\r\n .find('li.active')\r\n .removeClass('active')\r\n $currentTarget.addClass('active')\r\n $currentTarget\r\n .parent()\r\n .parent()\r\n .parent()\r\n .find('div[data-ticket-type-id].active')\r\n .velocity(\r\n {\r\n opacity: animation ? 0 : 1\r\n },\r\n {\r\n duration: animation ? 250 : 1,\r\n complete: function () {\r\n var vm = this\r\n $(vm)\r\n .removeClass('active')\r\n .addClass('hide')\r\n\r\n $keyWindow.velocity(\r\n {\r\n opacity: 1\r\n },\r\n {\r\n duration: animation ? 250 : 1,\r\n begin: function () {\r\n $keyWindow.removeClass('hide')\r\n },\r\n complete: function () {\r\n $keyWindow.addClass('active')\r\n }\r\n }\r\n )\r\n }\r\n }\r\n )\r\n }\r\n }\r\n }\r\n\r\n $scope.createTicketType = function (event) {\r\n event.preventDefault()\r\n var form = $('#createTicketTypeForm')\r\n if (!form.isValid(null, null, false)) {\r\n return true\r\n }\r\n\r\n var typeName = form.find('input[name=\"typeName\"]').val()\r\n if (!typeName || typeName.length < 3) return true\r\n\r\n $http\r\n .post(\r\n '/api/v1/tickets/types/create',\r\n {\r\n name: typeName\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n helpers.UI.showSnackbar('Type: ' + typeName + ' created successfully', false)\r\n\r\n History.pushState(null, null, '/settings/tickets/?refresh=true')\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar('Unable to create ticket type. Check console', true)\r\n $log.error(err)\r\n }\r\n )\r\n }\r\n\r\n $scope.editTicketType = function ($event) {\r\n if (\r\n _.isNull($event.target) ||\r\n _.isUndefined($event.target) ||\r\n $event.target.tagName.toLowerCase() === 'label' ||\r\n $event.target.tagName.toLowerCase() === 'input'\r\n ) {\r\n return true\r\n }\r\n\r\n var ticketTypeId = $event.currentTarget.dataset.tickettypeoid\r\n if (!ticketTypeId) return true\r\n\r\n History.pushState(null, null, '/settings/tickettypes/' + ticketTypeId)\r\n }\r\n\r\n $scope.submitUpdateTicketType = function ($event, typeId) {\r\n $event.preventDefault()\r\n var $form = $($event.currentTarget)\r\n if ($form) {\r\n var $typeNameInput = $form.find('input#ticket-type-name-' + typeId)\r\n var typeName = $typeNameInput.val()\r\n\r\n $http\r\n .put(\r\n '/api/v1/tickets/types/' + typeId,\r\n {\r\n name: typeName\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n helpers.UI.showSnackbar('Type: ' + typeName + ' updated successfully', false)\r\n $('li[data-key=\"' + typeId + '\"]')\r\n .find('h3')\r\n .text(typeName)\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err, true)\r\n }\r\n )\r\n }\r\n }\r\n\r\n $scope.submitUpdateTemplateSubject = function ($event, templateId) {\r\n $event.preventDefault()\r\n var $form = $($event.currentTarget)\r\n if ($form) {\r\n var $subjectInput = $form.find('input')\r\n var subject = $subjectInput.val()\r\n\r\n $http\r\n .put(\r\n '/api/v1/settings/mailer/template/' + templateId,\r\n {\r\n subject: subject\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n helpers.UI.showSnackbar('Template subject updated successfully')\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err, true)\r\n }\r\n )\r\n }\r\n }\r\n\r\n $scope.updateTicketType = function (typeId) {\r\n if (!typeId || typeId.length < 1) {\r\n helpers.UI.showSnackbar('Unable to get type id', true)\r\n return true\r\n }\r\n\r\n var typeName = $('#editType_Name').val()\r\n\r\n $http\r\n .put(\r\n '/api/v1/tickets/types/' + typeId,\r\n {\r\n name: typeName\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n helpers.UI.showSnackbar('Type: ' + typeName + ' updated successfully', false)\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err, true)\r\n }\r\n )\r\n }\r\n\r\n $scope.showDeleteTicketType = function (typeId, hasTickets) {\r\n if (hasTickets) {\r\n var delTicketTypeModal = $('#deleteTicketTypeModal-' + typeId)\r\n if (delTicketTypeModal.length > 0) {\r\n UIkit.modal(delTicketTypeModal, { bgclose: false }).show()\r\n } else {\r\n $log.log('Unable to locate modal window: #deleteTicketTypeModal' + typeId)\r\n }\r\n } else {\r\n $scope.submitDeleteTicketType(typeId, undefined)\r\n }\r\n }\r\n\r\n $scope.submitDeleteTicketType = function (typeId, event) {\r\n if (event) event.preventDefault()\r\n\r\n if (_.isUndefined(typeId) || typeId.length < 1) {\r\n helpers.UI.showSnackbar('Unable to get type ID', true)\r\n return true\r\n }\r\n\r\n var typeName = $('input#del_type_name-' + typeId).val()\r\n var newTypeId = $('form#deleteTicketTypeForm-' + typeId + ' select[name=\"ticketType\"]').val()\r\n\r\n if (!newTypeId || newTypeId.length < 1) {\r\n helpers.UI.showSnackbar('Unable to get new ticket type. Aborting...', true)\r\n return true\r\n }\r\n\r\n $http({\r\n method: 'DELETE',\r\n url: '/api/v1/tickets/types/' + typeId,\r\n data: {\r\n newTypeId: newTypeId\r\n },\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }).then(\r\n function successCallback (response) {\r\n if (response.data.success) {\r\n helpers.UI.showSnackbar('Successfully removed ticket type: ' + typeName, false)\r\n\r\n return History.pushState(null, null, '/settings/tickets/')\r\n }\r\n },\r\n function errorCallback (response) {\r\n if (!_.isUndefined(response.data.error.custom)) {\r\n $log.error('[trudesk:settings:submitDeleteTicketType] Error -', response.data.error)\r\n helpers.UI.showSnackbar(response.data.error.message, true)\r\n } else {\r\n $log.error('[trudesk:settings:submitDeleteTicketType] Error -', response.data.error)\r\n helpers.UI.showSnackbar('Unable to remove ticket type. Check console.', true)\r\n }\r\n }\r\n )\r\n }\r\n\r\n $scope.editTagClicked = function (tagId, $event) {\r\n if ($event) {\r\n $event.preventDefault()\r\n }\r\n\r\n var $viewBox = $('#view-tag-' + tagId)\r\n var $editBox = $('#edit-tag-' + tagId)\r\n if ($editBox.length > 0 && $viewBox.length > 0) {\r\n $viewBox.addClass('hide')\r\n $editBox.removeClass('hide')\r\n }\r\n }\r\n\r\n $scope.cancelEditTagClicked = function (tagId, $event) {\r\n if ($event) {\r\n $event.preventDefault()\r\n }\r\n\r\n var $viewBox = $('#view-tag-' + tagId)\r\n var $editBox = $('#edit-tag-' + tagId)\r\n if ($editBox.length > 0 && $viewBox.length > 0) {\r\n if ($event) {\r\n $($event.currentTarget)\r\n .parents('form')\r\n .trigger('reset')\r\n }\r\n $viewBox.removeClass('hide')\r\n $editBox.addClass('hide')\r\n }\r\n }\r\n\r\n $scope.editPriority = function (pId, $event) {\r\n $event.preventDefault()\r\n var $viewBox = $('#view-p-' + pId)\r\n var $editBox = $('#edit-p-' + pId)\r\n if ($editBox.length > 0 && $viewBox.length > 0) {\r\n $editBox.find('.uk-color-button').css({\r\n background: $editBox.find('input[name=\"p-' + pId + '-htmlColor\"]').val()\r\n })\r\n $viewBox.addClass('hide')\r\n $editBox.removeClass('hide')\r\n }\r\n }\r\n\r\n $scope.cancelEditPriority = function (pId, $event) {\r\n if ($event) {\r\n $event.preventDefault()\r\n }\r\n var $viewBox = $('#view-p-' + pId)\r\n var $editBox = $('#edit-p-' + pId)\r\n if ($editBox.length > 0 && $viewBox.length > 0) {\r\n if ($event) {\r\n $($event.currentTarget)\r\n .parents('form')\r\n .trigger('reset')\r\n }\r\n $viewBox.removeClass('hide')\r\n $editBox.addClass('hide')\r\n }\r\n }\r\n\r\n $scope.editTicketTypePriority = function (typeId, id, $event) {\r\n $event.preventDefault()\r\n var $viewBox = $('#t-' + typeId + '-view-p-' + id)\r\n var $editBox = $('#t-' + typeId + '-edit-p-' + id)\r\n if ($editBox.length > 0 && $viewBox.length > 0) {\r\n $editBox.find('.uk-color-button').css({\r\n background: $editBox.find('input[name=\"p-' + id + '-htmlColor\"]').val()\r\n })\r\n $viewBox.addClass('hide')\r\n $editBox.removeClass('hide')\r\n }\r\n }\r\n\r\n $scope.cancelEditTicketTypePriority = function (typeId, id, $event) {\r\n if ($event) {\r\n $event.preventDefault()\r\n }\r\n var $viewBox = $('#t-' + typeId + '-view-p-' + id)\r\n var $editBox = $('#t-' + typeId + '-edit-p-' + id)\r\n if ($editBox.length > 0 && $viewBox.length > 0) {\r\n if ($event) {\r\n $($event.currentTarget)\r\n .parents('form')\r\n .trigger('reset')\r\n }\r\n $viewBox.removeClass('hide')\r\n $editBox.addClass('hide')\r\n }\r\n }\r\n\r\n $scope.showAddPriorityToType = function (typeId, $event) {\r\n if ($event) {\r\n $event.preventDefault()\r\n }\r\n\r\n // Dynamically load priorities....\r\n $http\r\n .get('/api/v1/tickets/type/' + typeId)\r\n .success(function (response) {\r\n if (response.success) {\r\n var updatedType = response.type\r\n $http\r\n .get('/api/v1/tickets/priorities')\r\n .success(function (response) {\r\n var priorities = response.priorities\r\n var $addPriorityToTypeModal = $('#addPriorityTicketType-' + typeId)\r\n var $pLoop = $addPriorityToTypeModal.find('.priority-loop')\r\n $pLoop.empty()\r\n\r\n var html = ''\r\n _.each(priorities, function (priority) {\r\n if (_.some(updatedType.priorities, priority)) {\r\n html = ''\r\n html +=\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        ' +\r\n priority.name +\r\n '
        \\n' +\r\n '

        SLA Overdue: ' +\r\n priority.durationFormatted +\r\n '

        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n ' check\\n' +\r\n '
        \\n' +\r\n '
        '\r\n\r\n $pLoop.append(html)\r\n } else {\r\n html = ''\r\n html +=\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        ' +\r\n priority.name +\r\n '
        \\n' +\r\n '

        SLA Overdue: ' +\r\n priority.durationFormatted +\r\n '

        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n ' Add\\n' +\r\n ' check\\n' +\r\n '
        \\n' +\r\n '
        '\r\n\r\n $pLoop.append(html)\r\n }\r\n })\r\n\r\n var $injector = angular.injector(['ng', 'trudesk'])\r\n $injector.invoke([\r\n '$compile',\r\n '$rootScope',\r\n function ($compile, $rootScope) {\r\n var $scope = $pLoop.scope()\r\n $compile($pLoop)($scope || $rootScope)\r\n $rootScope.$digest()\r\n }\r\n ])\r\n\r\n if ($addPriorityToTypeModal.length > 0) {\r\n UIkit.modal($addPriorityToTypeModal, {\r\n bgclose: false\r\n }).show()\r\n } else {\r\n $log.error('Unable to locate add priority modal.')\r\n }\r\n })\r\n .error(function (error) {\r\n $log.error(error)\r\n helpers.UI.showSnackbar('Unable to load ticket type. Check Console.')\r\n })\r\n } else {\r\n helpers.UI.showSnackbar('Unable to load ticket type. Check Console.')\r\n }\r\n })\r\n .error(function (error) {\r\n $log.error(error)\r\n helpers.UI.showSnackbar('Unable to load ticket type. Check Console.')\r\n })\r\n }\r\n\r\n $scope.priorityAddBtnClicked = function (typeId, pId, $event) {\r\n $event.preventDefault()\r\n var $addButton = $($event.currentTarget)\r\n if ($addButton.length < 1) {\r\n return false\r\n }\r\n\r\n $http\r\n .post(\r\n '/api/v1/tickets/type/' + typeId + '/addpriority',\r\n {\r\n priority: pId\r\n },\r\n {\r\n 'Content-Type': 'application/json'\r\n }\r\n )\r\n .then(\r\n function success (response) {\r\n var Type = response.data.type\r\n if (Type) {\r\n // Update UI\r\n var $typeContainer = $('div[data-ticket-type-id=\"' + typeId + '\"]')\r\n if ($typeContainer.length > 0) {\r\n var $prioritiesBox = $typeContainer.find('.priority-loop')\r\n var html = ''\r\n $prioritiesBox.empty()\r\n var sortedTypePriorities = _.sortBy(_.sortBy(Type.priorities, 'name'), 'migrationNum')\r\n\r\n _.each(sortedTypePriorities, function (priority) {\r\n html = ''\r\n html +=\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        ' +\r\n priority.name +\r\n '
        \\n' +\r\n '

        SLA Overdue: ' +\r\n priority.durationFormatted +\r\n '

        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n ' Edit\\n' +\r\n ' Remove\\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n ' \\n' +\r\n '
        \\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n ' Cancel\\n' +\r\n ' \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        '\r\n\r\n $prioritiesBox.append(html)\r\n })\r\n\r\n // Bootstrap Angular dynamically...\r\n var $injector = angular.injector(['ng', 'trudesk'])\r\n $injector.invoke([\r\n '$compile',\r\n '$rootScope',\r\n function ($compile, $rootScope) {\r\n var $scope = $prioritiesBox.scope()\r\n $compile($prioritiesBox)($scope || $rootScope)\r\n $rootScope.$digest()\r\n }\r\n ])\r\n\r\n // Fix filled inputs\r\n helpers.UI.inputs()\r\n helpers.UI.reRenderInputs()\r\n }\r\n }\r\n\r\n // Animation\r\n $addButton.velocity(\r\n {\r\n opacity: 0\r\n },\r\n {\r\n duration: 350,\r\n complete: function () {\r\n $addButton.addClass('hide')\r\n }\r\n }\r\n )\r\n\r\n var $check = $addButton.siblings('i.material-icons')\r\n if ($check.length > 0) {\r\n $check.velocity(\r\n {\r\n opacity: 1\r\n },\r\n {\r\n delay: 360,\r\n duration: 200,\r\n begin: function () {\r\n $check.show()\r\n }\r\n }\r\n )\r\n }\r\n },\r\n function errorCallback (err) {\r\n $log.error(err)\r\n helpers.UI.showSnackbar('Error: ' + err, true)\r\n }\r\n )\r\n }\r\n\r\n $scope.removePriorityClicked = function (pId, $event) {\r\n if ($event) {\r\n $event.preventDefault()\r\n }\r\n\r\n var deletePriorityModal = $('#deletePriorityModal-' + pId)\r\n if (deletePriorityModal.length > 0) {\r\n deletePriorityModal.find('form').trigger('reset')\r\n UIkit.modal(deletePriorityModal, { bgclose: false }).show()\r\n } else {\r\n $log.error('Unable to locate delete priority modal.')\r\n }\r\n }\r\n\r\n $scope.submitRemovePriority = function (pId, $event) {\r\n if ($event) {\r\n $event.preventDefault()\r\n }\r\n\r\n if (pId) {\r\n var $form = $($event.currentTarget).parents('form')\r\n var selectedPriority = $form.find('select[name=\"priority\"]').val()\r\n\r\n $http\r\n .post(\r\n '/api/v1/tickets/priority/' + pId + '/delete',\r\n {\r\n newPriority: selectedPriority\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function () {\r\n var $body = $('body')\r\n // $body.find('div#view-p-' + pId).remove();\r\n // $body.find('div#edit-p-' + pId).remove();\r\n $body.find('div[data-pId=\"' + pId + '\"]').remove()\r\n var deletePriorityModal = $('#deletePriorityModal-' + pId)\r\n if (deletePriorityModal) {\r\n UIkit.modal(deletePriorityModal).hide()\r\n }\r\n },\r\n function (err) {\r\n $log.error(err)\r\n helpers.UI.showSnackbar(err.data.error, true)\r\n }\r\n )\r\n }\r\n }\r\n\r\n $scope.submitRemoveTicketTypePriority = function (typeId, priorityId, $event) {\r\n if ($event) {\r\n $event.preventDefault()\r\n }\r\n\r\n if (typeId && priorityId) {\r\n $http\r\n .post(\r\n '/api/v1/tickets/type/' + typeId + '/removepriority',\r\n {\r\n priority: priorityId\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function () {\r\n helpers.UI.showSnackbar('Removed priority from type', false)\r\n var $body = $('body')\r\n $body.find('div#t-' + typeId + '-view-p-' + priorityId).remove()\r\n $body.find('div#t-' + typeId + '-edit-p-' + priorityId).remove()\r\n },\r\n function (err) {\r\n $log.error(err)\r\n helpers.UI.showSnackbar(err.data.error, true)\r\n }\r\n )\r\n }\r\n }\r\n\r\n $scope.showCreatePriorityWindow = function ($event) {\r\n if ($event) {\r\n $event.preventDefault()\r\n }\r\n\r\n var createPriorityModal = $('#createPriorityModal')\r\n if (createPriorityModal.length > 0) {\r\n createPriorityModal.find('form').trigger('reset')\r\n helpers.UI.inputs()\r\n helpers.UI.reRenderInputs()\r\n createPriorityModal.find('form').trigger('reset')\r\n createPriorityModal.find('.generateHtmlColorBtn').css({ background: '#29B955' })\r\n UIkit.modal(createPriorityModal, { bgclose: false }).show()\r\n createPriorityModal.find('input[name=\"p-name\"]').focus()\r\n } else {\r\n $log.error('Unable to locate create priority modal.')\r\n }\r\n }\r\n\r\n $scope.createPrioritySubmit = function ($event) {\r\n $event.preventDefault()\r\n var $form = $($event.currentTarget)\r\n if ($form) {\r\n if (!$form.isValid(null, null, false)) {\r\n return false\r\n }\r\n\r\n var $priorityName = $form.find('input[name=\"p-name\"]')\r\n var $priorityOverdueIn = $form.find('input[name=\"p-overdueIn\"]')\r\n var $priorityHtmlColor = $form.find('input[name=\"p-htmlColor\"]')\r\n if ($priorityName.length < 1 || $priorityOverdueIn.length < 1 || $priorityHtmlColor.length < 1) {\r\n return false\r\n }\r\n\r\n var name = $priorityName.val()\r\n var overdueIn = $priorityOverdueIn.val()\r\n var htmlColor = $priorityHtmlColor.val()\r\n\r\n $http\r\n .post(\r\n '/api/v1/tickets/priority/create',\r\n {\r\n name: name,\r\n overdueIn: overdueIn,\r\n htmlColor: htmlColor\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback (response) {\r\n var savedPriority = response.data.priority\r\n if (savedPriority) {\r\n var priorityLoop = $('body').find('.all-priorities-loop')\r\n if (priorityLoop) {\r\n $http\r\n .get('/api/v1/tickets/priorities')\r\n .success(function (pResponse) {\r\n var priorities = pResponse.priorities\r\n var html = ''\r\n html +=\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        ' +\r\n savedPriority.name +\r\n '
        \\n' +\r\n '

        SLA Overdue: ' +\r\n savedPriority.durationFormatted +\r\n '

        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n ' Edit\\n' +\r\n ' Remove\\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n ' \\n' +\r\n '
        \\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n ' Cancel\\n' +\r\n ' \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n ' \\n' +\r\n '
        \\n' +\r\n '

        Remove Priority

        \\n' +\r\n ' Please select the priority you wish to reassign tickets to in order to delete the this priority.\\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n ' \\n' +\r\n ' \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n ' WARNING: This will change all tickets with a priority of: ' +\r\n savedPriority.name +\r\n ' to the selected priority above.
        This is permanent!
        \\n' +\r\n '
        \\n' +\r\n ' \\n' +\r\n '
        \\n' +\r\n '
        \\n' +\r\n '
        \\n'\r\n\r\n priorityLoop.append(html)\r\n\r\n helpers.UI.selectize()\r\n\r\n // Bootstrap Angular dynamically...\r\n var $injector = angular.injector(['ng', 'trudesk'])\r\n $injector.invoke([\r\n '$compile',\r\n '$rootScope',\r\n function ($compile, $rootScope) {\r\n var $scope = priorityLoop.scope()\r\n $compile(priorityLoop)($scope || $rootScope)\r\n $rootScope.$digest()\r\n }\r\n ])\r\n\r\n helpers.UI.showSnackbar('Priority Created.', false)\r\n var createPriorityModal = $('#createPriorityModal')\r\n if (createPriorityModal.length > 0) {\r\n UIkit.modal(createPriorityModal).hide()\r\n }\r\n })\r\n .error(function (errorResponse) {\r\n $log.error(errorResponse)\r\n helpers.UI.showSnackbar('Error: ' + errorResponse.data.error, true)\r\n })\r\n }\r\n }\r\n },\r\n function errorCallback (errorResponse) {\r\n $log.error(errorResponse)\r\n helpers.UI.showSnackbar('Error: ' + errorResponse.data.error, true)\r\n }\r\n )\r\n }\r\n }\r\n\r\n $scope.submitUpdatePriority = function ($event) {\r\n $event.preventDefault()\r\n var $form = $($event.currentTarget)\r\n var priorityId = $form.attr('data-priority-id')\r\n var typeId = $form.parents('div[data-ticket-type-id]').attr('data-ticket-type-id')\r\n if ($form && priorityId) {\r\n var $priorityNameInput = $form.find('input[name=\"p-' + priorityId + '-name\"]')\r\n var $priorityHtmlColor = $form.find('input[name=\"p-' + priorityId + '-htmlColor\"]')\r\n var $priorityOverdueIn = $form.find('input[name=\"p-' + priorityId + '-overdueIn\"]')\r\n var priorityName = $priorityNameInput.val()\r\n var htmlColor = $priorityHtmlColor.val()\r\n var overdueIn = $priorityOverdueIn.val()\r\n\r\n $http\r\n .put(\r\n '/api/v1/tickets/priority/' + priorityId,\r\n {\r\n name: priorityName,\r\n htmlColor: htmlColor,\r\n overdueIn: overdueIn\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback (response) {\r\n helpers.UI.showSnackbar('Priority updated successfully', false)\r\n var $body = $('body')\r\n $body\r\n .find('.p-' + priorityId + '-name')\r\n .css({ color: htmlColor })\r\n .text(priorityName)\r\n $body.find('.p-' + priorityId + '-overdueIn').text(response.data.priority.durationFormatted)\r\n $body.find('input[name=\"p-' + priorityId + '-htmlColor\"]').val(htmlColor)\r\n if (typeId) {\r\n $scope.cancelEditTicketTypePriority(typeId, priorityId)\r\n } else {\r\n $scope.cancelEditPriority(priorityId)\r\n }\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err, true)\r\n }\r\n )\r\n }\r\n }\r\n\r\n // Colors watch\r\n function setApperanceColorBtn (selector, color) {\r\n var $button = $(selector)\r\n var fgColor = getContrast(color)\r\n $button.css({ background: color, color: fgColor })\r\n }\r\n\r\n $scope.$watch('colorHeaderBG', function () {\r\n setApperanceColorBtn('#headerBGColorBtn', $scope.colorHeaderBG)\r\n })\r\n $scope.$watch('colorHeaderPrimary', function () {\r\n setApperanceColorBtn('#headerPrimaryColorBtn', $scope.colorHeaderPrimary)\r\n })\r\n $scope.$watch('colorPrimary', function () {\r\n setApperanceColorBtn('#primaryColorBtn', $scope.colorPrimary)\r\n })\r\n $scope.$watch('colorSecondary', function () {\r\n setApperanceColorBtn('#secondaryColorBtn', $scope.colorSecondary)\r\n })\r\n $scope.$watch('colorTertiary', function () {\r\n setApperanceColorBtn('#tertiaryColorBtn', $scope.colorTertiary)\r\n })\r\n $scope.$watch('colorQuaternary', function () {\r\n setApperanceColorBtn('#quaternaryColorBtn', $scope.colorQuaternary)\r\n })\r\n\r\n $scope.saveColorScheme = function ($event) {\r\n $event.preventDefault()\r\n if ($scope.colorHeaderBG[0] !== '#') {\r\n helpers.UI.showSnackbar('Invalid Header BG Color', true)\r\n return false\r\n }\r\n\r\n if ($scope.colorHeaderPrimary[0] !== '#') {\r\n helpers.UI.showSnackbar('Invalid Header Primary Color', true)\r\n return false\r\n }\r\n\r\n if ($scope.colorPrimary[0] !== '#') {\r\n helpers.UI.showSnackbar('Invalid Primary Color', true)\r\n return false\r\n }\r\n\r\n if ($scope.colorSecondary[0] !== '#') {\r\n helpers.UI.showSnackbar('Invalid Secondary Color', true)\r\n return false\r\n }\r\n\r\n if ($scope.colorTertiary[0] !== '#') {\r\n helpers.UI.showSnackbar('Invalid Tertiary Color', true)\r\n return false\r\n }\r\n\r\n if ($scope.colorQuaternary[0] !== '#') {\r\n helpers.UI.showSnackbar('Invalid Quaternary Color', true)\r\n return false\r\n }\r\n\r\n $http\r\n .put(\r\n '/api/v1/settings',\r\n [\r\n { name: 'color:headerbg', value: $scope.colorHeaderBG },\r\n { name: 'color:headerprimary', value: $scope.colorHeaderPrimary },\r\n { name: 'color:primary', value: $scope.colorPrimary },\r\n { name: 'color:secondary', value: $scope.colorSecondary },\r\n { name: 'color:tertiary', value: $scope.colorTertiary },\r\n { name: 'color:quaternary', value: $scope.colorQuaternary }\r\n ],\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .then(\r\n function successCallback () {\r\n // Call rebuild of app.min.css\r\n $http.get('/api/v1/settings/buildsass').then(\r\n function successCallback () {\r\n helpers.UI.showSnackbar('Color Scheme Saved. Reloading...', false)\r\n $timeout(function () {\r\n $window.location.reload()\r\n }, 1000)\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err, true)\r\n }\r\n )\r\n },\r\n function errorCallback (err) {\r\n helpers.UI.showSnackbar(err, true)\r\n }\r\n )\r\n }\r\n\r\n $scope.revertColor = function (model, defaultColor) {\r\n $scope[model] = defaultColor\r\n }\r\n\r\n $scope.generateRandomColor = function (id, $event) {\r\n $event.preventDefault()\r\n var $currentTarget = $($event.currentTarget)\r\n if ($currentTarget.length > 0) {\r\n var color = getRandomColor()\r\n var fgColor = getContrast(color.substring(1))\r\n $currentTarget.css({ background: color, color: fgColor })\r\n $currentTarget\r\n .next()\r\n .find('input')\r\n .val(color)\r\n if (\r\n $currentTarget\r\n .next()\r\n .find('input')\r\n .attr('ng-model')\r\n ) {\r\n $scope[\r\n $currentTarget\r\n .next()\r\n .find('input')\r\n .attr('ng-model')\r\n ] = color\r\n }\r\n }\r\n }\r\n\r\n function getRandomColor () {\r\n var letters = '0123456789ABCDEF'\r\n var color = '#'\r\n for (var i = 0; i < 6; i++) {\r\n color += letters[Math.floor(Math.random() * 16)]\r\n }\r\n\r\n return color\r\n }\r\n\r\n function getContrast (hexcolor) {\r\n hexcolor = hexcolor.replace('#', '')\r\n if (hexcolor.length === 3) {\r\n var v = hexcolor[0]\r\n hexcolor = hexcolor + v + v + v\r\n }\r\n var r = parseInt(hexcolor.substr(0, 2), 16)\r\n var g = parseInt(hexcolor.substr(2, 2), 16)\r\n var b = parseInt(hexcolor.substr(4, 2), 16)\r\n var yiq = (r * 299 + g * 587 + b * 114) / 1000\r\n return yiq >= 128 ? '#444' : '#f7f8fa'\r\n }\r\n\r\n $scope.editTag = function ($event) {\r\n if (\r\n _.isNull($event.target) ||\r\n _.isUndefined($event.target) ||\r\n $event.target.tagName.toLowerCase() === 'label' ||\r\n $event.target.tagName.toLowerCase() === 'input'\r\n ) {\r\n return true\r\n }\r\n\r\n // currentTarget = ng-click() bound to. \"\"\r\n var id = $event.currentTarget.dataset.tagoid\r\n if (!id) return true\r\n\r\n History.pushState(null, null, '/settings/tags/' + id)\r\n }\r\n\r\n $scope.submitUpdateTag = function ($event) {\r\n var $form = $($event.currentTarget)\r\n var tagId = $form.attr('data-tag-id')\r\n var tagName = $form.find('input[name=\"tag-' + tagId + '-name\"]').val()\r\n if (tagName.length < 3) {\r\n helpers.UI.showSnackbar('Invalid Tag Name', true)\r\n } else {\r\n $http\r\n .put(\r\n '/api/v1/tags/' + tagId,\r\n {\r\n name: tagName\r\n },\r\n {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n }\r\n )\r\n .success(function () {\r\n helpers.UI.showSnackbar('Tag: ' + tagName + ' updated successfully', false)\r\n var $h5 = $('h5.tag-' + tagId + '-name')\r\n if ($h5.length > 0) {\r\n $h5.text(tagName)\r\n }\r\n $scope.cancelEditTagClicked(tagId, null)\r\n })\r\n .error(function (err) {\r\n helpers.UI.showSnackbar(err.error)\r\n })\r\n }\r\n }\r\n\r\n $scope.removeTagClicked = function (tagId) {\r\n var tagName = $('#view-tag-' + tagId)\r\n .find('h5')\r\n .text()\r\n UIkit.modal.confirm(\r\n 'Really delete tag ' +\r\n tagName +\r\n '
        This will remove the tag from all associated tickets!',\r\n function () {\r\n return $scope.deleteTag(tagId)\r\n },\r\n {\r\n labels: { Ok: 'Yes', Cancel: 'No' },\r\n confirmButtonClass: 'md-btn-danger'\r\n }\r\n )\r\n }\r\n\r\n $scope.deleteTag = function (tagId) {\r\n if (_.isUndefined(tagId) || tagId.length < 1) {\r\n helpers.UI.showSnackbar('Unable to get tag ID', true)\r\n return true\r\n }\r\n\r\n var tagName = $('#view-tag-' + tagId)\r\n .find('h5')\r\n .text()\r\n\r\n $http({\r\n method: 'DELETE',\r\n url: '/api/v1/tags/' + tagId\r\n }).then(\r\n function successCallback (response) {\r\n if (response.data.success) {\r\n helpers.UI.showSnackbar('Successfully removed tag: ' + tagName, false)\r\n\r\n return History.pushState(null, null, '/settings/tickets/?refresh=' + new Date().getTime())\r\n }\r\n },\r\n function errorCallback (response) {\r\n $log.error('[trudesk:settings:deleteTag] Error - ' + response.data.error)\r\n helpers.UI.showSnackbar('Unable to remove Tag. Check console.', true)\r\n }\r\n )\r\n }\r\n })\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/angularjs/controllers/settings.js?"); - -/***/ }), - -/***/ "./src/public/js/angularjs/controllers/singleTicket.js": -/*!*************************************************************!*\ - !*** ./src/public/js/angularjs/controllers/singleTicket.js ***! - \*************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 02/10/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\r\n __webpack_require__(/*! angular */ \"./src/public/js/vendor/angular/angular.min.js\"),\r\n __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"),\r\n __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"),\r\n __webpack_require__(/*! uikit */ \"./src/public/js/vendor/uikit/js/uikit_combined.min.js\"),\r\n __webpack_require__(/*! modules/socket */ \"./src/public/js/modules/socket.js\"),\r\n __webpack_require__(/*! modules/navigation */ \"./src/public/js/modules/navigation.js\"),\r\n __webpack_require__(/*! tomarkdown */ \"./src/public/js/vendor/tomarkdown/tomarkdown.js\"),\r\n __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"),\r\n __webpack_require__(/*! easymde */ \"./src/public/js/vendor/easymde/dist/easymde.min.js\"),\r\n __webpack_require__(/*! inlineAttachment */ \"./src/public/js/vendor/easymde/dist/inline-attachment.js\"),\r\n __webpack_require__(/*! inputInlineAttachment */ \"./src/public/js/vendor/easymde/dist/input.inline-attachment.js\"),\r\n __webpack_require__(/*! cm4InlineAttachment */ \"./src/public/js/vendor/easymde/dist/codemirror-4.inline-attachment.js\"),\r\n __webpack_require__(/*! angularjs/services/session */ \"./src/public/js/angularjs/services/session.js\"),\r\n __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\")\r\n], __WEBPACK_AMD_DEFINE_RESULT__ = (function (angular, _, $, UIkit, socket, nav, md, helpers, EasyMDE) {\r\n return angular\r\n .module('trudesk.controllers.singleTicket', ['trudesk.services.session'])\r\n .controller('singleTicket', function (SessionService, $window, $rootScope, $scope, $http, $timeout, $q, $log) {\r\n $scope.loggedInAccount = SessionService.getUser()\r\n\r\n var mdeToolbarItems = [\r\n {\r\n name: 'bold',\r\n action: EasyMDE.toggleBold,\r\n className: 'material-icons mi-bold no-ajaxy',\r\n title: 'Bold'\r\n },\r\n {\r\n name: 'italic',\r\n action: EasyMDE.toggleItalic,\r\n className: 'material-icons mi-italic no-ajaxy',\r\n title: 'Italic'\r\n },\r\n {\r\n name: 'Title',\r\n action: EasyMDE.toggleHeadingSmaller,\r\n className: 'material-icons mi-title no-ajaxy',\r\n title: 'Title'\r\n },\r\n '|',\r\n {\r\n name: 'Code',\r\n action: EasyMDE.toggleCodeBlock,\r\n className: 'material-icons mi-code no-ajaxy',\r\n title: 'Code'\r\n },\r\n {\r\n name: 'Quote',\r\n action: EasyMDE.toggleBlockquote,\r\n className: 'material-icons mi-quote no-ajaxy',\r\n title: 'Quote'\r\n },\r\n {\r\n name: 'Generic List',\r\n action: EasyMDE.toggleUnorderedList,\r\n className: 'material-icons mi-list no-ajaxy',\r\n title: 'Generic List'\r\n },\r\n {\r\n name: 'Numbered List',\r\n action: EasyMDE.toggleOrderedList,\r\n className: 'material-icons mi-numlist no-ajaxy',\r\n title: 'Numbered List'\r\n },\r\n '|',\r\n {\r\n name: 'Create Link',\r\n action: EasyMDE.drawLink,\r\n className: 'material-icons mi-link no-ajaxy',\r\n title: 'Create Link'\r\n },\r\n '|',\r\n {\r\n name: 'Toggle Preview',\r\n action: EasyMDE.togglePreview,\r\n className: 'material-icons mi-preview no-disable no-mobile no-ajaxy',\r\n title: 'Toggle Preview'\r\n }\r\n ]\r\n\r\n function attachFileDesc (textarea) {\r\n var $el = $(textarea)\r\n var attachFileDiv = $('
        ')\r\n attachFileDiv\r\n .addClass('attachFileDesc')\r\n .html('

        Attach images by dragging & dropping or pasting from clipboard.

        ')\r\n $el.siblings('.CodeMirror').addClass('hasFileDesc')\r\n $el\r\n .siblings('.editor-statusbar')\r\n .addClass('hasFileDesc')\r\n .prepend(attachFileDiv)\r\n }\r\n\r\n var $editIssueText = $('#edit-issue-text')\r\n var editIssueTextMDE = null\r\n if ($editIssueText.length > 0) {\r\n editIssueTextMDE = new EasyMDE({\r\n element: $editIssueText[0],\r\n forceSync: true,\r\n height: '100px',\r\n minHeight: '150px',\r\n toolbar: mdeToolbarItems,\r\n autoDownloadFontAwesome: false,\r\n status: false\r\n })\r\n }\r\n\r\n $window.inlineAttachment.editors.codemirror4.attach(editIssueTextMDE.codemirror, {\r\n onFileUploadResponse: function (xhr) {\r\n var result = JSON.parse(xhr.responseText)\r\n\r\n var filename = result[this.settings.jsonFieldName]\r\n\r\n if (result && filename) {\r\n var newValue\r\n if (typeof this.settings.urlText === 'function') {\r\n newValue = this.settings.urlText.call(this, filename, result)\r\n } else {\r\n newValue = this.settings.urlText.replace(this.filenameTag, filename)\r\n }\r\n\r\n var text = this.editor.getValue().replace(this.lastValue, newValue)\r\n this.editor.setValue(text)\r\n this.settings.onFileUploaded.call(this, filename)\r\n }\r\n return false\r\n },\r\n onFileUploadError: function (xhr) {\r\n var result = xhr.responseText\r\n var text = this.editor.getValue() + ' ' + result\r\n this.editor.setValue(text)\r\n },\r\n extraHeaders: {\r\n ticketid: $('#__ticketId').text()\r\n },\r\n errorText: 'Error uploading file: ',\r\n uploadUrl: '/tickets/uploadmdeimage',\r\n jsonFieldName: 'filename',\r\n urlText: '![Image]({filename})'\r\n })\r\n\r\n // attachFileDesc($editIssueText)\r\n\r\n $scope.showEditWindow = function (type, showSubject, commentNoteId) {\r\n var $editWindow = $('#edit-ticket-window')\r\n if ($editWindow.length < 1) return false\r\n var text = ''\r\n var ticketId = $('#__ticketId').text()\r\n $editWindow.attr('data-ticket-id', ticketId)\r\n\r\n if (type.toLowerCase() === 'issue') {\r\n var issueText = $('.initial-issue .issue-text > .issue-body').html()\r\n text = md(issueText)\r\n\r\n $editWindow.find('.save-btn').attr('data-save-type', 'issue')\r\n } else if (type.toLowerCase() === 'comment') {\r\n var commentText = $('.ticket-comment[data-commentid=\"' + commentNoteId + '\"] .comment-body').html()\r\n text = md(commentText)\r\n\r\n $editWindow.attr('data-id', commentNoteId)\r\n $editWindow.find('.save-btn').attr('data-save-type', 'comment')\r\n } else if (type.toLowerCase() === 'note') {\r\n var noteText = $('.ticket-note[data-noteid=\"' + commentNoteId + '\"] .comment-body').html()\r\n text = md(noteText)\r\n\r\n $editWindow.attr('data-id', commentNoteId)\r\n $editWindow.find('.save-btn').attr('data-save-type', 'note')\r\n }\r\n\r\n if (editIssueTextMDE) {\r\n editIssueTextMDE.codemirror.getDoc().setValue(text)\r\n }\r\n\r\n var $subjectWrap = $editWindow.find('.edit-subject-wrap')\r\n\r\n if (!showSubject) {\r\n $subjectWrap.hide()\r\n $subjectWrap.attr('data-active', false)\r\n } else {\r\n var subjectText = ''\r\n if (type.toLowerCase() === 'issue') {\r\n subjectText = $('.initial-issue > .issue-text > .subject-text').text()\r\n }\r\n\r\n var $input = $subjectWrap.find('input')\r\n $input.val(subjectText)\r\n $input.parent().addClass('md-input-filled')\r\n $subjectWrap.attr('data-active', true)\r\n }\r\n\r\n $editWindow.addClass('open').removeClass('closed')\r\n }\r\n\r\n $scope.hideEditWindow = function () {\r\n $('#edit-ticket-window')\r\n .addClass('closed')\r\n .removeClass('open')\r\n }\r\n\r\n $scope.saveEditWindow = function () {\r\n if (!editIssueTextMDE) return false\r\n var $editTicketWindow = $('#edit-ticket-window')\r\n var ticketId = $editTicketWindow.attr('data-ticket-id')\r\n var $subject = $editTicketWindow.find('input#edit-subject-input')\r\n var $saveButton = $editTicketWindow.find('.action-panel button[data-save-type]')\r\n var saveType = null\r\n if ($saveButton.length > 0) saveType = $saveButton.attr('data-save-type')\r\n\r\n if (saveType.toLowerCase() === 'issue') {\r\n var subjectText = $subject.val()\r\n var issueText = editIssueTextMDE.codemirror.getValue()\r\n\r\n socket.ui.setTicketIssue(ticketId, issueText, subjectText)\r\n $scope.hideEditWindow()\r\n } else if (saveType.toLowerCase() === 'comment') {\r\n var commentId = $editTicketWindow.attr('data-id')\r\n var commentText = editIssueTextMDE.codemirror.getValue()\r\n\r\n socket.ui.setCommentText(ticketId, commentId, commentText)\r\n $scope.hideEditWindow()\r\n } else if (saveType.toLowerCase() === 'note') {\r\n var noteId = $editTicketWindow.attr('data-id')\r\n var noteText = editIssueTextMDE.codemirror.getValue()\r\n\r\n socket.ui.setNoteText(ticketId, noteId, noteText)\r\n $scope.hideEditWindow()\r\n }\r\n }\r\n\r\n var $commentReply = $('#commentReply')\r\n var commentMDE = null\r\n if ($commentReply.length > 0) {\r\n commentMDE = new EasyMDE({\r\n element: $commentReply[0],\r\n forceSync: true,\r\n minHeight: '220px', // Slighty smaller to adjust the scroll\r\n toolbar: mdeToolbarItems,\r\n autoDownloadFontAwesome: false\r\n })\r\n\r\n commentMDE.codemirror.setOption('extraKeys', {\r\n 'Ctrl-Enter': function (cm) {\r\n var $submitButton = $(cm.display.wrapper)\r\n .parents('form')\r\n .find('#comment-reply-submit-button')\r\n if ($submitButton) {\r\n $submitButton.click()\r\n }\r\n }\r\n })\r\n\r\n $window.inlineAttachment.editors.codemirror4.attach(commentMDE.codemirror, {\r\n onFileUploadResponse: function (xhr) {\r\n var result = JSON.parse(xhr.responseText)\r\n\r\n var filename = result[this.settings.jsonFieldName]\r\n\r\n if (result && filename) {\r\n var newValue\r\n if (typeof this.settings.urlText === 'function') {\r\n newValue = this.settings.urlText.call(this, filename, result)\r\n } else {\r\n newValue = this.settings.urlText.replace(this.filenameTag, filename)\r\n }\r\n\r\n var text = this.editor.getValue().replace(this.lastValue, newValue)\r\n this.editor.setValue(text)\r\n this.settings.onFileUploaded.call(this, filename)\r\n }\r\n return false\r\n },\r\n onFileUploadError: function (xhr) {\r\n var result = xhr.responseText\r\n var text = this.editor.getValue() + ' ' + result\r\n this.editor.setValue(text)\r\n },\r\n extraHeaders: {\r\n ticketid: $('#__ticketId').text()\r\n },\r\n errorText: 'Error uploading file: ',\r\n uploadUrl: '/tickets/uploadmdeimage',\r\n jsonFieldName: 'filename',\r\n urlText: '![Image]({filename})'\r\n })\r\n\r\n attachFileDesc($commentReply)\r\n }\r\n\r\n var $ticketNote = $('#ticket-note')\r\n var noteMDE = null\r\n if ($ticketNote.length > 0) {\r\n noteMDE = new EasyMDE({\r\n element: $ticketNote[0],\r\n forceSync: true,\r\n minHeight: '220px',\r\n toolbar: mdeToolbarItems,\r\n autoDownloadFontAwesome: false\r\n })\r\n\r\n $window.inlineAttachment.editors.codemirror4.attach(noteMDE.codemirror, {\r\n onFileUploadResponse: function (xhr) {\r\n var result = JSON.parse(xhr.responseText)\r\n\r\n var filename = result[this.settings.jsonFieldName]\r\n\r\n if (result && filename) {\r\n var newValue\r\n if (typeof this.settings.urlText === 'function') {\r\n newValue = this.settings.urlText.call(this, filename, result)\r\n } else {\r\n newValue = this.settings.urlText.replace(this.filenameTag, filename)\r\n }\r\n\r\n var text = this.editor.getValue().replace(this.lastValue, newValue)\r\n this.editor.setValue(text)\r\n this.settings.onFileUploaded.call(this, filename)\r\n }\r\n return false\r\n },\r\n onFileUploadError: function (xhr) {\r\n var result = xhr.responseText\r\n var text = this.editor.getValue() + ' ' + result\r\n this.editor.setValue(text)\r\n },\r\n extraHeaders: {\r\n ticketid: $('#__ticketId').text()\r\n },\r\n errorText: 'Error uploading file: ',\r\n uploadUrl: '/tickets/uploadmdeimage',\r\n jsonFieldName: 'filename',\r\n urlText: '![Image]({filename})'\r\n })\r\n\r\n attachFileDesc($ticketNote)\r\n }\r\n\r\n // Setup Assignee Drop based on Status\r\n var ticketStatus = $('#__ticketStatus').html()\r\n var assigneeListBtn = $('.ticket-assignee > a')\r\n if (assigneeListBtn.length > 0 && ticketStatus.length > 0) {\r\n if (ticketStatus === '3') {\r\n assigneeListBtn.removeAttr('data-notifications')\r\n assigneeListBtn.removeAttr('data-updateUi')\r\n nav.notifications()\r\n }\r\n }\r\n\r\n $scope.showStatusSelect = function () {\r\n var statusSelect = $('#statusSelect')\r\n if (statusSelect.length > 0) {\r\n if (statusSelect.hasClass('hide')) {\r\n statusSelect.removeClass('hide')\r\n statusSelect.addClass('shown')\r\n } else {\r\n statusSelect.addClass('hide')\r\n statusSelect.removeClass('shown')\r\n }\r\n }\r\n }\r\n\r\n $scope.changeStatus = function (status) {\r\n var id = $('#__ticketId').html()\r\n var statusSelectBox = $('#statusSelect')\r\n if (statusSelectBox.length > 0) {\r\n statusSelectBox.addClass('hide')\r\n statusSelectBox.removeClass('shown')\r\n }\r\n\r\n socket.ui.sendUpdateTicketStatus(id, status)\r\n }\r\n\r\n $scope.clearAssignee = function () {\r\n var id = $('#__ticketId').html()\r\n if (id.length > 0) {\r\n socket.ui.clearAssignee(id)\r\n }\r\n }\r\n\r\n $scope.types = []\r\n $scope.priorities = []\r\n $scope.groups = []\r\n\r\n var ticketTypes = $http\r\n .get('/api/v1/tickets/types')\r\n .success(function (data) {\r\n _.each(data, function (item) {\r\n item.priorities = _.sortBy(item.priorities, function (i) {\r\n return i.name\r\n })\r\n $scope.types.push(item)\r\n })\r\n })\r\n .error(function (e) {\r\n $log.log('[trudesk:singleTicket:ticketTypes] - ' + e)\r\n })\r\n\r\n function showSelectPriorityConfirm () {\r\n UIkit.modal.confirm(\r\n 'Selected Priority does not exit for this ticket type.

        Please select a new priority',\r\n function () {},\r\n { cancelButtonClass: 'uk-hidden' }\r\n )\r\n }\r\n\r\n $q.all([ticketTypes]).then(function () {\r\n $scope.selectedType = _.findWhere($scope.types, {\r\n _id: $scope.ticketType\r\n })\r\n $scope.priorities = $scope.selectedType.priorities\r\n $scope.priorities = _.sortBy($scope.priorities, 'name')\r\n $scope.selectedPriority = _.findWhere($scope.priorities, {\r\n _id: $scope.ticketPriority\r\n })\r\n if (!$scope.selectedPriority) {\r\n showSelectPriorityConfirm()\r\n }\r\n })\r\n\r\n var groupHttpGet = $http\r\n .get('/api/v1/groups')\r\n .success(function (data) {\r\n _.each(data.groups, function (item) {\r\n $scope.groups.push(item)\r\n })\r\n })\r\n .error(function (e) {\r\n $log.log('[trudesk:singleTicket:groupHttpGet] - ' + e)\r\n })\r\n\r\n $q.all([groupHttpGet]).then(function () {\r\n $scope.selectedGroup = _.findWhere($scope.groups, {\r\n _id: $scope.ticketGroup\r\n })\r\n })\r\n\r\n $scope.updateTicketType = function () {\r\n var id = $('#__ticketId').html()\r\n if (id.length > 0) {\r\n socket.ui.setTicketType(id, $scope.selectedType)\r\n $scope.priorities = $scope.selectedType.priorities\r\n $scope.priorities = _.sortBy($scope.priorities, 'name')\r\n $scope.selectedPriority = _.findWhere($scope.priorities, {\r\n _id: $scope.ticketPriority\r\n })\r\n if (_.isUndefined($scope.selectedPriority)) {\r\n showSelectPriorityConfirm()\r\n }\r\n }\r\n }\r\n\r\n $scope.updateTicketPriority = function () {\r\n var id = $('#__ticketId').html()\r\n if (id.length > 0 && $scope.selectedPriority) {\r\n socket.ui.setTicketPriority(id, $scope.selectedPriority._id)\r\n $scope.ticketPriority = $scope.selectedPriority._id\r\n }\r\n }\r\n\r\n $scope.updateTicketGroup = function () {\r\n var id = $('#__ticketId').html()\r\n if (id.length > 0) {\r\n socket.ui.setTicketGroup(id, $scope.selectedGroup)\r\n }\r\n }\r\n\r\n $scope.updateTicketIssue = function () {\r\n var id = $('#__ticketId').html()\r\n if (id.length > 0) {\r\n var form = $('form#edit-issue-form')\r\n if (!form.isValid(null, null, false)) return true\r\n var issue = form.find('textarea#issueText').val()\r\n\r\n // socket.ui.setTicketIssue(id, issue)\r\n }\r\n }\r\n\r\n $scope.editIssueCancelClicked = function ($event) {\r\n $('#edit-issue')\r\n .addClass('closed')\r\n .removeClass('open')\r\n\r\n $event.preventDefault()\r\n var issueForm = $('.edit-issue-form')\r\n var issueText = $('.initial-issue')\r\n .find('.issue-text')\r\n .find('.issue-body')\r\n\r\n if (issueForm.length > 0 && issueText.length > 0) {\r\n issueText.removeClass('hide')\r\n issueForm.addClass('hide')\r\n\r\n // Setup Text\r\n var iText = $('.issue-text')\r\n .find('div.issue-body')\r\n .html()\r\n // iText = iText.replace(/(
        )|(
        )|(

        )|(<\\/p>)/g, \"\\r\\n\");\r\n // iText = iText.replace(/(<([^>]+)>)/ig,\"\");\r\n iText = md(iText)\r\n iText = iText.trim()\r\n $('#issueText').val(iText)\r\n }\r\n }\r\n\r\n $scope.showUploadAttachment = function ($event) {\r\n $event.preventDefault()\r\n var self = $($event.currentTarget)\r\n var inputField = self.parents('form').find('input.attachmentInput')\r\n if (inputField.length > 0) {\r\n $(inputField).trigger('click')\r\n }\r\n }\r\n\r\n $scope.SubscriberChange = function () {\r\n var id = $('#__ticketId').html()\r\n $http\r\n .put('/api/v1/tickets/' + id + '/subscribe', {\r\n user: $scope.user,\r\n subscribe: $scope.subscribed\r\n })\r\n .success(function () {})\r\n .error(function (e) {\r\n $log.log('[trudesk:singleTicket:SubscriberChange] - ' + e)\r\n helpers.UI.showSnackbar('Error: ' + e.message, true)\r\n })\r\n }\r\n\r\n $scope.showTags = function (event) {\r\n event.preventDefault()\r\n var tagModal = $('#addTagModal')\r\n if (tagModal.length > 0) {\r\n tagModal.find('option').prop('selected', false)\r\n var selectedItems = []\r\n $('.__TAG_SELECTED').each(function () {\r\n var vm = this\r\n var i = $(vm).text()\r\n if (i.length > 0) {\r\n selectedItems.push(i)\r\n }\r\n })\r\n _.each(selectedItems, function (item) {\r\n var option = tagModal.find('#tags').find('option[value=\"' + item + '\"]')\r\n option.prop('selected', 'selected')\r\n })\r\n\r\n tagModal.find('select').trigger('chosen:updated')\r\n\r\n UIkit.modal('#addTagModal', { bgclose: false }).show()\r\n }\r\n }\r\n\r\n $scope.submitAddTags = function (event) {\r\n event.preventDefault()\r\n var id = $('#__ticketId').text()\r\n var form = $(event.target)\r\n if (form.length < 1) return\r\n var tagField = form.find('#tags')\r\n if (tagField.length < 1) return\r\n // var user = form.find('input[name=\"from\"]').val();\r\n $http\r\n .put('/api/v1/tickets/' + id, {\r\n tags: tagField.val()\r\n })\r\n .success(function () {\r\n helpers.UI.showSnackbar('Tags have been added.', false)\r\n socket.ui.refreshTicketTags(id)\r\n\r\n UIkit.modal('#addTagModal').hide()\r\n })\r\n .error(function (e) {\r\n $log.log('[trudesk:singleTicket:submitAddTags] - ' + e)\r\n helpers.UI.showSnackbar('Error: ' + e.message, true)\r\n\r\n UIkit.modal('#addTagModal').hide()\r\n })\r\n }\r\n\r\n $scope.clearTags = function (event) {\r\n event.preventDefault()\r\n var id = $('#__ticketId').text()\r\n $http\r\n .put('/api/v1/tickets/' + id, {\r\n tags: []\r\n })\r\n .success(function () {\r\n socket.ui.refreshTicketTags(id)\r\n $('#addTagModal')\r\n .find('option')\r\n .prop('selected', false)\r\n $('#addTagModal')\r\n .find('select')\r\n .trigger('chosen:updated')\r\n UIkit.modal('#addTagModal').hide()\r\n })\r\n .error(function (e) {\r\n $log.log('[trudesk:singleTicket:clearTags] - ' + e.message)\r\n helpers.UI.showSnackbar('Error: ' + e.message, true)\r\n UIkit.modal('#addTagModal').hide()\r\n })\r\n }\r\n\r\n $scope.submitComment = function (event) {\r\n event.preventDefault()\r\n var form = $(event.target)\r\n if (form.length < 1) return\r\n var id = form.find('input[name=\"ticketId\"]')\r\n var commentField = form.find('#commentReply')\r\n if (commentField.length < 1 || id.length < 1) return\r\n\r\n var $mdeError = null\r\n if (commentField.val().length < 5) {\r\n // commentField.validate();\r\n commentField.parent().css({ border: '1px solid #E74C3C' })\r\n var mdeError = $(\r\n '

        Please enter a valid comment. Comments must contain at least 5 characters.
        '\r\n )\r\n\r\n $mdeError = commentField.siblings('.editor-statusbar').find('.mde-error')\r\n if ($mdeError.length < 1) {\r\n commentField.siblings('.editor-statusbar').prepend(mdeError)\r\n }\r\n\r\n return\r\n }\r\n\r\n commentField.parent().css('border', 'none')\r\n $mdeError = commentField.parent().find('.mde-error')\r\n if ($mdeError.length > 0) $mdeError.remove()\r\n\r\n if (form.isValid(null, null, false)) {\r\n $http\r\n .post('/api/v1/tickets/addcomment', {\r\n comment: commentMDE.value(),\r\n _id: id.val().toString(),\r\n ownerId: $scope.loggedInAccount._id\r\n })\r\n .success(function () {\r\n commentField.val('')\r\n if (commentMDE) {\r\n commentMDE.value('')\r\n }\r\n })\r\n .error(function (e) {\r\n $log.error('[trudesk:singleTicket:submitComment]')\r\n $log.error(e)\r\n helpers.UI.showSnackbar('Error: ' + e.error, true)\r\n })\r\n }\r\n }\r\n\r\n $scope.submitInternalNote = function (event) {\r\n event.preventDefault()\r\n var id = $('#__ticketId').text()\r\n var form = $(event.target)\r\n if (form.length < 1) return\r\n var noteField = form.find('#ticket-note')\r\n if (noteField.length < 1 || id.length < 1) return\r\n\r\n var $mdeError = null\r\n if (noteField.val().length < 5) {\r\n noteField.parent().css({ border: '1px solid #E74C3C' })\r\n var mdeError = $(\r\n '
        Please enter a valid note. Notes must contain at least 5 characters.
        '\r\n )\r\n\r\n $mdeError = noteField.siblings('.editor-statusbar').find('.mde-error')\r\n if ($mdeError.length < 1) {\r\n noteField.siblings('.editor-statusbar').prepend(mdeError)\r\n }\r\n\r\n return\r\n }\r\n\r\n noteField.parent().css('border', 'none')\r\n $mdeError = noteField.parent().find('.mde-error')\r\n if ($mdeError.length > 0) $mdeError.remove()\r\n\r\n if (form.isValid(null, null, false)) {\r\n $http\r\n .post('/api/v1/tickets/addnote', {\r\n note: noteField.val(),\r\n ticketid: id,\r\n owner: $scope.loggedInAccount._id\r\n })\r\n .success(function () {\r\n noteField.val('')\r\n if (noteMDE) {\r\n noteMDE.value('')\r\n }\r\n })\r\n .error(function (e) {\r\n $log.error('[trudesk:singleTicket:submitInternalNote]')\r\n $log.error(e)\r\n helpers.UI.showSnackbar('Error: ' + e.error, true)\r\n })\r\n }\r\n }\r\n\r\n $scope.closeAddTagModal = function () {\r\n UIkit.modal('#addTagModal').hide()\r\n }\r\n })\r\n .directive('closeMouseUp', [\r\n '$document',\r\n function ($document) {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element) {\r\n $document.on('mouseup', mouseup)\r\n\r\n scope.$on('$destroy', function () {\r\n $document.off('mouseup', mouseup)\r\n })\r\n\r\n element.on('$destroy', function () {\r\n $document.off('mouseup', mouseup)\r\n })\r\n\r\n function mouseup ($event) {\r\n var target = $event.target.offsetParent\r\n if ($(target).length > 0 && $(target).hasClass('floating-ticket-status')) return false\r\n\r\n if (!element.hasClass('hide')) {\r\n element.addClass('hide')\r\n }\r\n\r\n if (element.hasClass('shown')) {\r\n element.removeClass('shown')\r\n }\r\n }\r\n }\r\n }\r\n }\r\n ])\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/angularjs/controllers/singleTicket.js?"); - -/***/ }), - -/***/ "./src/public/js/angularjs/controllers/tickets.js": -/*!********************************************************!*\ - !*** ./src/public/js/angularjs/controllers/tickets.js ***! - \********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\r\n * . .o8 oooo\r\n * .o8 \"888 `888\r\n * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n * 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n * 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n * \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n * ========================================================================\r\n * Author: Chris Brame\r\n * Updated: 1/30/19 3:05 AM\r\n * Copyright (c) 2014-2019. All rights reserved.\r\n */\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\r\n __webpack_require__(/*! angular */ \"./src/public/js/vendor/angular/angular.min.js\"),\r\n __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"),\r\n __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"),\r\n __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"),\r\n __webpack_require__(/*! modules/socket */ \"./src/public/js/modules/socket.js\"),\r\n __webpack_require__(/*! uikit */ \"./src/public/js/vendor/uikit/js/uikit_combined.min.js\"),\r\n __webpack_require__(/*! easymde */ \"./src/public/js/vendor/easymde/dist/easymde.min.js\"),\r\n __webpack_require__(/*! inlineAttachment */ \"./src/public/js/vendor/easymde/dist/inline-attachment.js\"),\r\n __webpack_require__(/*! inputInlineAttachment */ \"./src/public/js/vendor/easymde/dist/input.inline-attachment.js\"),\r\n __webpack_require__(/*! cm4InlineAttachment */ \"./src/public/js/vendor/easymde/dist/codemirror-4.inline-attachment.js\"),\r\n __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\"),\r\n __webpack_require__(/*! formvalidator */ \"./src/public/js/vendor/formvalidator/jquery.form-validator.js\"),\r\n __webpack_require__(/*! angularjs/services */ \"./src/public/js/angularjs/services.js\")\r\n], __WEBPACK_AMD_DEFINE_RESULT__ = (function (angular, _, $, helpers, socket, UIkit, EasyMDE) {\r\n return angular\r\n .module('trudesk.controllers.tickets', ['trudesk.services.settings'])\r\n .controller('ticketsCtrl', function (SettingsService, $scope, $http, $window, $log, openFilterTicketWindow) {\r\n var mdeToolbarItems = [\r\n {\r\n name: 'bold',\r\n action: EasyMDE.toggleBold,\r\n className: 'material-icons mi-bold no-ajaxy',\r\n title: 'Bold'\r\n },\r\n {\r\n name: 'italic',\r\n action: EasyMDE.toggleItalic,\r\n className: 'material-icons mi-italic no-ajaxy',\r\n title: 'Italic'\r\n },\r\n {\r\n name: 'Title',\r\n action: EasyMDE.toggleHeadingSmaller,\r\n className: 'material-icons mi-title no-ajaxy',\r\n title: 'Title'\r\n },\r\n '|',\r\n {\r\n name: 'Code',\r\n action: EasyMDE.toggleCodeBlock,\r\n className: 'material-icons mi-code no-ajaxy',\r\n title: 'Code'\r\n },\r\n {\r\n name: 'Quote',\r\n action: EasyMDE.toggleBlockquote,\r\n className: 'material-icons mi-quote no-ajaxy',\r\n title: 'Quote'\r\n },\r\n {\r\n name: 'Generic List',\r\n action: EasyMDE.toggleUnorderedList,\r\n className: 'material-icons mi-list no-ajaxy',\r\n title: 'Generic List'\r\n },\r\n {\r\n name: 'Numbered List',\r\n action: EasyMDE.toggleOrderedList,\r\n className: 'material-icons mi-numlist no-ajaxy',\r\n title: 'Numbered List'\r\n },\r\n '|',\r\n {\r\n name: 'Create Link',\r\n action: EasyMDE.drawLink,\r\n className: 'material-icons mi-link no-ajaxy',\r\n title: 'Create Link'\r\n },\r\n '|',\r\n {\r\n name: 'Toggle Preview',\r\n action: EasyMDE.togglePreview,\r\n className: 'material-icons mi-preview no-disable no-mobile no-ajaxy',\r\n title: 'Toggle Preview'\r\n }\r\n ]\r\n\r\n function attachFileDesc (textarea) {\r\n var $el = $(textarea)\r\n var attachFileDiv = $('
        ')\r\n attachFileDiv\r\n .addClass('attachFileDesc')\r\n .html('

        Attach images by dragging & dropping or pasting from clipboard.

        ')\r\n $el.siblings('.CodeMirror').addClass('hasFileDesc')\r\n $el\r\n .siblings('.editor-statusbar')\r\n .addClass('hasFileDesc')\r\n .prepend(attachFileDiv)\r\n }\r\n\r\n var $issueTextarea = $('textarea#issue:not(.hasMDE)')\r\n var issueTextMDE = null\r\n if ($issueTextarea.length > 0) {\r\n $issueTextarea.addClass('hasMDE')\r\n issueTextMDE = new EasyMDE({\r\n element: $issueTextarea[0],\r\n forceSync: true,\r\n height: '100px',\r\n minHeight: '150px',\r\n toolbar: mdeToolbarItems,\r\n autoDownloadFontAwesome: false,\r\n status: false,\r\n spellChecker: false\r\n })\r\n }\r\n\r\n if (issueTextMDE != null && $issueTextarea.hasClass('hasMDE') && !$issueTextarea.hasClass('hasInlineUpload')) {\r\n $issueTextarea.addClass('hasInlineUpload')\r\n $window.inlineAttachment.editors.codemirror4.attach(issueTextMDE.codemirror, {\r\n onFileUploadResponse: function (xhr) {\r\n var result = JSON.parse(xhr.responseText)\r\n\r\n var filename = result[this.settings.jsonFieldName]\r\n\r\n if (result && filename) {\r\n var newValue\r\n if (typeof this.settings.urlText === 'function') {\r\n newValue = this.settings.urlText.call(this, filename, result)\r\n } else {\r\n newValue = this.settings.urlText.replace(this.filenameTag, filename)\r\n }\r\n\r\n var text = this.editor.getValue().replace(this.lastValue, newValue)\r\n this.editor.setValue(text)\r\n this.settings.onFileUploaded.call(this, filename)\r\n }\r\n return false\r\n },\r\n onFileUploadError: function (xhr) {\r\n var result = xhr.responseText\r\n var text = this.editor.getValue() + ' ' + result\r\n this.editor.setValue(text)\r\n },\r\n extraHeaders: {\r\n ticketid: 'uploads'\r\n },\r\n errorText: 'Error uploading file: ',\r\n uploadUrl: '/tickets/uploadmdeimage',\r\n jsonFieldName: 'filename',\r\n urlText: '![Image]({filename})'\r\n })\r\n\r\n attachFileDesc($issueTextarea)\r\n }\r\n\r\n $scope.openFilterTicketWindow = function () {\r\n openFilterTicketWindow.openWindow()\r\n }\r\n\r\n $scope.submitTicketForm = function (event) {\r\n event.preventDefault()\r\n var socketId = socket.ui.socket.io.engine.id\r\n var data = {}\r\n var form = $('#createTicketForm')\r\n var issueField = form.find('textarea#issue')\r\n\r\n if (issueField.length < 1) return\r\n\r\n var minIssueLength = SettingsService.getSettings().minIssueLength.value\r\n var $mdeError = null\r\n if (issueField.val().length < minIssueLength) {\r\n // commentField.validate();\r\n issueField.parent().css({ border: '1px solid #E74C3C' })\r\n var mdeError = $(\r\n '
        Please enter a valid comment. Comments must contain at least ' +\r\n minIssueLength +\r\n ' characters.
        '\r\n )\r\n\r\n $mdeError = issueField.siblings('.editor-statusbar').find('.mde-error')\r\n if ($mdeError.length < 1) {\r\n issueField.siblings('.editor-statusbar').prepend(mdeError)\r\n }\r\n\r\n return\r\n }\r\n\r\n issueField.parent().css('border', 'none')\r\n $mdeError = issueField.parent().find('.mde-error')\r\n if ($mdeError.length > 0) $mdeError.remove()\r\n\r\n if (!form.isValid(null, null, false)) {\r\n return true\r\n }\r\n\r\n form.serializeArray().map(function (x) {\r\n data[x.name] = x.value\r\n })\r\n data.tags = form.find('#tags').val()\r\n data.socketId = socketId\r\n $http({\r\n method: 'POST',\r\n url: '/api/v1/tickets/create',\r\n data: data,\r\n headers: { 'Content-Type': 'application/json' }\r\n })\r\n .success(function (data) {\r\n if (!data.success) {\r\n if (data.error) {\r\n helpers.UI.showSnackbar({\r\n text: 'Error: ' + data.error,\r\n actionTextColor: '#B92929'\r\n })\r\n return\r\n }\r\n\r\n helpers.UI.showSnackbar({\r\n text: 'Error submitting ticket.',\r\n actionTextColor: '#B92929'\r\n })\r\n }\r\n\r\n helpers.UI.showSnackbar({ text: 'Ticket Created Successfully' })\r\n\r\n UIkit.modal('#ticketCreateModal').hide()\r\n\r\n // History.pushState(null, null, '/tickets/');\r\n })\r\n .error(function (err) {\r\n $log.error('[trudesk:tickets:submitTicketForm] - ' + err.error.message)\r\n helpers.UI.showSnackbar({\r\n text: 'Error: ' + err.error.message,\r\n actionTextColor: '#B92929'\r\n })\r\n })\r\n }\r\n\r\n $scope.searchBarSubmit = function (event) {\r\n if (!_.isUndefined(event.keyCode) && event.keyCode === 13) {\r\n var searchBoxText = $('#tickets_Search').val()\r\n if (searchBoxText.length < 3) return true\r\n\r\n var queryString = '?uid={0}&fs={0}&it={0}'.formatUnicorn(searchBoxText)\r\n\r\n History.pushState(\r\n null,\r\n null,\r\n '/tickets/filter/' + queryString + '&r=' + Math.floor(Math.random() * (99999 - 1 + 1)) + 1\r\n )\r\n }\r\n }\r\n\r\n $scope.showTags = function (event) {\r\n event.preventDefault()\r\n var tagModal = $('#addTagModal')\r\n if (tagModal.length > 0) {\r\n tagModal.find('#tags').trigger('chosen:updated')\r\n UIkit.modal(tagModal).show()\r\n }\r\n }\r\n\r\n $scope.submitAddTag = function (event) {\r\n event.preventDefault()\r\n var form = $('form#addTagForm')\r\n if (form.length > 0) {\r\n var tag = form.find('#tag').val()\r\n var data = {\r\n tag: tag\r\n }\r\n\r\n $http({\r\n method: 'POST',\r\n url: '/api/v1/tags/create',\r\n data: data,\r\n headers: { 'Content-Type': 'application/json' }\r\n })\r\n .success(function (data) {\r\n var tagModal = $('#addTagModal')\r\n var tagFormField = $('#tags')\r\n tagFormField.append(\r\n ''\r\n )\r\n tagFormField.trigger('chosen:updated')\r\n if (tagModal.length > 0) UIkit.modal(tagModal).hide()\r\n })\r\n .error(function (err) {\r\n $log.error('[trudesk:tickets:addTag} - Error: ' + err.error)\r\n helpers.UI.showSnackbar({\r\n text: 'Error: ' + err.error,\r\n actionTextColor: '#B92929'\r\n })\r\n })\r\n }\r\n }\r\n\r\n $scope.deleteTickets = function () {\r\n var $ids = getChecked()\r\n _.each($ids, function (id) {\r\n $http\r\n .delete('/api/v1/tickets/' + id)\r\n .success(function () {\r\n clearChecked()\r\n removeCheckedFromGrid()\r\n helpers.UI.showSnackbar({ text: 'Ticket Deleted Successfully' })\r\n })\r\n .error(function (e) {\r\n $log.error('[trudesk:tickets:deleteTickets] - ' + e)\r\n helpers.UI.showSnackbar({\r\n text: 'Error: ' + e.error.message,\r\n actionTextColor: '#B92929'\r\n })\r\n })\r\n })\r\n\r\n // hide Dropdown\r\n helpers.hideAllpDropDowns()\r\n }\r\n\r\n $scope.setOpenTickets = function () {\r\n var $ids = getChecked()\r\n\r\n _.each($ids, function (id) {\r\n $http\r\n .put('/api/v1/tickets/' + id, {\r\n status: 1\r\n })\r\n .success(function () {\r\n helpers.UI.showSnackbar({ text: 'Ticket status set to open' })\r\n })\r\n .error(function (e) {\r\n $log.error('[trudesk:tickets:openTickets] - Error: ', e)\r\n helpers.UI.showSnackbar('An Error occurred. Please check console.', true)\r\n })\r\n })\r\n }\r\n\r\n $scope.setPendingTickets = function () {\r\n var $ids = getChecked()\r\n\r\n _.each($ids, function (id) {\r\n $http\r\n .put('/api/v1/tickets/' + id, {\r\n status: 2\r\n })\r\n .success(function () {\r\n helpers.UI.showSnackbar('Ticket status set to pending', false)\r\n })\r\n .error(function (e) {\r\n $log.error('[trudes:tickets:setPendingTickets] - Error ', e)\r\n helpers.UI.showSnackbar('An Error occurred. Please check console.', true)\r\n })\r\n })\r\n }\r\n\r\n $scope.setClosedTickets = function () {\r\n var $ids = getChecked()\r\n\r\n _.each($ids, function (id) {\r\n $http\r\n .put('/api/v1/tickets/' + id, {\r\n status: 3\r\n })\r\n .success(function () {\r\n helpers.UI.showSnackbar('Ticket status set to closed', false)\r\n })\r\n .error(function (e) {\r\n $log.error('[trudesk:tickets:closeTickets] - Error', e)\r\n helpers.UI.showSnackbar('An Error occurred. Please check console.', true)\r\n })\r\n })\r\n }\r\n\r\n $scope.GridRefreshChanged = function () {\r\n $http\r\n .put('/api/v1/users/' + $scope.username + '/updatepreferences', {\r\n preference: 'autoRefreshTicketGrid',\r\n value: $scope.preferences_autoRefreshTicketGrid\r\n })\r\n .success(function () {})\r\n .error(function (e) {\r\n $log.error('[trudesk:tickets:GridRefreshChanged] - ' + e)\r\n helpers.UI.showSnackbar({\r\n text: 'Error: ' + e.message,\r\n actionTextColor: '#B92929'\r\n })\r\n })\r\n }\r\n\r\n $scope.RefreshTicketGrid = function (event) {\r\n var path = $window.location.pathname\r\n History.pushState(null, null, path + '?r=' + Math.random())\r\n event.preventDefault()\r\n }\r\n\r\n $scope.submitFilter = function () {\r\n var data = {}\r\n var $ticketFilterForm = $('#ticketFilterForm')\r\n\r\n $ticketFilterForm.serializeArray().map(function (x) {\r\n data[x.name] = x.value\r\n })\r\n var querystring = '?f=1'\r\n if (!_.isEmpty(data.filterSubject)) {\r\n querystring += '&fs=' + data.filterSubject\r\n }\r\n if (!_.isEmpty(data.filterDate_Start)) {\r\n querystring += '&ds=' + data.filterDate_Start\r\n }\r\n if (!_.isEmpty(data.filterDate_End)) {\r\n querystring += '&de=' + data.filterDate_End\r\n }\r\n\r\n var filterStatus = $ticketFilterForm.find('select#filterStatus').val()\r\n _.each(filterStatus, function (item) {\r\n querystring += '&st=' + item\r\n })\r\n\r\n var filterPriority = $ticketFilterForm.find('select#filterPriority').val()\r\n _.each(filterPriority, function (item) {\r\n querystring += '&pr=' + item\r\n })\r\n\r\n var filterGroup = $ticketFilterForm.find('select#filterGroup').val()\r\n _.each(filterGroup, function (item) {\r\n querystring += '&gp=' + item\r\n })\r\n\r\n var filterType = $ticketFilterForm.find('select#filterType').val()\r\n _.each(filterType, function (item) {\r\n querystring += '&tt=' + item\r\n })\r\n\r\n var filterTags = $ticketFilterForm.find('select#filterTags').val()\r\n _.each(filterTags, function (item) {\r\n querystring += '&tag=' + item\r\n })\r\n\r\n var filterAssignee = $ticketFilterForm.find('select#filterAssignee').val()\r\n _.each(filterAssignee, function (item) {\r\n querystring += '&au=' + item\r\n })\r\n\r\n openFilterTicketWindow.closeWindow()\r\n History.pushState(\r\n null,\r\n null,\r\n '/tickets/filter/' + querystring + '&r=' + Math.floor(Math.random() * (99999 - 1 + 1)) + 1\r\n )\r\n }\r\n\r\n $scope.clearFilterForm = function (e) {\r\n $(':input', '#ticketFilterForm')\r\n .not(':button, :submit, :reset, :hidden')\r\n .val('')\r\n $('#ticketFilterForm')\r\n .find('option:selected')\r\n .removeAttr('selected')\r\n .trigger('chosen:updated')\r\n e.preventDefault()\r\n }\r\n\r\n function clearChecked () {\r\n $('#ticketTable')\r\n .find('input[type=\"checkbox\"]:checked')\r\n .each(function () {\r\n var vm = this\r\n var self = $(vm)\r\n self.prop('checked', false)\r\n })\r\n }\r\n\r\n function getChecked () {\r\n var checkedIds = []\r\n $('#ticketTable')\r\n .find('input[type=\"checkbox\"]:checked')\r\n .each(function () {\r\n var vm = this\r\n var self = $(vm)\r\n var $ticketTR = self.parents('tr')\r\n if (!_.isUndefined($ticketTR)) {\r\n var ticketOid = $ticketTR.attr('data-ticketOid')\r\n\r\n if (!_.isUndefined(ticketOid) && ticketOid.length > 0) {\r\n checkedIds.push(ticketOid)\r\n }\r\n }\r\n })\r\n\r\n return checkedIds\r\n }\r\n\r\n function removeCheckedFromGrid () {\r\n $('#ticketTable')\r\n .find('input[type=\"checkbox\"]:checked')\r\n .each(function () {\r\n var vm = this\r\n var self = $(vm)\r\n var $ticketTR = self.parents('tr')\r\n if (!_.isUndefined($ticketTR)) {\r\n $ticketTR.remove()\r\n }\r\n })\r\n }\r\n })\r\n .factory('openFilterTicketWindow', function () {\r\n return {\r\n openWindow: function openWindow () {\r\n UIkit.modal('#ticketFilterModal').show()\r\n },\r\n closeWindow: function closeWindow () {\r\n UIkit.modal('#ticketFilterModal').hide()\r\n }\r\n }\r\n })\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/angularjs/controllers/tickets.js?"); - -/***/ }), - -/***/ "./src/public/js/angularjs/main.js": -/*!*****************************************!*\ - !*** ./src/public/js/angularjs/main.js ***! - \*****************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 02/10/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n// require.ensure([], function(require) {\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\r\n __webpack_require__(/*! angular */ \"./src/public/js/vendor/angular/angular.min.js\"),\r\n __webpack_require__(/*! angularjs/services/session */ \"./src/public/js/angularjs/services/session.js\"),\r\n __webpack_require__(/*! angularjs/controllers */ \"./src/public/js/angularjs/controllers.js\"),\r\n __webpack_require__(/*! angularRoute */ \"./src/public/js/vendor/angular/angular-route.min.js\"),\r\n __webpack_require__(/*! angularCookies */ \"./src/public/js/vendor/angular/angular-cookies.min.js\"),\r\n __webpack_require__(/*! angularSanitize */ \"./src/public/js/vendor/angular/angular-sanitize.min.js\")\r\n], __WEBPACK_AMD_DEFINE_RESULT__ = (function (angular) {\r\n return angular\r\n .module('trudesk', ['trudesk.services.session', 'ngRoute', 'ngCookies', 'ngSanitize', 'trudesk.controllers'])\r\n .config(function ($interpolateProvider) {\r\n $interpolateProvider.startSymbol('{[{')\r\n $interpolateProvider.endSymbol('}]}')\r\n })\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n// });\r\n\n\n//# sourceURL=webpack:///./src/public/js/angularjs/main.js?"); - -/***/ }), - -/***/ "./src/public/js/modules/chat.js": -/*!***************************************!*\ - !*** ./src/public/js/modules/chat.js ***! - \***************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 02/10/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"), __webpack_require__(/*! moment */ \"./src/public/js/vendor/moment/moment.js\"), __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"), __webpack_require__(/*! uikit */ \"./src/public/js/vendor/uikit/js/uikit_combined.min.js\"), __webpack_require__(/*! autogrow */ \"./src/public/js/plugins/autogrow.js\"), __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (\r\n $,\r\n _,\r\n moment,\r\n helpers,\r\n UIKit\r\n) {\r\n var chatClient = {}\r\n\r\n var socket\r\n\r\n var loggedInAccount\r\n\r\n chatClient.init = function (sock) {\r\n loggedInAccount = window.trudeskSessionService.getUser()\r\n socket = sock\r\n\r\n socket.removeAllListeners('updateUsers')\r\n socket.on('updateUsers', function (data) {\r\n var html = ''\r\n var onlineList = $('.online-list-wrapper').find('ul.online-list')\r\n var username = loggedInAccount.username\r\n var isUserRole = loggedInAccount.role === 'user'\r\n var filteredData = _.filter(data, function (item) {\r\n return item.user.username !== username\r\n })\r\n var activeNow = $('.active-now')\r\n if (_.size(filteredData) < 1) {\r\n activeNow.hide()\r\n } else {\r\n activeNow.show()\r\n }\r\n\r\n onlineList.html('')\r\n var activeCount = 0\r\n _.each(filteredData, function (v) {\r\n var onlineUser = v.user\r\n if (onlineUser.username === username) return true\r\n // This hides all other users from the active online list.\r\n if (isUserRole && onlineUser.role === 'user') return true\r\n var imageUrl = onlineUser.image\r\n if (_.isUndefined(imageUrl)) imageUrl = 'defaultProfile.jpg'\r\n html += '
      • '\r\n html +=\r\n ''\r\n html += '
        '\r\n html += '
        '\r\n html += ''\r\n html += '
        ' + onlineUser.fullname + '
        '\r\n html += '
        '\r\n html += '
        '\r\n html += '
      • '\r\n\r\n var allUserList = $('ul.user-list')\r\n var userStatus = allUserList.find('li[data-user-id=\"' + onlineUser._id + '\"]').find('.online-status-offline')\r\n userStatus.removeClass('online-status-offline').addClass('online-status')\r\n userStatus.text('')\r\n activeCount++\r\n })\r\n\r\n onlineList.append(html)\r\n\r\n var onlineUserCount = $('.online-user-count')\r\n if (onlineUserCount.length > 0) {\r\n var size = _.size(filteredData)\r\n if (size < 1) onlineUserCount.addClass('hide')\r\n else {\r\n onlineUserCount.text(activeCount)\r\n onlineUserCount.removeClass('hide')\r\n }\r\n }\r\n\r\n chatClient.bindActions()\r\n })\r\n\r\n socket.removeAllListeners('$trudesk:chat:updateOnlineBubbles')\r\n socket.on('$trudesk:chat:updateOnlineBubbles', function (data) {\r\n var $u = _.throttle(\r\n function () {\r\n updateOnlineBubbles(data)\r\n },\r\n 1000,\r\n { trailing: false }\r\n )\r\n\r\n $u()\r\n })\r\n\r\n socket.removeAllListeners('spawnChatWindow')\r\n socket.on('spawnChatWindow', function (data) {\r\n var messageContent = $('#message-content[data-conversation-id]')\r\n if (messageContent.length > 0) {\r\n var loggedInAccountId = loggedInAccount._id\r\n startConversation(loggedInAccountId, data._id, function (err, convo) {\r\n if (err) {\r\n console.log('[trudesk:chat:openChatWindow] - Error')\r\n console.error(err)\r\n helpers.UI.showSnackbar('Unable to start chat', true)\r\n } else {\r\n var splitPath = window.location.pathname.split('/')\r\n if (splitPath.length > 1) {\r\n if (splitPath[0].toString().toLowerCase() === 'messages') {\r\n return true\r\n }\r\n } else {\r\n History.pushState(null, null, '/messages/' + convo._id, true)\r\n }\r\n }\r\n })\r\n } else {\r\n chatClient.openChatWindow(data)\r\n }\r\n })\r\n\r\n socket.removeAllListeners('chatMessage')\r\n socket.on('chatMessage', function (data) {\r\n var type = data.type\r\n var to = data.to\r\n var from = data.from\r\n var chatBox = ''\r\n\r\n var chatMessage = ''\r\n\r\n var chatMessageList = ''\r\n\r\n var scroller = ''\r\n\r\n var selector = ''\r\n\r\n if (type === 's') {\r\n chatBox = $('.chat-box[data-chat-userid=\"' + to + '\"]')\r\n chatMessage = createChatMessageDiv(data.message)\r\n chatMessageList = chatBox.find('.chat-message-list:first')\r\n scroller = chatBox.find('.chat-box-messages')\r\n chatMessageList.append(chatMessage)\r\n helpers.scrollToBottom(scroller)\r\n helpers.UI.playSound('sendChatMessage')\r\n } else if (type === 'r') {\r\n selector = '.chat-box[data-chat-userid=\"' + from + '\"]'\r\n chatBox = $(selector)\r\n if (chatBox.length < 1) {\r\n chatClient.openChatWindow(data.fromUser, function () {\r\n chatBox = $(selector)\r\n scroller = chatBox.find('.chat-box-messages')\r\n helpers.scrollToBottom(scroller)\r\n })\r\n } else {\r\n chatMessage = createChatMessageFromUser(data.fromUser, data.message)\r\n chatMessageList = chatBox.find('.chat-message-list:first')\r\n chatMessageList.append(chatMessage)\r\n scroller = chatBox.find('.chat-box-messages')\r\n helpers.scrollToBottom(scroller)\r\n }\r\n\r\n helpers.UI.playSound('receivedChatMessage')\r\n }\r\n\r\n $.event.trigger('$trudesk:chat:message', data)\r\n\r\n // Ajaxify Any ticket links\r\n $('body').ajaxify()\r\n })\r\n\r\n socket.removeAllListeners('chatTyping')\r\n socket.on('chatTyping', function (data) {\r\n $.event.trigger('$trudesk:chat:typing', data)\r\n var chatBox = $('div[data-conversation-id=\"' + data.cid + '\"]')\r\n var isTypingDiv = chatBox.find('.user-is-typing-wrapper')\r\n isTypingDiv.removeClass('hide')\r\n var scroller = chatBox.find('.chat-box-messages')\r\n if (scroller.length > 0) {\r\n // Only scroll if the scroller is on bottom\r\n if (scroller.scrollTop() + window.innerHeight >= scroller[0].scrollHeight) {\r\n helpers.scrollToBottom(scroller)\r\n }\r\n }\r\n\r\n scroller = $('#message-content')\r\n if (scroller.length > 0) {\r\n // Only scroll if the scroller is on bottom\r\n if (scroller.scrollTop() + window.innerHeight >= scroller[0].scrollHeight) {\r\n helpers.scrollToBottom(scroller)\r\n }\r\n }\r\n })\r\n\r\n socket.removeAllListeners('chatStopTyping')\r\n socket.on('chatStopTyping', function (data) {\r\n $.event.trigger('$trudesk:chat:stoptyping', data)\r\n })\r\n\r\n socket.removeAllListeners('leftChatServer')\r\n socket.on('leftChatServer', function (data) {\r\n $.event.trigger('$trudesk:chat:leftchatserver', data)\r\n })\r\n\r\n $(window).on('$trudesk:chat:stoptyping.chatSystem', function (event, data) {\r\n var chatBox = []\r\n var scroller\r\n chatBox[0] = $('#message-content[data-conversation-id=\"' + data.cid + '\"]')\r\n chatBox[1] = $('.chat-box[data-conversation-id=\"' + data.cid + '\"]')\r\n for (var i = 0; i < chatBox.length; i++) {\r\n chatBox[i].find('.user-is-typing-wrapper').addClass('hide')\r\n scroller = chatBox[i].find('.chat-box-messages')\r\n if (scroller.length > 0) {\r\n if (scroller.scrollTop() === scroller[0].scrollHeight) {\r\n helpers.scrollToBottom(scroller)\r\n }\r\n }\r\n }\r\n\r\n scroller = $('#message-content')\r\n if (scroller.length > 0) {\r\n // Only scroll if the scroller is on bottom\r\n if (scroller.scrollTop() === scroller[0].scrollHeight) {\r\n helpers.scrollToBottom(scroller)\r\n }\r\n }\r\n })\r\n }\r\n\r\n var typingTimeout = {}\r\n var isTyping = {}\r\n function stopTyping (cid, to) {\r\n isTyping[cid] = false\r\n typingTimeout[cid] = undefined\r\n var loggedInAccountId = loggedInAccount._id\r\n socket.emit('chatStopTyping', {\r\n cid: cid,\r\n to: to,\r\n from: loggedInAccountId\r\n })\r\n }\r\n\r\n chatClient.stopTyping = function (cid, to, complete) {\r\n stopTyping(cid, to)\r\n\r\n if (_.isFunction(complete)) {\r\n return complete()\r\n }\r\n }\r\n\r\n chatClient.startTyping = function (cid, userid, complete) {\r\n if (isTyping[cid]) {\r\n clearTimeout(typingTimeout[cid])\r\n typingTimeout[cid] = setTimeout(stopTyping, 5000, cid, userid)\r\n\r\n if (_.isFunction(complete)) {\r\n return complete()\r\n }\r\n } else {\r\n socket.emit('chatTyping', {\r\n cid: cid,\r\n to: userid,\r\n from: loggedInAccount._id\r\n })\r\n\r\n isTyping[cid] = true\r\n if (typingTimeout[cid] === undefined) {\r\n typingTimeout[cid] = setTimeout(stopTyping, 5000, cid, userid)\r\n }\r\n\r\n if (_.isFunction(complete)) {\r\n return complete()\r\n }\r\n }\r\n }\r\n\r\n chatClient.bindActions = function () {\r\n $(document).ready(function () {\r\n $('*[data-action=\"startChat\"]').each(function () {\r\n var self = $(this)\r\n self.off('click')\r\n self.click(function (e) {\r\n var userId = self.attr('data-chatUser')\r\n socket.emit('spawnChatWindow', userId)\r\n UIKit.offcanvas.hide()\r\n e.preventDefault()\r\n })\r\n })\r\n })\r\n }\r\n\r\n function bindChatWindowActions (convoId) {\r\n var $chatBox = $('.chat-box[data-conversation-id=\"' + convoId + '\"]')\r\n if ($chatBox.length < 1) {\r\n return false\r\n }\r\n\r\n var $textarea = $chatBox.find('textarea.textAreaAutogrow')\r\n var $chatBoxText = $chatBox.find('.chat-box-text')\r\n var $chatCloseButton = $chatBox.find('.chatCloseBtn')\r\n var $chatTitleBar = $chatBox.find('.chat-box-title')\r\n\r\n $textarea.off('keyup')\r\n $textarea.off('keydown')\r\n $textarea.on('keydown', function (e) {\r\n if (e.keyCode === 13) {\r\n return\r\n }\r\n\r\n var self = $(this)\r\n var cid = self\r\n .parent()\r\n .parent()\r\n .attr('data-conversation-id')\r\n var user = self\r\n .parent()\r\n .parent()\r\n .attr('data-chat-userid')\r\n\r\n if (cid === undefined || user === undefined) {\r\n console.log('Invalid Conversation ID or User ID')\r\n return\r\n }\r\n\r\n chatClient.startTyping(cid, user)\r\n })\r\n\r\n $textarea.autogrow({\r\n postGrowCallback: chatBoxTextAreaGrowCallback,\r\n enterPressed: function (self, v) {\r\n var messages = self.parent().siblings('.chat-box-messages')\r\n var cid = self\r\n .parent()\r\n .parent()\r\n .attr('data-conversation-id')\r\n var userId = self.parents('.chat-box').attr('data-chat-userid')\r\n helpers.scrollToBottom(messages)\r\n if (v.length < 1) return\r\n\r\n // Send Message\r\n chatClient.sendChatMessage(cid, userId, v, function () {\r\n clearTimeout(typingTimeout[cid])\r\n stopTyping(cid, userId)\r\n })\r\n }\r\n })\r\n\r\n $chatBoxText.off('click')\r\n $chatBoxText.click(function (e) {\r\n if (\r\n $(this)\r\n .children('textarea')\r\n .is(':focus')\r\n ) {\r\n e.stopPropagation()\r\n return false\r\n }\r\n\r\n $(this)\r\n .children('textarea')\r\n .focus()\r\n var val = $(this)\r\n .children('textarea')\r\n .val()\r\n $(this)\r\n .children('textarea')\r\n .val('')\r\n .val(val)\r\n })\r\n\r\n $chatCloseButton.off('click')\r\n $chatCloseButton.click(function (e) {\r\n e.preventDefault()\r\n $(this)\r\n .parents('.chat-box[data-chat-userid]')\r\n .parent()\r\n .remove()\r\n\r\n var $loggedInAccountId = loggedInAccount._id\r\n var cid = $chatCloseButton.parents('.chat-box[data-conversation-id]').attr('data-conversation-id')\r\n socket.emit('saveChatWindow', {\r\n userId: $loggedInAccountId,\r\n convoId: cid,\r\n remove: true\r\n })\r\n })\r\n\r\n $chatTitleBar.off('click')\r\n $chatTitleBar.click(function () {\r\n var p = $(this).parents('.chat-box-position')\r\n if (p.css('top') === '-280px') {\r\n p.animate(\r\n {\r\n top: -29\r\n },\r\n 250\r\n )\r\n } else {\r\n p.animate(\r\n {\r\n top: -280\r\n },\r\n 250\r\n )\r\n }\r\n })\r\n }\r\n\r\n // Make this return messages with single HTTP request\r\n function startConversation (owner, receiver, callback) {\r\n if (owner === receiver) {\r\n return callback('Invalid Participants')\r\n }\r\n\r\n $.ajax({\r\n url: '/api/v1/messages/conversation/start',\r\n type: 'POST',\r\n contentType: 'application/json',\r\n dataType: 'json',\r\n data: JSON.stringify({\r\n owner: owner,\r\n participants: [owner, receiver]\r\n }),\r\n success: function (data) {\r\n $.ajax({\r\n url: '/api/v1/messages/conversation/' + data.conversation._id,\r\n type: 'GET',\r\n success: function (d) {\r\n var userMeta =\r\n data.conversation.userMeta[\r\n _.findIndex(data.conversation.userMeta, function (item) {\r\n return item.userId.toString() === owner.toString()\r\n })\r\n ]\r\n if (userMeta && userMeta.deletedAt) {\r\n d.messages = _.filter(d.messages, function (message) {\r\n return moment(message.createdAt) > moment(userMeta.deletedAt)\r\n })\r\n }\r\n data.conversation.messages = d.messages\r\n return callback(null, data.conversation)\r\n },\r\n error: function (err) {\r\n return callback(err)\r\n }\r\n })\r\n },\r\n error: function (err) {\r\n return callback(err)\r\n }\r\n })\r\n }\r\n\r\n function loadChatMessages (chatBox, messageArray) {\r\n var to = chatBox.attr('data-chat-userid')\r\n\r\n var chatMessage\r\n\r\n var chatMessageList\r\n\r\n var scroller\r\n\r\n messageArray.reverse()\r\n\r\n _.each(messageArray, function (m) {\r\n if (m.owner._id === to) {\r\n chatMessage = createChatMessageFromUser(m.owner, m.body)\r\n chatMessageList = chatBox.find('.chat-message-list:first')\r\n chatMessageList.append(chatMessage)\r\n scroller = chatBox.find('.chat-box-messages')\r\n helpers.scrollToBottom(scroller)\r\n } else {\r\n chatMessage = createChatMessageDiv(m.body)\r\n chatMessageList = chatBox.find('.chat-message-list:first')\r\n scroller = chatBox.find('.chat-box-messages')\r\n chatMessageList.append(chatMessage)\r\n helpers.scrollToBottom(scroller)\r\n }\r\n })\r\n\r\n // Ajaxify Any ticket links\r\n $('body').ajaxify()\r\n }\r\n\r\n chatClient.sendChatMessage = function (cid, toUserId, message, complete) {\r\n var loggedInAccountId = loggedInAccount._id\r\n $.ajax({\r\n url: '/api/v1/messages/send',\r\n type: 'POST',\r\n contentType: 'application/json',\r\n data: JSON.stringify({\r\n cId: cid,\r\n owner: loggedInAccountId,\r\n body: message\r\n }),\r\n success: function (data) {\r\n socket.emit('chatMessage', {\r\n conversation: cid,\r\n to: toUserId,\r\n from: loggedInAccountId,\r\n type: 's',\r\n messageId: data.message._id,\r\n message: data.message.body\r\n })\r\n\r\n if (_.isFunction(complete)) {\r\n return complete()\r\n }\r\n },\r\n error: function (error) {\r\n console.log('[trudesk:chat:bindActions] Error')\r\n console.log(error)\r\n helpers.UI.showSnackbar(error, true)\r\n\r\n if (complete !== undefined && _.isFunction(complete)) {\r\n return complete(error)\r\n }\r\n }\r\n })\r\n }\r\n\r\n chatClient.getOpenWindows = function () {\r\n socket.emit('getOpenChatWindows')\r\n }\r\n\r\n chatClient.openChatWindow = function (user, complete) {\r\n var isOnMessagesPage =\r\n $('#__page')\r\n .text()\r\n .toLowerCase() === 'messages'\r\n if (isOnMessagesPage) {\r\n if (_.isFunction(complete)) {\r\n return complete()\r\n }\r\n return true\r\n }\r\n var loggedInAccountId = loggedInAccount._id\r\n if (_.isUndefined(loggedInAccountId)) {\r\n return helpers.UI.showSnackbar('Unable to start chat', true)\r\n }\r\n\r\n startConversation(loggedInAccountId, user._id, function (err, convo) {\r\n if (err) {\r\n console.log('[trudesk:chat:openChatWindow] - Error')\r\n console.log(err)\r\n // return helpers.UI.showSnackbar('Unable to start chat', true);\r\n }\r\n\r\n var username = loggedInAccount.username\r\n if (user.username === username) return true\r\n\r\n var cWindow = $('.chat-box-position').find('.chat-box[data-chat-userid=\"' + user._id + '\"]')\r\n if (cWindow.length > 0) {\r\n // loadChatMessages($('.chat-box-position').find('.chat-box[data-chat-userid=\"' + user._id + '\"]'), convo.messages);\r\n cWindow.find('textarea').focus()\r\n helpers.scrollToBottom(cWindow.find('.chat-box-messages'))\r\n return true\r\n }\r\n\r\n var imageUrl = user.image\r\n if (_.isUndefined(imageUrl)) imageUrl = 'defaultProfile.jpg'\r\n\r\n var userMeta =\r\n convo.userMeta[\r\n _.findIndex(convo.userMeta, function (item) {\r\n return item.userId.toString() === loggedInAccountId.toString()\r\n })\r\n ]\r\n var html = '
        '\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n html += 'close'\r\n html += '
        '\r\n html += '

        '\r\n html += '' + user.fullname + ''\r\n html += '

        '\r\n html += '
        '\r\n html += '
        '\r\n if (userMeta && userMeta.deletedAt) {\r\n html +=\r\n '
        Conversation deleted at ' +\r\n moment(userMeta.deletedAt).format(helpers.getShortDateFormat() + ' ' + helpers.getTimeFormat()) +\r\n '
        '\r\n }\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n html +=\r\n '
        \"'
        '\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n html += ''\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n\r\n $('.chat-box-wrapper').append(html)\r\n $('.chat-box[data-chat-userid=\"' + user._id + '\"] textarea').focus()\r\n loadChatMessages($('.chat-box-position').find('.chat-box[data-chat-userid=\"' + user._id + '\"]'), convo.messages)\r\n helpers.hideAllpDropDowns()\r\n helpers.setupScrollers('.chat-box[data-chat-userid=\"' + user._id + '\"] > div.scrollable')\r\n bindChatWindowActions(convo._id)\r\n helpers.scrollToBottom($('.chat-box[data-chat-userid=\"' + user._id + '\"]').find('.chat-box-messages'))\r\n\r\n socket.emit('saveChatWindow', {\r\n userId: loggedInAccountId,\r\n convoId: convo._id,\r\n remove: false\r\n })\r\n\r\n // Fire when window is done loading\r\n if (_.isFunction(complete)) {\r\n return complete()\r\n }\r\n })\r\n }\r\n\r\n chatClient.setUserIdle = function () {\r\n socket.emit('$trudesk:setUserIdle')\r\n }\r\n\r\n chatClient.setUserActive = function () {\r\n socket.emit('$trudesk:setUserActive')\r\n }\r\n\r\n chatClient.updateOnlineBubbles = function () {\r\n socket.emit('$trudesk:chat:updateOnlineBubbles')\r\n }\r\n\r\n function updateOnlineBubbles (usersOnline) {\r\n $('span[data-user-status-id]').each(function () {\r\n $(this)\r\n .removeClass('user-online user-idle')\r\n .addClass('user-offline')\r\n })\r\n\r\n var onlineUserList = usersOnline.sortedUserList\r\n var idleUserList = usersOnline.sortedIdleList\r\n\r\n _.each(onlineUserList, function (v) {\r\n var $bubble = $('span[data-user-status-id=\"' + v.user._id + '\"]')\r\n $bubble.each(function () {\r\n var self = $(this)\r\n\r\n self.removeClass('user-offline user-idle').addClass('user-online')\r\n })\r\n })\r\n\r\n _.each(idleUserList, function (v) {\r\n var $bubble = $('span[data-user-status-id=\"' + v.user._id + '\"]')\r\n $bubble.each(function () {\r\n var self = $(this)\r\n\r\n self.removeClass('user-offline user-online').addClass('user-idle')\r\n })\r\n })\r\n }\r\n\r\n function createChatMessageDiv (message) {\r\n var html = '
        '\r\n html += '
        '\r\n html += '
        '\r\n html += '
        ' + message.replace(/\\n\\r?/g, '
        ') + '
        '\r\n html += '
        '\r\n\r\n return html\r\n }\r\n\r\n function createChatMessageFromUser (user, message) {\r\n var imageUrl = user.image\r\n if (_.isUndefined(imageUrl)) imageUrl = 'defaultProfile.jpg'\r\n var html = '
        '\r\n html +=\r\n '
        \"'
        '\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n html += '' + message.replace(/\\n\\r?/g, '
        ') + '
        '\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n\r\n return html\r\n }\r\n\r\n function chatBoxTextAreaGrowCallback (self, oldHeight, newHeight) {\r\n if (oldHeight === newHeight) {\r\n return true\r\n }\r\n\r\n // var textAreaHeight = self.parent().outerHeight();\r\n var messages = self.parent().siblings('.chat-box-messages')\r\n messages.css({ 'min-height': '170px', 'max-height': '220px' })\r\n self.parent().css({ 'max-height': '77px', 'min-height': '16px' })\r\n\r\n if (newHeight < 80) {\r\n messages.height(messages.height() - (newHeight - oldHeight))\r\n }\r\n // else\r\n // messages.height(156);\r\n\r\n messages.scrollTop(messages[0].scrollHeight)\r\n }\r\n\r\n return chatClient\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/modules/chat.js?"); - -/***/ }), - -/***/ "./src/public/js/modules/navigation.js": -/*!*********************************************!*\ - !*** ./src/public/js/modules/navigation.js ***! - \*********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 02/10/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"), __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"), __webpack_require__(/*! modules/socket */ \"./src/public/js/modules/socket.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($, helpers, _, socket) {\r\n var navigation = {}\r\n\r\n navigation.init = function () {\r\n this.notifications()\r\n this.flashMessageClose()\r\n }\r\n\r\n navigation.flashMessageClose = function () {\r\n var flashMessage = $('.flash-message').find('.close')\r\n flashMessage.off('click', closeFlash)\r\n flashMessage.on('click', closeFlash)\r\n }\r\n\r\n function closeFlash (e) {\r\n var self = $(this)\r\n var flashMessage = self.parent()\r\n\r\n flashMessage.slideUp(250, function () {\r\n helpers.resizeAll()\r\n })\r\n\r\n e.preventDefault()\r\n }\r\n\r\n navigation.notifications = function () {\r\n $('a[data-notifications]').each(function () {\r\n $(this).off('click', showDropdown)\r\n $(this).on('click', showDropdown)\r\n })\r\n\r\n $('a[data-clearNotifications]').each(function () {\r\n $(this).off('click', clearNotifications)\r\n $(this).on('click', clearNotifications)\r\n })\r\n\r\n $(document).off('mouseup', hideDropdownMouseUp)\r\n $(document).on('mouseup', hideDropdownMouseUp)\r\n }\r\n\r\n function clearNotifications () {\r\n socket.ui.clearNotifications()\r\n }\r\n\r\n function hideDropdownMouseUp (e) {\r\n var hasEnjoyHint = $('.enjoyhint').length > 0\r\n if (hasEnjoyHint) return true\r\n\r\n $('a[data-notifications]').each(function () {\r\n var drop = $('#' + $(this).attr('data-notifications'))\r\n if ($(this).has(e.target).length !== 0) {\r\n return\r\n }\r\n if (!drop.is(e.target) && drop.has(e.target).length === 0) {\r\n if (drop.hasClass('pDropOpen')) {\r\n drop.removeClass('pDropOpen')\r\n }\r\n }\r\n })\r\n }\r\n\r\n function showDropdown (e) {\r\n var drop = $('#' + $(this).attr('data-notifications'))\r\n // var scroll = $('#' + $(drop).attr('data-scroll'));\r\n if (drop.css('visibility') === 'visible') {\r\n drop.removeClass('pDropOpen')\r\n\r\n return true\r\n }\r\n var pageContent = $(this).parents('#page-content > div')\r\n var insidePage = pageContent.length > 0\r\n var pageOffsetTop = 0\r\n var pageOffsetLeft = 0\r\n if (insidePage) {\r\n var pOffset = pageContent.offset()\r\n pageOffsetTop = pOffset.top\r\n pageOffsetLeft = pOffset.left\r\n }\r\n\r\n pageOffsetTop += $(this).offset().top\r\n\r\n var leftO = 250\r\n\r\n if ($(drop).hasClass('pSmall')) leftO = 180\r\n\r\n var left = $(this).offset().left - $(window).scrollLeft() - pageOffsetLeft - leftO\r\n // if (drop.hasClass('p-dropdown-left')) {\r\n // //left += 250;\r\n // }\r\n var leftExtraOffset = $(drop).attr('data-left-offset')\r\n if (_.isUndefined(leftExtraOffset)) {\r\n leftExtraOffset = 0\r\n }\r\n\r\n left += Number(leftExtraOffset)\r\n left = left + 'px'\r\n\r\n var hasNotice = false\r\n var $noticeFrame = $('.wrapper').find('#notice-banner')\r\n if ($noticeFrame.length > 0) {\r\n hasNotice = $noticeFrame.hasClass('uk-hidden') === false\r\n }\r\n\r\n var topOffset = $(this).offset().top - $(window).scrollTop() - pageOffsetTop\r\n var top = $(this).outerHeight() + topOffset\r\n var topExtraOffset = $(drop).attr('data-top-offset')\r\n if (_.isUndefined(topExtraOffset)) {\r\n topExtraOffset = 0\r\n }\r\n\r\n top += Number(topExtraOffset)\r\n\r\n if (hasNotice) {\r\n top += 30\r\n }\r\n\r\n top = top + 'px'\r\n\r\n var override = $(drop).attr('data-override')\r\n if (!_.isUndefined(override) && override.length > 0) {\r\n top = topExtraOffset + 'px'\r\n left = leftExtraOffset + 'px'\r\n }\r\n\r\n $(drop)\r\n .find('.close-on-click')\r\n .find('li > a')\r\n .each(function () {\r\n $(this).off('click', liClick)\r\n $(this).on('click', liClick)\r\n })\r\n\r\n $(drop).addClass('pDropOpen')\r\n $(drop).css({ position: 'absolute', left: left, top: top })\r\n\r\n e.preventDefault()\r\n }\r\n\r\n function liClick () {\r\n helpers.hideAllpDropDowns()\r\n }\r\n\r\n return navigation\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/modules/navigation.js?"); - -/***/ }), - -/***/ "./src/public/js/modules/socket.io/accountsImporter.js": -/*!*************************************************************!*\ - !*** ./src/public/js/modules/socket.io/accountsImporter.js ***! - \*************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n . o8 \"888 `888\r\n.o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 04/17/2018\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"), __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($, helpers) {\r\n var accountsImporter = {}\r\n\r\n var socket\r\n\r\n function onStatusChange (type, item, percent) {\r\n var $statusBox = $('#' + type + '-import-status-box > ul')\r\n if (item) {\r\n if (item.state === 1) {\r\n $statusBox.append(\r\n '
      • Importing ' +\r\n item.username +\r\n '...
      • '\r\n )\r\n } else if (item.state === 2) {\r\n var span = $statusBox.find('div[data-import-username=\"' + item.username + '\"] > span')\r\n if (span.length > 0) {\r\n span.css({ display: 'inline-flex', marginLeft: '5px' })\r\n span.html(\r\n 'check'\r\n )\r\n }\r\n } else if (item.state === 3) {\r\n var span1 = $statusBox.find('div[data-import-username=\"' + item.username + '\"] > span')\r\n if (span1.length > 0) {\r\n span1.css({ display: 'inline-flex', marginLeft: '5px' })\r\n span1.html(\r\n 'close'\r\n )\r\n }\r\n }\r\n }\r\n\r\n scrollStatusBox()\r\n\r\n $('.js-' + type + '-progress')\r\n .find('.uk-progress-bar')\r\n .css({ width: percent + '%' })\r\n }\r\n\r\n function finishImport (type, completedCount) {\r\n var $statusBox = $('#' + type + '-import-status-box')\r\n if (completedCount === 1) {\r\n $statusBox.find('ul').append('
      • Imported ' + completedCount + ' account
      • ')\r\n } else {\r\n $statusBox.find('ul').append('
      • Imported ' + completedCount + ' accounts
      • ')\r\n }\r\n\r\n scrollStatusBox()\r\n\r\n var $wizard = $('#wizard_' + type)\r\n $wizard.find('.button_finish').removeClass('disabled')\r\n }\r\n\r\n accountsImporter.init = function (sock) {\r\n socket = sock\r\n\r\n socket.removeAllListeners('$trudesk:accounts:import:error')\r\n socket.on('$trudesk:accounts:import:error', function (data) {\r\n var error = data.error\r\n\r\n console.error(error)\r\n helpers.showSnackbar(error, true)\r\n })\r\n\r\n socket.removeAllListeners('$trudesk:accounts:import:onStatusChange')\r\n socket.on('$trudesk:accounts:import:onStatusChange', function (data) {\r\n var type = data.type\r\n var item = data.item\r\n var totalCount = data.totalCount\r\n var completedCount = data.completedCount\r\n var percent = Math.floor((completedCount / totalCount) * 100)\r\n\r\n onStatusChange(type, item, percent)\r\n\r\n // See if we are done\r\n if (completedCount >= totalCount) {\r\n finishImport(type, completedCount)\r\n }\r\n })\r\n }\r\n\r\n accountsImporter.sendAccountData = function (type, addedUsers, updatedUsers) {\r\n if (socket === null || socket === undefined) return\r\n\r\n socket.emit('$trudesk:accounts:import:' + type, {\r\n addedUsers: addedUsers,\r\n updatedUsers: updatedUsers\r\n })\r\n }\r\n\r\n function scrollStatusBox () {\r\n var e = $('#ldap-import-status-box')\r\n if (e.length > 0) {\r\n e = e[0]\r\n e.scrollTop = e.scrollHeight - e.getBoundingClientRect().height\r\n }\r\n }\r\n\r\n return accountsImporter\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/modules/socket.io/accountsImporter.js?"); - -/***/ }), - -/***/ "./src/public/js/modules/socket.io/logs.io.js": -/*!****************************************************!*\ - !*** ./src/public/js/modules/socket.io/logs.io.js ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n . o8 \"888 `888\r\n.o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 07/22/2016\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"), __webpack_require__(/*! moment */ \"./src/public/js/vendor/moment/moment.js\"), __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"), __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (\r\n $,\r\n _,\r\n moment,\r\n helpers\r\n) {\r\n var logsIO = {}\r\n\r\n cleanPreTags()\r\n\r\n logsIO.getLogData = function (socket) {\r\n socket.removeAllListeners('logs:data')\r\n socket.on('logs:data', function (data) {\r\n var $sLogs = $('#serverlogs')\r\n if ($sLogs.length > 0) {\r\n $sLogs.append(data)\r\n $sLogs.append('\\n
        ')\r\n $sLogs.scrollTop(99999999999999 * 999999999999999)\r\n helpers.scrollToBottom($sLogs)\r\n }\r\n })\r\n }\r\n\r\n function cleanPreTags () {\r\n ;[].forEach.call(document.querySelectorAll('pre'), function ($pre) {\r\n var lines = $($pre)\r\n .html()\r\n .split('\\n')\r\n var matches\r\n for (var i = 0; i < lines.length; i++) {\r\n var indentation = (matches = /^\\s+/.exec(lines[i])) !== null ? matches[0] : null\r\n if (indentation) {\r\n // lines = lines.map(function(line) {\r\n // return line.replace(indentation, '');\r\n // });\r\n lines[i].replace(/^\\s+/, '')\r\n }\r\n }\r\n\r\n return $($pre).html(lines.join('\\n').trim())\r\n })\r\n }\r\n\r\n return logsIO\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/modules/socket.io/logs.io.js?"); - -/***/ }), - -/***/ "./src/public/js/modules/socket.io/noticeUI.js": -/*!*****************************************************!*\ - !*** ./src/public/js/modules/socket.io/noticeUI.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 08/20/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\r\n __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"),\r\n __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"),\r\n __webpack_require__(/*! moment */ \"./src/public/js/vendor/moment/moment.js\"),\r\n __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"),\r\n __webpack_require__(/*! uikit */ \"./src/public/js/vendor/uikit/js/uikit_combined.min.js\"),\r\n __webpack_require__(/*! modules/navigation */ \"./src/public/js/modules/navigation.js\"),\r\n __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\")\r\n], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($, _, moment, helpers, UIkit) {\r\n var noticeUI = {}\r\n\r\n noticeUI.setShowNotice = function (socket, notice) {\r\n socket.emit('setShowNotice', notice)\r\n }\r\n\r\n noticeUI.updateShowNotice = function (socket) {\r\n socket.removeAllListeners('updateShowNotice')\r\n socket.on('updateShowNotice', function (notice) {\r\n var $noticeDiv = $('div#notice-banner')\r\n var $dateFormated = moment(notice.activeDate).format('MM/DD/YYYY HH:mm')\r\n var $message = ' - Important: ' + notice.message\r\n var $bgColor = notice.color\r\n var $fontColor = notice.fontColor\r\n $noticeDiv.css('background', $bgColor)\r\n $noticeDiv.css('color', $fontColor)\r\n $noticeDiv.html($dateFormated + $message)\r\n $noticeDiv.removeClass('uk-hidden')\r\n $('.sidebar').css('top', '105px')\r\n\r\n helpers.resizeAll()\r\n\r\n if (notice.alertWindow) {\r\n showNoticeAlertWindow(notice)\r\n }\r\n })\r\n }\r\n\r\n noticeUI.setClearNotice = function (socket) {\r\n socket.emit('setClearNotice')\r\n }\r\n\r\n noticeUI.updateClearNotice = function (socket) {\r\n socket.removeAllListeners('updateClearNotice')\r\n socket.on('updateClearNotice', function () {\r\n $('div#notice-banner').addClass('uk-hidden')\r\n $('.sidebar').css('top', '75px')\r\n\r\n helpers.resizeAll()\r\n\r\n hideNoticeAlertWindow()\r\n })\r\n }\r\n\r\n function showNoticeAlertWindow (notice) {\r\n var noticeAlertWindow = $('#noticeAlertWindow')\r\n if (noticeAlertWindow.length < 1) return true\r\n\r\n var noticeTitle = noticeAlertWindow.find('#noticeTitle')\r\n var noticeText = noticeAlertWindow.find('#noticeText')\r\n var noticeBG = noticeAlertWindow.find('#noticeBG')\r\n var noticeCookieName = noticeAlertWindow.find('#__noticeCookieName')\r\n noticeCookieName.html(notice.name + '_' + moment(notice.activeDate).format('MMMDDYYYY_HHmmss'))\r\n\r\n noticeBG.css('background-color', notice.color)\r\n noticeTitle.css('color', notice.fontColor)\r\n\r\n noticeTitle.html(notice.name)\r\n noticeText.html(notice.message)\r\n\r\n var modal = UIkit.modal(noticeAlertWindow, {\r\n bgclose: false\r\n })\r\n\r\n modal.show()\r\n }\r\n\r\n function hideNoticeAlertWindow () {\r\n var noticeAlertWindow = $('#noticeAlertWindow')\r\n if (noticeAlertWindow.length < 1) return true\r\n\r\n UIkit.modal(noticeAlertWindow).hide()\r\n }\r\n\r\n return noticeUI\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/modules/socket.io/noticeUI.js?"); - -/***/ }), - -/***/ "./src/public/js/modules/socket.io/ticketsUI.js": -/*!******************************************************!*\ - !*** ./src/public/js/modules/socket.io/ticketsUI.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 08/20/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\r\n __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"),\r\n __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"),\r\n __webpack_require__(/*! moment */ \"./src/public/js/vendor/moment/moment.js\"),\r\n __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"),\r\n __webpack_require__(/*! modules/navigation */ \"./src/public/js/modules/navigation.js\"),\r\n __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\")\r\n], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($) {\r\n var ticketsUI = {}\r\n\r\n ticketsUI.updateSubscribe = function (socket) {\r\n socket.removeAllListeners('ticket:subscriber:update')\r\n socket.on('ticket:subscriber:update', function (data) {\r\n var $subscribeSwitch = $('input#subscribeSwitch[data-subscribe-userId=\"' + data.user + '\"]')\r\n if ($subscribeSwitch.length > 0) {\r\n if (data.subscribe) {\r\n $subscribeSwitch.prop('checked', true)\r\n } else {\r\n $subscribeSwitch.prop('checked', false)\r\n }\r\n }\r\n })\r\n }\r\n\r\n return ticketsUI\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/modules/socket.io/ticketsUI.js?"); - -/***/ }), - -/***/ "./src/public/js/modules/socket.js": -/*!*****************************************!*\ - !*** ./src/public/js/modules/socket.js ***! - \*****************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 02/10/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! modules/chat */ \"./src/public/js/modules/chat.js\"), __webpack_require__(/*! modules/ui */ \"./src/public/js/modules/ui.js\"), __webpack_require__(/*! modules/socket.io/accountsImporter */ \"./src/public/js/modules/socket.io/accountsImporter.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function (\r\n chat,\r\n ui,\r\n accountsImporter\r\n) {\r\n var socket = io.connect({\r\n transports: ['polling', 'websocket']\r\n })\r\n var sClient = {\r\n socket: socket\r\n }\r\n\r\n ui.init(socket)\r\n sClient.ui = ui\r\n\r\n chat.init(socket)\r\n sClient.chat = chat\r\n\r\n accountsImporter.init(socket)\r\n sClient.accountsImporter = accountsImporter\r\n\r\n return sClient\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/modules/socket.js?"); - -/***/ }), - -/***/ "./src/public/js/modules/tour.js": -/*!***************************************!*\ - !*** ./src/public/js/modules/tour.js ***! - \***************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 03/14/2017\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! shepherd */ \"./src/public/js/vendor/shepherd/js/shepherd.min.js\"), __webpack_require__(/*! uikit */ \"./src/public/js/vendor/uikit/js/uikit_combined.min.js\"), __webpack_require__(/*! tether */ \"./src/public/js/vendor/tether/tether.min.js\")], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($, Shepherd, UIKit) {\r\n var tour = {}\r\n\r\n tour = new Shepherd.Tour({\r\n defaults: {\r\n classes: 'shepherd-theme-square shepherd-theme-arrows'\r\n }\r\n })\r\n\r\n tour.addStep('welcome', {\r\n title: 'Welcome!',\r\n text:\r\n '
        ' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '
        ' +\r\n \"Welcome to the trudesk tour!
        I'm going to guide you through the system and show you around a little.

        \" +\r\n 'You may choose to skip the tour if you do not require it. Simply press the skip button below.',\r\n buttons: [\r\n {\r\n text: 'Lets Start',\r\n action: tour.next\r\n },\r\n {\r\n text: 'Skip',\r\n classes: 'uk-float-left',\r\n action: function () {\r\n var username = window.trudeskSessionService.getUser().username\r\n $.ajax({\r\n url: '/api/v1/users/' + username + '/updatepreferences',\r\n method: 'PUT',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n data: JSON.stringify({\r\n preference: 'tourCompleted',\r\n value: true\r\n }),\r\n success: function () {\r\n tour.cancel()\r\n },\r\n error: function (error) {\r\n console.error(error)\r\n }\r\n })\r\n }\r\n }\r\n ],\r\n when: {\r\n show: function () {\r\n var overlay = $('#serverRestarting')\r\n overlay.css('z-index', 999).removeClass('hide')\r\n overlay.find('*').hide()\r\n },\r\n hide: function () {\r\n var overlay = $('#serverRestarting')\r\n overlay.animate({ opacity: 0 }, 500, function () {\r\n overlay.css('z-index', 9999).addClass('hide')\r\n overlay.find('*').show()\r\n })\r\n }\r\n }\r\n })\r\n\r\n tour.addStep('dashboard', {\r\n title: 'Dashboard',\r\n text: 'This is your dashboard screen. It will show you stats at a glance.'\r\n })\r\n\r\n tour.addStep('topbar', {\r\n title: 'Top Nav',\r\n text: 'This is your top nav. It has quick links to frequently used functions and notifications.',\r\n attachTo: '.top-nav bottom'\r\n })\r\n\r\n tour.addStep('addTicket', {\r\n title: 'Quick Link - Add Ticket',\r\n text:\r\n ' Add Ticket quick link will is the fastest way to submit and enter a ticket. Go ahead give it a push!',\r\n attachTo: '.top-menu .tour-addTicket bottom',\r\n buttons: [],\r\n when: {\r\n show: function () {\r\n var $target = $('.tour-addTicket')\r\n $target.on('click', advanceTourDelayed)\r\n $('button.uk-modal-close').attr('disabled', true)\r\n $('button#submitNewTicket').attr('disabled', true)\r\n },\r\n hide: function () {\r\n setTimeout(function () {\r\n var $target = $('.tour-addTicket')\r\n $target.off('click', advanceTourDelayed)\r\n }, 5000)\r\n }\r\n }\r\n })\r\n\r\n tour.addStep('addTicketForm', {\r\n title: 'Add Ticket Form',\r\n text:\r\n \"The great ticket form. Use this to submit new request. Don't worry it's pretty simple. Remember, always try to be as detailed as possible.\",\r\n attachTo: '#ticketCreateModal .uk-modal-dialog left',\r\n when: {\r\n hide: function () {\r\n UIKit.modal($('#ticketCreateModal')).hide()\r\n }\r\n }\r\n })\r\n\r\n tour.addStep('messagesIcon', {\r\n title: 'Messages Notification',\r\n text: 'Here you will see your notification for chat messages sent by other users.',\r\n attachTo: '.tour-messagesNotification bottom'\r\n })\r\n\r\n tour.addStep('ticketNotifications', {\r\n title: 'Ticket Notifications',\r\n text: \"This is where you'll get notification updates about tickets.\",\r\n attachTo: '.tour-ticketNotifications bottom'\r\n })\r\n\r\n tour.addStep('onlineUserListButton', {\r\n title: 'Chat - User List',\r\n text: 'Push this to open the user list to quickly send a message to any user.',\r\n attachTo: '.tour-onlineUserListButton bottom',\r\n buttons: [],\r\n // advanceOn: '.tour-onlineUserListButton click',\r\n when: {\r\n show: function () {\r\n var $target = $('.tour-onlineUserListButton')\r\n $target.on('click', function () {\r\n setTimeout(function () {\r\n tour.show('onlineUserList')\r\n }, 300)\r\n })\r\n },\r\n hide: function () {\r\n var $target = $('.tour-onlineUserListButton')\r\n $target.off('click')\r\n }\r\n }\r\n })\r\n\r\n tour.addStep('onlineUserList', {\r\n title: 'Chat - User List',\r\n text: 'There it is! Your user list. Lets move on!',\r\n when: {\r\n hide: function () {\r\n // History.pushState(null, null, '/tickets');\r\n }\r\n }\r\n })\r\n\r\n // tour.addStep('profileButton', {\r\n // title: 'Profile',\r\n // text: 'Clicking your profile picture will open up your profile dropdown.',\r\n // attachTo: 'img#profileImage bottom'\r\n // });\r\n\r\n tour.addStep('sidebar_tickets', {\r\n title: 'Tickets',\r\n text: \"This is the core of trudesk. You'll find all your current and past tickets located here.\",\r\n attachTo: '.navTickets right',\r\n buttons: [],\r\n when: {\r\n show: function () {\r\n UIKit.offcanvas.hide()\r\n // $('#page-content').css({background: 'rgba(0,0,0,0.5)'});\r\n $('#page-content').css({ opacity: 0.5 })\r\n var $target = $('.navTickets')\r\n $target.on('click', function () {\r\n tour.next()\r\n })\r\n }\r\n }\r\n })\r\n\r\n tour.addStep('tickets_page', {\r\n title: 'Tickets',\r\n text:\r\n 'Here you will find all new, open, or pending tickets. If any tickets are overdue they will flash red.

        ' +\r\n 'Take a minute to review this screen and click next to proceed.'\r\n })\r\n\r\n tour.addStep('sidebar_messages', {\r\n title: 'Messages',\r\n text: 'This will take you to your messages. Messages are sent between users privately and securely.',\r\n attachTo: '.navMessages right',\r\n buttons: [],\r\n when: {\r\n show: function () {\r\n var $target = $('.navMessages')\r\n $target.on('click', function () {\r\n setTimeout(function () {\r\n tour.next()\r\n }, 1000)\r\n })\r\n }\r\n }\r\n })\r\n\r\n tour.addStep('message_list', {\r\n title: 'Message List',\r\n text:\r\n 'Here you will find your current active conversations. If there are no current conversation, you can start a conversation. We will view that next.',\r\n attachTo: 'ul.message-items right'\r\n })\r\n\r\n tour.addStep('start_conversation', {\r\n title: 'Start New Conversation',\r\n text: 'Simply click the (+) sign to start a new conversation with a user.',\r\n attachTo: '#convo-actions a right',\r\n buttons: [],\r\n when: {\r\n show: function () {\r\n var $target = $('#convo-actions a')\r\n $target.on('click', function () {\r\n tour.next()\r\n })\r\n }\r\n }\r\n })\r\n\r\n tour.addStep('all_user_list', {\r\n title: 'User List',\r\n text:\r\n 'Here you will find the same list as before, the all user list. Clicking on a user will start the conversation.',\r\n attachTo: '#new-convo-user-list right',\r\n when: {\r\n show: function () {\r\n $('.all-user-list *').css({ 'pointer-events': 'none' })\r\n }\r\n }\r\n })\r\n\r\n tour.on('complete', function () {})\r\n\r\n tour.init = function () {\r\n tour.start()\r\n }\r\n\r\n function advanceTourDelayed () {\r\n setTimeout(function () {\r\n tour.next()\r\n }, 300)\r\n }\r\n\r\n return tour\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/modules/tour.js?"); - -/***/ }), - -/***/ "./src/public/js/modules/ui.js": -/*!*************************************!*\ - !*** ./src/public/js/modules/ui.js ***! - \*************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 02/10/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\r\n __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"),\r\n __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"),\r\n __webpack_require__(/*! uikit */ \"./src/public/js/vendor/uikit/js/uikit_combined.min.js\"),\r\n __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"),\r\n __webpack_require__(/*! modules/navigation */ \"./src/public/js/modules/navigation.js\"),\r\n __webpack_require__(/*! modules/socket.io/noticeUI */ \"./src/public/js/modules/socket.io/noticeUI.js\"),\r\n __webpack_require__(/*! modules/socket.io/ticketsUI */ \"./src/public/js/modules/socket.io/ticketsUI.js\"),\r\n __webpack_require__(/*! modules/socket.io/logs.io */ \"./src/public/js/modules/socket.io/logs.io.js\"),\r\n __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\")\r\n], __WEBPACK_AMD_DEFINE_RESULT__ = (function ($, _, UIKit, helpers, nav, noticeUI, ticketsUI, logsIO) {\r\n var socketUi = {}\r\n\r\n var socket\r\n\r\n socketUi.init = function (sock) {\r\n // loggedInAccount = window.trudeskSessionService.getUser();\r\n socketUi.socket = socket = sock\r\n\r\n this.onReconnect()\r\n this.onDisconnect()\r\n this.updateUsers()\r\n this.updateNotifications()\r\n this.updateAllNotifications()\r\n // this.updateMailNotifications();\r\n this.updateConversationsNotifications()\r\n this.updateComments()\r\n this.updateUi()\r\n this.updateTicketStatus()\r\n this.updateAssigneeList()\r\n this.updateAssignee()\r\n this.updateTicketType()\r\n this.updateTicketPriority()\r\n this.updateTicketGroup()\r\n this.updateTicketIssue()\r\n this.updateTicketAttachments()\r\n this.updateTicketTags()\r\n\r\n // Events\r\n this.onTicketCreated()\r\n this.onTicketDelete()\r\n this.onUpdateTicketGrid()\r\n this.onProfileImageUpdate()\r\n\r\n this.updateShowNotice(socket)\r\n this.updateClearNotice(socket)\r\n this.updateSubscribe(socket)\r\n\r\n // Logs\r\n this.updateServerLogs(socket)\r\n\r\n // Backup / Restore\r\n this.onShowRestoreOverlay()\r\n this.onRestoreComplete()\r\n }\r\n\r\n socketUi.onShowRestoreOverlay = function () {\r\n socket.removeAllListeners('$trudesk:restore:showOverlay')\r\n socket.on('$trudesk:restore:showOverlay', function () {\r\n $('#restoreBackupOverlay').removeClass('hide')\r\n })\r\n }\r\n\r\n socketUi.emitShowRestoreOverlay = function () {\r\n socket.emit('$trudesk:restore:showOverlay')\r\n }\r\n\r\n socketUi.onRestoreComplete = function () {\r\n socket.removeAllListeners('$trudesk:restore:complete')\r\n socket.on('$trudesk:restore:complete', function () {\r\n location.reload()\r\n })\r\n }\r\n\r\n socketUi.emitRestoreComplete = function () {\r\n socket.emit('$trudesk:restore:complete')\r\n }\r\n\r\n socketUi.setShowNotice = function (notice) {\r\n noticeUI.setShowNotice(socket, notice)\r\n }\r\n\r\n socketUi.setClearNotice = function () {\r\n noticeUI.setClearNotice(socket)\r\n }\r\n\r\n socketUi.updateShowNotice = noticeUI.updateShowNotice\r\n socketUi.updateClearNotice = noticeUI.updateClearNotice\r\n\r\n socketUi.updateSubscribe = ticketsUI.updateSubscribe\r\n\r\n socketUi.updateServerLogs = logsIO.getLogData\r\n socketUi.fetchServerLogs = function () {\r\n socket.emit('logs:fetch')\r\n }\r\n\r\n socketUi.onReconnect = function () {\r\n socket.removeAllListeners('reconnect')\r\n socket.on('reconnect', function () {\r\n helpers.UI.hideDisconnectedOverlay()\r\n })\r\n }\r\n\r\n socketUi.onDisconnect = function () {\r\n socket.removeAllListeners('disconnect')\r\n socket.on('disconnect', function () {\r\n helpers.UI.showDisconnectedOverlay()\r\n })\r\n\r\n socket.removeAllListeners('reconnect_attempt')\r\n socket.on('reconnect_attempt', function () {\r\n helpers.UI.showDisconnectedOverlay()\r\n })\r\n\r\n socket.removeAllListeners('connect_timeout')\r\n socket.on('connect_timeout', function () {\r\n helpers.UI.showDisconnectedOverlay()\r\n })\r\n }\r\n\r\n socketUi.sendUpdateTicketStatus = function (id, status) {\r\n socket.emit('updateTicketStatus', { ticketId: id, status: status })\r\n }\r\n\r\n socketUi.clearAssignee = function (id) {\r\n socket.emit('clearAssignee', id)\r\n }\r\n\r\n socketUi.updateConversationsNotifications = function () {\r\n $(document).ready(function () {\r\n var btnMailNotifications = $('#btn_mail-notifications')\r\n btnMailNotifications.off('click', updateMailNotificationsClicked)\r\n btnMailNotifications.on('click', updateMailNotificationsClicked)\r\n })\r\n\r\n socket.removeAllListeners('updateConversationsNotifications')\r\n socket.on('updateConversationsNotifications', function (data) {\r\n var label = $('#btn_mail-notifications').find('> span')\r\n // TODO: Fixed this once unread messages is fully impl.\r\n var count = 0 // Setting this to 0 to clear label until above is impl.\r\n var items = data.conversations\r\n if (count < 1) {\r\n label.hide()\r\n } else {\r\n label.text(count)\r\n label.removeClass('hide')\r\n label.show()\r\n }\r\n\r\n var mailDropList = $('div.mail-Messages').find('ul')\r\n mailDropList.empty()\r\n\r\n var html = ''\r\n\r\n _.each(items, function (item) {\r\n if (item.partner !== undefined) {\r\n html += '
      • '\r\n html += ''\r\n html += '
        '\r\n if (item.partner.image) {\r\n html +=\r\n '
        \"profile\"/
        '\r\n } else {\r\n html += '
        \"profile\"/
        '\r\n }\r\n html += '
        ' + item.partner.fullname + '
        '\r\n html += '
        '\r\n html += '' + item.recentMessage + ''\r\n html += '
        '\r\n html += '
        '\r\n html +=\r\n ''\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n html += '
      • '\r\n }\r\n })\r\n\r\n mailDropList.append(html)\r\n\r\n var $body = $('body')\r\n\r\n if (typeof $body.ajaxify === 'function') $body.ajaxify()\r\n })\r\n }\r\n\r\n socketUi.updateTicketStatus = function () {\r\n socket.removeAllListeners('updateTicketStatus')\r\n socket.on('updateTicketStatus', function (payload) {\r\n var ticketId = payload.tid\r\n var status = payload.status\r\n var statusSelectBox = $('#statusSelect')\r\n if (statusSelectBox.length > 0) statusSelectBox.addClass('hide')\r\n\r\n var tStatusBox = $('.floating-ticket-status[data-ticketId=\"' + ticketId + '\"] > .ticket-status')\r\n if (tStatusBox.length > 0) {\r\n tStatusBox.removeClass('ticket-new')\r\n tStatusBox.removeClass('ticket-open')\r\n tStatusBox.removeClass('ticket-pending')\r\n tStatusBox.removeClass('ticket-closed')\r\n\r\n var s = 'New'\r\n var c = 'ticket-new'\r\n switch (status) {\r\n case 0:\r\n s = 'New'\r\n c = 'ticket-new'\r\n break\r\n case 1:\r\n s = 'Open'\r\n c = 'ticket-open'\r\n break\r\n case 2:\r\n s = 'Pending'\r\n c = 'ticket-pending'\r\n break\r\n case 3:\r\n s = 'Closed'\r\n c = 'ticket-closed'\r\n break\r\n }\r\n\r\n tStatusBox.find('span').html(s)\r\n tStatusBox.addClass(c)\r\n\r\n var ticketReply = $('.ticket-reply')\r\n var assigneeListBtn = $('.ticket-assignee > a')\r\n var ticketTypeSelect = $('select#tType')\r\n var ticketPriority = $('select#tPriority')\r\n var ticketGroup = $('select#tGroup')\r\n var ticketTags = $('div#editTags')\r\n\r\n var addAttachments = $('form#attachmentForm > div.add-attachment')\r\n var editIssue = $('div.initial-issue > div.edit-issue')\r\n var commentActions = $('div.comment-actions')\r\n\r\n if (status === 3) {\r\n // Remove Comment Box\r\n if (ticketReply.length > 0) {\r\n ticketReply.addClass('hide')\r\n }\r\n\r\n // Setup assignee list on Closed\r\n if (assigneeListBtn.length > 0) {\r\n assigneeListBtn.removeAttr('data-notifications')\r\n assigneeListBtn.removeAttr('data-updateUi')\r\n nav.notifications()\r\n }\r\n // Disabled Ticket Details\r\n if (ticketTypeSelect.length > 0) {\r\n ticketTypeSelect.prop('disabled', true)\r\n }\r\n\r\n if (ticketPriority.length > 0) {\r\n ticketPriority.prop('disabled', true)\r\n }\r\n\r\n if (ticketGroup.length > 0) {\r\n ticketGroup.prop('disabled', true)\r\n }\r\n\r\n if (ticketTags.length > 0) {\r\n ticketTags.addClass('hide')\r\n }\r\n\r\n if (addAttachments.length > 0) {\r\n addAttachments.addClass('hide')\r\n }\r\n\r\n if (editIssue.length > 0) {\r\n editIssue.addClass('hide')\r\n }\r\n\r\n if (commentActions.length > 0) {\r\n commentActions.addClass('hide')\r\n }\r\n } else {\r\n if (ticketReply.length > 0) {\r\n ticketReply.removeClass('hide')\r\n }\r\n\r\n // Enable Ticket Details\r\n if (ticketTypeSelect.length > 0) {\r\n ticketTypeSelect.prop('disabled', false)\r\n }\r\n\r\n if (ticketPriority.length > 0) {\r\n ticketPriority.prop('disabled', false)\r\n }\r\n\r\n if (ticketGroup.length > 0) {\r\n ticketGroup.prop('disabled', false)\r\n }\r\n\r\n if (ticketTags.length > 0) {\r\n ticketTags.removeClass('hide')\r\n }\r\n\r\n if (addAttachments.length > 0) {\r\n addAttachments.removeClass('hide')\r\n }\r\n\r\n if (editIssue.length > 0) {\r\n editIssue.removeClass('hide')\r\n }\r\n\r\n if (commentActions.length > 0) {\r\n commentActions.removeClass('hide')\r\n }\r\n\r\n // Setup assignee list\r\n if (assigneeListBtn.length > 0) {\r\n assigneeListBtn.attr('data-notifications', 'assigneeDropdown')\r\n assigneeListBtn.attr('data-updateui', 'assigneeList')\r\n nav.notifications()\r\n socketUi.updateUi()\r\n }\r\n }\r\n }\r\n })\r\n }\r\n\r\n socketUi.updateAssigneeList = function () {\r\n socket.removeAllListeners('updateAssigneeList')\r\n socket.on('updateAssigneeList', function (users) {\r\n var wrapper = ''\r\n _.each(users, function (user) {\r\n var html = '
      • '\r\n html += ''\r\n html += '
        '\r\n if (_.isUndefined(user.image)) {\r\n html += '
        \"profile\"/
        '\r\n } else {\r\n html += '
        \"profile\"/
        '\r\n }\r\n\r\n html += '
        ' + user.fullname + '
        '\r\n html += '
        '\r\n html += '' + user.email + ''\r\n html += '
        '\r\n html += '
        '\r\n html += '' + user.title + ''\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n html += '
      • '\r\n\r\n wrapper += html\r\n })\r\n\r\n var assigneeListDrop = $('#assigneeDropdown-content > ul')\r\n $('#assigneeDropdown-content')\r\n .addClass('uk-clearfix')\r\n .css({\r\n height: 'auto',\r\n 'max-height': '372px',\r\n 'overflow-y': 'auto',\r\n 'overflow-x': 'hidden'\r\n })\r\n if (assigneeListDrop.length > 0) {\r\n assigneeListDrop.css({ height: '100%' })\r\n assigneeListDrop.html(wrapper)\r\n\r\n $.each(assigneeListDrop.find('li[data-setAssignee]'), function () {\r\n var self = $(this)\r\n var id = self.attr('data-setAssignee')\r\n self.off('click', setAssigneeClicked)\r\n self.on('click', { _id: id }, setAssigneeClicked)\r\n })\r\n }\r\n })\r\n }\r\n\r\n function setAssigneeClicked (e) {\r\n e.preventDefault()\r\n\r\n var _id = e.data._id\r\n var ticketId = $('#__ticketId').html()\r\n var payload = {\r\n _id: _id,\r\n ticketId: ticketId\r\n }\r\n\r\n socket.emit('setAssignee', payload)\r\n $('#assigneeDropdown').removeClass('pDropOpen')\r\n }\r\n\r\n socketUi.updateAssignee = function () {\r\n socket.removeAllListeners('updateAssignee')\r\n socket.on('updateAssignee', function (ticket) {\r\n var assigneeContainer = $('.ticket-assignee[data-ticketId=\"' + ticket._id + '\"]')\r\n if (assigneeContainer.length > 0) {\r\n var image = _.isUndefined(ticket.assignee) ? 'defaultProfile.jpg' : ticket.assignee.image\r\n if (_.isUndefined(image)) image = 'defaultProfile.jpg'\r\n assigneeContainer.find('a > img').attr('src', '/uploads/users/' + image)\r\n var $bubble = assigneeContainer.find('a > span[data-user-status-id]')\r\n if ($bubble.length < 1 && ticket.assignee) {\r\n $bubble = $('')\r\n assigneeContainer.find('a').append($bubble)\r\n $bubble = assigneeContainer.find('a > span[data-user-status-id]')\r\n }\r\n\r\n if (ticket.assignee) {\r\n $bubble.attr('data-user-status-id', ticket.assignee._id)\r\n socket.emit('updateUsers')\r\n } else {\r\n if ($bubble.length > 0) {\r\n $bubble.remove()\r\n }\r\n }\r\n var details = assigneeContainer.find('.ticket-assignee-details')\r\n if (details.length > 0) {\r\n var name = _.isUndefined(ticket.assignee) ? 'No User Assigned' : ticket.assignee.fullname\r\n details.find('h3').html(name)\r\n var a = details.find('a.comment-email-link')\r\n var email = _.isUndefined(ticket.assignee) ? '' : ticket.assignee.email\r\n if (a.length > 0) {\r\n a.attr('href', 'mailto:' + email).html(email)\r\n } else {\r\n a = $('')\r\n .attr('href', 'mailto:' + email)\r\n .html(email)\r\n .addClass('comment-email-link uk-text-truncate')\r\n details.append(a)\r\n }\r\n\r\n var span = details.find('span')\r\n var title = _.isUndefined(ticket.assignee) ? '' : ticket.assignee.title\r\n if (span.length > 0) {\r\n span.html(title)\r\n } else {\r\n span = $('').html(title)\r\n details.append(span)\r\n }\r\n }\r\n }\r\n\r\n socket.emit('$trudesk:chat:updateOnlineBubbles')\r\n })\r\n }\r\n\r\n socketUi.setTicketType = function (ticketId, typeId) {\r\n var payload = {\r\n ticketId: ticketId,\r\n typeId: typeId\r\n }\r\n\r\n socket.emit('setTicketType', payload)\r\n }\r\n\r\n socketUi.updateTicketType = function () {\r\n socket.removeAllListeners('updateTicketType')\r\n socket.on('updateTicketType', function (data) {\r\n var typeSelect = $('select#tType[data-ticketId=\"' + data._id + '\"] option[value=\"' + data.type._id + '\"]')\r\n if (typeSelect.length > 0) {\r\n typeSelect.prop('selected', true)\r\n } else {\r\n typeSelect = $('div#tType[data-ticketId=\"' + data._id + '\"]')\r\n if (typeSelect.length > 0) {\r\n typeSelect.html(data.type.name)\r\n }\r\n }\r\n })\r\n }\r\n\r\n socketUi.setTicketPriority = function (ticketId, priority) {\r\n var payload = {\r\n ticketId: ticketId,\r\n priority: priority\r\n }\r\n\r\n socket.emit('setTicketPriority', payload)\r\n }\r\n\r\n socketUi.updateTicketPriority = function () {\r\n socket.removeAllListeners('updateTicketPriority')\r\n socket.on('updateTicketPriority', function (data) {\r\n var prioritySelect = $(\r\n 'select#tPriority[data-ticketId=\"' + data._id + '\"] option[value=\"' + data.priority._id + '\"]'\r\n )\r\n if (prioritySelect.length > 0) {\r\n prioritySelect.prop('selected', true)\r\n }\r\n })\r\n }\r\n\r\n socketUi.setTicketGroup = function (ticketId, group) {\r\n var payload = {\r\n ticketId: ticketId,\r\n groupId: group._id\r\n }\r\n\r\n socket.emit('setTicketGroup', payload)\r\n }\r\n\r\n socketUi.updateTicketGroup = function () {\r\n socket.removeAllListeners('updateTicketGroup')\r\n socket.on('updateTicketGroup', function (data) {\r\n var groupSelect = $('select#tGroup[data-ticketId=\"' + data._id + '\"] option[value=\"' + data.group._id + '\"]')\r\n if (groupSelect.length > 0) {\r\n groupSelect.prop('selected', true)\r\n } else {\r\n groupSelect = $('div#tGroup[data-ticketId=\"' + data._id + '\"]')\r\n if (groupSelect.length > 0) {\r\n groupSelect.html(data.group.name)\r\n }\r\n }\r\n })\r\n }\r\n\r\n socketUi.setTicketIssue = function (ticketId, issue, subject) {\r\n var payload = {\r\n ticketId: ticketId,\r\n issue: issue,\r\n subject: subject\r\n }\r\n\r\n socket.emit('setTicketIssue', payload)\r\n }\r\n\r\n socketUi.updateTicketIssue = function () {\r\n socket.removeAllListeners('updateTicketIssue')\r\n socket.on('updateTicketIssue', function (data) {\r\n var $initialIssue = $('.initial-issue[data-ticketid=\"' + data._id + '\"]')\r\n var $subjectBody = $initialIssue.find('.subject-text')\r\n var $issueBody = $initialIssue.find('div.issue-text').find('div.issue-body')\r\n\r\n $subjectBody.html(data.subject)\r\n $issueBody.html(data.issue)\r\n })\r\n }\r\n\r\n socketUi.setCommentText = function (ticketId, commentId, commentText) {\r\n var payload = {\r\n ticketId: ticketId,\r\n commentId: commentId,\r\n commentText: commentText\r\n }\r\n\r\n socket.emit('setCommentText', payload)\r\n }\r\n\r\n socketUi.removeComment = function (ticketId, commentId) {\r\n var payload = {\r\n ticketId: ticketId,\r\n commentId: commentId\r\n }\r\n\r\n socket.emit('removeComment', payload)\r\n }\r\n\r\n socketUi.setNoteText = function (ticketId, noteId, noteText) {\r\n var payload = {\r\n ticketId: ticketId,\r\n noteId: noteId,\r\n noteText: noteText\r\n }\r\n\r\n socket.emit('$trudesk:tickets:setNoteText', payload)\r\n }\r\n\r\n socketUi.removeNote = function (ticketId, noteId) {\r\n var payload = {\r\n ticketId: ticketId,\r\n noteId: noteId\r\n }\r\n\r\n socket.emit('$trudesk:tickets:removeNote', payload)\r\n }\r\n\r\n socketUi.refreshTicketAttachments = function (ticketId) {\r\n var payload = {\r\n ticketId: ticketId\r\n }\r\n\r\n socket.emit('refreshTicketAttachments', payload)\r\n }\r\n\r\n socketUi.updateTicketAttachments = function () {\r\n socket.removeAllListeners('updateTicketAttachments')\r\n socket.on('updateTicketAttachments', function (data) {\r\n // Rebuild ticket attachments on view\r\n var ticket = data.ticket\r\n var canRemoveAttachments = data.canRemoveAttachments\r\n\r\n var $ul = $('ul.attachments[data-ticketid=\"' + ticket._id + '\"]')\r\n if ($ul.length < 1) return true\r\n\r\n $ul.empty()\r\n _.each(ticket.attachments, function (attachment) {\r\n var html = '
      • ' + attachment.name + ''\r\n if (canRemoveAttachments) {\r\n html +=\r\n '
      • '\r\n }\r\n\r\n $ul.append(html)\r\n })\r\n\r\n __webpack_require__.e(/*! AMD require */ 0).then(function() { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [__webpack_require__(/*! pages/singleTicket */ \"./src/public/js/pages/singleTicket.js\")]; (function (st) {\r\n st.init()\r\n }).apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__);}).catch(__webpack_require__.oe)\r\n })\r\n }\r\n\r\n socketUi.refreshTicketTags = function (ticketId) {\r\n var payload = {\r\n ticketId: ticketId\r\n }\r\n\r\n socket.emit('refreshTicketTags', payload)\r\n }\r\n\r\n socketUi.updateTicketTags = function () {\r\n socket.removeAllListeners('updateTicketTags')\r\n socket.on('updateTicketTags', function (data) {\r\n // Rebuild Ticket Tags\r\n var ticket = data.ticket\r\n var tagsDiv = $('.tag-list[data-ticketId=\"' + ticket._id + '\"]')\r\n if (tagsDiv.length < 1) return true\r\n\r\n tagsDiv.html('')\r\n var html = ''\r\n if (_.isUndefined(ticket.tags) && _.size(ticket.tags) < 1) return true\r\n _.each(ticket.tags, function (item) {\r\n html +=\r\n '
        ' +\r\n item._id +\r\n '
        ' +\r\n '
        ' +\r\n item.name +\r\n '
        '\r\n })\r\n\r\n tagsDiv.html(html)\r\n })\r\n }\r\n\r\n socketUi.updateUi = function () {\r\n $(document).ready(function () {\r\n var $button = $('*[data-updateUi]')\r\n $.each($button, function () {\r\n var self = $(this)\r\n var $action = self.attr('data-updateUi')\r\n if ($action.toLowerCase() === 'online-users') {\r\n self.off('click', updateUsersBtnClicked)\r\n self.on('click', updateUsersBtnClicked)\r\n } else if ($action.toLowerCase() === 'assigneelist') {\r\n self.off('click', updateAssigneeList)\r\n self.on('click', updateAssigneeList)\r\n } else if ($action.toLowerCase() === 'notifications') {\r\n self.off('click', updateNotificationsClicked)\r\n self.on('click', updateNotificationsClicked)\r\n }\r\n })\r\n })\r\n }\r\n\r\n function updateMailNotificationsClicked (e) {\r\n socket.emit('updateMailNotifications')\r\n e.preventDefault()\r\n }\r\n\r\n function updateUsersBtnClicked (e) {\r\n socket.emit('updateUsers')\r\n e.preventDefault()\r\n }\r\n\r\n socketUi.updateUsers = function () {\r\n socket.emit('updateUsers')\r\n }\r\n\r\n function updateAssigneeList (e) {\r\n socket.emit('updateAssigneeList')\r\n e.preventDefault()\r\n }\r\n\r\n function updateNotificationsClicked (e) {\r\n socket.emit('updateNotifications')\r\n e.preventDefault()\r\n }\r\n\r\n socketUi.emitUpdateAllNotifications = function () {\r\n socket.emit('updateAllNotifications')\r\n }\r\n\r\n socketUi.updateComments = function () {\r\n socket.removeAllListeners('updateComments')\r\n socket.on('updateComments', function (data) {\r\n var ticket = data\r\n var canViewNotes = helpers.canUser('notes:view')\r\n _.each(ticket.comments, function (i) {\r\n i.isComment = true\r\n })\r\n\r\n var combined = ticket.comments\r\n var allCount = ticket.comments.length\r\n if (canViewNotes) {\r\n _.each(ticket.notes, function (i) {\r\n i.isNote = true\r\n })\r\n combined = _.union(ticket.comments, ticket.notes)\r\n allCount = ticket.comments.length + ticket.notes.length\r\n } else {\r\n $('#tab-internal-notes[data-ticketid=\"' + ticket._id + '\"]').addClass('hide')\r\n }\r\n\r\n ticket.commentsAndNotes = _.sortBy(combined, 'date')\r\n\r\n var commentsNotesTab = $('.comments-notes-tab[data-ticketid=\"' + ticket._id + '\"]')\r\n\r\n if (ticket.commentsAndNotes.length < 1) {\r\n commentsNotesTab.addClass('hide')\r\n return true\r\n }\r\n\r\n commentsNotesTab.removeClass('hide')\r\n\r\n var allCommentsContainer = $('.all-comments[data-ticketId=\"' + ticket._id + '\"]')\r\n var commentContainer = $('.comments[data-ticketId=\"' + ticket._id + '\"]')\r\n var notesContainer = $('.notes[data-ticketId=\"' + ticket._id + '\"]')\r\n\r\n // Update Comments Tab Badge\r\n\r\n $('#tab-all-comments[data-ticketid=\"' + ticket._id + '\"]')\r\n .find('span')\r\n .html(allCount)\r\n $('#tab-public-comments[data-ticketid=\"' + ticket._id + '\"]')\r\n .find('span')\r\n .html(ticket.comments.length)\r\n $('#tab-internal-notes[data-ticketid=\"' + ticket._id + '\"]')\r\n .find('span')\r\n .html(ticket.notes.length)\r\n\r\n var allCommentsHtml = ''\r\n\r\n var commentsHtml = ''\r\n\r\n var notesHtml = ''\r\n\r\n // Build All Comments / Notes Section\r\n _.each(ticket.commentsAndNotes, function (item) {\r\n var image = item.owner.image\r\n if (_.isUndefined(image)) image = 'defaultProfile.jpg'\r\n\r\n if (item.isComment) {\r\n // Comment\r\n allCommentsHtml +=\r\n '
        ' +\r\n '
        ' +\r\n '\"\"/' +\r\n '' +\r\n '
        ' +\r\n '
        ' +\r\n '

        Re: ' +\r\n ticket.subject +\r\n '

        ' +\r\n '' +\r\n item.owner.fullname +\r\n ' <' +\r\n item.owner.email +\r\n '>' +\r\n '
        ' +\r\n '' +\r\n '

        ' +\r\n item.comment +\r\n '

        ' +\r\n '
        ' +\r\n '
        ' +\r\n '
        ' +\r\n '
        ' +\r\n '' +\r\n '
        ' +\r\n '
        ' +\r\n '' +\r\n '' +\r\n '
        ' +\r\n '
        ' +\r\n '
        ' +\r\n '
        '\r\n if (helpers.canUser('comment:delete') || helpers.canUserEditSelf(item.owner._id, 'comment')) {\r\n allCommentsHtml +=\r\n '
        '\r\n }\r\n\r\n if (helpers.canUser('comment:edit') || helpers.canUserEditSelf(item.owner._id, 'comment')) {\r\n allCommentsHtml +=\r\n '
        '\r\n }\r\n\r\n allCommentsHtml += '
        ' + '
        '\r\n } else if (item.isNote) {\r\n allCommentsHtml +=\r\n '
        ' +\r\n '
        ' +\r\n '\"\"/' +\r\n '' +\r\n '
        ' +\r\n '
        ' +\r\n '

        Re: ' +\r\n ticket.subject +\r\n '

        ' +\r\n '' +\r\n item.owner.fullname +\r\n ' <' +\r\n item.owner.email +\r\n '>' +\r\n '
        ' +\r\n '' +\r\n '
        ' +\r\n 'NOTE' +\r\n '

        ' +\r\n item.note +\r\n '

        ' +\r\n '
        ' +\r\n '
        ' +\r\n '
        ' +\r\n '
        ' +\r\n '' +\r\n '
        ' +\r\n '
        ' +\r\n '' +\r\n '' +\r\n '
        ' +\r\n '
        ' +\r\n '
        ' +\r\n '
        '\r\n if (helpers.canUser('note:delete') || helpers.canUserEditSelf(item.owner._id, 'note')) {\r\n allCommentsHtml +=\r\n '
        '\r\n }\r\n\r\n if (helpers.canUser('note:edit') || helpers.canUserEditSelf(item.owner._id, 'note')) {\r\n allCommentsHtml +=\r\n '
        '\r\n }\r\n\r\n allCommentsHtml += '
        ' + '
        '\r\n }\r\n })\r\n\r\n _.each(ticket.comments, function (comment) {\r\n var image = comment.owner.image\r\n if (_.isUndefined(image)) image = 'defaultProfile.jpg'\r\n\r\n commentsHtml +=\r\n '
        ' +\r\n '
        ' +\r\n '\"\"/' +\r\n '' +\r\n '
        ' +\r\n '
        ' +\r\n '

        Re: ' +\r\n ticket.subject +\r\n '

        ' +\r\n '' +\r\n comment.owner.fullname +\r\n ' <' +\r\n comment.owner.email +\r\n '>' +\r\n '
        ' +\r\n '' +\r\n '

        ' +\r\n comment.comment +\r\n '

        ' +\r\n '
        ' +\r\n '
        ' +\r\n '
        ' +\r\n '
        ' +\r\n '' +\r\n '
        ' +\r\n '
        ' +\r\n '' +\r\n '' +\r\n '
        ' +\r\n '
        ' +\r\n '
        ' +\r\n '
        '\r\n if (helpers.canUser('comment:delete') || helpers.canUserEditSelf(comment.owner._id, 'comment')) {\r\n commentsHtml +=\r\n '
        '\r\n }\r\n\r\n if (helpers.canUser('comment:edit') || helpers.canUserEditSelf(comment.owner._id, 'comment')) {\r\n commentsHtml +=\r\n '
        '\r\n }\r\n\r\n commentsHtml += '
        ' + '
        '\r\n })\r\n\r\n _.each(ticket.notes, function (note) {\r\n var image = note.owner.image\r\n if (_.isUndefined(image)) image = 'defaultProfile.jpg'\r\n\r\n notesHtml +=\r\n '
        ' +\r\n '
        ' +\r\n '\"\"/' +\r\n '' +\r\n '
        ' +\r\n '
        ' +\r\n '

        Re: ' +\r\n ticket.subject +\r\n '

        ' +\r\n '' +\r\n note.owner.fullname +\r\n ' <' +\r\n note.owner.email +\r\n '>' +\r\n '
        ' +\r\n '' +\r\n '
        ' +\r\n 'NOTE' +\r\n '

        ' +\r\n note.note +\r\n '

        ' +\r\n '
        ' +\r\n '
        ' +\r\n '
        ' +\r\n '
        ' +\r\n '' +\r\n '
        ' +\r\n '
        ' +\r\n '' +\r\n '' +\r\n '
        ' +\r\n '
        ' +\r\n '
        ' +\r\n '
        '\r\n if (helpers.canUser('note:delete') || helpers.canUserEditSelf(note.owner._id, 'note')) {\r\n notesHtml +=\r\n '
        '\r\n }\r\n\r\n if (helpers.canUser('note:edit') || helpers.canUserEditSelf(note.owner._id, 'note')) {\r\n notesHtml +=\r\n '
        '\r\n }\r\n\r\n notesHtml += '
        ' + '
        '\r\n })\r\n\r\n // allCommentsContainer.html(allCommentsHtml)\r\n // Inject Angular to new links\r\n var $injector = angular.injector(['ng', 'trudesk'])\r\n $injector.invoke([\r\n '$compile',\r\n '$rootScope',\r\n function ($compile, $rootScope) {\r\n var $scope = allCommentsContainer.html(allCommentsHtml).scope()\r\n $compile(allCommentsContainer)($scope || $rootScope)\r\n $rootScope.$digest()\r\n }\r\n ])\r\n\r\n // commentContainer.html(commentsHtml)\r\n\r\n // Inject Angular to new links\r\n $injector = angular.injector(['ng', 'trudesk'])\r\n $injector.invoke([\r\n '$compile',\r\n '$rootScope',\r\n function ($compile, $rootScope) {\r\n var $scope = commentContainer.html(commentsHtml).scope()\r\n $compile(commentContainer)($scope || $rootScope)\r\n $rootScope.$digest()\r\n }\r\n ])\r\n\r\n if (canViewNotes) {\r\n // notesContainer.html(notesHtml)\r\n\r\n // Inject Angular to new links\r\n $injector = angular.injector(['ng', 'trudesk'])\r\n $injector.invoke([\r\n '$compile',\r\n '$rootScope',\r\n function ($compile, $rootScope) {\r\n var $scope = notesContainer.html(notesHtml).scope()\r\n $compile(notesContainer)($scope || $rootScope)\r\n $rootScope.$digest()\r\n }\r\n ])\r\n }\r\n helpers.resizeAll()\r\n\r\n __webpack_require__.e(/*! AMD require */ 0).then(function() { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [__webpack_require__(/*! pages/singleTicket */ \"./src/public/js/pages/singleTicket.js\")]; (function (st) {\r\n st.init()\r\n }).apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__);}).catch(__webpack_require__.oe)\r\n })\r\n }\r\n\r\n socketUi.clearNotifications = function () {\r\n socket.emit('clearNotifications')\r\n\r\n helpers.hideAllpDropDowns()\r\n }\r\n\r\n socketUi.markNotificationRead = function (_id) {\r\n socket.emit('markNotificationRead', _id)\r\n\r\n helpers.hideAllpDropDowns()\r\n }\r\n\r\n socketUi.updateNotifications = function () {\r\n socket.removeAllListeners('updateNotifications')\r\n socket.on('updateNotifications', function (data) {\r\n var $notifications = $('#notifications-Messages').find('ul')\r\n if ($notifications.length < 1) return\r\n\r\n $notifications.html('')\r\n // Build Notifications\r\n _.each(data.items, function (item) {\r\n var html = ''\r\n html +=\r\n '
      • ' +\r\n '' +\r\n '
        '\r\n if (item.unread === true) {\r\n html += '
        '\r\n }\r\n\r\n switch (item.type) {\r\n case 0:\r\n html += '
        '\r\n break\r\n case 1:\r\n html += '
        '\r\n break\r\n case 2:\r\n html += '
        '\r\n break\r\n }\r\n\r\n html +=\r\n '
        ' +\r\n item.title +\r\n '
        ' +\r\n '
        ' +\r\n '' +\r\n item.message +\r\n '' +\r\n '
        ' +\r\n '
        ' +\r\n '' +\r\n '
        ' +\r\n '
        ' +\r\n '
        ' +\r\n '
      • '\r\n\r\n $notifications.append(html)\r\n\r\n var $nLinks = $('#notifications-Messages').find('a[data-notificationId]')\r\n $.each($nLinks, function (k, val) {\r\n var item = $(val)\r\n item.off('click')\r\n item.on('click', function (e) {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n var $id = $(e.currentTarget).attr('data-notificationId')\r\n var $href = $(e.currentTarget).attr('href')\r\n if ($id.length < 1) return\r\n\r\n socketUi.markNotificationRead($id)\r\n\r\n History.pushState(null, null, $href)\r\n })\r\n })\r\n })\r\n\r\n var $notificationsCount = $('#btn_notifications').find('span')\r\n var $bottomActions = $('#notifications').find('.bottom-actions')\r\n if ($notificationsCount.length > 0) {\r\n if (data.count === 0) {\r\n $notificationsCount.html('0')\r\n $notificationsCount.addClass('hide')\r\n $bottomActions.addClass('hide')\r\n } else {\r\n $notificationsCount.removeClass('hide')\r\n $notificationsCount.html(data.count)\r\n $bottomActions.removeClass('hide')\r\n }\r\n }\r\n })\r\n }\r\n\r\n socketUi.updateAllNotifications = function () {\r\n socket.removeAllListeners('updateAllNotifications')\r\n socket.on('updateAllNotifications', function (data) {\r\n // All Notifications\r\n var $notificationsTable = $('table.notificationsTable')\r\n var $tbody = $notificationsTable.find('tbody')\r\n $tbody.html('')\r\n _.each(data.items, function (item) {\r\n if (!item.data && item.data.ticket) return\r\n var html = ''\r\n html +=\r\n ''\r\n html += ''\r\n html += ''\r\n html += ''\r\n html += ''\r\n html += '

        ' + item.title + '

        '\r\n html += '
        '\r\n html += item.message\r\n html += '
        '\r\n html += ''\r\n html += ''\r\n html +=\r\n ''\r\n html += ''\r\n html += ''\r\n\r\n $tbody.append(html)\r\n\r\n var $nRows = $tbody.find('.notification-row')\r\n $.each($nRows, function (k, val) {\r\n var $item = $(val)\r\n $item.off('click')\r\n $item.on('click', function (e) {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n var $id = $(e.currentTarget).attr('data-notificationId')\r\n var $uid = $(e.currentTarget).attr('data-ticket-uid')\r\n socketUi.markNotificationRead($id)\r\n helpers.closeNotificationsWindow()\r\n History.pushState(null, null, '/tickets/' + $uid)\r\n })\r\n })\r\n })\r\n })\r\n }\r\n\r\n socketUi.onTicketCreated = function () {\r\n socket.removeAllListeners('ticket:created')\r\n socket.on('ticket:created', function () {\r\n socket.emit('updateNotifications')\r\n var audio = $('audio#newticketaudio')\r\n if (audio.length > 0) audio.trigger('play')\r\n $('a#refreshTicketGrid').trigger('click')\r\n })\r\n }\r\n\r\n socketUi.onTicketDelete = function () {\r\n socket.removeAllListeners('ticket:delete')\r\n socket.on('ticket:delete', function () {\r\n var refreshEnabled = $('input#refreshSwitch:checked')\r\n if (refreshEnabled.length > 0) {\r\n $('a#refreshTicketGrid').trigger('click')\r\n }\r\n })\r\n }\r\n\r\n socketUi.onUpdateTicketGrid = function () {\r\n socket.removeAllListeners('ticket:updategrid')\r\n socket.on('ticket:updategrid', function () {\r\n var refreshEnabled = $('input#refreshSwitch:checked')\r\n if (refreshEnabled.length > 0) {\r\n $('a#refreshTicketGrid').trigger('click')\r\n }\r\n })\r\n }\r\n\r\n socketUi.onProfileImageUpdate = function () {\r\n socket.removeAllListeners('trudesk:profileImageUpdate')\r\n socket.on('trudesk:profileImageUpdate', function (data) {\r\n var profileImage = $('#profileImage[data-userid=\"' + data.userid + '\"]')\r\n if (profileImage.length > 0) {\r\n profileImage.attr('src', '/uploads/users/' + data.img + '?r=' + new Date().getTime())\r\n }\r\n })\r\n }\r\n\r\n return socketUi\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/modules/ui.js?"); - -/***/ }), - -/***/ "./src/public/js/pages/accounts.js": -/*!*****************************************!*\ - !*** ./src/public/js/pages/accounts.js ***! - \*****************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 02/10/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\r\n __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"),\r\n __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"),\r\n __webpack_require__(/*! angular */ \"./src/public/js/vendor/angular/angular.min.js\"),\r\n __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"),\r\n __webpack_require__(/*! uikit */ \"./src/public/js/vendor/uikit/js/uikit_combined.min.js\"),\r\n __webpack_require__(/*! modules/socket */ \"./src/public/js/modules/socket.js\"),\r\n __webpack_require__(/*! isinview */ \"./src/public/js/plugins/jquery.isinview.js\"),\r\n __webpack_require__(/*! datatables */ \"./src/public/js/vendor/datatables/jquery.dataTables.js\"),\r\n __webpack_require__(/*! dt_responsive */ \"./src/public/js/vendor/datatables/dataTables.responsive.js\"),\r\n __webpack_require__(/*! dt_grouping */ \"./src/public/js/vendor/datatables/dataTables.grouping.js\"),\r\n // 'dt_foundation',\r\n __webpack_require__(/*! dt_scroller */ \"./src/public/js/vendor/datatables/dataTables.scroller.js\"),\r\n __webpack_require__(/*! history */ \"./src/public/js/vendor/history/jquery.history.js\")\r\n], __WEBPACK_AMD_DEFINE_RESULT__ = (function (_, $, angular, helpers, UIkit, socket) {\r\n 'use strict'\r\n var accountsPage = {}\r\n\r\n String.prototype.capitalizeFirstLetter = function () {\r\n return this.charAt(0).toUpperCase() + this.slice(1)\r\n }\r\n\r\n accountsPage.init = function (callback, reset) {\r\n $(document).ready(function () {\r\n var $accountList = $('#account_list')\r\n\r\n var $scroller = $accountList.parents('.scrollable')\r\n\r\n var $scrollspy = $('#scrollspy')\r\n\r\n var $spinner = $scrollspy.find('i')\r\n\r\n var $filterAll = $('.filter-all')\r\n\r\n var $nextPage = 1\r\n\r\n var $enabled = true\r\n\r\n var $loading = false\r\n\r\n if (reset) {\r\n $nextPage = 0\r\n getAccounts()\r\n }\r\n\r\n UIkit.grid($accountList, {\r\n controls: '#account_list_filter',\r\n gutter: 20\r\n })\r\n\r\n $scroller.scroll(function () {\r\n if ($scrollspy.isInView($scroller)) {\r\n var run = _.throttle(getAccounts, 500)\r\n run()\r\n }\r\n })\r\n\r\n $('#account_list_filter li a').on('click', function () {\r\n $('#account_list_search').val('')\r\n $('.tru-card[data-search-result]').remove()\r\n setTimeout(function () {\r\n helpers.resizeAll()\r\n }, 280)\r\n })\r\n\r\n $('#account_list_search').keyup(function (e) {\r\n e.preventDefault()\r\n var key = e.keyCode || e.which\r\n\r\n var sValue = $(this)\r\n .val()\r\n .toLowerCase()\r\n\r\n if (key === 13) {\r\n if (sValue.length < 3) {\r\n $('#account_list_filter li.uk-active a').trigger('click')\r\n return true\r\n }\r\n\r\n $.ajax({\r\n url: '/api/v1/users?search=' + sValue,\r\n success: function (data) {\r\n $accountList.children().css('display', 'none')\r\n var users = data.users\r\n var html = ''\r\n _.each(users, function (u) {\r\n html += buildUserHTML(u, true)\r\n })\r\n\r\n var $injector = angular.injector(['ng', 'trudesk'])\r\n $injector.invoke([\r\n '$compile',\r\n '$rootScope',\r\n function ($compile, $rootScope) {\r\n var $scope = $accountList.append(html).scope()\r\n $compile($accountList)($scope || $rootScope)\r\n $rootScope.$digest()\r\n }\r\n ])\r\n\r\n $('.s-ajaxify').on('click', function (e) {\r\n e.preventDefault()\r\n var href = $(e.target).attr('href')\r\n\r\n History.pushState(null, null, href)\r\n })\r\n\r\n UIkit.$html.trigger('changed.uk.dom')\r\n helpers.resizeAll()\r\n\r\n socket.ui.updateUsers()\r\n },\r\n error: function (error) {\r\n console.log('[trudesk:accountsPage:setupGrid] - Error: ' + error.error)\r\n }\r\n })\r\n }\r\n\r\n return false\r\n })\r\n\r\n function getAccounts () {\r\n if (!$enabled || $loading) {\r\n return false\r\n }\r\n\r\n if (!$filterAll.hasClass('uk-active')) return true\r\n\r\n $loading = true\r\n $spinner.removeClass('uk-hidden')\r\n\r\n $.ajax({\r\n url: '/api/v1/users?limit=20&page=' + $nextPage\r\n })\r\n .done(function (data) {\r\n $spinner.addClass('uk-hidden')\r\n var users = data.users\r\n if (_.size(users) < 1) {\r\n $enabled = false\r\n $loading = false\r\n return false\r\n }\r\n\r\n var html = ''\r\n\r\n _.each(users, function (u) {\r\n var h = null\r\n if (reset) {\r\n $accountList.html('')\r\n h = buildUserHTML(u, true)\r\n reset = false\r\n } else {\r\n h = buildUserHTML(u, false)\r\n }\r\n\r\n if (h.length > 0) html += h\r\n })\r\n\r\n var $injector = angular.injector(['ng', 'trudesk'])\r\n $injector.invoke([\r\n '$compile',\r\n '$rootScope',\r\n function ($compile, $rootScope) {\r\n var $scope = $accountList.append(html).scope()\r\n $compile($accountList)($scope || $rootScope)\r\n $rootScope.$digest()\r\n }\r\n ])\r\n\r\n UIkit.$html.trigger('changed.uk.dom')\r\n helpers.resizeAll()\r\n\r\n $('.s-ajaxify').on('click', function (e) {\r\n e.preventDefault()\r\n var href = $(e.target).attr('href')\r\n\r\n History.pushState(null, null, href)\r\n })\r\n\r\n $nextPage = $nextPage + 1\r\n $loading = false\r\n\r\n socket.ui.updateUsers()\r\n })\r\n .fail(function (err) {\r\n console.log('[trudesk:accountsPage:setupGrid] - Error: ' + err.error)\r\n $loading = false\r\n })\r\n }\r\n\r\n if (typeof callback === 'function') {\r\n return callback()\r\n }\r\n })\r\n }\r\n\r\n function buildUserHTML (user, addRemove) {\r\n if (!addRemove) {\r\n var $card = $('[data-card-username=\"' + user.username + '\"]')\r\n if ($card.length > 0) return ''\r\n }\r\n\r\n var html = '
        '\r\n if (addRemove) {\r\n html += '
        '\r\n } else {\r\n html += '
        '\r\n }\r\n\r\n if (user.role === 'admin') {\r\n html += '
        '\r\n } else {\r\n html += '
        '\r\n }\r\n\r\n html += '
        '\r\n html += ''\r\n html += '
        '\r\n html += '
          '\r\n html +=\r\n '
        • Edit
        • '\r\n html +=\r\n '
        • Delete
        • '\r\n html +=\r\n '
        • Enable
        • '\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n if (user.image) {\r\n html +=\r\n '\"Profile'\r\n } else {\r\n html += '\"Profile'\r\n }\r\n html +=\r\n ''\r\n html += '
        '\r\n\r\n html += '
        '\r\n html += '

        '\r\n html += user.fullname\r\n html +=\r\n '' +\r\n (_.isUndefined(user.title) ? '' : user.title.capitalizeFirstLetter()) +\r\n ''\r\n html += '

        '\r\n html += '
        '\r\n html += '
        '\r\n html += '
          '\r\n html += '
        • '\r\n html += '
          '\r\n html += 'Role'\r\n html += '' + user.role.capitalizeFirstLetter() + ''\r\n html += '
          '\r\n html += '
        • '\r\n html += '
        • '\r\n html += '
          '\r\n html += 'Email'\r\n html +=\r\n '' +\r\n user.email +\r\n ''\r\n html += '
          '\r\n html += '
        • '\r\n html += '
        • '\r\n html += '
          '\r\n html += 'Groups'\r\n html += ''\r\n _.each(user.groups, function (g) {\r\n html += g\r\n if (_.size(user.groups) > 1) {\r\n if (_.last(user.groups) !== g) {\r\n html += ', '\r\n }\r\n }\r\n })\r\n html += ''\r\n html += '
          '\r\n html += '
        • '\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n html += '
        '\r\n\r\n return html\r\n }\r\n\r\n return accountsPage\r\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\r\n\n\n//# sourceURL=webpack:///./src/public/js/pages/accounts.js?"); - -/***/ }), - -/***/ "./src/public/js/plugins/autogrow.js": -/*!*******************************************!*\ - !*** ./src/public/js/plugins/autogrow.js ***! - \*******************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function(jQuery) {(function($)\r\n{\r\n /**\r\n * Auto-growing textareas; technique ripped from Facebook\r\n *\r\n *\r\n * http://github.com/jaz303/jquery-grab-bag/tree/master/javascripts/jquery.autogrow-textarea.js\r\n */\r\n $.fn.autogrow = function(options)\r\n {\r\n return this.filter('textarea').each(function()\r\n {\r\n var self = this;\r\n var $self = $(self);\r\n //var minHeight = $self.height();\r\n var minHeight = 16;\r\n var noFlickerPad = $self.hasClass('autogrow-short') ? 0 : parseInt($self.css('lineHeight')) || 0;\r\n var settings = $.extend({\r\n preGrowCallback: null,\r\n postGrowCallback: null,\r\n enterPressed: null,\r\n shiftEnterPressed: null\r\n }, options );\r\n\r\n var shadow = $('
        ').css({\r\n position: 'absolute',\r\n top: -10000,\r\n left: -10000,\r\n width: $self.width(),\r\n fontSize: $self.css('fontSize'),\r\n fontFamily: $self.css('fontFamily'),\r\n fontWeight: $self.css('fontWeight'),\r\n lineHeight: $self.css('lineHeight'),\r\n resize: 'none',\r\n 'word-wrap': 'break-word'\r\n }).appendTo(document.body);\r\n\r\n var update = function(event)\r\n {\r\n var times = function(string, number)\r\n {\r\n for (var i=0, r=''; i/g, '>')\r\n .replace(/&/g, '&')\r\n .replace(/\\n$/, '
         ')\r\n .replace(/\\n/g, '
        ')\r\n .replace(/ {2,}/g, function(space){ return times(' ', space.length - 1) + ' ' });\r\n\r\n // Did enter get pressed? Resize in this keydown event so that the flicker doesn't occur.\r\n if (event && event.data && event.data.event === 'keydown' && (event.keyCode === 13 && event.shiftKey)) {\r\n val += '
        ';\r\n\r\n if (settings.shiftEnterPressed!=null) {\r\n settings.shiftEnterPressed($self);\r\n }\r\n } else if (event && event.data && event.data.event === 'keydown' && event.keyCode === 13) {\r\n var value = val;\r\n\r\n $self.val('');\r\n val = '';\r\n $self.height(Math.max(shadow.height() + noFlickerPad, minHeight));\r\n\r\n if (settings.enterPressed!=null) {\r\n settings.enterPressed($self, value);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n shadow.css('width', $self.width());\r\n shadow.html(val + (noFlickerPad === 0 ? '...' : '')); // Append '...' to resize pre-emptively.\r\n\r\n var oldHeight=$self.height();\r\n var newHeight=Math.max(shadow.height() + noFlickerPad, minHeight);\r\n if(settings.preGrowCallback!=null){\r\n newHeight=settings.preGrowCallback($self,shadow,newHeight,minHeight);\r\n }\r\n\r\n $self.height(newHeight);\r\n\r\n if(settings.postGrowCallback!=null){\r\n settings.postGrowCallback($self, oldHeight, newHeight);\r\n }\r\n }\r\n\r\n $self.change(update).keyup(update).keydown({event:'keydown'},update);\r\n $(window).resize(update);\r\n\r\n update();\r\n });\r\n };\r\n})(jQuery);\r\n\r\n//End AUTOGROW\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\")))\n\n//# sourceURL=webpack:///./src/public/js/plugins/autogrow.js?"); - -/***/ }), - -/***/ "./src/public/js/plugins/jquery.custom.js": -/*!************************************************!*\ - !*** ./src/public/js/plugins/jquery.custom.js ***! - \************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function(jQuery) {/*!\r\n * jQuery serializeObject - v0.2 - 1/20/2010\r\n * http://benalman.com/projects/jquery-misc-plugins/\r\n *\r\n * Copyright (c) 2010 \"Cowboy\" Ben Alman\r\n * Dual licensed under the MIT and GPL licenses.\r\n * http://benalman.com/about/license/\r\n */\r\n\r\n// Whereas .serializeArray() serializes a form into an array, .serializeObject()\r\n// serializes a form into an (arguably more useful) object.\r\n\r\n;(function ($, undefined) {\r\n '$:nomunge' // Used by YUI compressor.\r\n\r\n $.fn.serializeObject = function () {\r\n var obj = {}\r\n\r\n $.each(this.serializeArray(), function (i, o) {\r\n var n = o.name,\r\n v = o.value\r\n\r\n obj[n] = obj[n] === undefined ? v : $.isArray(obj[n]) ? obj[n].concat(v) : [obj[n], v]\r\n })\r\n\r\n return obj\r\n }\r\n\r\n /**\r\n This is a jQuery plugin to support resizing text areas.\r\n\r\n Originally based off text area resizer by Ryan O'Dell : http://plugins.jquery.com/misc/textarea.js\r\n Modifications by Discourse https://github.com/discourse/discourse\r\n @module $.fn.DivResizer\r\n **/\r\n\r\n var div,\r\n endDrag,\r\n grip,\r\n lastMousePos,\r\n min,\r\n mousePosition,\r\n originalDivHeight,\r\n originalPos,\r\n performDrag,\r\n startDrag,\r\n wrappedEndDrag,\r\n wrappedPerformDrag\r\n div = void 0\r\n originalPos = void 0\r\n originalDivHeight = void 0\r\n lastMousePos = 0\r\n min = 350\r\n grip = void 0\r\n wrappedEndDrag = void 0\r\n wrappedPerformDrag = void 0\r\n\r\n startDrag = function (e, opts) {\r\n div = $(e.data.el)\r\n div.addClass('clear-transitions')\r\n div.blur()\r\n lastMousePos = mousePosition(e).y\r\n originalPos = lastMousePos\r\n originalDivHeight = div.height()\r\n wrappedPerformDrag = (function () {\r\n return function (e) {\r\n return performDrag(e, opts)\r\n }\r\n })()\r\n wrappedEndDrag = (function () {\r\n return function (e) {\r\n return endDrag(e, opts)\r\n }\r\n })()\r\n $(document)\r\n .mousemove(wrappedPerformDrag)\r\n .mouseup(wrappedEndDrag)\r\n return false\r\n }\r\n\r\n performDrag = function (e, opts) {\r\n $(div).trigger('div-resizing')\r\n\r\n var size, sizePx, thisMousePos\r\n thisMousePos = mousePosition(e).y\r\n size = originalDivHeight + (originalPos - thisMousePos)\r\n lastMousePos = thisMousePos\r\n\r\n var maxHeight = $(window).height()\r\n if (opts.maxHeight) {\r\n maxHeight = opts.maxHeight(maxHeight)\r\n }\r\n size = Math.min(size, maxHeight)\r\n size = Math.max(min, size)\r\n sizePx = size + 'px'\r\n if (typeof opts.onDrag === 'function') {\r\n opts.onDrag(sizePx)\r\n }\r\n div.height(sizePx)\r\n if (size < min) {\r\n endDrag(e, opts)\r\n }\r\n return false\r\n }\r\n\r\n endDrag = function (e, opts) {\r\n $(document)\r\n .unbind('mousemove', wrappedPerformDrag)\r\n .unbind('mouseup', wrappedEndDrag)\r\n div.removeClass('clear-transitions')\r\n div.focus()\r\n if (typeof opts.resize === 'function') {\r\n opts.resize()\r\n }\r\n $(div).trigger('div-resized')\r\n div = null\r\n }\r\n\r\n mousePosition = function (e) {\r\n return {\r\n x: e.clientX + document.documentElement.scrollLeft,\r\n y: e.clientY + document.documentElement.scrollTop\r\n }\r\n }\r\n\r\n $.fn.DivResizer = function (opts) {\r\n return this.each(function () {\r\n var grippie, start, staticOffset\r\n div = $(this)\r\n if (div.hasClass('processed')) return\r\n div.addClass('processed')\r\n staticOffset = null\r\n start = function () {\r\n return function (e) {\r\n return startDrag(e, opts)\r\n }\r\n }\r\n grippie = div\r\n .prepend(\"
        \")\r\n .find('.grippie')\r\n .bind(\r\n 'mousedown',\r\n {\r\n el: this\r\n },\r\n start()\r\n )\r\n })\r\n }\r\n})(jQuery)\r\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\")))\n\n//# sourceURL=webpack:///./src/public/js/plugins/jquery.custom.js?"); - -/***/ }), - -/***/ "./src/public/js/plugins/jquery.documentsize.js": -/*!******************************************************!*\ - !*** ./src/public/js/plugins/jquery.documentsize.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function($) {// jQuery.documentSize, v1.2.3\r\n// Copyright (c) 2015-2016 Michael Heim, Zeilenwechsel.de\r\n// Distributed under MIT license\r\n// http://github.com/hashchange/jquery.documentsize\r\n\r\n;( function ( root, factory ) {\r\n \"use strict\";\r\n\r\n if ( true ) {\r\n\r\n module.exports = factory(\r\n __webpack_require__( /*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\" )\r\n );\r\n\r\n } else {}\r\n}( this, function ( jQuery ) {\r\n \"use strict\";\r\n\r\n ;( function ( $ ) {\r\n \"use strict\";\r\n\r\n // IIFE generating the functions $.documentWidth, $.documentHeight, $.windowWidth, $.windowHeight, and\r\n // $.scrollbarWidth.\r\n //\r\n // These functions need to run feature detections which requires insertion of an iframe ($.documentWidth/Height) and\r\n // a div ($.scrollbarWidth). The body element in the main document must be available when that happens (ie, the\r\n // opening body tag must have been parsed).\r\n //\r\n // For that reason, the detection does not run instantly - after all, the code might be loaded and run while parsing\r\n // the head. Instead, detection happens on DOM-ready, or when any of the functions is invoked for the first time.\r\n // Given the purpose of the functions, they won't be called until after the opening body tag has been parsed.\r\n\r\n var _scrollbarWidth,\r\n _supportsWindowInnerWidth,\r\n _supportsSubpixelAccuracy,\r\n elementNameForDocSizeQuery,\r\n ieVersion,\r\n useGetComputedStyle = !! window.getComputedStyle;\r\n\r\n /**\r\n * @param {Document} [_document=document]\r\n * @returns {number}\r\n */\r\n $.documentWidth = function ( _document ) {\r\n var width;\r\n\r\n _document || ( _document = document );\r\n\r\n try {\r\n\r\n if ( elementNameForDocSizeQuery === undefined ) testDocumentScroll();\r\n width = _document[elementNameForDocSizeQuery].scrollWidth;\r\n\r\n } catch ( e ) {\r\n\r\n // Fallback for unsupported, broken browsers which can't run the behaviour test successfully\r\n width = guessDocumentSize( \"Width\", _document );\r\n\r\n }\r\n\r\n return width;\r\n };\r\n\r\n /**\r\n * @param {Document} [_document=document]\r\n * @returns {number}\r\n */\r\n $.documentHeight = function ( _document ) {\r\n var height;\r\n\r\n _document || ( _document = document );\r\n\r\n try {\r\n\r\n if ( elementNameForDocSizeQuery === undefined ) testDocumentScroll();\r\n height = _document[elementNameForDocSizeQuery].scrollHeight;\r\n\r\n } catch ( e ) {\r\n\r\n // Fallback for unsupported, broken browsers which can't run the behaviour test successfully\r\n height = guessDocumentSize( \"Height\", _document );\r\n\r\n }\r\n\r\n return height;\r\n };\r\n\r\n /**\r\n * @param {string|Object|Window} [options=\"visual\"] (a) viewport option: strings \"visual\", \"layout\" (case-\r\n * insensitive), or a hash with a `viewport` property\r\n * (b) the window argument\r\n * @param {string|Object|Window} [_window=window] same as first argument; positions for window and viewport\r\n * argument are interchangeable\r\n * @returns {number}\r\n */\r\n $.windowWidth = function ( options, _window ) {\r\n var config = getWindowQueryConfig( arguments );\r\n return getWindowSize( \"Width\", config );\r\n };\r\n\r\n /**\r\n * @param {string|Object|Window} [options=\"visual\"] (a) viewport option: strings \"visual\", \"layout\" (case-\r\n * insensitive), or a hash with a `viewport` property\r\n * (b) the window argument\r\n * @param {string|Object|Window} [_window=window] same as first argument; positions for window and viewport\r\n * argument are interchangeable\r\n * @returns {number}\r\n */\r\n $.windowHeight = function ( options, _window ) {\r\n var config = getWindowQueryConfig( arguments );\r\n return getWindowSize( \"Height\", config );\r\n };\r\n\r\n /**\r\n * @param {Window} [_window=window]\r\n * @returns {number}\r\n */\r\n $.pinchZoomFactor = function ( _window ) {\r\n\r\n // Calculate the zoom factor based on the width, not the height. getPinchZoomFactor() does just that.\r\n //\r\n // It would be more accurate to use the longest side for the calculation, keeping the effect of rounding errors\r\n // low (unless the browser supports sub-pixel accuracy anyway).\r\n //\r\n // Unfortunately, iOS does not allow that approach. Switching from normal to minimal UI is not reflected in the\r\n // clientHeight, so the zoom factor would seem to change when the UI disappears (even though in reality, it\r\n // doesn't). We have to use the width, irrespective of orientation.\r\n\r\n return getPinchZoomFactor( _window );\r\n };\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n $.scrollbarWidth = browserScrollbarWidth;\r\n\r\n\r\n /**\r\n * Returns the window width or height. Does the actual work of $.windowWidth() and $.windowHeight().\r\n *\r\n * Handles minimal UI in iOS properly. Returns the size of either the visual viewport (default) or the layout\r\n * viewport.\r\n *\r\n * Precision:\r\n *\r\n * - The maximum rounding error for the visual viewport is +/- 1px.\r\n * - Layout viewport width is precise.\r\n * - Layout viewport height would potentially be prone to larger rounding errors (though in practice they rarely\r\n * seem to exceed +/- 2px). Additional logic is employed to detect and correct these errors. As a result, the\r\n * layout viewport height is precise as well.\r\n *\r\n * @param {string} dimension must be \"Width\" or \"Height\" (upper case!)\r\n * @param {WindowQueryConfig} config\r\n * @returns {number}\r\n */\r\n function getWindowSize ( dimension, config ) {\r\n var ddeClientHeight, visualSize, zoomFactor, snapToKnownHeight, lBound, uBound,\r\n _window = config.window,\r\n\r\n scrollbarsConsumeSpace = browserScrollbarWidth() !== 0,\r\n getLayoutViewportWidth = config.useLayoutViewport && dimension === \"Width\",\r\n\r\n useClientSize = scrollbarsConsumeSpace || !supportsWindowInnerWidth() || getLayoutViewportWidth,\r\n size = useClientSize ? _window.document.documentElement[ \"client\" + dimension ] : getWindowInnerSize( dimension, _window );\r\n\r\n if ( config.useLayoutViewport && ! useClientSize ) {\r\n\r\n // Looking for the layout viewport height on mobile. Calculate it from window.innerHeight and the zoom\r\n // factor, so as to capture the real height when the browser is in minimal UI on iOS.\r\n //\r\n // NB The layout viewport has a size in full CSS pixels (unaffected by zooming, hence no sub pixels).\r\n\r\n visualSize = size;\r\n zoomFactor = getPinchZoomFactor( _window, { asRange: true } );\r\n\r\n size = Math.round( visualSize * zoomFactor.calculated );\r\n\r\n // Fix rounding errors, caused by the visual height ignoring sub-pixel fractions. If we know we are near a\r\n // known layout viewport height, use that.\r\n if ( !supportsSubpixelAccuracy() ) {\r\n\r\n ddeClientHeight = _window.document.documentElement.clientHeight;\r\n\r\n // In Android, the height we get from ddE.clientHeight and the one calculated from window.innerHeight\r\n // should be the same, except for rounding errors in the calculation. So basically, we could just set\r\n // any calculated value to the clientHeight, no matter how large the difference is. (That is, if we even\r\n // end up here - in some versions of Chrome on Android, for instance, we have sub-pixel accuracy.)\r\n //\r\n // Not so in iOS. In minimal UI, the real layout viewport may be larger than the one reported by\r\n // clientHeight, by about 60px. So we need to impose reasonable limits on what is considered to be near\r\n // the clientHeight.\r\n //\r\n // - If the calculated value is within 3px of the clientHeight, we consider it to be a clear case of a\r\n // rounding error.\r\n // - Alternatively, the clientHeight must be between the theoretical maximum and minimum values of the\r\n // computation, assuming maximum rounding errors at every stage.\r\n // - If we use that range, its upper bound is capped at 30px above the clientHeight - keeping a safe\r\n // distance from current minimal UI heights, or possible future ones.\r\n\r\n lBound = ( visualSize - 1 ) * zoomFactor.min;\r\n uBound = ( visualSize + 1 ) * zoomFactor.max;\r\n\r\n snapToKnownHeight = ( size <= ddeClientHeight + 3 && size >= ddeClientHeight - 3 ) ||\r\n ( lBound <= ddeClientHeight && uBound >= ddeClientHeight && uBound < ddeClientHeight + 30 );\r\n\r\n if ( snapToKnownHeight ) size = ddeClientHeight;\r\n\r\n }\r\n }\r\n\r\n return size;\r\n }\r\n\r\n /**\r\n * Calculates the zoom factor for pinch zooming on mobile. A factor > 1 means that the page is zoomed in (content\r\n * enlarged).\r\n *\r\n * The zoom factor returned here measures the size of the visual viewport with respect to the size of the layout\r\n * viewport. Note that browsers usually calculate their zoom level with respect to the ideal viewport, not the\r\n * layout viewport (see Peter-Paul Koch, The Mobile Web Handbook, Chapter 3: Viewports, Section \"Minimum and Maximum\r\n * Zoom\").\r\n *\r\n * Ignores page zoom on the desktop (returning a zoom factor of 1). For the distinction between pinch and page zoom,\r\n * again see Chapter 3 in PPK's book.\r\n *\r\n * @param {Window} [_window=window]\r\n * @param {Object} [options]\r\n * @param {boolean} [options.asRange=false]\r\n * @returns {number|ZoomAccuracyRange}\r\n */\r\n function getPinchZoomFactor ( _window, options ) {\r\n var ddeClientWidth, windowInnerWidth,\r\n asRange = options && options.asRange,\r\n factors = {\r\n calculated: 1,\r\n min: 1,\r\n max: 1\r\n },\r\n skip = browserScrollbarWidth() !== 0 || !supportsWindowInnerWidth();\r\n\r\n if ( !skip ) {\r\n\r\n _window || ( _window = window );\r\n ddeClientWidth = _window.document.documentElement.clientWidth;\r\n windowInnerWidth = getWindowInnerWidth( _window );\r\n\r\n // Calculate the zoom factor, assuming window.innerWidth is precise (no rounding errors).\r\n factors.calculated = ddeClientWidth / windowInnerWidth;\r\n\r\n // If requested, determine the minimum and maximum value of the zoom factor in the presence of rounding errors.\r\n if ( asRange ) {\r\n if ( supportsSubpixelAccuracy() ) {\r\n // No need to take rounding errors into account\r\n factors.min = factors.max = factors.calculated;\r\n } else {\r\n factors.min = ddeClientWidth / ( windowInnerWidth + 1 );\r\n factors.max = ddeClientWidth / ( windowInnerWidth - 1 );\r\n }\r\n }\r\n\r\n }\r\n\r\n return asRange ? factors : factors.calculated;\r\n }\r\n\r\n /**\r\n * Handles the argument juggling for $.windowWidth() and $.windowHeight(). Extracts the window and viewport settings\r\n * from the arguments, applying the defaults (use global window, use visual viewport) where necessary.\r\n *\r\n * Examines the first two arguments. The window and the viewport setting can appear in either position,\r\n * interchangeably. The viewport setting can be passed in as a string, or as part of an options hash,\r\n * `{ viewport: ... }`.\r\n *\r\n * Recognized viewport names are \"visual\" and \"layout\" (case-insensitive).\r\n *\r\n * @param {Array|Arguments} args\r\n * @returns {WindowQueryConfig}\r\n */\r\n function getWindowQueryConfig( args ) {\r\n var isWindowArg0, isOptionArg0, isOptionArg1,\r\n\r\n // Defaults\r\n _window = window,\r\n _useVisualViewport = true;\r\n\r\n if ( args && args.length ) {\r\n\r\n // Coerce to a real array\r\n args = Array.prototype.slice.call( args );\r\n\r\n // Examine the first argument. Cast strings to an options hash with a `viewport` property.\r\n isWindowArg0 = isWindow( args[0] );\r\n if( !isWindowArg0 ) args[0] = castStringToViewportOption( args[0] );\r\n isOptionArg0 = !isWindowArg0 && args[0];\r\n\r\n // Examine the second argument. Again, cast strings to an options hash with a `viewport` property.\r\n if ( !isOptionArg0 ) args[1] = castStringToViewportOption( args[1] );\r\n isOptionArg1 = !isOptionArg0 && args[1];\r\n\r\n // Extract window and viewport option, if available.\r\n if ( isWindowArg0 ) {\r\n\r\n _window = args[0];\r\n if( isOptionArg1 && args[1].viewport ) _useVisualViewport = isVisualViewport( args[1].viewport );\r\n\r\n } else if ( isOptionArg0 ) {\r\n\r\n if( args[0].viewport ) _useVisualViewport = isVisualViewport( args[0].viewport );\r\n if ( isWindow( args[1] ) ) _window = args[1];\r\n\r\n } else if ( !args[0] && args[1] ) {\r\n\r\n // First argument was falsy, e.g. undefined, null. Ignore it. But process the second, non-falsy argument.\r\n if( isOptionArg1 && args[1].viewport ) {\r\n _useVisualViewport = isVisualViewport( args[1].viewport );\r\n } else if ( isWindow( args[1] ) ) {\r\n _window = args[1];\r\n }\r\n\r\n }\r\n }\r\n\r\n return {\r\n window: _window,\r\n useVisualViewport: _useVisualViewport,\r\n useLayoutViewport: !_useVisualViewport\r\n };\r\n }\r\n\r\n /**\r\n * Checks if the argument is the name of the visual viewport. The check is case-insensitive.\r\n *\r\n * Expects a string. Tolerates falsy values, returning false then (argument is not naming the visual viewport).\r\n * Throws an error for everything else. Also throws an error if the viewport name is a string but not recognized\r\n * (typo alert).\r\n *\r\n * Helper for getWindowQueryConfig().\r\n *\r\n * @param {string} [name] strings \"visual\", \"layout\" (case-insensitive)\r\n * @returns {boolean}\r\n */\r\n function isVisualViewport ( name ) {\r\n var viewport = isString( name ) && name.toLowerCase();\r\n\r\n if ( name && !viewport ) throw new Error( \"Invalid viewport option: \" + name );\r\n if ( viewport && viewport !== \"visual\" && viewport !== \"layout\" ) throw new Error( \"Invalid viewport name: \" + name );\r\n\r\n return viewport === \"visual\";\r\n }\r\n\r\n /**\r\n * Examines a value and casts a string to a hash with a `viewport` property (the string being its value). If the\r\n * value is not a string, or if the string is empty, it is returned as-is. Helper for getWindowQueryConfig().\r\n *\r\n * @param {*} arg\r\n * @returns {*}\r\n */\r\n function castStringToViewportOption ( arg ) {\r\n return ( isString( arg ) && arg !== \"\" ) ? { viewport: arg } : arg;\r\n }\r\n\r\n /**\r\n * Checks if the browser supports window.innerWidth and window.innerHeight.\r\n *\r\n * The check is run on demand, rather than up front while loading the component, because the window properties can\r\n * behave strangely in the early stages of opening a window. The component might be loaded in the document head,\r\n * which could potentially be early enough to run into these oddities. So we wait until the first call.\r\n *\r\n * IE 8 does not support window.innerWidth and .innerHeight. FF has a bug which as only been fixed in FF25 (released\r\n * 29 Oct 2013). It manifests itself in a fictional return value of 10 for these properties. See\r\n *\r\n * - https://developer.mozilla.org/en-US/docs/Web/API/Window.innerWidth\r\n * - https://developer.mozilla.org/en-US/docs/Web/API/Window.innerHeight\r\n * - https://bugzilla.mozilla.org/show_bug.cgi?id=641188\r\n *\r\n * @returns {boolean}\r\n */\r\n function supportsWindowInnerWidth () {\r\n if ( _supportsWindowInnerWidth === undefined ) _supportsWindowInnerWidth = getWindowInnerWidth() > 10;\r\n return _supportsWindowInnerWidth;\r\n }\r\n\r\n /**\r\n * Does the actual work of $.scrollbarWidth. Protected from external modification. See $.scrollbarWidth for details.\r\n *\r\n * Adapted from Ben Alman's scrollbarWidth plugin. See\r\n * - http://benalman.com/projects/jquery-misc-plugins/#scrollbarwidth\r\n * - http://jsbin.com/zeliy/1\r\n *\r\n * @returns {number}\r\n */\r\n function browserScrollbarWidth () {\r\n var testEl;\r\n\r\n if ( _scrollbarWidth === undefined ) {\r\n\r\n testEl = document.createElement( \"div\" );\r\n testEl.style.cssText = \"width: 100px; height: 100px; overflow: scroll; position: absolute; top: -500px; left: -500px; margin: 0px; padding: 0px; border: none;\";\r\n\r\n document.body.appendChild( testEl );\r\n _scrollbarWidth = testEl.offsetWidth - testEl.clientWidth;\r\n document.body.removeChild( testEl );\r\n\r\n }\r\n\r\n return _scrollbarWidth;\r\n }\r\n\r\n /**\r\n * Detects which element to use for a document size query (body or documentElement).\r\n *\r\n * Sandbox\r\n * -------\r\n *\r\n * The detection is sandboxed in an iframe element created for the purpose. If the iframe window can't be\r\n * accessed because of some obscure policy restriction or browser bug, the main window and document is used\r\n * as a fallback.\r\n *\r\n * The test is designed to minimize the visual and rendering impact in the test window, in case the fallback\r\n * should ever be used.\r\n *\r\n * Test method\r\n * -----------\r\n *\r\n * We can't test directly which call to use (at least not with an even worse amount of intervention than is\r\n * already the case, which matters if the iframe is not accessible). But we can work by exclusion.\r\n *\r\n * In Chrome (desktop and mobile), Safari (also iOS), and Opera, body.scrollWidth returns the true document\r\n * width. In Firefox and IE, body.scrollWidth responds to the body content size instead. In those browsers,\r\n * true document width is returned by document.documentElement.scrollWidth.\r\n *\r\n * So we test the behaviour of body.scrollWidth by manipulating the body size, while keeping the document size\r\n * constant.\r\n *\r\n * - We prepare for the test by making sure the body does not display its overflow.\r\n * - Then we inject a small test element into the body and give it a relative position far outside the viewport.\r\n *\r\n * The body size is expanded, but the document size remains unaffected because the body hides the overflowing\r\n * test element (either outright, or by putting it in a hidden part of the scroll pane). Then we check if\r\n * body.scrollWidth has responded to the change. From that, we infer the right element to use for a document\r\n * width query.\r\n *\r\n * The function does not return anything. It sets the elementNameForDocSizeQuery in the closure instead.\r\n */\r\n function testDocumentScroll () {\r\n\r\n var initialDocumentState, _testEl, initialScrollWidth, responds,\r\n\r\n iframe = createTestIframe(),\r\n _document = iframe && iframe.contentDocument || document,\r\n _body = _document.body,\r\n inIframe = _document !== document;\r\n\r\n // Create a test element which will be used to to expand the body content way to the right.\r\n _testEl = _document.createElement( \"div\" );\r\n _testEl.style.cssText = \"width: 1px; height: 1px; position: relative; top: 0px; left: 32000px;\";\r\n\r\n // Make sure that the body (but not the window) hides its overflow. Only applies if the iframe is not\r\n // accessible. The iframe document already contains the required styles.\r\n if ( ! inIframe ) initialDocumentState = prepareGlobalDocument();\r\n\r\n // Inject the test element, then test if the body.scrollWidth property responds\r\n initialScrollWidth = _body.scrollWidth;\r\n _body.appendChild( _testEl );\r\n responds = initialScrollWidth !== _body.scrollWidth;\r\n _body.removeChild( _testEl );\r\n\r\n // Restore the overflow settings for window and body\r\n if ( ! inIframe ) restoreGlobalDocument( initialDocumentState );\r\n\r\n // If body.scrollWidth responded, it reacts to body content size, not document size. Default to\r\n // ddE.scrollWidth. If it did not react, however, it is linked to the (unchanged) document size.\r\n elementNameForDocSizeQuery = responds ? \"documentElement\" : \"body\";\r\n\r\n if ( iframe ) document.body.removeChild( iframe );\r\n\r\n }\r\n\r\n /**\r\n * Creates an iframe document with an HTML5 doctype and UTF-8 encoding and positions it off screen. Window size\r\n * is 500px x 500px. Body and window (document element) are set to overflow: hidden.\r\n *\r\n * In case the content document of the iframe can't be accessed for some reason, the function returns undefined.\r\n * This is unlikely to ever happen, though.\r\n *\r\n * @returns {HTMLIFrameElement|undefined}\r\n */\r\n function createTestIframe () {\r\n var iframe = document.createElement( \"iframe\" ),\r\n body = document.body;\r\n\r\n iframe.style.cssText = \"position: absolute; top: -600px; left: -600px; width: 500px; height: 500px; margin: 0px; padding: 0px; border: none; display: block;\";\r\n iframe.frameborder = \"0\";\r\n\r\n body.appendChild( iframe );\r\n iframe.src = 'about:blank';\r\n\r\n if ( !iframe.contentDocument ) return;\r\n\r\n iframe.contentDocument.write( '' );\r\n\r\n return iframe;\r\n }\r\n\r\n /**\r\n * Makes sure the body (but not the window) hides its overflow. Works with the global document, returns the initial\r\n * state before manipulation (including properties indicating what has been modified).\r\n *\r\n * Used only if iframe creation or access has failed for some reason.\r\n */\r\n function prepareGlobalDocument () {\r\n var ddEStyle, bodyStyle,\r\n\r\n ddE = document.documentElement,\r\n body = document.body,\r\n\r\n ddEComputedStyles = useGetComputedStyle ? window.getComputedStyle( ddE, null ) : ddE.currentStyle,\r\n bodyComputedStyles = useGetComputedStyle ? window.getComputedStyle( body, null ) : body.currentStyle,\r\n\r\n ddEOverflowX = ( ddEComputedStyles.overflowX || ddEComputedStyles.overflow || \"visible\" ).toLowerCase(),\r\n bodyOverflowX = ( bodyComputedStyles.overflowX || bodyComputedStyles.overflow || \"visible\" ).toLowerCase(),\r\n\r\n modifyBody = bodyOverflowX !== \"hidden\",\r\n modifyDocumentElement = ddEOverflowX === \"visible\",\r\n\r\n initialState = {\r\n documentElement: {\r\n modified: modifyDocumentElement\r\n },\r\n body: {\r\n modified: modifyBody\r\n }\r\n };\r\n\r\n if ( modifyDocumentElement ) {\r\n ddEStyle = ddE.style;\r\n initialState.documentElement.styleOverflowX = ddEStyle.overflowX;\r\n ddEStyle.overflowX = \"auto\";\r\n }\r\n\r\n if ( modifyBody ) {\r\n bodyStyle = body.style;\r\n initialState.body.styleOverflowX = bodyStyle.overflowX;\r\n bodyStyle.overflowX = \"hidden\";\r\n }\r\n\r\n return initialState;\r\n\r\n }\r\n\r\n /**\r\n * Restores the body and documentElement styles to their initial state, which is passed in as an argument. Works\r\n * with the global document.\r\n *\r\n * Used only if iframe creation or access has failed for some reason.\r\n *\r\n * @param {Object} previousState the initial state, as returned by prepareGlobalDocument()\r\n */\r\n function restoreGlobalDocument ( previousState ) {\r\n\r\n if ( previousState.documentElement.modified ) document.documentElement.style.overflowX = previousState.documentElement.styleOverflowX;\r\n if ( previousState.body.modified ) document.body.style.overflowX = previousState.body.styleOverflowX;\r\n\r\n }\r\n\r\n /**\r\n * Returns a best guess for the window width or height. Used as a fallback for unsupported browsers which are too\r\n * broken to even run the feature test.\r\n *\r\n * The conventional jQuery method of guessing the document size is used here: every conceivable value is queried and\r\n * the largest one is picked.\r\n *\r\n * @param {string} dimension accepted values are \"Width\" or \"Height\" (capitalized first letter!)\r\n * @param {Document} [_document]\r\n */\r\n function guessDocumentSize( dimension, _document ) {\r\n var ddE = _document.documentElement;\r\n\r\n return Math.max(\r\n ddE.body[ \"scroll\" + dimension ], _document[ \"scroll\" + dimension ],\r\n ddE.body[ \"offset\" + dimension ], _document[ \"offset\" + dimension ],\r\n _document[ \"client\" + dimension ]\r\n );\r\n }\r\n\r\n /**\r\n * Returns window.innerWidth.\r\n *\r\n * Along the way, the return value is examined to see if the browser supports sub-pixel accuracy (floating-point\r\n * values).\r\n *\r\n * @param {Window} [_window=window]\r\n * @returns {number}\r\n */\r\n function getWindowInnerWidth ( _window ) {\r\n return getWindowInnerSize( \"Width\", _window );\r\n }\r\n\r\n /**\r\n * Returns window.innerHeight.\r\n *\r\n * Along the way, the return value is examined to see if the browser supports sub-pixel accuracy (floating-point\r\n * values).\r\n *\r\n * @param {Window} [_window=window]\r\n * @returns {number}\r\n */\r\n function getWindowInnerHeight ( _window ) {\r\n return getWindowInnerSize( \"Height\", _window );\r\n }\r\n\r\n /**\r\n * Returns window.innerWidth or window.innerHeight, depending on the dimension argument.\r\n *\r\n * Along the way, the return value is examined to see if the browser supports sub-pixel accuracy (floating-point\r\n * values).\r\n *\r\n * @param {string} dimension must be \"Width\" or \"Height\" (upper case!)\r\n * @param {Window} [_window=window]\r\n * @returns {number}\r\n */\r\n function getWindowInnerSize ( dimension, _window ) {\r\n var size = ( _window || window )[ \"inner\" + dimension];\r\n\r\n // Check for fractions. Exclude undefined return values in browsers which don't support window.innerWidth/Height.\r\n if ( size ) checkForFractions( size );\r\n return size;\r\n }\r\n\r\n /**\r\n * Accepts an observed value of window.innerWidth or window.innerHeight and examines it for fractional values.\r\n * Caches the finding if there is one. Helper for getWindowInnerWidth() and friends.\r\n *\r\n * See supportsSubpixelAccuracy() for more.\r\n *\r\n * @param {number} sizeMeasurement\r\n */\r\n function checkForFractions ( sizeMeasurement ) {\r\n\r\n // When checking the cached value, we can't accept false as a definitive answer. We have to continue checking\r\n // unless the cached value is `true`.\r\n //\r\n // See supportsSubpixelAccuracy().\r\n if ( !_supportsSubpixelAccuracy && isFloat( sizeMeasurement ) ) _supportsSubpixelAccuracy = true;\r\n\r\n }\r\n\r\n /**\r\n * Returns whether or not the browser supports sub-pixel accuracy (floating-point values) for window.innerWidth and\r\n * window.innerHeight - as far as we know yet.\r\n *\r\n * The browser behaviour can't be tested directly, and must be figured out by continuous observation. We have to\r\n * monitor the return values of window.innerWidth/Height for fractions. That is done with getWindowInnerWidth etc.\r\n * As soon as we find a fraction, we know that the browser supports floating-point accuracy.\r\n *\r\n * However, we can never be sure of the opposite. If we haven't encountered a fraction yet, it could simply mean\r\n * that we are at 100% zoom, and integers have indeed been the correct return value so far.\r\n *\r\n * So when the method here answers with true, it is definitive. When it returns false, that just means \"maybe not,\r\n * but we don't know\". And the the return value might flip to true in a future query.\r\n *\r\n * @returns {boolean}\r\n */\r\n function supportsSubpixelAccuracy () {\r\n return !!_supportsSubpixelAccuracy;\r\n }\r\n\r\n function isWindow ( value ) {\r\n // Identical to jQuery.isWindow()\r\n return value != null && value.window == value; // jshint ignore:line\r\n }\r\n\r\n function isString ( value ) {\r\n // Done as in the Lodash compatibility build\r\n return typeof value === 'string' || value && typeof value === 'object' && Object.prototype.toString.call(value) === '[object String]' || false;\r\n }\r\n\r\n /**\r\n * Returns whether or not a value is of type number. Also rejects NaN as a number.\r\n *\r\n * NB This is not the same as $.isNumeric because $.isNumeric( \"3\" ) is true while isNumber( \"3\" ) is false.\r\n *\r\n * @param {*} value\r\n * @returns {boolean}\r\n */\r\n function isNumber ( value ) {\r\n // Done as in the Lodash compatibility build, but rejecting NaN as a number.\r\n var isNumeric = typeof value === 'number' || value && typeof value === 'object' && Object.prototype.toString.call( value ) === '[object Number]' || false;\r\n\r\n // Reject NaN before returning\r\n return isNumeric && value === +value;\r\n }\r\n\r\n /**\r\n * Returns whether or not a number is a float, ie has decimals.\r\n *\r\n * Requires the argument to be a number. If unsure, guard against false detections with\r\n * `isNumber( value ) && isFloat ( value )`.\r\n *\r\n * For the technique, see http://stackoverflow.com/a/3885844/508355\r\n *\r\n * @param {number} num\r\n * @returns {boolean}\r\n */\r\n function isFloat ( num ) {\r\n return num === +num && num !== ( num | 0 ); // jshint ignore:line\r\n }\r\n\r\n /**\r\n * Returns the IE version, or false if the browser is not IE.\r\n *\r\n * The result is determined by browser sniffing, rather than a test tailored to the use case. The function must only\r\n * be called as a last resort, for scenarios where there is no alternative to browser sniffing.\r\n *\r\n * These scenarios include:\r\n *\r\n * - Preventing IE6 and IE7 from crashing\r\n * - Preventing IE9 from blocking or delaying the load event\r\n *\r\n * The test follows the MSDN recommendation at https://msdn.microsoft.com/en-us/library/ms537509(v=vs.85).aspx#parsingua\r\n * The result is cached.\r\n *\r\n * @returns {number|boolean}\r\n */\r\n function getIEVersion () {\r\n var userAgent, userAgentTestRx;\r\n\r\n if ( ieVersion === undefined ) {\r\n\r\n ieVersion = false;\r\n userAgent = navigator && navigator.userAgent;\r\n\r\n if ( navigator && navigator.appName === \"Microsoft Internet Explorer\" && userAgent ) {\r\n userAgentTestRx = new RegExp( \"MSIE ([0-9]{1,}[\\.0-9]{0,})\" ); // jshint ignore:line\r\n if ( userAgentTestRx.exec( userAgent ) != null ) ieVersion = parseFloat( RegExp.$1 );\r\n }\r\n\r\n }\r\n\r\n return ieVersion;\r\n }\r\n\r\n /**\r\n * Checks if we are dealing with a truly ancient version of IE (< IE8).\r\n *\r\n * This is done by browser sniffing, rather than a test tailored to the use case. Use it only if there is no\r\n * alternative.\r\n *\r\n * @returns {boolean}\r\n */\r\n function isAncientIE () {\r\n var ieVersion = getIEVersion();\r\n return ieVersion && ieVersion < 8;\r\n }\r\n\r\n /**\r\n * Checks if the browser is IE9.\r\n *\r\n * This is done by browser sniffing, rather than a test tailored to the use case. Use it only if there is no\r\n * alternative.\r\n *\r\n * @returns {boolean}\r\n */\r\n function isIE9 () {\r\n return getIEVersion() === 9;\r\n }\r\n\r\n\r\n // Let's prime $.documentWidth(), $.documentHeight() and $.scrollbarWidth() immediately after the DOM is ready. It\r\n // is best to do it up front because the test touches the DOM, so let's get it over with before people set up\r\n // handlers for mutation events and such.\r\n //\r\n // This step has to be skipped for the following browsers:\r\n //\r\n // - ancient versions of IE (IE6, IE7).\r\n // IE6 and IE7 can't handle the feature tests on DOM ready - they crash right away. Later on, the tests are ok.\r\n //\r\n // - IE9.\r\n // If the feature tests were run on DOM ready, the window load event would become unreliable. The event might not\r\n // fire until the user moves the mouse over the document. This bug is rare and not triggered by jQuery.documentSize\r\n // alone; third-party code likely plays a role. The exact circumstances are not clear - see issue #3.\r\n //\r\n // For these browsers, we don't run the feature tests preemptively. Instead, we do it on demand, when the first\r\n // document size query is made.\r\n if ( typeof $ === \"function\" && !isAncientIE() && !isIE9() ) {\r\n\r\n // Try-catch acts as a safety net for unsupported, broken browsers\r\n try {\r\n\r\n $( function () {\r\n if ( elementNameForDocSizeQuery === undefined ) testDocumentScroll();\r\n browserScrollbarWidth();\r\n } );\r\n\r\n } catch ( e ) {}\r\n\r\n }\r\n\r\n\r\n /**\r\n * Custom types.\r\n *\r\n * For easier documentation and type inference.\r\n */\r\n\r\n /**\r\n * @name ZoomAccuracyRange\r\n * @type {Object}\r\n *\r\n * @property {number} calculated\r\n * @property {number} min\r\n * @property {number} max\r\n */\r\n\r\n /**\r\n * @name WindowQueryConfig\r\n * @type {Object}\r\n *\r\n * @property {Window} window\r\n * @property {boolean} useVisualViewport\r\n * @property {boolean} useLayoutViewport\r\n */\r\n\r\n }(\r\n typeof jQuery !== \"undefined\" ? jQuery :\r\n typeof Zepto !== \"undefined\" ? Zepto :\r\n $\r\n ));\r\n return jQuery.documentSize;\r\n\r\n} ));\r\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\")))\n\n//# sourceURL=webpack:///./src/public/js/plugins/jquery.documentsize.js?"); - -/***/ }), - -/***/ "./src/public/js/plugins/jquery.isinview.js": -/*!**************************************************!*\ - !*** ./src/public/js/plugins/jquery.isinview.js ***! - \**************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function($) {// jQuery.isInView, v1.0.3\r\n// Copyright (c)2015 Michael Heim, Zeilenwechsel.de\r\n// Distributed under MIT license\r\n// http://github.com/hashchange/jquery.isinview\r\n\r\n;( function ( root, factory ) {\r\n \"use strict\";\r\n\r\n if ( true ) {\r\n\r\n module.exports = factory(\r\n __webpack_require__( /*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\" ),\r\n __webpack_require__( /*! jquery_docsize */ \"./src/public/js/plugins/jquery.documentsize.js\" )\r\n );\r\n\r\n } else {}\r\n}( this, function ( jQuery ) {\r\n \"use strict\";\r\n\r\n ;( function( $ ) {\r\n \"use strict\";\r\n\r\n var _useGetComputedStyle = !! window.getComputedStyle, // IE8, my dear, this is for you\r\n _isIOS,\r\n root = window,\r\n $root = $( window );\r\n\r\n\r\n /**\r\n * API\r\n */\r\n\r\n /**\r\n * @param {string} [axis=\"both\"] values \"horizontal\", \"vertical\", \"both\"\r\n * @returns {boolean|Object|undefined}\r\n */\r\n $.fn.hasScrollbar = function ( axis ) {\r\n return hasScrollbar( this, axis );\r\n };\r\n\r\n /**\r\n * @param {string} [axis=\"both\"] values \"horizontal\", \"vertical\", \"both\"\r\n * @returns {number|Object|undefined}\r\n */\r\n $.fn.scrollbarWidth = function ( axis ) {\r\n return effectiveScrollbarWith( this, axis );\r\n };\r\n\r\n /**\r\n * @returns {Window|undefined}\r\n */\r\n $.fn.ownerWindow = function () {\r\n return ownerWindow( this );\r\n };\r\n\r\n /**\r\n * @param {Window|Document|HTMLElement|jQuery|string} [container=window]\r\n * @param {Object} [opts]\r\n * @param {boolean} [opts.partially=false]\r\n * @param {boolean} [opts.excludeHidden=false]\r\n * @param {string} [opts.direction=\"both\"]\r\n * @param {string} [opts.box=\"border-box\"] alternatively, \"content-box\"\r\n * @param {number|string} [opts.tolerance=0] number only (px), or with unit (\"px\" or \"%\" only)\r\n *\r\n * @returns {jQuery}\r\n */\r\n $.fn.inView = function ( container, opts ) {\r\n return inView( this, container, opts );\r\n };\r\n\r\n /**\r\n * @param {Object} [opts]\r\n * @param {boolean} [opts.partially=false]\r\n * @param {boolean} [opts.excludeHidden=false]\r\n * @param {string} [opts.direction=\"both\"]\r\n * @param {string} [opts.box=\"border-box\"] alternatively, \"content-box\"\r\n * @param {number|string} [opts.tolerance=0] number only (px), or with unit (\"px\" or \"%\" only)\r\n *\r\n * @returns {jQuery}\r\n */\r\n $.fn.inViewport = function ( opts ) {\r\n return inView( this, ownerWindow( this ), opts );\r\n };\r\n\r\n /**\r\n * @param {Window|Document|HTMLElement|jQuery|string} [container=window]\r\n * @param {Object} [opts]\r\n * @param {boolean} [opts.partially=false]\r\n * @param {boolean} [opts.excludeHidden=false]\r\n * @param {string} [opts.direction=\"both\"]\r\n * @param {string} [opts.box=\"border-box\"] alternatively, \"content-box\"\r\n * @param {number|string} [opts.tolerance=0] number only (px), or with unit (\"px\" or \"%\" only)\r\n *\r\n * @returns {boolean}\r\n */\r\n $.fn.isInView = function ( container, opts ) {\r\n return isInView( this, container, opts );\r\n };\r\n\r\n /**\r\n * @param {Object} [opts]\r\n * @param {boolean} [opts.partially=false]\r\n * @param {boolean} [opts.excludeHidden=false]\r\n * @param {string} [opts.direction=\"both\"]\r\n * @param {string} [opts.box=\"border-box\"] alternatively, \"content-box\"\r\n * @param {number|string} [opts.tolerance=0] number only (px), or with unit (\"px\" or \"%\" only)\r\n *\r\n * @returns {boolean}\r\n */\r\n $.fn.isInViewport = function ( opts ) {\r\n return isInView( this, ownerWindow( this ), opts );\r\n };\r\n\r\n $.expr.match.inviewport = /^(?:inVieport)$/i;\r\n\r\n $.expr.setFilters.inviewport = $.expr.createPseudo( function () {\r\n return $.expr.createPseudo( function ( elems, matches ) {\r\n var i, config,\r\n length = elems.length;\r\n\r\n if ( length ) {\r\n\r\n config = _prepareConfig( $( elems ) );\r\n checkHierarchy( elems[0], config.container );\r\n\r\n for ( i = 0; i < length; i++ ) {\r\n matches[i] = _isInView( elems[i], config ) ? elems[i] : undefined;\r\n }\r\n }\r\n\r\n } );\r\n } );\r\n\r\n\r\n /**\r\n * Internals\r\n */\r\n\r\n /**\r\n * Does the actual work of $.fn.hasScrollbar. Protected from external modification. See $.fn.hasScrollbar for\r\n * details.\r\n *\r\n * @param {jQuery} $elem\r\n * @param {string} [axis=\"both\"] values \"horizontal\", \"vertical\", \"both\"\r\n * @returns {boolean|Object|undefined}\r\n */\r\n function hasScrollbar ( $elem, axis ) {\r\n\r\n var $body, elemProps, bodyProps, innerWidth, innerHeight, scrollWidth, scrollHeight,\r\n query = { target: {} }, result = {}, context = {},\r\n elem = $elem[0];\r\n\r\n $elem = $elem.eq( 0 );\r\n axis || ( axis = \"both\" );\r\n\r\n query.getBoth = axis === \"both\";\r\n query.getHorizontal = axis === \"horizontal\" || query.getBoth;\r\n query.getVertical = axis === \"vertical\" || query.getBoth;\r\n\r\n if ( axis !== \"horizontal\" && axis !== \"vertical\" && axis !== \"both\" ) throw new Error( \"Invalid parameter value: axis = \" + axis );\r\n if ( ! $elem.length ) return;\r\n\r\n // Transformations:\r\n // - If called on a window, we need window, document, documentElement and body, and discard the element\r\n // - If called on the document or document element, we treat it like a call on window (above)\r\n // - If called on the body, we need document, documentElement and the body itself (again, we discard the element\r\n // to avoid ambiguity)\r\n // - If called on an iframe element, we treat it like a window call, using the iframe content window\r\n query.target.isWindow = $.isWindow( elem );\r\n if ( query.target.isWindow ) {\r\n context.document = elem.document;\r\n } else if ( elem.nodeType === 9 ) {\r\n context.document = elem;\r\n query.target.isWindow = true;\r\n } else if ( elem === elem.ownerDocument.documentElement ) {\r\n context.document = elem.ownerDocument;\r\n query.target.isWindow = true;\r\n } else if ( elem.nodeType === 1 && elem.tagName.toLowerCase() === \"iframe\" ) {\r\n context.document = elem.contentDocument || elem.contentWindow.document;\r\n query.target.isWindow = true;\r\n } else if ( elem === elem.ownerDocument.body ) {\r\n context.document = elem.ownerDocument;\r\n query.target.isBody = true;\r\n }\r\n\r\n if ( query.target.isWindow || query.target.isBody ) {\r\n context.window = context.document.defaultView || context.document.parentWindow;\r\n context.$document = $( context.document );\r\n context.documentElement = context.document.documentElement;\r\n context.body = context.document.body;\r\n\r\n elem = $elem = undefined; // won't be needed; discard, to avoid ambiguity in the code below\r\n }\r\n\r\n if ( query.target.isWindow ) {\r\n\r\n result = _windowHasScrollbar( query, context );\r\n\r\n } else if ( query.target.isBody ) {\r\n\r\n // Checking for body scroll bars.\r\n //\r\n // body.clientWidth returns the width of the body, minus the scroll bars. We can simply compare it to the\r\n // full width, provided that the browser displays scroll bars which take up space.\r\n //\r\n // By implication, this check DOES NOT work for an effective body overflow of \"auto\" in browsers which\r\n // display scroll bars of width 0. (Affects iOS, other mobile browsers, and Safari on OS X when used without\r\n // an attached mouse.) There simply is no reliable, bullet-proof way to determine the width of the body\r\n // content, ie the true body scroll width, in those browsers.\r\n bodyProps = _getViewportOverflows( query, context ).body;\r\n\r\n $body = $( context.body );\r\n if ( query.getHorizontal ) result.horizontal = bodyProps.overflowScrollX || bodyProps.overflowAutoX && context.body.clientHeight < $body.height();\r\n if ( query.getVertical ) result.vertical = bodyProps.overflowScrollY || bodyProps.overflowAutoY && context.body.clientWidth < $body.width();\r\n\r\n } else {\r\n\r\n // Scroll bars on an ordinary HTML element\r\n //\r\n // If we deal with an ordinary element, we always need the overflow settings for both axes because the axes\r\n // interact (one scroll bar can cause another).\r\n elemProps = getCss( elem, [\"overflow\", \"overflowX\", \"overflowY\"], { toLowerCase: true } );\r\n elemProps = getAppliedOverflows( elemProps, true );\r\n\r\n scrollWidth = elem.scrollWidth;\r\n scrollHeight = elem.scrollHeight;\r\n\r\n result.horizontal = scrollWidth > 0 && ( elemProps.overflowScrollX || elemProps.overflowAutoX && ( innerWidth = $elem.innerWidth() ) < scrollWidth );\r\n result.vertical = scrollHeight > 0 && ( elemProps.overflowScrollY || elemProps.overflowAutoY && ( innerHeight = $elem.innerHeight() ) < scrollHeight );\r\n\r\n // Detect if the appearance of one scroll bar causes the other to appear, too.\r\n result.vertical = result.vertical ||\r\n result.horizontal && elemProps.overflowAutoY &&\r\n ( innerHeight !== undefined ? innerHeight : $elem.innerHeight() ) - $.scrollbarWidth() < scrollHeight;\r\n result.horizontal = result.horizontal ||\r\n result.vertical && elemProps.overflowAutoX &&\r\n ( innerWidth !== undefined ? innerWidth : $elem.innerWidth() ) - $.scrollbarWidth() < scrollWidth;\r\n\r\n }\r\n\r\n return query.getBoth ? result : query.getHorizontal ? result.horizontal : result.vertical;\r\n }\r\n\r\n /**\r\n * Does the actual work of $.fn.scrollbarWidth. Protected from external modification. See $.fn.scrollbarWidth for\r\n * details.\r\n *\r\n * @param {jQuery} $elem\r\n * @param {string} [axis=\"both\"] values \"horizontal\", \"vertical\", \"both\"\r\n * @returns {number|Object}\r\n */\r\n function effectiveScrollbarWith ( $elem, axis ) {\r\n\r\n var queryHorizontal, queryVertical, queryBoth, elemHasScrollbar, horizontal, vertical,\r\n globalWidth = $.scrollbarWidth();\r\n\r\n axis || ( axis = \"both\" );\r\n\r\n queryBoth = axis === \"both\";\r\n queryHorizontal = axis === \"horizontal\" || queryBoth;\r\n queryVertical = axis === \"vertical\" || queryBoth;\r\n\r\n if ( axis !== \"horizontal\" && axis !== \"vertical\" && axis !== \"both\" ) throw new Error( \"Invalid parameter value: axis = \" + axis );\r\n if ( ! $elem.length ) return;\r\n\r\n // Bail out early, without an $elem.hasScrollbar() query, if scroll bars don't take up any space.\r\n if ( globalWidth === 0 ) return queryBoth ? { horizontal: 0, vertical: 0 } : 0;\r\n\r\n elemHasScrollbar = queryBoth ? hasScrollbar( $elem ) : queryHorizontal ? { horizontal: hasScrollbar( $elem, \"horizontal\" ) } : { vertical: hasScrollbar( $elem, \"vertical\" ) };\r\n\r\n if ( queryHorizontal ) horizontal = elemHasScrollbar.horizontal ? globalWidth : 0;\r\n if ( queryVertical ) vertical = elemHasScrollbar.vertical ? globalWidth : 0;\r\n\r\n return queryBoth ? { horizontal: horizontal, vertical: vertical } : queryHorizontal ? horizontal : vertical;\r\n\r\n }\r\n\r\n /**\r\n * Does the actual work of $.fn.ownerWindow. Protected from external modification. See $.fn.ownerWindow for details.\r\n *\r\n * @param {jQuery} $elem\r\n * @returns {Window|undefined}\r\n */\r\n function ownerWindow ( $elem ) {\r\n var elem = $elem[0],\r\n ownerDocument = elem && ( elem.nodeType === 9 ? elem : elem.ownerDocument );\r\n\r\n return ownerDocument && ( ownerDocument.defaultView || ownerDocument.parentWindow ) || $.isWindow( elem ) && elem || undefined;\r\n }\r\n\r\n /**\r\n * Does the actual work of $.fn.inView. Protected from external modification. See $.fn.inView for details.\r\n *\r\n * @param {jQuery} $elems\r\n * @param {Window|Document|HTMLElement|jQuery|string} [container=window]\r\n * @param {Object} [opts]\r\n * @param {boolean} [opts.partially=false]\r\n * @param {boolean} [opts.excludeHidden=false]\r\n * @param {string} [opts.direction=\"both\"]\r\n * @param {string} [opts.box=\"border-box\"] alternatively, \"content-box\"\r\n * @param {number|string} [opts.tolerance=0] number only (px), or with unit (\"px\" or \"%\" only)\r\n *\r\n * @returns {jQuery}\r\n */\r\n function inView ( $elems, container, opts ) {\r\n\r\n var config,\r\n elemsInView = [];\r\n\r\n if ( ! $elems.length ) return $();\r\n\r\n config = _prepareConfig( $elems, container, opts );\r\n\r\n // Check if the elements are children of the container. For performance reasons, only the first element is\r\n // examined.\r\n checkHierarchy( $elems[0], config.container );\r\n\r\n $elems.each( function () {\r\n if ( _isInView( this, config ) ) elemsInView.push( this );\r\n } );\r\n\r\n return $( elemsInView );\r\n\r\n }\r\n\r\n /**\r\n * Does the actual work of $.fn.isInView. Protected from external modification. See $.fn.isInView for details.\r\n *\r\n * @param {jQuery} $elem\r\n * @param {Window|Document|HTMLElement|jQuery|string} [container=window]\r\n * @param {Object} [opts]\r\n * @param {boolean} [opts.partially=false]\r\n * @param {boolean} [opts.excludeHidden=false]\r\n * @param {string} [opts.direction=\"both\"]\r\n * @param {string} [opts.box=\"border-box\"] alternatively, \"content-box\"\r\n * @param {number|string} [opts.tolerance=0] number only (px), or with unit (\"px\" or \"%\" only)\r\n *\r\n * @returns {boolean}\r\n */\r\n function isInView ( $elem, container, opts ) {\r\n\r\n var config,\r\n elem = $elem[0];\r\n\r\n if ( ! $elem.length ) return false;\r\n\r\n config = _prepareConfig( $elem, container, opts );\r\n checkHierarchy( elem, config.container );\r\n\r\n return _isInView( elem, config );\r\n\r\n }\r\n\r\n /**\r\n * Prepares the configuration for a single element query. Returns the config object which is to be consumed by\r\n * _isInView().\r\n *\r\n * @param {jQuery} $elem single element, or set of elements\r\n * @param {Window|Document|HTMLElement|jQuery|string} [container=window]\r\n * @param {Object} [opts]\r\n * @param {boolean} [opts.partially=false]\r\n * @param {boolean} [opts.excludeHidden=false]\r\n * @param {string} [opts.direction=\"both\"]\r\n * @param {string} [opts.box=\"border-box\"] alternatively, \"content-box\"\r\n * @param {number|string} [opts.tolerance=0] number only (px), or with unit (\"px\" or \"%\" only)\r\n *\r\n * @returns {Object}\r\n */\r\n function _prepareConfig ( $elem, container, opts ) {\r\n\r\n var $container, direction,\r\n config = {};\r\n\r\n opts || ( opts = {} );\r\n\r\n container || ( container = ownerWindow( $elem ) );\r\n config.$container = $container = wrapContainer( container );\r\n config.container = container = $container[0];\r\n\r\n checkOptions( opts );\r\n\r\n direction = opts.direction || 'both';\r\n config.useVertical = direction === 'both' || direction === 'vertical';\r\n config.useHorizontal = direction === 'both' || direction === 'horizontal';\r\n\r\n config.partially = opts.partially;\r\n config.excludeHidden = opts.excludeHidden;\r\n config.borderBox = opts.box !== 'content-box';\r\n config.containerIsWindow = $.isWindow( container );\r\n\r\n if ( opts.tolerance !== undefined ) {\r\n config.toleranceType = ( isNumber( opts.tolerance ) || opts.tolerance.slice( -3 ) === \"px\" ) ? \"add\" : \"multiply\";\r\n config.tolerance = config.toleranceType === \"add\" ? parseFloat( opts.tolerance ) : parseFloat( opts.tolerance ) / 100 + 1;\r\n } else {\r\n config.tolerance = 0;\r\n config.toleranceType = \"add\";\r\n }\r\n\r\n // Create an object to cache DOM queries with regard to the viewport, for faster repeated access.\r\n config.cache = {};\r\n\r\n return config;\r\n }\r\n\r\n /**\r\n * Returns if an element is in view, with regard to a given configuration.\r\n *\r\n * The configuration is built with _prepareConfig().\r\n *\r\n * @param {HTMLElement} elem\r\n * @param {Object} config\r\n * @param {HTMLElement|Window} config.container\r\n * @param {jQuery} config.$container\r\n * @param {boolean} config.containerIsWindow\r\n * @param {Object} config.cache\r\n * @param {boolean} config.useHorizontal\r\n * @param {boolean} config.useVertical\r\n * @param {boolean} config.partially\r\n * @param {boolean} config.excludeHidden\r\n * @param {boolean} config.borderBox\r\n * @param {number} config.tolerance\r\n * @param {string} config.toleranceType\r\n *\r\n * @returns {boolean}\r\n */\r\n function _isInView ( elem, config ) {\r\n\r\n var containerWidth, containerHeight, hTolerance, vTolerance, rect,\r\n container = config.container,\r\n $container = config.$container,\r\n cache = config.cache,\r\n elemInView = true;\r\n\r\n if ( elem === container ) throw new Error( \"Invalid container: is the same as the element\" );\r\n\r\n // When hidden elements are ignored, we check if an element consumes space in the document. And we bail out\r\n // immediately if it doesn't.\r\n //\r\n // The test employed for this works in the vast majority of cases, but there is a limitation. We use offsetWidth\r\n // and offsetHeight, which considers the content (incl. borders) but ignores margins. Zero-size content with a\r\n // margin might actually consume space sometimes, but it won't be detected (see http://jsbin.com/tiwabo/3).\r\n //\r\n // That said, the definition of visibility and the actual test are the same as in jQuery :visible.\r\n if ( config.excludeHidden && !( elem.offsetWidth > 0 && elem.offsetHeight > 0 ) ) return false;\r\n\r\n if ( config.useHorizontal ) containerWidth = getNetContainerWidth( $container, config.containerIsWindow, cache );\r\n if ( config.useVertical ) containerHeight = getNetContainerHeight( $container, config.containerIsWindow, cache );\r\n\r\n // Convert tolerance to a px value (if given as a percentage)\r\n hTolerance = cache.hTolerance !== undefined ? cache.hTolerance : ( cache.hTolerance = config.toleranceType === \"add\" ? config.tolerance : containerWidth * config.tolerance );\r\n vTolerance = cache.vTolerance !== undefined ? cache.vTolerance : ( cache.vTolerance = config.toleranceType === \"add\" ? config.tolerance : containerHeight * config.tolerance );\r\n\r\n // We can safely use getBoundingClientRect without a fallback. Its core properties (top, left, bottom, right)\r\n // are supported on the desktop for ages (IE5+). On mobile, too: supported from Blackberry 6+ (2010), iOS 4\r\n // (2010, iPhone 3GS+), according to the jQuery source comment in $.fn.offset.\r\n //\r\n // In oldIE (up to IE8), the coordinates were 2px off in each dimension because the \"viewport\" began at (2,2) of\r\n // the window. Can be feature-tested by creating an absolutely positioned div at (0,0) and reading the rect\r\n // coordinates. Won't be fixed here because the quirk is too minor to justify the overhead, just for oldIE.\r\n //\r\n // (See http://stackoverflow.com/a/10231202/508355 and Zakas, Professional Javascript (2012), p. 406)\r\n\r\n rect = config.borderBox ? elem.getBoundingClientRect() : getContentRect( elem );\r\n if ( ! config.containerIsWindow ) rect = getRelativeRect( rect, $container, cache );\r\n\r\n if ( config.partially ) {\r\n if ( config.useVertical ) elemInView = rect.top < containerHeight + vTolerance && rect.bottom > -vTolerance;\r\n if ( config.useHorizontal ) elemInView = elemInView && rect.left < containerWidth + hTolerance && rect.right > -hTolerance;\r\n } else {\r\n if ( config.useVertical ) elemInView = rect.top >= -vTolerance && rect.top < containerHeight + vTolerance && rect.bottom > -vTolerance && rect.bottom <= containerHeight + vTolerance;\r\n if ( config.useHorizontal ) elemInView = elemInView && rect.left >= -hTolerance && rect.left < containerWidth + hTolerance && rect.right > -hTolerance && rect.right <= containerWidth + hTolerance;\r\n }\r\n\r\n return elemInView;\r\n\r\n }\r\n\r\n /**\r\n * Gets the TextRectangle coordinates relative to a container element.\r\n *\r\n * Do not call if the container is a window (redundant) or a document. Both calls would fail.\r\n */\r\n function getRelativeRect ( rect, $container, cache ) {\r\n var containerPaddingRectRoot;\r\n\r\n if ( cache && cache.containerPaddingRectRoot ) {\r\n\r\n containerPaddingRectRoot = cache.containerPaddingRectRoot;\r\n\r\n } else {\r\n // gBCR coordinates enclose padding, and leave out margin. That is perfect for scrolling because\r\n //\r\n // - padding scrolls (ie,o it is part of the scrollable area, and gBCR puts it inside)\r\n // - margin doesn't scroll (ie, it pushes the scrollable area to another position, and gBCR records that)\r\n //\r\n // Borders, however, don't scroll, so they are not part of the scrollable area, but gBCR puts them inside.\r\n //\r\n // (See http://jsbin.com/pivata/10 for an extensive test of gBCR behaviour.)\r\n\r\n containerPaddingRectRoot = getPaddingRectRoot( $container[0] );\r\n\r\n // Cache the calculations\r\n if ( cache ) cache.containerPaddingRectRoot = containerPaddingRectRoot;\r\n }\r\n\r\n return {\r\n top: rect.top - containerPaddingRectRoot.top,\r\n bottom: rect.bottom - containerPaddingRectRoot.top,\r\n left: rect.left - containerPaddingRectRoot.left,\r\n right: rect.right - containerPaddingRectRoot.left\r\n };\r\n }\r\n\r\n /**\r\n * Calculates the rect of the content-box. Similar to getBoundingClientRect, but excludes padding and borders - and\r\n * is much slower.\r\n *\r\n * @param {HTMLElement} elem\r\n * @returns {ClientRect}\r\n */\r\n function getContentRect( elem ) {\r\n\r\n var rect = elem.getBoundingClientRect(),\r\n props = getCss( elem, [\r\n \"borderTopWidth\", \"borderRightWidth\", \"borderBottomWidth\", \"borderLeftWidth\",\r\n \"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\"\r\n ], { toFloat: true } );\r\n\r\n return {\r\n top: rect.top + props.paddingTop + props.borderTopWidth,\r\n right: rect.right - ( props.paddingRight + props.borderRightWidth ),\r\n bottom: rect.bottom - ( props.paddingBottom + props.borderBottomWidth ),\r\n left: rect.left + props.paddingLeft + props.borderLeftWidth\r\n };\r\n }\r\n\r\n /**\r\n * Returns the top, left coordinates of the rect of the padding box (offset box).\r\n *\r\n * The coordinates match those of getBoundingClientRect, but exclude the borders.\r\n *\r\n * Does not care about bottom, right coordinates, in order to speed up the process.\r\n *\r\n * @param {HTMLElement} elem\r\n * @returns {{ top: number, left: number }}\r\n */\r\n function getPaddingRectRoot( elem ) {\r\n\r\n var rect = elem.getBoundingClientRect(),\r\n props = getCss( elem, [\r\n \"borderTopWidth\", \"borderLeftWidth\"\r\n ], { toFloat: true } );\r\n\r\n return {\r\n top: rect.top + props.borderTopWidth,\r\n left: rect.left + props.borderLeftWidth\r\n };\r\n }\r\n\r\n /**\r\n * Returns the scroll bar state of the window. Helper for hasScrollbar().\r\n *\r\n * @param {Object} query\r\n * @param {Object} context\r\n *\r\n * @returns {{vertical: boolean, horizontal: boolean}}\r\n */\r\n function _windowHasScrollbar ( query, context ) {\r\n\r\n var windowInnerHeight, windowInnerWidth, windowProps,\r\n scrollbarWidth = $.scrollbarWidth(),\r\n result = {},\r\n doneX = ! query.getHorizontal,\r\n doneY = ! query.getVertical;\r\n\r\n // We may be able to take a shortcut. The window.innerWidth and -Height report the dimensions of the viewport\r\n // including scroll bars, and documentElement.clientWidth and -Height report them without scroll bars. That\r\n // gives the presence of a scroll bar away, as long as\r\n //\r\n // - the scroll bars actually take up space (width > 0)\r\n // - the browser supports window.innerWidth/Height (IE8, for instance, does not)\r\n // - the browser doesn't report a buggy value. FF has a bug which as only been fixed in FF25 (released 29 Oct\r\n // 2013). It manifests itself in a fictional return value of 10 for these properties. See\r\n // * https://developer.mozilla.org/en-US/docs/Web/API/Window.innerWidth\r\n // * https://developer.mozilla.org/en-US/docs/Web/API/Window.innerHeight\r\n // * https://bugzilla.mozilla.org/show_bug.cgi?id=641188\r\n\r\n if ( query.getHorizontal && scrollbarWidth > 0 ) {\r\n windowInnerHeight = context.window.innerHeight;\r\n if ( windowInnerHeight > 10 ) {\r\n result.horizontal = windowInnerHeight > context.documentElement.clientHeight;\r\n doneX = true;\r\n }\r\n }\r\n\r\n if ( query.getVertical && scrollbarWidth > 0 ) {\r\n windowInnerWidth = context.window.innerWidth;\r\n if ( windowInnerWidth > 10 ) {\r\n result.vertical = windowInnerWidth > context.documentElement.clientWidth;\r\n doneY = true;\r\n }\r\n }\r\n\r\n if ( ! doneX || ! doneY ) {\r\n\r\n // Shortcut didn't work. We have to evaluate overflow settings, window and document size.\r\n\r\n windowProps = _getViewportOverflows( query, context ).window;\r\n\r\n // Handle the trivial cases first: window set to overflow: scroll or to overflow: hidden.\r\n if ( ! doneX && windowProps.overflowScrollX ) result.horizontal = doneX = true;\r\n if ( ! doneY && windowProps.overflowScrollY ) result.vertical = doneY = true;\r\n\r\n if ( ! doneX && windowProps.overflowHiddenX ) {\r\n result.horizontal = false;\r\n doneX = true;\r\n }\r\n\r\n if ( ! doneY && windowProps.overflowHiddenY ) {\r\n result.vertical = false;\r\n doneY = true;\r\n }\r\n\r\n // Handle the remaining overflow: auto case\r\n //\r\n // (There is no actual overflow: visible case for the viewport, see getAppliedViewportOverflows.)\r\n if ( ! doneX ) result.horizontal = context.documentElement.clientWidth < $.documentWidth( context.document );\r\n if ( ! doneY ) result.vertical = context.documentElement.clientHeight < $.documentHeight( context.document );\r\n\r\n }\r\n\r\n return result;\r\n\r\n }\r\n\r\n /**\r\n * Returns the applied overflow for the viewport (documentElement) and body in an aggregated `{ window: ...,\r\n * body: ...}` hash. Helper for hasScrollbar().\r\n *\r\n * If we deal with window or body scroll bars, we always need the settings for both body and window (documentElement)\r\n * because they are interdependent. See getAppliedViewportOverflows().\r\n *\r\n * @param {Object} query\r\n * @param {Object} context\r\n * @returns {{window: AppliedOverflow, body: AppliedOverflow}}\r\n */\r\n function _getViewportOverflows ( query, context ) {\r\n var windowProps, bodyProps,\r\n overflowPropNames = [ \"overflow\"],\r\n bodyOverflowPropNames = [ \"overflow\" ];\r\n\r\n if ( query.getHorizontal ) {\r\n overflowPropNames.push( \"overflowX\" );\r\n bodyOverflowPropNames.push( \"overflowX\" );\r\n }\r\n if ( query.getVertical ) {\r\n overflowPropNames.push( \"overflowY\" );\r\n bodyOverflowPropNames.push( \"overflowY\" );\r\n }\r\n\r\n windowProps = getCss( context.documentElement, overflowPropNames, { toLowerCase: true } );\r\n bodyProps = getCss( context.body, bodyOverflowPropNames, { toLowerCase: true } );\r\n\r\n return getAppliedViewportOverflows( windowProps, bodyProps );\r\n }\r\n\r\n /**\r\n * Determines the effective overflow setting of an element, separately for each axis, based on the `overflow`,\r\n * `overflowX` and `overflowY` properties of the element which must be passed in as a hash.\r\n *\r\n * Returns a hash of the computed results for overflowX, overflowY. Also adds boolean status properties to the hash\r\n * if the createBooleans flag is set. These are properties for mere convenience. They signal if a particular\r\n * overflow type applies (e.g. overflowHiddenX = true/false).\r\n *\r\n * ATTN The method does not take the special relation of body and documentElement into account. That is handled by\r\n * the more specific getAppliedViewportOverflows() function.\r\n *\r\n * The effective overflow setting is established as follows:\r\n *\r\n * - If a computed value for `overflow(X/Y)` exists, it gets applied to the axis.\r\n * - If not, the computed value of the general `overflow` setting gets applied to the axis.\r\n * - If there is no computed value at all, the overflow default gets applied to the axis. The default is\r\n * \"visible\" in seemingly every browser out there. Falling back to the default should never be necessary,\r\n * though, because there always is a computed value.\r\n *\r\n * @param {Object} props hash of element properties (computed values)\r\n * @param {string} props.overflow\r\n * @param {string} props.overflowX\r\n * @param {string} props.overflowY\r\n * @param {boolean=false} createBooleans if true, create the full set of boolean status properties, e.g.\r\n * overflowVisibleX (true/false), overflowHiddenY (true/false) etc\r\n * @returns {AppliedOverflow} hash of the computed results: overflowX, overflowY, optional boolean\r\n * status properties\r\n */\r\n function getAppliedOverflows ( props, createBooleans ) {\r\n var status = {};\r\n\r\n // Establish the applied overflow (e.g. overflowX: \"scroll\")\r\n status.overflowX = props.overflowX || props.overflow || \"visible\";\r\n status.overflowY = props.overflowY || props.overflow || \"visible\";\r\n\r\n // Create the derived boolean status properties (e.g overflowScrollX: true)\r\n if ( createBooleans ) {\r\n $.each( [ \"Visible\", \"Auto\", \"Scroll\", \"Hidden\" ], function ( index, type ) {\r\n var lcType = type.toLowerCase();\r\n status[\"overflow\" + type + \"X\"] = status.overflowX === lcType;\r\n status[\"overflow\" + type + \"Y\"] = status.overflowY === lcType;\r\n } );\r\n }\r\n\r\n return status;\r\n }\r\n\r\n /**\r\n * Determines the effective overflow setting of the viewport and body, separately for each axis, based on the\r\n * `overflow`, `overflowX` and `overflowY` properties of the documentElement and body which must be passed in as a\r\n * hash.\r\n *\r\n * Returns the results for viewport and body in an aggregated `{ window: ..., body: ...}` hash.\r\n *\r\n * For the basic resolution mechanism, see getAppliedOverflows(). When determining the effective overflow, the\r\n * peculiarities of viewport and body are taken into account:\r\n *\r\n * - Viewport and body overflows are interdependent. If the nominal viewport overflow for a given axis is \"visible\",\r\n * the viewport inherits the body overflow for that axis, and the body overflow is set to \"visible\". Curiously,\r\n * that transfer is _not_ reflected in the computed values, it just manifests in behaviour.\r\n *\r\n * - Once that is done, if the viewport overflow is still \"visible\" for an axis, it is effectively turned into\r\n * \"auto\". Scroll bars appear when the content overflows the viewport (ie, \"auto\" behaviour). Hence, this function\r\n * will indeed report \"auto\". Again, the transformation is only manifest in behaviour, not in the computed values.\r\n *\r\n * - In iOS, if the effective overflow setting of the viewport is \"hidden\", it is ignored and treated as \"auto\".\r\n * Content can still overflow the viewport, and scroll bars appear as needed.\r\n *\r\n * Now, the catch. This behaviour is impossible to feature-detect. The computed values are not at all affected by\r\n * it, and the results reported eg. for clientHeight, offsetHeight, scrollHeight of body and documentElement do\r\n * not differ between Safari on iOS and, say, Chrome on the desktop. The numbers don't give the behaviour away.\r\n *\r\n * So we have to resort to browser sniffing here. It sucks, but there is literally no other option.\r\n *\r\n * NB Additional status properties (see getAppliedOverflows) are always generated here.\r\n *\r\n * @param {Object} documentElementProps hash of documentElement properties (computed values)\r\n * @param {string} documentElementProps.overflow\r\n * @param {string} documentElementProps.overflowX\r\n * @param {string} documentElementProps.overflowY\r\n *\r\n * @param {Object} bodyProps hash of body properties (computed values)\r\n * @param {string} bodyProps.overflow\r\n * @param {string} bodyProps.overflowX\r\n * @param {string} bodyProps.overflowY\r\n *\r\n * @returns {{window: AppliedOverflow, body: AppliedOverflow}}\r\n */\r\n function getAppliedViewportOverflows ( documentElementProps, bodyProps ) {\r\n var _window = getAppliedOverflows( documentElementProps, false ),\r\n body = getAppliedOverflows( bodyProps, false ),\r\n consolidated = { window: {}, body: {} };\r\n\r\n // Handle the interdependent relationship between body and window (documentElement) overflow\r\n if ( _window.overflowX === \"visible\" ) {\r\n // If the window overflow is set to \"visible\", body props get transferred to the window, body changes to\r\n // \"visible\". (Nothing really changes if both are set to \"visible\".)\r\n consolidated.body.overflowX = \"visible\";\r\n consolidated.window.overflowX = body.overflowX;\r\n } else {\r\n // No transfer of properties.\r\n // - If body overflow is \"visible\", it remains that way, and the window stays as it is.\r\n // - If body and window are set to properties other than \"visible\", they keep their divergent settings.\r\n consolidated.body.overflowX = body.overflowX;\r\n consolidated.window.overflowX = _window.overflowX;\r\n }\r\n\r\n // Repeat for overflowY\r\n if ( _window.overflowY === \"visible\" ) {\r\n consolidated.body.overflowY = \"visible\";\r\n consolidated.window.overflowY = body.overflowY;\r\n } else {\r\n consolidated.body.overflowY = body.overflowY;\r\n consolidated.window.overflowY = _window.overflowY;\r\n }\r\n\r\n // window.overflow(X/Y): \"visible\" actually means \"auto\" because scroll bars appear as needed; transform\r\n if ( consolidated.window.overflowX === \"visible\" ) consolidated.window.overflowX = \"auto\";\r\n if ( consolidated.window.overflowY === \"visible\" ) consolidated.window.overflowY = \"auto\";\r\n\r\n // In iOS, window.overflow(X/Y): \"hidden\" actually means \"auto\"; transform\r\n if ( isIOS() ) {\r\n if ( consolidated.window.overflowX === \"hidden\" ) consolidated.window.overflowX = \"auto\";\r\n if ( consolidated.window.overflowY === \"hidden\" ) consolidated.window.overflowY = \"auto\";\r\n }\r\n\r\n // Add the boolean status properties to the result\r\n consolidated.window = getAppliedOverflows( consolidated.window, true );\r\n consolidated.body = getAppliedOverflows( consolidated.body, true );\r\n\r\n return consolidated;\r\n }\r\n\r\n /**\r\n * Establishes the container and returns it in a jQuery wrapper.\r\n *\r\n * Resolves and normalizes the input, which may be a document, HTMLElement, window, or selector string. Corrects\r\n * likely mistakes, such as passing in a document or an iframe, rather than the corresponding window.\r\n *\r\n * @param {Window|Document|HTMLElement|HTMLIFrameElement|jQuery|string} container\r\n * @returns {jQuery}\r\n */\r\n function wrapContainer ( container ) {\r\n var $container,\r\n isJquery = container instanceof $;\r\n\r\n if ( ! isJquery && ! $.isWindow( container ) && ! container.nodeType && ! isString( container ) ) throw new Error( 'Invalid container: not a window, node, jQuery object or selector string' );\r\n\r\n $container = isJquery ? container : container === root ? $root : $( container );\r\n\r\n if ( !$container.length ) throw new Error( 'Invalid container: empty jQuery object' );\r\n\r\n container = $container[0];\r\n\r\n if ( container.nodeType === 9 ) {\r\n // Document is passed in, transform to window\r\n $container = wrapContainer( container.defaultView || container.parentWindow );\r\n } else if ( container.nodeType === 1 && container.tagName.toLowerCase() === \"iframe\" ) {\r\n // IFrame element is passed in, transform to IFrame content window\r\n $container = wrapContainer( container.contentWindow );\r\n }\r\n\r\n // Check if the container matches the requirements\r\n if ( !$.isWindow( $container[0] ) && $container.css( \"overflow\" ) === \"visible\" ) throw new Error( 'Invalid container: is set to overflow:visible. Containers must have the ability to obscure some of their content, otherwise the in-view test is pointless. Containers must be set to overflow:scroll/auto/hide, or be a window (or document, or iframe, as proxies for a window)' );\r\n\r\n return $container;\r\n }\r\n\r\n /**\r\n * Checks if the element is a descendant of the container, and throws an error otherwise. Also checks the type of\r\n * the element (must indeed be an element node).\r\n *\r\n * For performance reasons, this check should *not* be run on every element in a set.\r\n *\r\n * @param {HTMLElement} elem\r\n * @param {Window|Document|HTMLElement} container\r\n */\r\n function checkHierarchy ( elem, container ) {\r\n\r\n var elemIsContained;\r\n\r\n if ( elem.nodeType !== 1 ) throw new Error( \"Invalid node: is not an element\" );\r\n\r\n if ( $.isWindow( container ) ) {\r\n elemIsContained = elem.ownerDocument && container === ( elem.ownerDocument.defaultView || elem.ownerDocument.parentWindow );\r\n } else if ( container.nodeType === 9 ) {\r\n // We need a DOM element for this check, so we use the documentElement as a proxy if the container is a document.\r\n elemIsContained = $.contains( container.documentElement, elem );\r\n } else {\r\n elemIsContained = $.contains( container, elem );\r\n }\r\n\r\n if ( !elemIsContained ) throw new Error( \"Invalid container: is not an ancestor of the element\" );\r\n\r\n }\r\n\r\n /**\r\n * Spots likely option mistakes and throws appropriate errors.\r\n *\r\n * @param {Object} opts\r\n */\r\n function checkOptions ( opts ) {\r\n var isNum, isNumWithUnit;\r\n\r\n if ( opts.direction && !( opts.direction === 'vertical' || opts.direction === 'horizontal' || opts.direction === 'both' ) ) {\r\n throw new Error( 'Invalid option value: direction = \"' + opts.direction + '\"' );\r\n }\r\n\r\n if ( opts.box && !( opts.box === 'border-box' || opts.box === 'content-box' ) ) {\r\n throw new Error( 'Invalid option value: box = \"' + opts.box + '\"' );\r\n }\r\n\r\n if ( opts.tolerance !== undefined ) {\r\n isNum = isNumber( opts.tolerance );\r\n isNumWithUnit = isString( opts.tolerance ) && ( /^[+-]?\\d*\\.?\\d+(px|%)?$/.test( opts.tolerance ) );\r\n if ( ! ( isNum || isNumWithUnit ) ) throw new Error( 'Invalid option value: tolerance = \"' + opts.tolerance + '\"' );\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Gets the width of a jQuery-wrapped container, excluding scroll bars. Also supports quirks mode for window\r\n * containers, unlike jQuery's $( window ).width(). Makes use of caching if a cache object is provided.\r\n *\r\n * @param {jQuery} $container\r\n * @param {boolean} isWindow required to speed up the process\r\n * @param {Object} [cache]\r\n * @returns {number}\r\n */\r\n function getNetContainerWidth ( $container, isWindow, cache ) {\r\n var width;\r\n\r\n if ( cache && cache.netContainerWidth !== undefined ) {\r\n width = cache.netContainerWidth;\r\n } else {\r\n width = isWindow ?\r\n getWindowDimension( $container, \"Width\" ) :\r\n $container.innerWidth() - getContainerScrollbarWidths( $container, cache ).vertical;\r\n\r\n if ( cache ) cache.netContainerWidth = width;\r\n }\r\n\r\n return width;\r\n }\r\n\r\n /**\r\n * Gets the height of a jQuery-wrapped container, excluding scroll bars. Also supports quirks mode for window\r\n * containers, unlike jQuery's $( window ).height(). Makes use of caching if a cache object is provided.\r\n *\r\n * @param {jQuery} $container\r\n * @param {boolean} isWindow required to speed up the process\r\n * @param {Object} [cache]\r\n * @returns {number}\r\n */\r\n function getNetContainerHeight ( $container, isWindow, cache ) {\r\n var height;\r\n\r\n if ( cache && cache.netContainerHeight !== undefined ) {\r\n height = cache.netContainerHeight;\r\n } else {\r\n height = isWindow ?\r\n getWindowDimension( $container, \"Height\" ) :\r\n $container.innerHeight() - getContainerScrollbarWidths( $container, cache ).horizontal;\r\n\r\n if ( cache ) cache.netContainerHeight = height;\r\n }\r\n\r\n return height;\r\n }\r\n\r\n /**\r\n * Gets the effective scroll bar widths of a given container. Makes use of caching if a cache object is provided.\r\n *\r\n * @param {jQuery} $container\r\n * @param {Object} [cache]\r\n * @returns {Object}\r\n */\r\n function getContainerScrollbarWidths ( $container, cache ) {\r\n var containerScrollbarWidths;\r\n\r\n if ( cache && cache.containerScrollbarWidths ) {\r\n containerScrollbarWidths = cache.containerScrollbarWidths;\r\n } else {\r\n containerScrollbarWidths = effectiveScrollbarWith( $container );\r\n if ( cache ) cache.containerScrollbarWidths = containerScrollbarWidths;\r\n }\r\n\r\n return containerScrollbarWidths;\r\n }\r\n\r\n /**\r\n * Gets the width or height of a jQuery-wrapped window. Use it instead of $container.width(). Supports quirks mode,\r\n * unlike jQuery.\r\n *\r\n * Window dimensions are calculated as in Zakas, Professional Javascript (2012), p. 404. The standards mode part of\r\n * it is the same as in jQuery, too.\r\n *\r\n * @param {jQuery} $window\r\n * @param {string} dimension \"Width\" or \"Height\" (capitalized!)\r\n * @returns {number}\r\n */\r\n function getWindowDimension ( $window, dimension ) {\r\n var doc = $window[0].document,\r\n property = \"client\" + dimension;\r\n\r\n return doc.compatMode === \"BackCompat\" ? doc.body[property] : doc.documentElement[property];\r\n }\r\n\r\n /**\r\n * Returns the computed style for a property, or an array of properties, as a hash.\r\n *\r\n * Building a CSS properties hash this way can be significantly faster than the more convenient, conventional jQuery\r\n * approach, $( elem ).css( propertiesArray ).\r\n *\r\n * ATTN\r\n * ====\r\n *\r\n * We are using an internal jQuery API here: $.css(). The current signature was introduced in jQuery 1.9.0. It may\r\n * break without warning with any change of the minor version.\r\n *\r\n * For that reason, the $.css API is monitored by the tests in api.jquery.css.spec.js which verify that it works as\r\n * expected.\r\n *\r\n * @param {HTMLElement} elem\r\n * @param {string|string[]} properties\r\n * @param {Object} [opts]\r\n * @param {boolean} [opts.toLowerCase=false] ensures return values in lower case\r\n * @param {boolean} [opts.toFloat=false] converts return values to numbers, using parseFloat\r\n *\r\n * @returns {Object} property names and their values\r\n */\r\n function getCss ( elem, properties, opts ) {\r\n var i, length, name,\r\n props = {},\r\n _window = ( elem.ownerDocument.defaultView || elem.ownerDocument.parentWindow ),\r\n computedStyles = _useGetComputedStyle ? _window.getComputedStyle( elem, null ) : elem.currentStyle;\r\n\r\n opts || ( opts = {} );\r\n\r\n if ( ! $.isArray( properties ) ) properties = [ properties ];\r\n length = properties.length;\r\n\r\n for ( i = 0; i < length; i++ ) {\r\n name = properties[i];\r\n props[name] = $.css( elem, name, false, computedStyles );\r\n if ( opts.toLowerCase && props[name] && props[name].toLowerCase ) props[name] = props[name].toLowerCase();\r\n if ( opts.toFloat ) props[name] = parseFloat( props[name] );\r\n }\r\n\r\n return props;\r\n }\r\n\r\n /**\r\n * Returns the bounding client rect, including width and height properties. Ensures compatibility with IE8, which\r\n * supports getBoundingClientRect but doesn't calculate width and height.\r\n *\r\n * Use only when width and height are actually needed.\r\n *\r\n * Will be removed when IE8 support is dropped entirely.\r\n *\r\n * @param {HTMLElement} elem\r\n * @returns {ClientRect}\r\n */\r\n function getBoundingClientRectCompat ( elem ) {\r\n var elemRect = elem.getBoundingClientRect();\r\n\r\n if ( elemRect.width === undefined || elemRect.height === undefined ) {\r\n // Fix for IE8\r\n elemRect = {\r\n top: elemRect.top,\r\n left: elemRect.left,\r\n bottom: elemRect.bottom,\r\n right: elemRect.right,\r\n width: elemRect.right - elemRect.left,\r\n height: elemRect.bottom - elemRect.top\r\n };\r\n }\r\n\r\n return elemRect;\r\n }\r\n\r\n /**\r\n * Detects if the browser is on iOS. Works for Safari as well as other browsers, say, Chrome on iOS.\r\n *\r\n * Required for some iOS behaviour which can't be feature-detected in any way.\r\n *\r\n * @returns {boolean}\r\n */\r\n function isIOS () {\r\n if ( _isIOS === undefined ) _isIOS = (/iPad|iPhone|iPod/g).test( navigator.userAgent );\r\n return _isIOS;\r\n }\r\n\r\n /**\r\n * Calls parseFloat on each value. Useful for removing units from numeric values.\r\n *\r\n * @param {Object} object\r\n * @returns {Object}\r\n */\r\n function toFloat ( object ) {\r\n var transformed = {};\r\n\r\n $.map( object, function ( value, key ) {\r\n transformed[key] = parseFloat( value );\r\n } );\r\n\r\n return transformed;\r\n }\r\n\r\n /**\r\n * Returns whether or not a value is of type number. Also rejects NaN as a number.\r\n *\r\n * NB This is not the same as $.isNumeric because $.isNumeric( \"3\" ) is true while isNumber( \"3\" ) is false.\r\n *\r\n * @param {*} value\r\n * @returns {boolean}\r\n */\r\n function isNumber ( value ) {\r\n // Done as in the Lodash compatibility build, but rejecting NaN as a number.\r\n var isNumeric = typeof value === 'number' || value && typeof value === 'object' && Object.prototype.toString.call( value ) === '[object Number]' || false;\r\n\r\n // Reject NaN before returning\r\n return isNumeric && value === +value;\r\n }\r\n\r\n function isString ( value ) {\r\n // Done as in the Lodash compatibility build\r\n return typeof value === 'string' || value && typeof value === 'object' && Object.prototype.toString.call(value) === '[object String]' || false;\r\n }\r\n\r\n /**\r\n * Custom types.\r\n *\r\n * For easier documentation and type inference.\r\n */\r\n\r\n /**\r\n * @name AppliedOverflow\r\n * @type {Object}\r\n *\r\n * @property {string} overflowX\r\n * @property {string} overflowY\r\n * @property {boolean} overflowVisibleX\r\n * @property {boolean} overflowVisibleY\r\n * @property {boolean} overflowAutoX\r\n * @property {boolean} overflowAutoY\r\n * @property {boolean} overflowScrollX\r\n * @property {boolean} overflowScrollY\r\n * @property {boolean} overflowHiddenX\r\n * @property {boolean} overflowHiddenY\r\n */\r\n\r\n\r\n }( typeof jQuery !== \"undefined\" ? jQuery : $ ));\r\n\r\n} ));\r\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\")))\n\n//# sourceURL=webpack:///./src/public/js/plugins/jquery.isinview.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/angular/angular-cookies.min.js": -/*!*************************************************************!*\ - !*** ./src/public/js/vendor/angular/angular-cookies.min.js ***! - \*************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("/*\r\n AngularJS v1.4.7\r\n (c) 2010-2015 Google, Inc. http://angularjs.org\r\n License: MIT\r\n */\r\n(function(p,c,n){'use strict';function l(b,a,g){var d=g.baseHref(),k=b[0];return function(b,e,f){var g,h;f=f||{};h=f.expires;g=c.isDefined(f.path)?f.path:d;c.isUndefined(e)&&(h=\"Thu, 01 Jan 1970 00:00:00 GMT\",e=\"\");c.isString(h)&&(h=new Date(h));e=encodeURIComponent(b)+\"=\"+encodeURIComponent(e);e=e+(g?\";path=\"+g:\"\")+(f.domain?\";domain=\"+f.domain:\"\");e+=h?\";expires=\"+h.toUTCString():\"\";e+=f.secure?\";secure\":\"\";f=e.length+1;4096 4096 bytes)!\");k.cookie=e}}c.module(\"ngCookies\",[\"ng\"]).provider(\"$cookies\",[function(){var b=this.defaults={};this.$get=[\"$$cookieReader\",\"$$cookieWriter\",function(a,g){return{get:function(d){return a()[d]},getObject:function(d){return(d=this.get(d))?c.fromJson(d):d},getAll:function(){return a()},put:function(d,a,m){g(d,a,m?c.extend({},b,m):b)},putObject:function(d,b,a){this.put(d,c.toJson(b),a)},remove:function(a,k){g(a,n,k?c.extend({},b,k):b)}}}]}]);c.module(\"ngCookies\").factory(\"$cookieStore\",\r\n [\"$cookies\",function(b){return{get:function(a){return b.getObject(a)},put:function(a,c){b.putObject(a,c)},remove:function(a){b.remove(a)}}}]);l.$inject=[\"$document\",\"$log\",\"$browser\"];c.module(\"ngCookies\").provider(\"$$cookieWriter\",function(){this.$get=l})})(window,window.angular);\n\n//# sourceURL=webpack:///./src/public/js/vendor/angular/angular-cookies.min.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/angular/angular-route.min.js": -/*!***********************************************************!*\ - !*** ./src/public/js/vendor/angular/angular-route.min.js ***! - \***********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("/*\r\n AngularJS v1.4.7\r\n (c) 2010-2015 Google, Inc. http://angularjs.org\r\n License: MIT\r\n */\r\n(function(p,c,C){'use strict';function v(r,h,g){return{restrict:\"ECA\",terminal:!0,priority:400,transclude:\"element\",link:function(a,f,b,d,y){function z(){k&&(g.cancel(k),k=null);l&&(l.$destroy(),l=null);m&&(k=g.leave(m),k.then(function(){k=null}),m=null)}function x(){var b=r.current&&r.current.locals;if(c.isDefined(b&&b.$template)){var b=a.$new(),d=r.current;m=y(b,function(b){g.enter(b,null,m||f).then(function(){!c.isDefined(t)||t&&!a.$eval(t)||h()});z()});l=d.scope=b;l.$emit(\"$viewContentLoaded\");\r\n l.$eval(w)}else z()}var l,m,k,t=b.autoscroll,w=b.onload||\"\";a.$on(\"$routeChangeSuccess\",x);x()}}}function A(c,h,g){return{restrict:\"ECA\",priority:-400,link:function(a,f){var b=g.current,d=b.locals;f.html(d.$template);var y=c(f.contents());b.controller&&(d.$scope=a,d=h(b.controller,d),b.controllerAs&&(a[b.controllerAs]=d),f.data(\"$ngControllerController\",d),f.children().data(\"$ngControllerController\",d));y(a)}}}p=c.module(\"ngRoute\",[\"ng\"]).provider(\"$route\",function(){function r(a,f){return c.extend(Object.create(a),\r\n f)}function h(a,c){var b=c.caseInsensitiveMatch,d={originalPath:a,regexp:a},g=d.keys=[];a=a.replace(/([().])/g,\"\\\\$1\").replace(/(\\/)?:(\\w+)([\\?\\*])?/g,function(a,c,b,d){a=\"?\"===d?d:null;d=\"*\"===d?d:null;g.push({name:b,optional:!!a});c=c||\"\";return\"\"+(a?\"\":c)+\"(?:\"+(a?c:\"\")+(d&&\"(.+?)\"||\"([^/]+)\")+(a||\"\")+\")\"+(a||\"\")}).replace(/([\\/$\\*])/g,\"\\\\$1\");d.regexp=new RegExp(\"^\"+a+\"$\",b?\"i\":\"\");return d}var g={};this.when=function(a,f){var b=c.copy(f);c.isUndefined(b.reloadOnSearch)&&(b.reloadOnSearch=!0);\r\n c.isUndefined(b.caseInsensitiveMatch)&&(b.caseInsensitiveMatch=this.caseInsensitiveMatch);g[a]=c.extend(b,a&&h(a,b));if(a){var d=\"/\"==a[a.length-1]?a.substr(0,a.length-1):a+\"/\";g[d]=c.extend({redirectTo:a},h(d,b))}return this};this.caseInsensitiveMatch=!1;this.otherwise=function(a){\"string\"===typeof a&&(a={redirectTo:a});this.when(null,a);return this};this.$get=[\"$rootScope\",\"$location\",\"$routeParams\",\"$q\",\"$injector\",\"$templateRequest\",\"$sce\",function(a,f,b,d,h,p,x){function l(b){var e=s.current;\r\n (v=(n=k())&&e&&n.$$route===e.$$route&&c.equals(n.pathParams,e.pathParams)&&!n.reloadOnSearch&&!w)||!e&&!n||a.$broadcast(\"$routeChangeStart\",n,e).defaultPrevented&&b&&b.preventDefault()}function m(){var u=s.current,e=n;if(v)u.params=e.params,c.copy(u.params,b),a.$broadcast(\"$routeUpdate\",u);else if(e||u)w=!1,(s.current=e)&&e.redirectTo&&(c.isString(e.redirectTo)?f.path(t(e.redirectTo,e.params)).search(e.params).replace():f.url(e.redirectTo(e.pathParams,f.path(),f.search())).replace()),d.when(e).then(function(){if(e){var a=\r\n c.extend({},e.resolve),b,f;c.forEach(a,function(b,e){a[e]=c.isString(b)?h.get(b):h.invoke(b,null,null,e)});c.isDefined(b=e.template)?c.isFunction(b)&&(b=b(e.params)):c.isDefined(f=e.templateUrl)&&(c.isFunction(f)&&(f=f(e.params)),c.isDefined(f)&&(e.loadedTemplateUrl=x.valueOf(f),b=p(f)));c.isDefined(b)&&(a.$template=b);return d.all(a)}}).then(function(f){e==s.current&&(e&&(e.locals=f,c.copy(e.params,b)),a.$broadcast(\"$routeChangeSuccess\",e,u))},function(b){e==s.current&&a.$broadcast(\"$routeChangeError\",\r\n e,u,b)})}function k(){var a,b;c.forEach(g,function(d,g){var q;if(q=!b){var h=f.path();q=d.keys;var l={};if(d.regexp)if(h=d.regexp.exec(h)){for(var k=1,m=h.length;k=c;d--)f.end&&f.end(e[d]);e.length=c}}\"string\"!==typeof a&&(a=null===a||\"undefined\"===typeof a?\"\":\"\"+a);var b,k,e=[],m=a,l;for(e.last=function(){return e[e.length-1]};a;){l=\"\";k=!0;if(e.last()&&w[e.last()])a=a.replace(new RegExp(\"([\\\\W\\\\w]*)<\\\\s*\\\\/\\\\s*\"+e.last()+\"[^>]*>\",\"i\"),function(a,b){b=b.replace(H,\"$1\").replace(I,\"$1\");f.chars&&f.chars(q(b));return\"\"}),c(\"\",e.last());else{if(0===a.indexOf(\"\\x3c!--\"))b=a.indexOf(\"--\",4),0<=b&&a.lastIndexOf(\"--\\x3e\",\r\n b)===b&&(f.comment&&f.comment(a.substring(4,b)),a=a.substring(b+3),k=!1);else if(x.test(a)){if(b=a.match(x))a=a.replace(b[0],\"\"),k=!1}else if(J.test(a)){if(b=a.match(y))a=a.substring(b[0].length),b[0].replace(y,c),k=!1}else K.test(a)&&((b=a.match(z))?(b[4]&&(a=a.substring(b[0].length),b[0].replace(z,d)),k=!1):(l+=\"<\",a=a.substring(1)));k&&(b=a.indexOf(\"<\"),l+=0>b?a:a.substring(0,b),a=0>b?\"\":a.substring(b),f.chars&&f.chars(q(l)))}if(a==m)throw L(\"badparse\",a);m=a}c()}function q(a){if(!a)return\"\";A.innerHTML=\r\n a.replace(//g,\">\")}function r(a,f){var d=!1,c=h.bind(a,a.push);return{start:function(a,k,e){a=h.lowercase(a);!d&&w[a]&&(d=a);d||!0!==C[a]||(c(\"<\"),c(a),h.forEach(k,function(d,e){var k=h.lowercase(e),g=\"img\"===a&&\"src\"===k||\r\n \"background\"===k;!0!==O[k]||!0===D[k]&&!f(d,g)||(c(\" \"),c(e),c('=\"'),c(B(d)),c('\"'))}),c(e?\"/>\":\">\"))},end:function(a){a=h.lowercase(a);d||!0!==C[a]||(c(\"\"));a==d&&(d=!1)},chars:function(a){d||c(B(a))}}}var L=h.$$minErr(\"$sanitize\"),z=/^<((?:[a-zA-Z])[\\w:-]*)((?:\\s+[\\w:-]+(?:\\s*=\\s*(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>\\s]+))?)*)\\s*(\\/?)\\s*(>?)/,y=/^<\\/\\s*([\\w:-]+)[^>]*>/,G=/([\\w:-]+)(?:\\s*=\\s*(?:(?:\"((?:[^\"])*)\")|(?:'((?:[^'])*)')|([^>\\s]+)))?/g,K=/^]*?)>/i,\r\n I=/\"\\u201d\\u2019]/i,d=/^mailto:/i;return function(c,b){function k(a){a&&g.push(E(a))}function e(a,\r\n c){g.push(\"');k(c);g.push(\"\")}if(!c)return c;for(var m,l=c,g=[],n,p;m=l.match(f);)n=m[0],m[2]||m[4]||(n=(m[3]?\"http://\":\"mailto:\")+n),p=m.index,k(l.substr(0,p)),e(n,m[0].replace(d,\"\")),l=l.substring(p+m[0].length);k(l);return a(g.join(\"\"))}}])})(window,window.angular);\n\n//# sourceURL=webpack:///./src/public/js/vendor/angular/angular-sanitize.min.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/datatables/dataTables.grouping.js": -/*!****************************************************************!*\ - !*** ./src/public/js/vendor/datatables/dataTables.grouping.js ***! - \****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function(jQuery) {/*\r\n * File: jquery.dataTables.grouping.js\r\n * Version: 1.2.9.\r\n * Author: Jovan Popovic\r\n *\r\n * Copyright 2013 Jovan Popovic, all rights reserved.\r\n *\r\n * This source file is free software, under either the GPL v2 license or a\r\n * BSD style license, as supplied with this software.\r\n *\r\n * This source file is distributed in the hope that it will be useful, but\r\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r\n * or FITNESS FOR A PARTICULAR PURPOSE.\r\n * Parameters:\r\n * @iGroupingColumnIndex Integer Index of the column that will be used for grouping - default 0\r\n * @sGroupingColumnSortDirection Enumeration Sort direction of the group\r\n * @iGroupingOrderByColumnIndex Integer Index of the column that will be used for ordering groups\r\n * @sGroupingClass String Class that will be associated to the group row. Default - \"group\"\r\n * @sGroupItemClass String Class that will be associated to the group row of group items. Default - \"group-item\"\r\n * @bSetGroupingClassOnTR Boolean If set class will be set to the TR instead of the TD withing the grouping TR\r\n * @bHideGroupingColumn Boolean Hide column used for grouping once results are grouped. Default - true\r\n * @bHideGroupingOrderByColumn Boolean Hide column used for ordering groups once results are grouped. Default - true\r\n * @sGroupBy Enumeration Type of grouping that should be applied. Values \"name\"(default), \"letter\", \"year\"\r\n * @sGroupLabelPrefix String Prefix that will be added to each group cell\r\n * @bExpandableGrouping Boolean Attach expand/collapse handlers to the grouping rows\r\n * @bExpandSingleGroup Boolean Use accordon grouping\r\n * @iExpandGroupOffset Integer Number of pixels to set scroll position above the currently selected group. If -1 scroll will be alligned to the table\r\n * General settings\r\n * @sDateFormat: \"dd/MM/yyyy\" String Date format used for grouping\r\n * @sEmptyGroupLabel String Lable that will be placed as group if grouping cells are empty. Default \"-\"\r\n\r\n * Parameters used in the second level grouping\r\n * @iGroupingColumnIndex2 Integer Index of the secondary column that will be used for grouping - default 0\r\n * @sGroupingColumnSortDirection2 Enumeration Sort direction of the secondary group\r\n * @iGroupingOrderByColumnIndex2 Integer Index of the column that will be used for ordering secondary groups\r\n * @sGroupingClass2 String Class that will be associated to the secondary group row. Default \"subgroup\"\r\n * @sGroupItemClass2 String Class that will be associated to the secondary group row of group items. Default \"subgroup-item\"\r\n * @bHideGroupingColumn2 Boolean Hide column used for secondary grouping once results are grouped. Default - true,\r\n * @bHideGroupingOrderByColumn2 Boolean Hide column used for ordering secondary groups once results are grouped. Default - true,\r\n * @sGroupBy2 Enumeration Type of grouping that should be applied to secondary column. Values \"name\"(default), \"letter\", \"year\",\r\n * @sGroupLabelPrefix2 String Prefix that will be added to each secondary group cell\r\n * @fnOnGrouped Function Function that is called when grouping is finished. Function has no parameters.\r\n */\r\n(function(a){a.fn.rowGrouping=function(e){function b(){}function c(j,h,i){}function d(j,h,i){}function g(i){var h=[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"];return h[i-1]}var f={iGroupingColumnIndex:0,sGroupingColumnSortDirection:\"\",iGroupingOrderByColumnIndex:-1,sGroupingClass:\"group\",sGroupItemClass:\"group-item\",bHideGroupingColumn:true,bHideGroupingOrderByColumn:true,sGroupBy:\"name\",sGroupLabelPrefix:\"\",fnGroupLabelFormat:function(h){return h},bExpandableGrouping:false,bExpandSingleGroup:false,iExpandGroupOffset:100,asExpandedGroups:null,sDateFormat:\"dd/MM/yyyy\",sEmptyGroupLabel:\"-\",bSetGroupingClassOnTR:false,iGroupingColumnIndex2:-1,sGroupingColumnSortDirection2:\"\",iGroupingOrderByColumnIndex2:-1,sGroupingClass2:\"subgroup\",sGroupItemClass2:\"subgroup-item\",bHideGroupingColumn2:true,bHideGroupingOrderByColumn2:true,sGroupBy2:\"name\",sGroupLabelPrefix2:\"\",fnGroupLabelFormat2:function(h){return h},bExpandableGrouping2:false,fnOnGrouped:b,fnOnGroupCreated:c,fnOnGroupCompleted:d,oHideEffect:null,oShowEffect:null,bUseFilteringForGrouping:false};return this.each(function(s,J){var E=a(J).dataTable();var B=new Array();a(this).dataTableExt.aoGroups=B;function q(T,i,P){var R=document.createElement(\"tr\");var S=document.createElement(\"td\");R.id=\"group-id-\"+E.attr(\"id\")+\"_\"+T;var Q={id:R.id,key:T,text:i,level:0,groupItemClass:\".group-item-\"+T,dataGroup:T,aoSubgroups:new Array()};if(t.bSetGroupingClassOnTR){R.className=t.sGroupingClass+\" \"+T}else{S.className=t.sGroupingClass+\" \"+T}S.colSpan=P;S.innerHTML=t.sGroupLabelPrefix+t.fnGroupLabelFormat(i==\"\"?t.sEmptyGroupLabel:i,Q);if(t.bExpandableGrouping){if(!I(T)){S.className+=\" expanded-group\";Q.state=\"expanded\"}else{S.className+=\" collapsed-group\";Q.state=\"collapsed\"}S.className+=\" group-item-expander\";a(S).attr(\"data-group\",Q.dataGroup);a(S).attr(\"data-group-level\",Q.level);a(S).click(h)}R.appendChild(S);B[T]=Q;Q.nGroup=R;t.fnOnGroupCreated(Q,T,1);return Q}function w(R,Q,P,T){var i=document.createElement(\"tr\");i.id=T.id+\"_\"+R;var V=document.createElement(\"td\");var U=T.dataGroup+\"_\"+R;var S={id:i.id,key:R,text:Q,level:T.level+1,groupItemClass:\".group-item-\"+U,dataGroup:U,aoSubgroups:new Array()};if(t.bSetGroupingClassOnTR){i.className=t.sGroupingClass2+\" \"+R}else{V.className=t.sGroupingClass2+\" \"+R}V.colSpan=P;V.innerHTML=t.sGroupLabelPrefix2+t.fnGroupLabelFormat2(Q==\"\"?t.sEmptyGroupLabel:Q,S);if(t.bExpandableGrouping){i.className+=\" group-item-\"+T.dataGroup}if(t.bExpandableGrouping&&t.bExpandableGrouping2){if(!I(S.dataGroup)){V.className+=\" expanded-group\";S.state=\"expanded\"}else{V.className+=\" collapsed-group\";S.state=\"collapsed\"}V.className+=\" group-item-expander\";a(V).attr(\"data-group\",S.dataGroup);a(V).attr(\"data-group-level\",S.level);a(V).click(h)}i.appendChild(V);T.aoSubgroups[S.dataGroup]=S;B[S.dataGroup]=S;S.nGroup=i;t.fnOnGroupCreated(S,R,2);return S}function I(i){if(B[i]!=null){return(B[i].state==\"collapsed\")}else{if(i.indexOf(\"_\")>-1){true}else{if(l&&(j==null||j.length==0)){return false}else{return(a.inArray(i,j)==-1)}}}}function L(i){if(i.length<(x+K)){return i}else{return i.substr(x,K)}}function y(i){return i}function M(i){return i.substr(0,1)}function O(i){return L(i)}function C(i){return i.substr(x,K)+\" \"+g(i.substr(r,H))}function u(i){if(i===\"\"){return\"-\"}return i.toLowerCase().replace(/[^a-zA-Z0-9\\u0080-\\uFFFF]+/g,\"-\")}function D(R,P,i){if(R.nTable.id!==E[0].id){return true}var Q=P[t.iGroupingColumnIndex];if(typeof Q===\"undefined\"){Q=P[R.aoColumns[t.iGroupingColumnIndex].mDataProp]}if(I(u(Q))){if(E.fnIsOpen(E.fnGetNodes(i))){if(t.fnOnRowClosed!=null){t.fnOnRowClosed(this)}E.fnClose(E.fnGetNodes(i))}return false}return true}function p(i){B[i].state=\"expanded\";a(\"td[data-group^='\"+i+\"']\").removeClass(\"collapsed-group\");a(\"td[data-group^='\"+i+\"']\").addClass(\"expanded-group\");if(t.bUseFilteringForGrouping){E.fnDraw();return}if(jQuery.inArray(i,j)==-1){j.push(i)}if(t.oHideEffect!=null){a(\".group-item-\"+i,E)[t.oShowEffect.method](t.oShowEffect.duration,t.oShowEffect.easing,function(){})}else{a(\".group-item-\"+i,E).show()}}function m(i){B[i].state=\"collapsed\";a(\"td[data-group^='\"+i+\"']\").removeClass(\"expanded-group\");a(\"td[data-group^='\"+i+\"']\").addClass(\"collapsed-group\");if(t.bUseFilteringForGrouping){E.fnDraw();return}a(\".group-item-\"+i).each(function(){if(E.fnIsOpen(this)){if(t.fnOnRowClosed!=null){t.fnOnRowClosed(this)}E.fnClose(this)}});if(t.oHideEffect!=null){a(\".group-item-\"+i,E)[t.oHideEffect.method](t.oHideEffect.duration,t.oHideEffect.easing,function(){})}else{a(\".group-item-\"+i,E).hide()}}function h(T){var Q=a(this).attr(\"data-group\");var S=a(this).attr(\"data-group-level\");var R=!I(Q);if(t.bExpandSingleGroup){if(!R){var P=a(\"td.expanded-group\").attr(\"data-group\");m(P);p(Q);if(t.iExpandGroupOffset!=-1){var i=a(\"#group-id-\"+E.attr(\"id\")+\"_\"+Q).offset().top-t.iExpandGroupOffset;window.scroll(0,i)}else{var i=E.offset().top;window.scroll(0,i)}}}else{if(R){m(Q)}else{p(Q)}}T.preventDefault()}function A(V){if(E.fnSettings().oFeatures.bServerSide){l=true}var Z=false;if(t.iGroupingColumnIndex2!=-1){Z=true}if(V.aiDisplayMaster.length==0){return}var T=a(\"tbody tr\",E);var Q=0;for(var ae=0;ae0){for(var ag=0;ag
        ').css({position:\"absolute\",top:0,left:0,opacity:0,width:ghostWidth,height:ghostHeight,\"background-image\":bgimage,clip:\"rect(\"+rect.join(\",\")+\")\",\"-webkit-transform\":\"translateZ(0)\",transform:\"translateZ(0)\"}),ghost.append(box);this.container.append(ghost);var boxes=shuffle(ghost.children());return boxes.each(function(i){UI.$(this).css({transition:\"all \"+$this.options.duration+\"ms ease-in-out \"+(50+25*i)+\"ms\",\"-webkit-transition\":\"all \"+$this.options.duration+\"ms ease-in-out \"+(50+25*i)+\"ms\"})}).last().on(UI.support.transition.end,function(){ghost.remove(),d.resolve()}),ghost.width(),boxes.css({opacity:1}),d.promise()},boxes:function(current,next,dir,fromfx){if(!next.data(\"cover\"))return Animations.fade.apply(this,arguments);for(var box,rect,cols,d=UI.$.Deferred(),boxCols=Math.round(this.options.slices/2),boxWidth=Math.round(next.width()/boxCols),boxRows=Math.round(next.height()/boxWidth),boxHeight=Math.round(next.height()/boxRows)+1,bgimage=next.data(\"cover\").css(\"background-image\"),ghost=UI.$(\"
      • \").css({width:next.width(),height:next.height(),opacity:1,zIndex:15}),ghostWidth=next.width(),ghostHeight=next.height(),rows=0;rows
        ').css({position:\"absolute\",top:0,left:0,opacity:1,width:ghostWidth,height:ghostHeight,\"background-image\":bgimage,\"transform-origin\":rect[3]+\" \"+rect[0]+\" 0\",clip:\"rect(\"+rect.join(\",\")+\")\",\"-webkit-transform\":\"scale(0.0000000000000001)\",transform:\"scale(0.0000000000000001)\"}),ghost.append(box);this.container.append(ghost);var prevCol,rowIndex=0,colIndex=0,timeBuff=0,box2Darr=[[]],boxes=ghost.children();for(\"boxes-reverse\"==fromfx&&(boxes=[].reverse.apply(boxes)),boxes.each(function(){box2Darr[rowIndex][colIndex]=UI.$(this),++colIndex==boxCols&&(colIndex=0,box2Darr[++rowIndex]=[])}),prevCol=cols=0;colsdelayIdle.threshold||Math.abs(src.pageY-delayIdle.pos.y)>delayIdle.threshold)&&delayIdle.apply(src)}if(draggingPlaceholder){moving||(moving=!0,draggingPlaceholder.show(),draggingPlaceholder.$current.addClass(draggingPlaceholder.$sortable.options.placeholderClass),draggingPlaceholder.$sortable.element.children().addClass(draggingPlaceholder.$sortable.options.childClass),UI.$html.addClass(draggingPlaceholder.$sortable.options.dragMovingClass));var offset=draggingPlaceholder.data(\"mouse-offset\"),left=parseInt(e.originalEvent.pageX,10)+offset.left,top=parseInt(e.originalEvent.pageY,10)+offset.top;if(draggingPlaceholder.css({left:left,top:top}),top+draggingPlaceholder.height()/3>document.body.offsetHeight)return;topwindow.innerHeight+UI.$win.scrollTop()&&UI.$win.scrollTop(UI.$win.scrollTop()+Math.ceil(draggingPlaceholder.height()/3))}}),UI.$html.on(\"mouseup touchend\",function(e){if(delayIdle=!1,currentlyDraggingElement&&draggingPlaceholder){var sortable=function(ele){ele=UI.$(ele);do{if(ele.data(\"sortable\"))return ele;ele=UI.$(ele).parent()}while(ele.length);return ele}(currentlyDraggingElement),component=draggingPlaceholder.$sortable,ev={type:e.type};sortable[0]&&component.dragDrop(ev,component.element),component.dragEnd(ev,component.element)}else currentlyDraggingElement=draggingPlaceholder=null})},init:function(){var $this=this,element=this.element[0];touchedlists=[],this.checkEmptyList(),this.element.data(\"sortable-group\",this.options.group?this.options.group:UI.Utils.uid(\"sortable-group\"));var handleDragStart=delegate(function(e){if(!e.data||!e.data.sortable){var $target=UI.$(e.target),$link=$target.is(\"a[href]\")?$target:$target.parents(\"a[href]\");if(!$target.is(\":input\"))return e.preventDefault(),!supportsTouch&&$link.length&&$link.one(\"click\",function(e){e.preventDefault()}).one(\"mouseup\",function(){moved||$link.trigger(\"click\")}),e.data=e.data||{},e.data.sortable=element,$this.dragStart(e,this)}}),handleDragEnter=delegate(UI.Utils.debounce(function(e){return $this.dragEnter(e,this)})),handleDragLeave=delegate(function(e){var previousCounter=$this.dragenterData(this);$this.dragenterData(this,previousCounter-1),$this.dragenterData(this)||(UI.$(this).removeClass($this.options.overClass),$this.dragenterData(this,!1))}),handleTouchMove=delegate(function(e){return!currentlyDraggingElement||currentlyDraggingElement===this||currentlyDraggingTarget===this||($this.element.children().removeClass($this.options.overClass),currentlyDraggingTarget=this,$this.moveElementNextTo(currentlyDraggingElement,this),function(e){e.stopPropagation&&e.stopPropagation();e.preventDefault&&e.preventDefault();e.returnValue=!1}(e))});function delegate(fn){return function(e){var target,context;e&&(target=(supportsTouch&&e.touches&&e.touches[0]||{}).target||e.target,supportsTouch&&document.elementFromPoint&&(target=document.elementFromPoint(e.pageX-document.body.scrollLeft,e.pageY-document.body.scrollTop)),overElement=UI.$(target)),UI.$(target).hasClass($this.options.childClass)?fn.apply(target,[e]):target!==element&&(context=function(parent,child){var cur=child;if(cur==parent)return null;for(;cur;){if(cur.parentNode===parent)return cur;if(!(cur=cur.parentNode)||!cur.ownerDocument||11===cur.nodeType)break}return null}(element,target))&&fn.apply(context,[e])}}this.addDragHandlers=function(){supportsTouch?element.addEventListener(\"touchmove\",handleTouchMove,!1):(element.addEventListener(\"mouseover\",handleDragEnter,!1),element.addEventListener(\"mouseout\",handleDragLeave,!1))},this.removeDragHandlers=function(){supportsTouch?element.removeEventListener(\"touchmove\",handleTouchMove,!1):(element.removeEventListener(\"mouseover\",handleDragEnter,!1),element.removeEventListener(\"mouseout\",handleDragLeave,!1))},window.addEventListener(supportsTouch?\"touchmove\":\"mousemove\",function(e){currentlyDraggingElement&&$this.dragMove(e,$this)},!1),element.addEventListener(supportsTouch?\"touchstart\":\"mousedown\",handleDragStart,!1)},dragStart:function(e,elem){moving=moved=!1;var $this=this,target=UI.$(e.target);if(supportsTouch||2!=e.button){if($this.options.handleClass)if(!(target.hasClass($this.options.handleClass)?target:target.closest(\".\"+$this.options.handleClass,$this.element)).length)return;if(!target.is(\".\"+$this.options.noDragClass)&&!target.closest(\".\"+$this.options.noDragClass).length&&!target.is(\":input\")){currentlyDraggingElement=elem,draggingPlaceholder&&draggingPlaceholder.remove();var $current=UI.$(currentlyDraggingElement),offset=$current.offset();delayIdle={pos:{x:e.pageX,y:e.pageY},threshold:$this.options.threshold,apply:function(evt){(draggingPlaceholder=UI.$('
        ').css({display:\"none\",top:offset.top,left:offset.left,width:$current.width(),height:$current.height(),padding:$current.css(\"padding\")}).data({\"mouse-offset\":{left:offset.left-parseInt(evt.pageX,10),top:offset.top-parseInt(evt.pageY,10)},origin:$this.element,index:$current.index()}).append($current.html()).appendTo(\"body\")).$current=$current,draggingPlaceholder.$sortable=$this,$current.data({\"start-list\":$current.parent(),\"start-index\":$current.index(),\"sortable-group\":$this.options.group}),$this.addDragHandlers(),$this.options.start(this,currentlyDraggingElement),$this.trigger(\"start.uk.sortable\",[$this,currentlyDraggingElement]),delayIdle=!(moved=!0)}}}}},dragMove:function(e,elem){var overChild,overRoot=(overElement=UI.$(document.elementFromPoint(e.pageX-(document.body.scrollLeft||document.scrollLeft||0),e.pageY-(document.body.scrollTop||document.documentElement.scrollTop||0)))).closest(\".\"+this.options.baseClass),groupOver=overRoot.data(\"sortable-group\"),$current=UI.$(currentlyDraggingElement),currentRoot=$current.parent(),groupCurrent=$current.data(\"sortable-group\");overRoot[0]!==currentRoot[0]&&void 0!==groupCurrent&&groupOver===groupCurrent&&(overRoot.data(\"sortable\").addDragHandlers(),touchedlists.push(overRoot),overRoot.children().addClass(this.options.childClass),0documentHeight-containerBottom-(sticky.top<0?0:sticky.top)?documentHeight-containerBottom-(scrollTop+stickyHeight):newTop}if(sticky.currentTop!=newTop){if(sticky.element.css({position:\"fixed\",top:newTop,width:sticky.getWidthFrom.length?sticky.getWidthFrom.width():sticky.element.width()}),!sticky.init&&(sticky.element.addClass(sticky.options.clsinit),location.hash&&0').parent(),this.computeWrapper(),this.element.css(\"margin\",0),boundary&&(!0===boundary||\"!\"===boundary[0]?(boundary=!0===boundary?this.wrapper.parent():this.wrapper.closest(boundary.substr(1)),boundtoparent=!0):\"string\"==typeof boundary&&(boundary=UI.$(boundary))),this.sticky={self:this,options:this.options,element:this.element,currentTop:null,wrapper:this.wrapper,init:!1,getWidthFrom:UI.$(this.options.getWidthFrom||this.wrapper),boundary:boundary,boundtoparent:boundtoparent,top:0,calcTop:function(){var top=this.options.top;if(this.options.top&&\"string\"==typeof this.options.top)if(this.options.top.match(/^(-|)(\\d+)vh$/))top=window.innerHeight*parseInt(this.options.top,10)/100;else{var topElement=UI.$(this.options.top).first();topElement.length&&topElement.is(\":visible\")&&(top=-1*(topElement.offset().top+topElement.outerHeight()-this.wrapper.offset().top))}this.top=top},reset:function(force){this.calcTop();var finalize=function(){this.element.css({position:\"\",top:\"\",width:\"\",left:\"\",margin:\"0\"}),this.element.removeClass([this.options.animation,\"uk-animation-reverse\",this.options.clsactive].join(\" \")),this.element.addClass(this.options.clsinactive),this.element.trigger(\"inactive.uk.sticky\"),this.currentTop=null,this.animate=!1}.bind(this);!force&&this.options.animation&&UI.support.animation&&!UI.Utils.isInView(this.wrapper)?(this.animate=!0,this.element.removeClass(this.options.animation).one(UI.support.animation.end,function(){finalize()}).width(),this.element.addClass(this.options.animation+\" uk-animation-reverse\")):finalize()},check:function(){if(this.options.disabled)return!1;if(this.options.media)switch(typeof this.options.media){case\"number\":if(window.innerWidth{{~items}}
      • {{$item.value}}
      • {{/items}}',this.options.source=function(release){release(times[$this.options.format]||times[\"12h\"])},container=this.element.is(\"input\")?(this.element.wrap('
        '),this.element.parent()):this.element.addClass(\"uk-autocomplete\"),this.autocomplete=UI.autocomplete(container,this.options),this.autocomplete.dropdown.addClass(\"uk-dropdown-small uk-dropdown-scrollable\"),this.autocomplete.on(\"show.uk.autocomplete\",function(){var selected=$this.autocomplete.dropdown.find('[data-value=\"'+$this.autocomplete.input.val()+'\"]');setTimeout(function(){$this.autocomplete.pick(selected,!0)},10)}),this.autocomplete.input.on(\"focus\",function(){$this.autocomplete.value=Math.random(),$this.autocomplete.triggercomplete()}).on(\"blur\",UI.Utils.debounce(function(){$this.checkTime()},100)),this.element.data(\"timepicker\",this)},checkTime:function(){var arr,timeArray,hour,minute,meridian=\"AM\",time=this.autocomplete.input.val();\"12h\"==this.options.format?(timeArray=(arr=time.split(\" \"))[0].split(\":\"),meridian=arr[1]):timeArray=time.split(\":\"),hour=parseInt(timeArray[0],10),minute=parseInt(timeArray[1],10),isNaN(hour)&&(hour=0),isNaN(minute)&&(minute=0),\"12h\"==this.options.format?(12').appendTo(\"body\")),this.on({focus:function(e){$this.show()},blur:function(e){$this.hide()},mouseenter:function(e){$this.show()},mouseleave:function(e){$this.hide()}})},show:function(){if(this.tip=\"function\"==typeof this.options.src?this.options.src(this.element):this.options.src,tooltipdelay&&clearTimeout(tooltipdelay),checkdelay&&clearTimeout(checkdelay),\"string\"==typeof this.tip&&this.tip.length){$tooltip.stop().css({top:-2e3,visibility:\"hidden\"}).removeClass(this.options.activeClass).show(),$tooltip.html('
        '+this.tip+\"
        \");var $this=this,pos=UI.$.extend({},this.element.offset(),{width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}),width=$tooltip[0].offsetWidth,height=$tooltip[0].offsetHeight,offset=\"function\"==typeof this.options.offset?this.options.offset.call(this.element):this.options.offset,position=\"function\"==typeof this.options.pos?this.options.pos.call(this.element):this.options.pos,tmppos=position.split(\"-\"),tcss={display:\"none\",visibility:\"visible\",top:pos.top+pos.height+height,left:pos.left};if(\"fixed\"==UI.$html.css(\"position\")||\"fixed\"==UI.$body.css(\"position\")){var bodyoffset=UI.$(\"body\").offset(),htmloffset=UI.$(\"html\").offset(),docoffset_top=htmloffset.top+bodyoffset.top,docoffset_left=htmloffset.left+bodyoffset.left;pos.left-=docoffset_left,pos.top-=docoffset_top}\"left\"!=tmppos[0]&&\"right\"!=tmppos[0]||\"right\"!=UI.langdirection||(tmppos[0]=\"left\"==tmppos[0]?\"right\":\"left\");var variants={bottom:{top:pos.top+pos.height+offset,left:pos.left+pos.width/2-width/2},top:{top:pos.top-height-offset,left:pos.left+pos.width/2-width/2},left:{top:pos.top+pos.height/2-height/2,left:pos.left-width-offset},right:{top:pos.top+pos.height/2-height/2,left:pos.left+pos.width+offset}};UI.$.extend(tcss,variants[tmppos[0]]),2==tmppos.length&&(tcss.left=\"left\"==tmppos[1]?pos.left:pos.left+pos.width-width);var boundary=this.checkBoundary(tcss.left,tcss.top,width,height);if(boundary){switch(boundary){case\"x\":position=2==tmppos.length?tmppos[0]+\"-\"+(tcss.left<0?\"left\":\"right\"):tcss.left<0?\"right\":\"left\";break;case\"y\":position=2==tmppos.length?(tcss.top<0?\"bottom\":\"top\")+\"-\"+tmppos[1]:tcss.top<0?\"bottom\":\"top\";break;case\"xy\":position=2==tmppos.length?(tcss.top<0?\"bottom\":\"top\")+\"-\"+(tcss.left<0?\"left\":\"right\"):tcss.left<0?\"right\":\"left\"}tmppos=position.split(\"-\"),UI.$.extend(tcss,variants[tmppos[0]]),2==tmppos.length&&(tcss.left=\"left\"==tmppos[1]?pos.left:pos.left+pos.width-width)}tcss.left-=UI.$body.position().left,tooltipdelay=setTimeout(function(){$tooltip.css(tcss).attr(\"class\",[\"uk-tooltip\",\"uk-tooltip-\"+position,$this.options.cls].join(\" \")),$this.options.animation?$tooltip.css({opacity:0,display:\"block\"}).addClass($this.options.activeClass).animate({opacity:1},parseInt($this.options.animation,10)||400):$tooltip.show().addClass($this.options.activeClass),tooltipdelay=!1,checkdelay=setInterval(function(){$this.element.is(\":visible\")||$this.hide()},150)},parseInt(this.options.delay,10)||0)}},hide:function(){if(!this.element.is(\"input\")||this.element[0]!==document.activeElement)if(tooltipdelay&&clearTimeout(tooltipdelay),checkdelay&&clearTimeout(checkdelay),$tooltip.stop(),this.options.animation){var $this=this;$tooltip.fadeOut(parseInt(this.options.animation,10)||400,function(){$tooltip.removeClass($this.options.activeClass)})}else $tooltip.hide().removeClass(this.options.activeClass)},content:function(){return this.tip},checkBoundary:function(left,top,width,height){var axis=\"\";return(left<0||left-UI.$win.scrollLeft()+width>window.innerWidth)&&(axis+=\"x\"),(top<0||top-UI.$win.scrollTop()+height>window.innerHeight)&&(axis+=\"y\"),axis}}),UI.tooltip}),function(addon){var component;window.UIkit&&(component=addon(UIkit)), true&&!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__WEBPACK_LOCAL_MODULE_0__], __WEBPACK_AMD_DEFINE_RESULT__ = (function(){return component||addon(UIkit)}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))}(function(UI){\"use strict\";var xhr,fi;function xhrupload(files,settings){if(!UI.support.ajaxupload)return this;if(settings=UI.$.extend({},xhrupload.defaults,settings),files.length){if(\"*.*\"!==settings.allow)for(var file,i=0;file=files[i];i++)if(!matchName(settings.allow,file.name))return void(\"string\"==typeof settings.notallowed?alert(settings.notallowed):settings.notallowed(file,settings));var complete=settings.complete;if(settings.single){var count=files.length,uploaded=0,allow=!0;settings.beforeAll(files),settings.complete=function(response,xhr){uploaded+=1,complete(response,xhr),settings.filelimit&&uploaded>=settings.filelimit&&(allow=!1),allow&&uploaded
        ',$body.on(\"show.uk.modal\",\".uk-modal-dialog-replace\",function(){setTimeout(function(){var dialogReplace=$(\".uk-modal-dialog-replace\");if(dialogReplace.find(\".uk-button-primary\").length){var actionBtn=dialogReplace.find(\".uk-button-primary\").toggleClass(\"uk-button-primary md-btn-flat-primary\");actionBtn.next(\"button\")&&actionBtn.next(\"button\").after(actionBtn)}dialogReplace.find(\".uk-button\").length&&dialogReplace.find(\".uk-button\").toggleClass(\"uk-button md-btn md-btn-flat\"),dialogReplace.find(\".uk-margin-small-top\").length&&dialogReplace.find(\".uk-margin-small-top\").toggleClass(\"uk-margin-small-top uk-margin-top\"),dialogReplace.find(\"input.uk-width-1-1\").length&&dialogReplace.find(\"input.uk-width-1-1\").toggleClass(\"uk-width-1-1 md-input\"),dialogReplace.find(\".uk-form\").length&&dialogReplace.find(\".uk-form\").removeClass(\"uk-form\")},50)})}void 0!==UIkit.components.tooltip&&$.extend(UIkit.components.tooltip.prototype.defaults,{animation:280,offset:8}),void 0!==UIkit.components.sortable&&Modernizr.touch&&$(\"[data-uk-sortable]\").children().addClass(\"needsclick\")});\n\n/*** EXPORTS FROM exports-loader ***/\nmodule.exports = UIkit;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! moment */ \"./src/public/js/vendor/moment/moment.js\"), __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! modernizr */ \"./src/public/js/vendor/modernizr/modernizr.js\")))\n\n//# sourceURL=webpack:///./src/public/js/vendor/uikit/js/uikit_combined.min.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/velocity/velocity.min.js": -/*!*******************************************************!*\ - !*** ./src/public/js/vendor/velocity/velocity.min.js ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function(__webpack_provided_window_dot_jQuery, jQuery) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! VelocityJS.org (1.2.3). (C) 2014 Julian Shapiro. MIT @license: en.wikipedia.org/wiki/MIT_License */\r\n/*! VelocityJS.org jQuery Shim (1.0.1). (C) 2014 The jQuery Foundation. MIT @license: en.wikipedia.org/wiki/MIT_License. */\r\n!function(a){function b(a){var b=a.length,d=c.type(a);return\"function\"===d||c.isWindow(a)?!1:1===a.nodeType&&b?!0:\"array\"===d||0===b||\"number\"==typeof b&&b>0&&b-1 in a}if(!__webpack_provided_window_dot_jQuery){var c=function(a,b){return new c.fn.init(a,b)};c.isWindow=function(a){return null!=a&&a==a.window},c.type=function(a){return null==a?a+\"\":\"object\"==typeof a||\"function\"==typeof a?e[g.call(a)]||\"object\":typeof a},c.isArray=Array.isArray||function(a){return\"array\"===c.type(a)},c.isPlainObject=function(a){var b;if(!a||\"object\"!==c.type(a)||a.nodeType||c.isWindow(a))return!1;try{if(a.constructor&&!f.call(a,\"constructor\")&&!f.call(a.constructor.prototype,\"isPrototypeOf\"))return!1}catch(d){return!1}for(b in a);return void 0===b||f.call(a,b)},c.each=function(a,c,d){var e,f=0,g=a.length,h=b(a);if(d){if(h)for(;g>f&&(e=c.apply(a[f],d),e!==!1);f++);else for(f in a)if(e=c.apply(a[f],d),e===!1)break}else if(h)for(;g>f&&(e=c.call(a[f],f,a[f]),e!==!1);f++);else for(f in a)if(e=c.call(a[f],f,a[f]),e===!1)break;return a},c.data=function(a,b,e){if(void 0===e){var f=a[c.expando],g=f&&d[f];if(void 0===b)return g;if(g&&b in g)return g[b]}else if(void 0!==b){var f=a[c.expando]||(a[c.expando]=++c.uuid);return d[f]=d[f]||{},d[f][b]=e,e}},c.removeData=function(a,b){var e=a[c.expando],f=e&&d[e];f&&c.each(b,function(a,b){delete f[b]})},c.extend=function(){var a,b,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;for(\"boolean\"==typeof h&&(k=h,h=arguments[i]||{},i++),\"object\"!=typeof h&&\"function\"!==c.type(h)&&(h={}),i===j&&(h=this,i--);j>i;i++)if(null!=(f=arguments[i]))for(e in f)a=h[e],d=f[e],h!==d&&(k&&d&&(c.isPlainObject(d)||(b=c.isArray(d)))?(b?(b=!1,g=a&&c.isArray(a)?a:[]):g=a&&c.isPlainObject(a)?a:{},h[e]=c.extend(k,g,d)):void 0!==d&&(h[e]=d));return h},c.queue=function(a,d,e){function f(a,c){var d=c||[];return null!=a&&(b(Object(a))?!function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;)a[e++]=b[d++];if(c!==c)for(;void 0!==b[d];)a[e++]=b[d++];return a.length=e,a}(d,\"string\"==typeof a?[a]:a):[].push.call(d,a)),d}if(a){d=(d||\"fx\")+\"queue\";var g=c.data(a,d);return e?(!g||c.isArray(e)?g=c.data(a,d,f(e)):g.push(e),g):g||[]}},c.dequeue=function(a,b){c.each(a.nodeType?[a]:a,function(a,d){b=b||\"fx\";var e=c.queue(d,b),f=e.shift();\"inprogress\"===f&&(f=e.shift()),f&&(\"fx\"===b&&e.unshift(\"inprogress\"),f.call(d,function(){c.dequeue(d,b)}))})},c.fn=c.prototype={init:function(a){if(a.nodeType)return this[0]=a,this;throw new Error(\"Not a DOM node.\")},offset:function(){var b=this[0].getBoundingClientRect?this[0].getBoundingClientRect():{top:0,left:0};return{top:b.top+(a.pageYOffset||document.scrollTop||0)-(document.clientTop||0),left:b.left+(a.pageXOffset||document.scrollLeft||0)-(document.clientLeft||0)}},position:function(){function a(){for(var a=this.offsetParent||document;a&&\"html\"===!a.nodeType.toLowerCase&&\"static\"===a.style.position;)a=a.offsetParent;return a||document}var b=this[0],a=a.apply(b),d=this.offset(),e=/^(?:body|html)$/i.test(a.nodeName)?{top:0,left:0}:c(a).offset();return d.top-=parseFloat(b.style.marginTop)||0,d.left-=parseFloat(b.style.marginLeft)||0,a.style&&(e.top+=parseFloat(a.style.borderTopWidth)||0,e.left+=parseFloat(a.style.borderLeftWidth)||0),{top:d.top-e.top,left:d.left-e.left}}};var d={};c.expando=\"velocity\"+(new Date).getTime(),c.uuid=0;for(var e={},f=e.hasOwnProperty,g=e.toString,h=\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"),i=0;ie;++e){var f=j(c,a,d);if(0===f)return c;var g=i(c,a,d)-b;c-=g/f}return c}function l(){for(var b=0;t>b;++b)x[b]=i(b*u,a,d)}function m(b,c,e){var f,g,h=0;do g=c+(e-c)/2,f=i(g,a,d)-b,f>0?e=g:c=g;while(Math.abs(f)>r&&++h=q?k(b,h):0==i?h:m(b,c,c+u)}function o(){y=!0,(a!=c||d!=e)&&l()}var p=4,q=.001,r=1e-7,s=10,t=11,u=1/(t-1),v=\"Float32Array\"in b;if(4!==arguments.length)return!1;for(var w=0;4>w;++w)if(\"number\"!=typeof arguments[w]||isNaN(arguments[w])||!isFinite(arguments[w]))return!1;a=Math.min(a,1),d=Math.min(d,1),a=Math.max(a,0),d=Math.max(d,0);var x=v?new Float32Array(t):new Array(t),y=!1,z=function(b){return y||o(),a===c&&d===e?b:0===b?0:1===b?1:i(n(b),c,e)};z.getControlPoints=function(){return[{x:a,y:c},{x:d,y:e}]};var A=\"generateBezier(\"+[a,c,d,e]+\")\";return z.toString=function(){return A},z}function j(a,b){var c=a;return p.isString(a)?t.Easings[a]||(c=!1):c=p.isArray(a)&&1===a.length?h.apply(null,a):p.isArray(a)&&2===a.length?u.apply(null,a.concat([b])):p.isArray(a)&&4===a.length?i.apply(null,a):!1,c===!1&&(c=t.Easings[t.defaults.easing]?t.defaults.easing:s),c}function k(a){if(a){var b=(new Date).getTime(),c=t.State.calls.length;c>1e4&&(t.State.calls=e(t.State.calls));for(var f=0;c>f;f++)if(t.State.calls[f]){var h=t.State.calls[f],i=h[0],j=h[2],n=h[3],o=!!n,q=null;n||(n=t.State.calls[f][3]=b-16);for(var r=Math.min((b-n)/j.duration,1),s=0,u=i.length;u>s;s++){var w=i[s],y=w.element;if(g(y)){var z=!1;if(j.display!==d&&null!==j.display&&\"none\"!==j.display){if(\"flex\"===j.display){var A=[\"-webkit-box\",\"-moz-box\",\"-ms-flexbox\",\"-webkit-flex\"];m.each(A,function(a,b){v.setPropertyValue(y,\"display\",b)})}v.setPropertyValue(y,\"display\",j.display)}j.visibility!==d&&\"hidden\"!==j.visibility&&v.setPropertyValue(y,\"visibility\",j.visibility);for(var B in w)if(\"element\"!==B){var C,D=w[B],E=p.isString(D.easing)?t.Easings[D.easing]:D.easing;if(1===r)C=D.endValue;else{var F=D.endValue-D.startValue;if(C=D.startValue+F*E(r,j,F),!o&&C===D.currentValue)continue}if(D.currentValue=C,\"tween\"===B)q=C;else{if(v.Hooks.registered[B]){var G=v.Hooks.getRoot(B),H=g(y).rootPropertyValueCache[G];H&&(D.rootPropertyValue=H)}var I=v.setPropertyValue(y,B,D.currentValue+(0===parseFloat(C)?\"\":D.unitType),D.rootPropertyValue,D.scrollData);v.Hooks.registered[B]&&(g(y).rootPropertyValueCache[G]=v.Normalizations.registered[G]?v.Normalizations.registered[G](\"extract\",null,I[1]):I[1]),\"transform\"===I[0]&&(z=!0)}}j.mobileHA&&g(y).transformCache.translate3d===d&&(g(y).transformCache.translate3d=\"(0px, 0px, 0px)\",z=!0),z&&v.flushTransformCache(y)}}j.display!==d&&\"none\"!==j.display&&(t.State.calls[f][2].display=!1),j.visibility!==d&&\"hidden\"!==j.visibility&&(t.State.calls[f][2].visibility=!1),j.progress&&j.progress.call(h[1],h[1],r,Math.max(0,n+j.duration-b),n,q),1===r&&l(f)}}t.State.isTicking&&x(k)}function l(a,b){if(!t.State.calls[a])return!1;for(var c=t.State.calls[a][0],e=t.State.calls[a][1],f=t.State.calls[a][2],h=t.State.calls[a][4],i=!1,j=0,k=c.length;k>j;j++){var l=c[j].element;if(b||f.loop||(\"none\"===f.display&&v.setPropertyValue(l,\"display\",f.display),\"hidden\"===f.visibility&&v.setPropertyValue(l,\"visibility\",f.visibility)),f.loop!==!0&&(m.queue(l)[1]===d||!/\\.velocityQueueEntryFlag/i.test(m.queue(l)[1]))&&g(l)){g(l).isAnimating=!1,g(l).rootPropertyValueCache={};var n=!1;m.each(v.Lists.transforms3D,function(a,b){var c=/^scale/.test(b)?1:0,e=g(l).transformCache[b];g(l).transformCache[b]!==d&&new RegExp(\"^\\\\(\"+c+\"[^.]\").test(e)&&(n=!0,delete g(l).transformCache[b])}),f.mobileHA&&(n=!0,delete g(l).transformCache.translate3d),n&&v.flushTransformCache(l),v.Values.removeClass(l,\"velocity-animating\")}if(!b&&f.complete&&!f.loop&&j===k-1)try{f.complete.call(e,e)}catch(o){setTimeout(function(){throw o},1)}h&&f.loop!==!0&&h(e),g(l)&&f.loop===!0&&!b&&(m.each(g(l).tweensContainer,function(a,b){/^rotate/.test(a)&&360===parseFloat(b.endValue)&&(b.endValue=0,b.startValue=360),/^backgroundPosition/.test(a)&&100===parseFloat(b.endValue)&&\"%\"===b.unitType&&(b.endValue=0,b.startValue=100)}),t(l,\"reverse\",{loop:!0,delay:f.delay})),f.queue!==!1&&m.dequeue(l,f.queue)}t.State.calls[a]=!1;for(var p=0,q=t.State.calls.length;q>p;p++)if(t.State.calls[p]!==!1){i=!0;break}i===!1&&(t.State.isTicking=!1,delete t.State.calls,t.State.calls=[])}var m,n=function(){if(c.documentMode)return c.documentMode;for(var a=7;a>4;a--){var b=c.createElement(\"div\");if(b.innerHTML=\"\",b.getElementsByTagName(\"span\").length)return b=null,a}return d}(),o=function(){var a=0;return b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||function(b){var c,d=(new Date).getTime();return c=Math.max(0,16-(d-a)),a=d+c,setTimeout(function(){b(d+c)},c)}}(),p={isString:function(a){return\"string\"==typeof a},isArray:Array.isArray||function(a){return\"[object Array]\"===Object.prototype.toString.call(a)},isFunction:function(a){return\"[object Function]\"===Object.prototype.toString.call(a)},isNode:function(a){return a&&a.nodeType},isNodeList:function(a){return\"object\"==typeof a&&/^\\[object (HTMLCollection|NodeList|Object)\\]$/.test(Object.prototype.toString.call(a))&&a.length!==d&&(0===a.length||\"object\"==typeof a[0]&&a[0].nodeType>0)},isWrapped:function(a){return a&&(a.jquery||b.Zepto&&b.Zepto.zepto.isZ(a))},isSVG:function(a){return b.SVGElement&&a instanceof b.SVGElement},isEmptyObject:function(a){for(var b in a)return!1;return!0}},q=!1;if(a.fn&&a.fn.jquery?(m=a,q=!0):m=b.Velocity.Utilities,8>=n&&!q)throw new Error(\"Velocity: IE8 and below require jQuery to be loaded before Velocity.\");if(7>=n)return void(jQuery.fn.velocity=jQuery.fn.animate);var r=400,s=\"swing\",t={State:{isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),isAndroid:/Android/i.test(navigator.userAgent),isGingerbread:/Android 2\\.3\\.[3-7]/i.test(navigator.userAgent),isChrome:b.chrome,isFirefox:/Firefox/i.test(navigator.userAgent),prefixElement:c.createElement(\"div\"),prefixMatches:{},scrollAnchor:null,scrollPropertyLeft:null,scrollPropertyTop:null,isTicking:!1,calls:[]},CSS:{},Utilities:m,Redirects:{},Easings:{},Promise:b.Promise,defaults:{queue:\"\",duration:r,easing:s,begin:d,complete:d,progress:d,display:d,visibility:d,loop:!1,delay:!1,mobileHA:!0,_cacheValues:!0},init:function(a){m.data(a,\"velocity\",{isSVG:p.isSVG(a),isAnimating:!1,computedStyle:null,tweensContainer:null,rootPropertyValueCache:{},transformCache:{}})},hook:null,mock:!1,version:{major:1,minor:2,patch:2},debug:!1};b.pageYOffset!==d?(t.State.scrollAnchor=b,t.State.scrollPropertyLeft=\"pageXOffset\",t.State.scrollPropertyTop=\"pageYOffset\"):(t.State.scrollAnchor=c.documentElement||c.body.parentNode||c.body,t.State.scrollPropertyLeft=\"scrollLeft\",t.State.scrollPropertyTop=\"scrollTop\");var u=function(){function a(a){return-a.tension*a.x-a.friction*a.v}function b(b,c,d){var e={x:b.x+d.dx*c,v:b.v+d.dv*c,tension:b.tension,friction:b.friction};return{dx:e.v,dv:a(e)}}function c(c,d){var e={dx:c.v,dv:a(c)},f=b(c,.5*d,e),g=b(c,.5*d,f),h=b(c,d,g),i=1/6*(e.dx+2*(f.dx+g.dx)+h.dx),j=1/6*(e.dv+2*(f.dv+g.dv)+h.dv);return c.x=c.x+i*d,c.v=c.v+j*d,c}return function d(a,b,e){var f,g,h,i={x:-1,v:0,tension:null,friction:null},j=[0],k=0,l=1e-4,m=.016;for(a=parseFloat(a)||500,b=parseFloat(b)||20,e=e||null,i.tension=a,i.friction=b,f=null!==e,f?(k=d(a,b),g=k/e*m):g=m;;)if(h=c(h||i,g),j.push(1+h.x),k+=16,!(Math.abs(h.x)>l&&Math.abs(h.v)>l))break;return f?function(a){return j[a*(j.length-1)|0]}:k}}();t.Easings={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},spring:function(a){return 1-Math.cos(4.5*a*Math.PI)*Math.exp(6*-a)}},m.each([[\"ease\",[.25,.1,.25,1]],[\"ease-in\",[.42,0,1,1]],[\"ease-out\",[0,0,.58,1]],[\"ease-in-out\",[.42,0,.58,1]],[\"easeInSine\",[.47,0,.745,.715]],[\"easeOutSine\",[.39,.575,.565,1]],[\"easeInOutSine\",[.445,.05,.55,.95]],[\"easeInQuad\",[.55,.085,.68,.53]],[\"easeOutQuad\",[.25,.46,.45,.94]],[\"easeInOutQuad\",[.455,.03,.515,.955]],[\"easeInCubic\",[.55,.055,.675,.19]],[\"easeOutCubic\",[.215,.61,.355,1]],[\"easeInOutCubic\",[.645,.045,.355,1]],[\"easeInQuart\",[.895,.03,.685,.22]],[\"easeOutQuart\",[.165,.84,.44,1]],[\"easeInOutQuart\",[.77,0,.175,1]],[\"easeInQuint\",[.755,.05,.855,.06]],[\"easeOutQuint\",[.23,1,.32,1]],[\"easeInOutQuint\",[.86,0,.07,1]],[\"easeInExpo\",[.95,.05,.795,.035]],[\"easeOutExpo\",[.19,1,.22,1]],[\"easeInOutExpo\",[1,0,0,1]],[\"easeInCirc\",[.6,.04,.98,.335]],[\"easeOutCirc\",[.075,.82,.165,1]],[\"easeInOutCirc\",[.785,.135,.15,.86]]],function(a,b){t.Easings[b[0]]=i.apply(null,b[1])});var v=t.CSS={RegEx:{isHex:/^#([A-f\\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\\((.*)\\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\\(.+\\))|(([A-z0-9#-.]+?)(?=\\s|$))/gi},Lists:{colors:[\"fill\",\"stroke\",\"stopColor\",\"color\",\"backgroundColor\",\"borderColor\",\"borderTopColor\",\"borderRightColor\",\"borderBottomColor\",\"borderLeftColor\",\"outlineColor\"],transformsBase:[\"translateX\",\"translateY\",\"scale\",\"scaleX\",\"scaleY\",\"skewX\",\"skewY\",\"rotateZ\"],transforms3D:[\"transformPerspective\",\"translateZ\",\"scaleZ\",\"rotateX\",\"rotateY\"]},Hooks:{templates:{textShadow:[\"Color X Y Blur\",\"black 0px 0px 0px\"],boxShadow:[\"Color X Y Blur Spread\",\"black 0px 0px 0px 0px\"],clip:[\"Top Right Bottom Left\",\"0px 0px 0px 0px\"],backgroundPosition:[\"X Y\",\"0% 0%\"],transformOrigin:[\"X Y Z\",\"50% 50% 0px\"],perspectiveOrigin:[\"X Y\",\"50% 50%\"]},registered:{},register:function(){for(var a=0;a=n)switch(a){case\"name\":return\"filter\";case\"extract\":var d=c.toString().match(/alpha\\(opacity=(.*)\\)/i);return c=d?d[1]/100:1;case\"inject\":return b.style.zoom=1,parseFloat(c)>=1?\"\":\"alpha(opacity=\"+parseInt(100*parseFloat(c),10)+\")\"}else switch(a){case\"name\":return\"opacity\";case\"extract\":return c;case\"inject\":return c}}},register:function(){9>=n||t.State.isGingerbread||(v.Lists.transformsBase=v.Lists.transformsBase.concat(v.Lists.transforms3D));for(var a=0;ae&&(e=1),f=!/(\\d)$/i.test(e);break;case\"skew\":f=!/(deg|\\d)$/i.test(e);break;case\"rotate\":f=!/(deg|\\d)$/i.test(e)}return f||(g(c).transformCache[b]=\"(\"+e+\")\"),g(c).transformCache[b]}}}();for(var a=0;a=n||3!==f.split(\" \").length||(f+=\" 1\"),f;case\"inject\":return 8>=n?4===e.split(\" \").length&&(e=e.split(/\\s+/).slice(0,3).join(\" \")):3===e.split(\" \").length&&(e+=\" 1\"),(8>=n?\"rgb\":\"rgba\")+\"(\"+e.replace(/\\s+/g,\",\").replace(/\\.(\\d)+(?=,)/g,\"\")+\")\"}}}()}},Names:{camelCase:function(a){return a.replace(/-(\\w)/g,function(a,b){return b.toUpperCase()})},SVGAttribute:function(a){var b=\"width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2\";return(n||t.State.isAndroid&&!t.State.isChrome)&&(b+=\"|transform\"),new RegExp(\"^(\"+b+\")$\",\"i\").test(a)},prefixCheck:function(a){if(t.State.prefixMatches[a])return[t.State.prefixMatches[a],!0];for(var b=[\"\",\"Webkit\",\"Moz\",\"ms\",\"O\"],c=0,d=b.length;d>c;c++){var e;if(e=0===c?a:b[c]+a.replace(/^\\w/,function(a){return a.toUpperCase()}),p.isString(t.State.prefixElement.style[e]))return t.State.prefixMatches[a]=e,[e,!0]}return[a,!1]}},Values:{hexToRgb:function(a){var b,c=/^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i,d=/^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i;return a=a.replace(c,function(a,b,c,d){return b+b+c+c+d+d}),b=d.exec(a),b?[parseInt(b[1],16),parseInt(b[2],16),parseInt(b[3],16)]:[0,0,0]},isCSSNullValue:function(a){return 0==a||/^(none|auto|transparent|(rgba\\(0, ?0, ?0, ?0\\)))$/i.test(a)},getUnitType:function(a){return/^(rotate|skew)/i.test(a)?\"deg\":/(^(scale|scaleX|scaleY|scaleZ|alpha|flexGrow|flexHeight|zIndex|fontWeight)$)|((opacity|red|green|blue|alpha)$)/i.test(a)?\"\":\"px\"},getDisplayType:function(a){var b=a&&a.tagName.toString().toLowerCase();return/^(b|big|i|small|tt|abbr|acronym|cite|code|dfn|em|kbd|strong|samp|var|a|bdo|br|img|map|object|q|script|span|sub|sup|button|input|label|select|textarea)$/i.test(b)?\"inline\":/^(li)$/i.test(b)?\"list-item\":/^(tr)$/i.test(b)?\"table-row\":/^(table)$/i.test(b)?\"table\":/^(tbody)$/i.test(b)?\"table-row-group\":\"block\"},addClass:function(a,b){a.classList?a.classList.add(b):a.className+=(a.className.length?\" \":\"\")+b},removeClass:function(a,b){a.classList?a.classList.remove(b):a.className=a.className.toString().replace(new RegExp(\"(^|\\\\s)\"+b.split(\" \").join(\"|\")+\"(\\\\s|$)\",\"gi\"),\" \")}},getPropertyValue:function(a,c,e,f){function h(a,c){function e(){j&&v.setPropertyValue(a,\"display\",\"none\")}var i=0;if(8>=n)i=m.css(a,c);else{var j=!1;if(/^(width|height)$/.test(c)&&0===v.getPropertyValue(a,\"display\")&&(j=!0,v.setPropertyValue(a,\"display\",v.Values.getDisplayType(a))),!f){if(\"height\"===c&&\"border-box\"!==v.getPropertyValue(a,\"boxSizing\").toString().toLowerCase()){var k=a.offsetHeight-(parseFloat(v.getPropertyValue(a,\"borderTopWidth\"))||0)-(parseFloat(v.getPropertyValue(a,\"borderBottomWidth\"))||0)-(parseFloat(v.getPropertyValue(a,\"paddingTop\"))||0)-(parseFloat(v.getPropertyValue(a,\"paddingBottom\"))||0);return e(),k}if(\"width\"===c&&\"border-box\"!==v.getPropertyValue(a,\"boxSizing\").toString().toLowerCase()){var l=a.offsetWidth-(parseFloat(v.getPropertyValue(a,\"borderLeftWidth\"))||0)-(parseFloat(v.getPropertyValue(a,\"borderRightWidth\"))||0)-(parseFloat(v.getPropertyValue(a,\"paddingLeft\"))||0)-(parseFloat(v.getPropertyValue(a,\"paddingRight\"))||0);return e(),l}}var o;o=g(a)===d?b.getComputedStyle(a,null):g(a).computedStyle?g(a).computedStyle:g(a).computedStyle=b.getComputedStyle(a,null),\"borderColor\"===c&&(c=\"borderTopColor\"),i=9===n&&\"filter\"===c?o.getPropertyValue(c):o[c],(\"\"===i||null===i)&&(i=a.style[c]),e()}if(\"auto\"===i&&/^(top|right|bottom|left)$/i.test(c)){var p=h(a,\"position\");(\"fixed\"===p||\"absolute\"===p&&/top|left/i.test(c))&&(i=m(a).position()[c]+\"px\")}return i}var i;if(v.Hooks.registered[c]){var j=c,k=v.Hooks.getRoot(j);e===d&&(e=v.getPropertyValue(a,v.Names.prefixCheck(k)[0])),v.Normalizations.registered[k]&&(e=v.Normalizations.registered[k](\"extract\",a,e)),i=v.Hooks.extractValue(j,e)}else if(v.Normalizations.registered[c]){var l,o;l=v.Normalizations.registered[c](\"name\",a),\"transform\"!==l&&(o=h(a,v.Names.prefixCheck(l)[0]),v.Values.isCSSNullValue(o)&&v.Hooks.templates[c]&&(o=v.Hooks.templates[c][1])),i=v.Normalizations.registered[c](\"extract\",a,o)}if(!/^[\\d-]/.test(i))if(g(a)&&g(a).isSVG&&v.Names.SVGAttribute(c))if(/^(height|width)$/i.test(c))try{i=a.getBBox()[c]}catch(p){i=0}else i=a.getAttribute(c);else i=h(a,v.Names.prefixCheck(c)[0]);return v.Values.isCSSNullValue(i)&&(i=0),t.debug>=2&&console.log(\"Get \"+c+\": \"+i),i},setPropertyValue:function(a,c,d,e,f){var h=c;if(\"scroll\"===c)f.container?f.container[\"scroll\"+f.direction]=d:\"Left\"===f.direction?b.scrollTo(d,f.alternateValue):b.scrollTo(f.alternateValue,d);else if(v.Normalizations.registered[c]&&\"transform\"===v.Normalizations.registered[c](\"name\",a))v.Normalizations.registered[c](\"inject\",a,d),h=\"transform\",d=g(a).transformCache[c];else{if(v.Hooks.registered[c]){var i=c,j=v.Hooks.getRoot(c);e=e||v.getPropertyValue(a,j),d=v.Hooks.injectValue(i,d,e),c=j}if(v.Normalizations.registered[c]&&(d=v.Normalizations.registered[c](\"inject\",a,d),c=v.Normalizations.registered[c](\"name\",a)),h=v.Names.prefixCheck(c)[0],8>=n)try{a.style[h]=d}catch(k){t.debug&&console.log(\"Browser does not support [\"+d+\"] for [\"+h+\"]\")}else g(a)&&g(a).isSVG&&v.Names.SVGAttribute(c)?a.setAttribute(c,d):a.style[h]=d;t.debug>=2&&console.log(\"Set \"+c+\" (\"+h+\"): \"+d)}return[h,d]},flushTransformCache:function(a){function b(b){return parseFloat(v.getPropertyValue(a,b))}var c=\"\";if((n||t.State.isAndroid&&!t.State.isChrome)&&g(a).isSVG){var d={translate:[b(\"translateX\"),b(\"translateY\")],skewX:[b(\"skewX\")],skewY:[b(\"skewY\")],scale:1!==b(\"scale\")?[b(\"scale\"),b(\"scale\")]:[b(\"scaleX\"),b(\"scaleY\")],rotate:[b(\"rotateZ\"),0,0]};m.each(g(a).transformCache,function(a){/^translate/i.test(a)?a=\"translate\":/^scale/i.test(a)?a=\"scale\":/^rotate/i.test(a)&&(a=\"rotate\"),d[a]&&(c+=a+\"(\"+d[a].join(\" \")+\") \",delete d[a])})}else{var e,f;m.each(g(a).transformCache,function(b){return e=g(a).transformCache[b],\"transformPerspective\"===b?(f=e,!0):(9===n&&\"rotateZ\"===b&&(b=\"rotate\"),void(c+=b+e+\" \"))}),f&&(c=\"perspective\"+f+\" \"+c)}v.setPropertyValue(a,\"transform\",c)}};v.Hooks.register(),v.Normalizations.register(),t.hook=function(a,b,c){var e=d;return a=f(a),m.each(a,function(a,f){if(g(f)===d&&t.init(f),c===d)e===d&&(e=t.CSS.getPropertyValue(f,b));else{var h=t.CSS.setPropertyValue(f,b,c);\"transform\"===h[0]&&t.CSS.flushTransformCache(f),e=h}}),e};var w=function(){function a(){return h?B.promise||null:i}function e(){function a(){function a(a,b){var c=d,e=d,g=d;return p.isArray(a)?(c=a[0],!p.isArray(a[1])&&/^[\\d-]/.test(a[1])||p.isFunction(a[1])||v.RegEx.isHex.test(a[1])?g=a[1]:(p.isString(a[1])&&!v.RegEx.isHex.test(a[1])||p.isArray(a[1]))&&(e=b?a[1]:j(a[1],h.duration),a[2]!==d&&(g=a[2]))):c=a,b||(e=e||h.easing),p.isFunction(c)&&(c=c.call(f,y,x)),p.isFunction(g)&&(g=g.call(f,y,x)),[c||0,e,g]}function l(a,b){var c,d;return d=(b||\"0\").toString().toLowerCase().replace(/[%A-z]+$/,function(a){return c=a,\"\"}),c||(c=v.Values.getUnitType(a)),[d,c]}function n(){var a={myParent:f.parentNode||c.body,position:v.getPropertyValue(f,\"position\"),fontSize:v.getPropertyValue(f,\"fontSize\")},d=a.position===I.lastPosition&&a.myParent===I.lastParent,e=a.fontSize===I.lastFontSize;I.lastParent=a.myParent,I.lastPosition=a.position,I.lastFontSize=a.fontSize;var h=100,i={};if(e&&d)i.emToPx=I.lastEmToPx,i.percentToPxWidth=I.lastPercentToPxWidth,i.percentToPxHeight=I.lastPercentToPxHeight;else{var j=g(f).isSVG?c.createElementNS(\"http://www.w3.org/2000/svg\",\"rect\"):c.createElement(\"div\");t.init(j),a.myParent.appendChild(j),m.each([\"overflow\",\"overflowX\",\"overflowY\"],function(a,b){t.CSS.setPropertyValue(j,b,\"hidden\")}),t.CSS.setPropertyValue(j,\"position\",a.position),t.CSS.setPropertyValue(j,\"fontSize\",a.fontSize),t.CSS.setPropertyValue(j,\"boxSizing\",\"content-box\"),m.each([\"minWidth\",\"maxWidth\",\"width\",\"minHeight\",\"maxHeight\",\"height\"],function(a,b){t.CSS.setPropertyValue(j,b,h+\"%\")}),t.CSS.setPropertyValue(j,\"paddingLeft\",h+\"em\"),i.percentToPxWidth=I.lastPercentToPxWidth=(parseFloat(v.getPropertyValue(j,\"width\",null,!0))||1)/h,i.percentToPxHeight=I.lastPercentToPxHeight=(parseFloat(v.getPropertyValue(j,\"height\",null,!0))||1)/h,i.emToPx=I.lastEmToPx=(parseFloat(v.getPropertyValue(j,\"paddingLeft\"))||1)/h,a.myParent.removeChild(j)}return null===I.remToPx&&(I.remToPx=parseFloat(v.getPropertyValue(c.body,\"fontSize\"))||16),null===I.vwToPx&&(I.vwToPx=parseFloat(b.innerWidth)/100,I.vhToPx=parseFloat(b.innerHeight)/100),i.remToPx=I.remToPx,i.vwToPx=I.vwToPx,i.vhToPx=I.vhToPx,t.debug>=1&&console.log(\"Unit ratios: \"+JSON.stringify(i),f),i}if(h.begin&&0===y)try{h.begin.call(o,o)}catch(r){setTimeout(function(){throw r},1)}if(\"scroll\"===C){var u,w,z,A=/^x$/i.test(h.axis)?\"Left\":\"Top\",D=parseFloat(h.offset)||0;h.container?p.isWrapped(h.container)||p.isNode(h.container)?(h.container=h.container[0]||h.container,u=h.container[\"scroll\"+A],z=u+m(f).position()[A.toLowerCase()]+D):h.container=null:(u=t.State.scrollAnchor[t.State[\"scrollProperty\"+A]],w=t.State.scrollAnchor[t.State[\"scrollProperty\"+(\"Left\"===A?\"Top\":\"Left\")]],z=m(f).offset()[A.toLowerCase()]+D),i={scroll:{rootPropertyValue:!1,startValue:u,currentValue:u,endValue:z,unitType:\"\",easing:h.easing,scrollData:{container:h.container,direction:A,alternateValue:w}},element:f},t.debug&&console.log(\"tweensContainer (scroll): \",i.scroll,f)}else if(\"reverse\"===C){if(!g(f).tweensContainer)return void m.dequeue(f,h.queue);\"none\"===g(f).opts.display&&(g(f).opts.display=\"auto\"),\"hidden\"===g(f).opts.visibility&&(g(f).opts.visibility=\"visible\"),g(f).opts.loop=!1,g(f).opts.begin=null,g(f).opts.complete=null,s.easing||delete h.easing,s.duration||delete h.duration,h=m.extend({},g(f).opts,h);var E=m.extend(!0,{},g(f).tweensContainer);for(var F in E)if(\"element\"!==F){var G=E[F].startValue;E[F].startValue=E[F].currentValue=E[F].endValue,E[F].endValue=G,p.isEmptyObject(s)||(E[F].easing=h.easing),t.debug&&console.log(\"reverse tweensContainer (\"+F+\"): \"+JSON.stringify(E[F]),f)}i=E}else if(\"start\"===C){var E;g(f).tweensContainer&&g(f).isAnimating===!0&&(E=g(f).tweensContainer),m.each(q,function(b,c){if(RegExp(\"^\"+v.Lists.colors.join(\"$|^\")+\"$\").test(b)){var e=a(c,!0),f=e[0],g=e[1],h=e[2];if(v.RegEx.isHex.test(f)){for(var i=[\"Red\",\"Green\",\"Blue\"],j=v.Values.hexToRgb(f),k=h?v.Values.hexToRgb(h):d,l=0;lL;L++){var M={delay:E.delay,progress:E.progress};L===K-1&&(M.display=E.display,M.visibility=E.visibility,M.complete=E.complete),w(o,\"reverse\",M)}return a()}};t=m.extend(w,t),t.animate=w;var x=b.requestAnimationFrame||o;return t.State.isMobile||c.hidden===d||c.addEventListener(\"visibilitychange\",function(){c.hidden?(x=function(a){return setTimeout(function(){a(!0)},16)},k()):x=b.requestAnimationFrame||o}),a.Velocity=t,a!==b&&(a.fn.velocity=w,a.fn.velocity.defaults=t.defaults),m.each([\"Down\",\"Up\"],function(a,b){t.Redirects[\"slide\"+b]=function(a,c,e,f,g,h){var i=m.extend({},c),j=i.begin,k=i.complete,l={height:\"\",marginTop:\"\",marginBottom:\"\",paddingTop:\"\",paddingBottom:\"\"},n={};i.display===d&&(i.display=\"Down\"===b?\"inline\"===t.CSS.Values.getDisplayType(a)?\"inline-block\":\"block\":\"none\"),i.begin=function(){j&&j.call(g,g);for(var c in l){n[c]=a.style[c];var d=t.CSS.getPropertyValue(a,c);l[c]=\"Down\"===b?[d,0]:[0,d]}n.overflow=a.style.overflow,a.style.overflow=\"hidden\"},i.complete=function(){for(var b in n)a.style[b]=n[b];k&&k.call(g,g),h&&h.resolver(g)},t(a,l,i)}}),m.each([\"In\",\"Out\"],function(a,b){t.Redirects[\"fade\"+b]=function(a,c,e,f,g,h){var i=m.extend({},c),j={opacity:\"In\"===b?1:0},k=i.complete;i.complete=e!==f-1?i.begin=null:function(){k&&k.call(g,g),h&&h.resolver(g)},i.display===d&&(i.display=\"In\"===b?\"auto\":\"none\"),t(this,j,i)}}),t}(__webpack_provided_window_dot_jQuery||window.Zepto||window,window,document)});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\")))\n\n//# sourceURL=webpack:///./src/public/js/vendor/velocity/velocity.min.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/waves/waves.js": -/*!*********************************************!*\ - !*** ./src/public/js/vendor/waves/waves.js ***! - \*********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function(global) {var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\r\n * Waves v0.7.4\r\n * http://fian.my.id/Waves\r\n *\r\n * Copyright 2014 Alfiana E. Sibuea and other contributors\r\n * Released under the MIT license\r\n * https://github.com/fians/Waves/blob/master/LICENSE\r\n */\r\n\r\n;(function(window, factory) {\r\n 'use strict';\r\n\r\n // AMD. Register as an anonymous module. Wrap in function so we have access\r\n // to root via `this`.\r\n if (true) {\r\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {\r\n return factory.apply(window);\r\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n }\r\n\r\n // Node. Does not work with strict CommonJS, but only CommonJS-like\r\n // environments that support module.exports, like Node.\r\n else {}\r\n})(typeof global === 'object' ? global : this, function() {\r\n 'use strict';\r\n\r\n var Waves = Waves || {};\r\n var $$ = document.querySelectorAll.bind(document);\r\n var toString = Object.prototype.toString;\r\n var isTouchAvailable = 'ontouchstart' in window;\r\n\r\n\r\n // Find exact position of element\r\n function isWindow(obj) {\r\n return obj !== null && obj === obj.window;\r\n }\r\n\r\n function getWindow(elem) {\r\n return isWindow(elem) ? elem : elem.nodeType === 9 && elem.defaultView;\r\n }\r\n\r\n function isObject(value) {\r\n var type = typeof value;\r\n return type === 'function' || type === 'object' && !!value;\r\n }\r\n\r\n function isDOMNode(obj) {\r\n return isObject(obj) && obj.nodeType > 0;\r\n }\r\n\r\n function getWavesElements(nodes) {\r\n var stringRepr = toString.call(nodes);\r\n\r\n if (stringRepr === '[object String]') {\r\n return $$(nodes);\r\n } else if (isObject(nodes) && /^\\[object (HTMLCollection|NodeList|Object)\\]$/.test(stringRepr) && nodes.hasOwnProperty('length')) {\r\n return nodes;\r\n } else if (isDOMNode(nodes)) {\r\n return [nodes];\r\n }\r\n\r\n return [];\r\n }\r\n\r\n function offset(elem) {\r\n var docElem, win,\r\n box = { top: 0, left: 0 },\r\n doc = elem && elem.ownerDocument;\r\n\r\n docElem = doc.documentElement;\r\n\r\n if (typeof elem.getBoundingClientRect !== typeof undefined) {\r\n box = elem.getBoundingClientRect();\r\n }\r\n win = getWindow(doc);\r\n return {\r\n top: box.top + win.pageYOffset - docElem.clientTop,\r\n left: box.left + win.pageXOffset - docElem.clientLeft\r\n };\r\n }\r\n\r\n function convertStyle(styleObj) {\r\n var style = '';\r\n\r\n for (var prop in styleObj) {\r\n if (styleObj.hasOwnProperty(prop)) {\r\n style += (prop + ':' + styleObj[prop] + ';');\r\n }\r\n }\r\n\r\n return style;\r\n }\r\n\r\n var Effect = {\r\n\r\n // Effect duration\r\n duration: 750,\r\n\r\n // Effect delay (check for scroll before showing effect)\r\n delay: 200,\r\n\r\n show: function(e, element, velocity) {\r\n\r\n // Disable right click\r\n if (e.button === 2) {\r\n return false;\r\n }\r\n\r\n element = element || this;\r\n\r\n // Create ripple\r\n var ripple = document.createElement('div');\r\n ripple.className = 'waves-ripple waves-rippling';\r\n element.appendChild(ripple);\r\n\r\n // Get click coordinate and element width\r\n var pos = offset(element);\r\n var relativeY = 0;\r\n var relativeX = 0;\r\n // Support for touch devices\r\n if('touches' in e && e.touches.length) {\r\n relativeY = (e.touches[0].pageY - pos.top);\r\n relativeX = (e.touches[0].pageX - pos.left);\r\n }\r\n //Normal case\r\n else {\r\n relativeY = (e.pageY - pos.top);\r\n relativeX = (e.pageX - pos.left);\r\n }\r\n // Support for synthetic events\r\n relativeX = relativeX >= 0 ? relativeX : 0;\r\n relativeY = relativeY >= 0 ? relativeY : 0;\r\n\r\n var scale = 'scale(' + ((element.clientWidth / 100) * 3) + ')';\r\n var translate = 'translate(0,0)';\r\n\r\n if (velocity) {\r\n translate = 'translate(' + (velocity.x) + 'px, ' + (velocity.y) + 'px)';\r\n }\r\n\r\n // Attach data to element\r\n ripple.setAttribute('data-hold', Date.now());\r\n ripple.setAttribute('data-x', relativeX);\r\n ripple.setAttribute('data-y', relativeY);\r\n ripple.setAttribute('data-scale', scale);\r\n ripple.setAttribute('data-translate', translate);\r\n\r\n // Set ripple position\r\n var rippleStyle = {\r\n top: relativeY + 'px',\r\n left: relativeX + 'px'\r\n };\r\n\r\n ripple.classList.add('waves-notransition');\r\n ripple.setAttribute('style', convertStyle(rippleStyle));\r\n ripple.classList.remove('waves-notransition');\r\n\r\n // Scale the ripple\r\n rippleStyle['-webkit-transform'] = scale + ' ' + translate;\r\n rippleStyle['-moz-transform'] = scale + ' ' + translate;\r\n rippleStyle['-ms-transform'] = scale + ' ' + translate;\r\n rippleStyle['-o-transform'] = scale + ' ' + translate;\r\n rippleStyle.transform = scale + ' ' + translate;\r\n rippleStyle.opacity = '1';\r\n\r\n var duration = e.type === 'mousemove' ? 2500 : Effect.duration;\r\n rippleStyle['-webkit-transition-duration'] = duration + 'ms';\r\n rippleStyle['-moz-transition-duration'] = duration + 'ms';\r\n rippleStyle['-o-transition-duration'] = duration + 'ms';\r\n rippleStyle['transition-duration'] = duration + 'ms';\r\n\r\n ripple.setAttribute('style', convertStyle(rippleStyle));\r\n },\r\n\r\n hide: function(e, element) {\r\n element = element || this;\r\n\r\n var ripples = element.getElementsByClassName('waves-rippling');\r\n\r\n for (var i = 0, len = ripples.length; i < len; i++) {\r\n removeRipple(e, element, ripples[i]);\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Collection of wrapper for HTML element that only have single tag\r\n * like and \r\n */\r\n var TagWrapper = {\r\n\r\n // Wrap tag so it can perform the effect\r\n input: function(element) {\r\n\r\n var parent = element.parentNode;\r\n\r\n // If input already have parent just pass through\r\n if (parent.tagName.toLowerCase() === 'i' && parent.classList.contains('waves-effect')) {\r\n return;\r\n }\r\n\r\n // Put element class and style to the specified parent\r\n var wrapper = document.createElement('i');\r\n wrapper.className = element.className + ' waves-input-wrapper';\r\n element.className = 'waves-button-input';\r\n\r\n // Put element as child\r\n parent.replaceChild(wrapper, element);\r\n wrapper.appendChild(element);\r\n\r\n // Apply element color and background color to wrapper\r\n var elementStyle = window.getComputedStyle(element, null);\r\n var color = elementStyle.color;\r\n var backgroundColor = elementStyle.backgroundColor;\r\n\r\n wrapper.setAttribute('style', 'color:' + color + ';background:' + backgroundColor);\r\n element.setAttribute('style', 'background-color:rgba(0,0,0,0);');\r\n\r\n },\r\n\r\n // Wrap tag so it can perform the effect\r\n img: function(element) {\r\n\r\n var parent = element.parentNode;\r\n\r\n // If input already have parent just pass through\r\n if (parent.tagName.toLowerCase() === 'i' && parent.classList.contains('waves-effect')) {\r\n return;\r\n }\r\n\r\n // Put element as child\r\n var wrapper = document.createElement('i');\r\n parent.replaceChild(wrapper, element);\r\n wrapper.appendChild(element);\r\n\r\n }\r\n };\r\n\r\n /**\r\n * Hide the effect and remove the ripple. Must be\r\n * a separate function to pass the JSLint...\r\n */\r\n function removeRipple(e, el, ripple) {\r\n\r\n // Check if the ripple still exist\r\n if (!ripple) {\r\n return;\r\n }\r\n\r\n ripple.classList.remove('waves-rippling');\r\n\r\n var relativeX = ripple.getAttribute('data-x');\r\n var relativeY = ripple.getAttribute('data-y');\r\n var scale = ripple.getAttribute('data-scale');\r\n var translate = ripple.getAttribute('data-translate');\r\n\r\n // Get delay beetween mousedown and mouse leave\r\n var diff = Date.now() - Number(ripple.getAttribute('data-hold'));\r\n var delay = 350 - diff;\r\n\r\n if (delay < 0) {\r\n delay = 0;\r\n }\r\n\r\n if (e.type === 'mousemove') {\r\n delay = 150;\r\n }\r\n\r\n // Fade out ripple after delay\r\n var duration = e.type === 'mousemove' ? 2500 : Effect.duration;\r\n\r\n setTimeout(function() {\r\n\r\n var style = {\r\n top: relativeY + 'px',\r\n left: relativeX + 'px',\r\n opacity: '0',\r\n\r\n // Duration\r\n '-webkit-transition-duration': duration + 'ms',\r\n '-moz-transition-duration': duration + 'ms',\r\n '-o-transition-duration': duration + 'ms',\r\n 'transition-duration': duration + 'ms',\r\n '-webkit-transform': scale + ' ' + translate,\r\n '-moz-transform': scale + ' ' + translate,\r\n '-ms-transform': scale + ' ' + translate,\r\n '-o-transform': scale + ' ' + translate,\r\n 'transform': scale + ' ' + translate\r\n };\r\n\r\n ripple.setAttribute('style', convertStyle(style));\r\n\r\n setTimeout(function() {\r\n try {\r\n el.removeChild(ripple);\r\n } catch (e) {\r\n return false;\r\n }\r\n }, duration);\r\n\r\n }, delay);\r\n }\r\n\r\n\r\n /**\r\n * Disable mousedown event for 500ms during and after touch\r\n */\r\n var TouchHandler = {\r\n\r\n /* uses an integer rather than bool so there's no issues with\r\n * needing to clear timeouts if another touch event occurred\r\n * within the 500ms. Cannot mouseup between touchstart and\r\n * touchend, nor in the 500ms after touchend. */\r\n touches: 0,\r\n\r\n allowEvent: function(e) {\r\n\r\n var allow = true;\r\n\r\n if (/^(mousedown|mousemove)$/.test(e.type) && TouchHandler.touches) {\r\n allow = false;\r\n }\r\n\r\n return allow;\r\n },\r\n registerEvent: function(e) {\r\n var eType = e.type;\r\n\r\n if (eType === 'touchstart') {\r\n\r\n TouchHandler.touches += 1; // push\r\n\r\n } else if (/^(touchend|touchcancel)$/.test(eType)) {\r\n\r\n setTimeout(function() {\r\n if (TouchHandler.touches) {\r\n TouchHandler.touches -= 1; // pop after 500ms\r\n }\r\n }, 500);\r\n\r\n }\r\n }\r\n };\r\n\r\n\r\n /**\r\n * Delegated click handler for .waves-effect element.\r\n * returns null when .waves-effect element not in \"click tree\"\r\n */\r\n function getWavesEffectElement(e) {\r\n\r\n if (TouchHandler.allowEvent(e) === false) {\r\n return null;\r\n }\r\n\r\n var element = null;\r\n var target = e.target || e.srcElement;\r\n\r\n while (target.parentElement !== null) {\r\n if (target.classList.contains('waves-effect') && (!(target instanceof SVGElement))) {\r\n element = target;\r\n break;\r\n }\r\n target = target.parentElement;\r\n }\r\n\r\n return element;\r\n }\r\n\r\n /**\r\n * Bubble the click and show effect if .waves-effect elem was found\r\n */\r\n function showEffect(e) {\r\n\r\n // Disable effect if element has \"disabled\" property on it\r\n // In some cases, the event is not triggered by the current element\r\n // if (e.target.getAttribute('disabled') !== null) {\r\n // return;\r\n // }\r\n\r\n var element = getWavesEffectElement(e);\r\n\r\n if (element !== null) {\r\n\r\n // Make it sure the element has either disabled property, disabled attribute or 'disabled' class\r\n if (element.disabled || element.getAttribute('disabled') || element.classList.contains('disabled')) {\r\n return;\r\n }\r\n\r\n TouchHandler.registerEvent(e);\r\n\r\n if (e.type === 'touchstart' && Effect.delay) {\r\n\r\n var hidden = false;\r\n\r\n var timer = setTimeout(function () {\r\n timer = null;\r\n Effect.show(e, element);\r\n }, Effect.delay);\r\n\r\n var hideEffect = function(hideEvent) {\r\n\r\n // if touch hasn't moved, and effect not yet started: start effect now\r\n if (timer) {\r\n clearTimeout(timer);\r\n timer = null;\r\n Effect.show(e, element);\r\n }\r\n if (!hidden) {\r\n hidden = true;\r\n Effect.hide(hideEvent, element);\r\n }\r\n };\r\n\r\n var touchMove = function(moveEvent) {\r\n if (timer) {\r\n clearTimeout(timer);\r\n timer = null;\r\n }\r\n hideEffect(moveEvent);\r\n };\r\n\r\n element.addEventListener('touchmove', touchMove, false);\r\n element.addEventListener('touchend', hideEffect, false);\r\n element.addEventListener('touchcancel', hideEffect, false);\r\n\r\n } else {\r\n\r\n Effect.show(e, element);\r\n\r\n if (isTouchAvailable) {\r\n element.addEventListener('touchend', Effect.hide, false);\r\n element.addEventListener('touchcancel', Effect.hide, false);\r\n }\r\n\r\n element.addEventListener('mouseup', Effect.hide, false);\r\n element.addEventListener('mouseleave', Effect.hide, false);\r\n }\r\n }\r\n }\r\n\r\n Waves.init = function(options) {\r\n var body = document.body;\r\n\r\n options = options || {};\r\n\r\n if ('duration' in options) {\r\n Effect.duration = options.duration;\r\n }\r\n\r\n if ('delay' in options) {\r\n Effect.delay = options.delay;\r\n }\r\n\r\n if (isTouchAvailable) {\r\n body.addEventListener('touchstart', showEffect, false);\r\n body.addEventListener('touchcancel', TouchHandler.registerEvent, false);\r\n body.addEventListener('touchend', TouchHandler.registerEvent, false);\r\n }\r\n\r\n body.addEventListener('mousedown', showEffect, false);\r\n };\r\n\r\n\r\n /**\r\n * Attach Waves to dynamically loaded inputs, or add .waves-effect and other\r\n * waves classes to a set of elements. Set drag to true if the ripple mouseover\r\n * or skimming effect should be applied to the elements.\r\n */\r\n Waves.attach = function(elements, classes) {\r\n\r\n elements = getWavesElements(elements);\r\n\r\n if (toString.call(classes) === '[object Array]') {\r\n classes = classes.join(' ');\r\n }\r\n\r\n classes = classes ? ' ' + classes : '';\r\n\r\n var element, tagName;\r\n\r\n for (var i = 0, len = elements.length; i < len; i++) {\r\n\r\n element = elements[i];\r\n tagName = element.tagName.toLowerCase();\r\n\r\n if (['input', 'img'].indexOf(tagName) !== -1) {\r\n TagWrapper[tagName](element);\r\n element = element.parentElement;\r\n }\r\n\r\n if (element.className.indexOf('waves-effect') === -1) {\r\n element.className += ' waves-effect' + classes;\r\n }\r\n }\r\n };\r\n\r\n\r\n /**\r\n * Cause a ripple to appear in an element via code.\r\n */\r\n Waves.ripple = function(elements, options) {\r\n elements = getWavesElements(elements);\r\n var elementsLen = elements.length;\r\n\r\n options = options || {};\r\n options.wait = options.wait || 0;\r\n options.position = options.position || null; // default = centre of element\r\n\r\n\r\n if (elementsLen) {\r\n var element, pos, off, centre = {}, i = 0;\r\n var mousedown = {\r\n type: 'mousedown',\r\n button: 1\r\n };\r\n var hideRipple = function(mouseup, element) {\r\n return function() {\r\n Effect.hide(mouseup, element);\r\n };\r\n };\r\n\r\n for (; i < elementsLen; i++) {\r\n element = elements[i];\r\n pos = options.position || {\r\n x: element.clientWidth / 2,\r\n y: element.clientHeight / 2\r\n };\r\n\r\n off = offset(element);\r\n centre.x = off.left + pos.x;\r\n centre.y = off.top + pos.y;\r\n\r\n mousedown.pageX = centre.x;\r\n mousedown.pageY = centre.y;\r\n\r\n Effect.show(mousedown, element);\r\n\r\n if (options.wait >= 0 && options.wait !== null) {\r\n var mouseup = {\r\n type: 'mouseup',\r\n button: 1\r\n };\r\n\r\n setTimeout(hideRipple(mouseup, element), options.wait);\r\n }\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Remove all ripples from an element.\r\n */\r\n Waves.calm = function(elements) {\r\n elements = getWavesElements(elements);\r\n var mouseup = {\r\n type: 'mouseup',\r\n button: 1\r\n };\r\n\r\n for (var i = 0, len = elements.length; i < len; i++) {\r\n Effect.hide(mouseup, elements[i]);\r\n }\r\n };\r\n\r\n /**\r\n * Deprecated API fallback\r\n */\r\n Waves.displayEffect = function(options) {\r\n console.error('Waves.displayEffect() has been deprecated and will be removed in future version. Please use Waves.init() to initialize Waves effect');\r\n Waves.init(options);\r\n };\r\n\r\n return Waves;\r\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack:///./src/public/js/vendor/waves/waves.js?"); - -/***/ }) - -/******/ }); \ No newline at end of file diff --git a/public/js/trudesk.min.js b/public/js/trudesk.min.js deleted file mode 100644 index 9325c6447..000000000 --- a/public/js/trudesk.min.js +++ /dev/null @@ -1,212 +0,0 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ }; -/******/ -/******/ -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ "trudesk.min": 0 -/******/ }; -/******/ -/******/ -/******/ -/******/ // script path function -/******/ function jsonpScriptSrc(chunkId) { -/******/ return __webpack_require__.p + "" + ({}[chunkId]||chunkId) + ".js" -/******/ } -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ // This file contains only the entry chunk. -/******/ // The chunk loading function for additional chunks -/******/ __webpack_require__.e = function requireEnsure(chunkId) { -/******/ var promises = []; -/******/ -/******/ -/******/ // JSONP chunk loading for javascript -/******/ -/******/ var installedChunkData = installedChunks[chunkId]; -/******/ if(installedChunkData !== 0) { // 0 means "already installed". -/******/ -/******/ // a Promise means "currently loading". -/******/ if(installedChunkData) { -/******/ promises.push(installedChunkData[2]); -/******/ } else { -/******/ // setup Promise in chunk cache -/******/ var promise = new Promise(function(resolve, reject) { -/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; -/******/ }); -/******/ promises.push(installedChunkData[2] = promise); -/******/ -/******/ // start chunk loading -/******/ var script = document.createElement('script'); -/******/ var onScriptComplete; -/******/ -/******/ script.charset = 'utf-8'; -/******/ script.timeout = 120; -/******/ if (__webpack_require__.nc) { -/******/ script.setAttribute("nonce", __webpack_require__.nc); -/******/ } -/******/ script.src = jsonpScriptSrc(chunkId); -/******/ -/******/ onScriptComplete = function (event) { -/******/ // avoid mem leaks in IE. -/******/ script.onerror = script.onload = null; -/******/ clearTimeout(timeout); -/******/ var chunk = installedChunks[chunkId]; -/******/ if(chunk !== 0) { -/******/ if(chunk) { -/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); -/******/ var realSrc = event && event.target && event.target.src; -/******/ var error = new Error('Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'); -/******/ error.type = errorType; -/******/ error.request = realSrc; -/******/ chunk[1](error); -/******/ } -/******/ installedChunks[chunkId] = undefined; -/******/ } -/******/ }; -/******/ var timeout = setTimeout(function(){ -/******/ onScriptComplete({ type: 'timeout', target: script }); -/******/ }, 120000); -/******/ script.onerror = script.onload = onScriptComplete; -/******/ document.head.appendChild(script); -/******/ } -/******/ } -/******/ return Promise.all(promises); -/******/ }; -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "/js/"; -/******/ -/******/ // on error function for async loading -/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = "./src/public/js/app.js"); -/******/ }) -/************************************************************************/ -/******/ ({ - -/***/ "./src/public/js/app.js": -/*!******************************!*\ - !*** ./src/public/js/app.js ***! - \******************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/**\r\n . .o8 oooo\r\n .o8 \"888 `888\r\n .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo\r\n 888 `888\"\"8P `888 `888 d88' `888 d88' `88b d88( \"8 888 .8P'\r\n 888 888 888 888 888 888 888ooo888 `\"Y88b. 888888.\r\n 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b.\r\n \"888\" d888b `V88V\"V8P' `Y8bod88P\" `Y8bod8P' 8\"\"888P' o888o o888o\r\n ========================================================================\r\n Created: 02/10/2015\r\n Author: Chris Brame\r\n\r\n **/\r\n\r\n// Load SASS (Webpack)\r\n// require('../../sass/app.sass');\r\n\r\nPromise.all(/*! AMD require */[__webpack_require__.e(2), __webpack_require__.e(1)]).then(function() { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [__webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\"), __webpack_require__(/*! modules/helpers */ \"./src/public/js/modules/helpers.js\"), __webpack_require__(/*! angular */ \"./src/public/js/vendor/angular/angular.min.js\"), __webpack_require__(/*! async */ \"./src/public/js/vendor/async/async.js\"), __webpack_require__(/*! angularjs/services */ \"./src/public/js/angularjs/services.js\")]; (function ($, helpers, angular, async) {\r\n helpers.init()\r\n\r\n angular.element(document).ready(function () {\r\n // Call the Session service before bootstrapping.\r\n // Allowing the SessionUser to be populated before the controllers have access.\r\n async.parallel(\r\n [\r\n function (done) {\r\n angular\r\n .injector(['ng', 'trudesk.services.session'])\r\n .get('SessionService')\r\n .init(done)\r\n },\r\n function (done) {\r\n angular\r\n .injector(['ng', 'trudesk.services.settings'])\r\n .get('SettingsService')\r\n .init(done)\r\n }\r\n ],\r\n function (err) {\r\n if (err) throw new Error(err)\r\n\r\n __webpack_require__.e(/*! AMD require */ 3).then(function() { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [__webpack_require__(/*! angularjs/main */ \"./src/public/js/angularjs/main.js\")]; (function () {\r\n // Static Bootstraps\r\n angular.bootstrap($('.top-bar'), ['trudesk'])\r\n angular.bootstrap($('#ticketFilterModal'), ['trudesk'])\r\n angular.bootstrap($('#ticketCreateModal'), ['trudesk'])\r\n\r\n // Dynamic Bootstrap\r\n angular.bootstrap($('#page-content'), ['trudesk'])\r\n\r\n __webpack_require__.e(/*! AMD require */ 5).then(function() { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [\r\n __webpack_require__(/*! underscore */ \"./src/public/js/vendor/underscore/underscore.js\"),\r\n __webpack_require__(/*! modules/navigation */ \"./src/public/js/modules/navigation.js\"),\r\n __webpack_require__(/*! modules/socket */ \"./src/public/js/modules/socket.js\"),\r\n __webpack_require__(/*! uikit */ \"./src/public/js/vendor/uikit/js/uikit_combined.min.js\"),\r\n __webpack_require__(/*! modules/ajaxify */ \"./src/public/js/modules/ajaxify.js\"),\r\n __webpack_require__(/*! modernizr */ \"./src/public/js/vendor/modernizr/modernizr.js\"),\r\n __webpack_require__(/*! fastclick */ \"./src/public/js/vendor/fastclick/fastclick.js\"),\r\n __webpack_require__(/*! placeholder */ \"./src/public/js/vendor/placeholder/placeholder.js\"),\r\n __webpack_require__(/*! pace */ \"./src/public/js/vendor/pace/pace.min.js\"),\r\n __webpack_require__(/*! easypiechart */ \"./src/public/js/vendor/easypiechart/easypiechart.js\"),\r\n __webpack_require__(/*! idletimer */ \"./src/public/js/plugins/jquery.idletimer.js\")\r\n ]; (function (_, nav, socket) {\r\n // Page loading (init)\r\n Promise.resolve(/*! AMD require */).then(function() { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [__webpack_require__(/*! pages/pageloader */ \"./src/public/js/pages/pageloader.js\")]; (function (pl) {\r\n pl.init(function () {\r\n nav.init()\r\n\r\n var $event = _.debounce(function () {\r\n helpers.hideLoader(1000)\r\n helpers.countUpMe()\r\n helpers.UI.cardShow()\r\n\r\n // 5min idle timer\r\n var idleTime = 5 * 60 * 1000\r\n\r\n $(document).idleTimer(idleTime)\r\n $(document).on('idle.idleTimer', function () {\r\n socket.chat.setUserIdle()\r\n })\r\n\r\n $(document).on('active.idleTimer', function () {\r\n socket.chat.setUserActive()\r\n })\r\n\r\n $.event.trigger('$trudesk:ready', window)\r\n }, 100)\r\n\r\n $event()\r\n })\r\n }).apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__);}).catch(__webpack_require__.oe)\r\n }).apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__);}).catch(__webpack_require__.oe)\r\n }).apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__);}).catch(__webpack_require__.oe)\r\n }\r\n )\r\n })\r\n}).apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__);}).catch(__webpack_require__.oe)\r\n\n\n//# sourceURL=webpack:///./src/public/js/app.js?"); - -/***/ }) - -/******/ }); \ No newline at end of file diff --git a/public/js/vendor.js b/public/js/vendor.js deleted file mode 100644 index 64d9f591f..000000000 --- a/public/js/vendor.js +++ /dev/null @@ -1,146 +0,0 @@ -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["vendor"],{ - -/***/ "./src/public/js/plugins/jquery.custom.js": -/*!************************************************!*\ - !*** ./src/public/js/plugins/jquery.custom.js ***! - \************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function(jQuery) {/*!\r\n * jQuery serializeObject - v0.2 - 1/20/2010\r\n * http://benalman.com/projects/jquery-misc-plugins/\r\n *\r\n * Copyright (c) 2010 \"Cowboy\" Ben Alman\r\n * Dual licensed under the MIT and GPL licenses.\r\n * http://benalman.com/about/license/\r\n */\r\n\r\n// Whereas .serializeArray() serializes a form into an array, .serializeObject()\r\n// serializes a form into an (arguably more useful) object.\r\n\r\n;(function ($, undefined) {\r\n '$:nomunge' // Used by YUI compressor.\r\n\r\n $.fn.serializeObject = function () {\r\n var obj = {}\r\n\r\n $.each(this.serializeArray(), function (i, o) {\r\n var n = o.name,\r\n v = o.value\r\n\r\n obj[n] = obj[n] === undefined ? v : $.isArray(obj[n]) ? obj[n].concat(v) : [obj[n], v]\r\n })\r\n\r\n return obj\r\n }\r\n\r\n /**\r\n This is a jQuery plugin to support resizing text areas.\r\n\r\n Originally based off text area resizer by Ryan O'Dell : http://plugins.jquery.com/misc/textarea.js\r\n Modifications by Discourse https://github.com/discourse/discourse\r\n @module $.fn.DivResizer\r\n **/\r\n\r\n var div,\r\n endDrag,\r\n grip,\r\n lastMousePos,\r\n min,\r\n mousePosition,\r\n originalDivHeight,\r\n originalPos,\r\n performDrag,\r\n startDrag,\r\n wrappedEndDrag,\r\n wrappedPerformDrag\r\n div = void 0\r\n originalPos = void 0\r\n originalDivHeight = void 0\r\n lastMousePos = 0\r\n min = 350\r\n grip = void 0\r\n wrappedEndDrag = void 0\r\n wrappedPerformDrag = void 0\r\n\r\n startDrag = function (e, opts) {\r\n div = $(e.data.el)\r\n div.addClass('clear-transitions')\r\n div.blur()\r\n lastMousePos = mousePosition(e).y\r\n originalPos = lastMousePos\r\n originalDivHeight = div.height()\r\n wrappedPerformDrag = (function () {\r\n return function (e) {\r\n return performDrag(e, opts)\r\n }\r\n })()\r\n wrappedEndDrag = (function () {\r\n return function (e) {\r\n return endDrag(e, opts)\r\n }\r\n })()\r\n $(document)\r\n .mousemove(wrappedPerformDrag)\r\n .mouseup(wrappedEndDrag)\r\n return false\r\n }\r\n\r\n performDrag = function (e, opts) {\r\n $(div).trigger('div-resizing')\r\n\r\n var size, sizePx, thisMousePos\r\n thisMousePos = mousePosition(e).y\r\n size = originalDivHeight + (originalPos - thisMousePos)\r\n lastMousePos = thisMousePos\r\n\r\n var maxHeight = $(window).height()\r\n if (opts.maxHeight) {\r\n maxHeight = opts.maxHeight(maxHeight)\r\n }\r\n size = Math.min(size, maxHeight)\r\n size = Math.max(min, size)\r\n sizePx = size + 'px'\r\n if (typeof opts.onDrag === 'function') {\r\n opts.onDrag(sizePx)\r\n }\r\n div.height(sizePx)\r\n if (size < min) {\r\n endDrag(e, opts)\r\n }\r\n return false\r\n }\r\n\r\n endDrag = function (e, opts) {\r\n $(document)\r\n .unbind('mousemove', wrappedPerformDrag)\r\n .unbind('mouseup', wrappedEndDrag)\r\n div.removeClass('clear-transitions')\r\n div.focus()\r\n if (typeof opts.resize === 'function') {\r\n opts.resize()\r\n }\r\n $(div).trigger('div-resized')\r\n div = null\r\n }\r\n\r\n mousePosition = function (e) {\r\n return {\r\n x: e.clientX + document.documentElement.scrollLeft,\r\n y: e.clientY + document.documentElement.scrollTop\r\n }\r\n }\r\n\r\n $.fn.DivResizer = function (opts) {\r\n return this.each(function () {\r\n var grippie, start, staticOffset\r\n div = $(this)\r\n if (div.hasClass('processed')) return\r\n div.addClass('processed')\r\n staticOffset = null\r\n start = function () {\r\n return function (e) {\r\n return startDrag(e, opts)\r\n }\r\n }\r\n grippie = div\r\n .prepend(\"
        \")\r\n .find('.grippie')\r\n .bind(\r\n 'mousedown',\r\n {\r\n el: this\r\n },\r\n start()\r\n )\r\n })\r\n }\r\n})(jQuery)\r\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\")))\n\n//# sourceURL=webpack:///./src/public/js/plugins/jquery.custom.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/angular/angular-cookies.min.js": -/*!*************************************************************!*\ - !*** ./src/public/js/vendor/angular/angular-cookies.min.js ***! - \*************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("/*\r\n AngularJS v1.4.7\r\n (c) 2010-2015 Google, Inc. http://angularjs.org\r\n License: MIT\r\n */\r\n(function(p,c,n){'use strict';function l(b,a,g){var d=g.baseHref(),k=b[0];return function(b,e,f){var g,h;f=f||{};h=f.expires;g=c.isDefined(f.path)?f.path:d;c.isUndefined(e)&&(h=\"Thu, 01 Jan 1970 00:00:00 GMT\",e=\"\");c.isString(h)&&(h=new Date(h));e=encodeURIComponent(b)+\"=\"+encodeURIComponent(e);e=e+(g?\";path=\"+g:\"\")+(f.domain?\";domain=\"+f.domain:\"\");e+=h?\";expires=\"+h.toUTCString():\"\";e+=f.secure?\";secure\":\"\";f=e.length+1;4096 4096 bytes)!\");k.cookie=e}}c.module(\"ngCookies\",[\"ng\"]).provider(\"$cookies\",[function(){var b=this.defaults={};this.$get=[\"$$cookieReader\",\"$$cookieWriter\",function(a,g){return{get:function(d){return a()[d]},getObject:function(d){return(d=this.get(d))?c.fromJson(d):d},getAll:function(){return a()},put:function(d,a,m){g(d,a,m?c.extend({},b,m):b)},putObject:function(d,b,a){this.put(d,c.toJson(b),a)},remove:function(a,k){g(a,n,k?c.extend({},b,k):b)}}}]}]);c.module(\"ngCookies\").factory(\"$cookieStore\",\r\n [\"$cookies\",function(b){return{get:function(a){return b.getObject(a)},put:function(a,c){b.putObject(a,c)},remove:function(a){b.remove(a)}}}]);l.$inject=[\"$document\",\"$log\",\"$browser\"];c.module(\"ngCookies\").provider(\"$$cookieWriter\",function(){this.$get=l})})(window,window.angular);\n\n//# sourceURL=webpack:///./src/public/js/vendor/angular/angular-cookies.min.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/angular/angular-route.min.js": -/*!***********************************************************!*\ - !*** ./src/public/js/vendor/angular/angular-route.min.js ***! - \***********************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -eval("/*\r\n AngularJS v1.4.7\r\n (c) 2010-2015 Google, Inc. http://angularjs.org\r\n License: MIT\r\n */\r\n(function(p,c,C){'use strict';function v(r,h,g){return{restrict:\"ECA\",terminal:!0,priority:400,transclude:\"element\",link:function(a,f,b,d,y){function z(){k&&(g.cancel(k),k=null);l&&(l.$destroy(),l=null);m&&(k=g.leave(m),k.then(function(){k=null}),m=null)}function x(){var b=r.current&&r.current.locals;if(c.isDefined(b&&b.$template)){var b=a.$new(),d=r.current;m=y(b,function(b){g.enter(b,null,m||f).then(function(){!c.isDefined(t)||t&&!a.$eval(t)||h()});z()});l=d.scope=b;l.$emit(\"$viewContentLoaded\");\r\n l.$eval(w)}else z()}var l,m,k,t=b.autoscroll,w=b.onload||\"\";a.$on(\"$routeChangeSuccess\",x);x()}}}function A(c,h,g){return{restrict:\"ECA\",priority:-400,link:function(a,f){var b=g.current,d=b.locals;f.html(d.$template);var y=c(f.contents());b.controller&&(d.$scope=a,d=h(b.controller,d),b.controllerAs&&(a[b.controllerAs]=d),f.data(\"$ngControllerController\",d),f.children().data(\"$ngControllerController\",d));y(a)}}}p=c.module(\"ngRoute\",[\"ng\"]).provider(\"$route\",function(){function r(a,f){return c.extend(Object.create(a),\r\n f)}function h(a,c){var b=c.caseInsensitiveMatch,d={originalPath:a,regexp:a},g=d.keys=[];a=a.replace(/([().])/g,\"\\\\$1\").replace(/(\\/)?:(\\w+)([\\?\\*])?/g,function(a,c,b,d){a=\"?\"===d?d:null;d=\"*\"===d?d:null;g.push({name:b,optional:!!a});c=c||\"\";return\"\"+(a?\"\":c)+\"(?:\"+(a?c:\"\")+(d&&\"(.+?)\"||\"([^/]+)\")+(a||\"\")+\")\"+(a||\"\")}).replace(/([\\/$\\*])/g,\"\\\\$1\");d.regexp=new RegExp(\"^\"+a+\"$\",b?\"i\":\"\");return d}var g={};this.when=function(a,f){var b=c.copy(f);c.isUndefined(b.reloadOnSearch)&&(b.reloadOnSearch=!0);\r\n c.isUndefined(b.caseInsensitiveMatch)&&(b.caseInsensitiveMatch=this.caseInsensitiveMatch);g[a]=c.extend(b,a&&h(a,b));if(a){var d=\"/\"==a[a.length-1]?a.substr(0,a.length-1):a+\"/\";g[d]=c.extend({redirectTo:a},h(d,b))}return this};this.caseInsensitiveMatch=!1;this.otherwise=function(a){\"string\"===typeof a&&(a={redirectTo:a});this.when(null,a);return this};this.$get=[\"$rootScope\",\"$location\",\"$routeParams\",\"$q\",\"$injector\",\"$templateRequest\",\"$sce\",function(a,f,b,d,h,p,x){function l(b){var e=s.current;\r\n (v=(n=k())&&e&&n.$$route===e.$$route&&c.equals(n.pathParams,e.pathParams)&&!n.reloadOnSearch&&!w)||!e&&!n||a.$broadcast(\"$routeChangeStart\",n,e).defaultPrevented&&b&&b.preventDefault()}function m(){var u=s.current,e=n;if(v)u.params=e.params,c.copy(u.params,b),a.$broadcast(\"$routeUpdate\",u);else if(e||u)w=!1,(s.current=e)&&e.redirectTo&&(c.isString(e.redirectTo)?f.path(t(e.redirectTo,e.params)).search(e.params).replace():f.url(e.redirectTo(e.pathParams,f.path(),f.search())).replace()),d.when(e).then(function(){if(e){var a=\r\n c.extend({},e.resolve),b,f;c.forEach(a,function(b,e){a[e]=c.isString(b)?h.get(b):h.invoke(b,null,null,e)});c.isDefined(b=e.template)?c.isFunction(b)&&(b=b(e.params)):c.isDefined(f=e.templateUrl)&&(c.isFunction(f)&&(f=f(e.params)),c.isDefined(f)&&(e.loadedTemplateUrl=x.valueOf(f),b=p(f)));c.isDefined(b)&&(a.$template=b);return d.all(a)}}).then(function(f){e==s.current&&(e&&(e.locals=f,c.copy(e.params,b)),a.$broadcast(\"$routeChangeSuccess\",e,u))},function(b){e==s.current&&a.$broadcast(\"$routeChangeError\",\r\n e,u,b)})}function k(){var a,b;c.forEach(g,function(d,g){var q;if(q=!b){var h=f.path();q=d.keys;var l={};if(d.regexp)if(h=d.regexp.exec(h)){for(var k=1,m=h.length;k=c;d--)f.end&&f.end(e[d]);e.length=c}}\"string\"!==typeof a&&(a=null===a||\"undefined\"===typeof a?\"\":\"\"+a);var b,k,e=[],m=a,l;for(e.last=function(){return e[e.length-1]};a;){l=\"\";k=!0;if(e.last()&&w[e.last()])a=a.replace(new RegExp(\"([\\\\W\\\\w]*)<\\\\s*\\\\/\\\\s*\"+e.last()+\"[^>]*>\",\"i\"),function(a,b){b=b.replace(H,\"$1\").replace(I,\"$1\");f.chars&&f.chars(q(b));return\"\"}),c(\"\",e.last());else{if(0===a.indexOf(\"\\x3c!--\"))b=a.indexOf(\"--\",4),0<=b&&a.lastIndexOf(\"--\\x3e\",\r\n b)===b&&(f.comment&&f.comment(a.substring(4,b)),a=a.substring(b+3),k=!1);else if(x.test(a)){if(b=a.match(x))a=a.replace(b[0],\"\"),k=!1}else if(J.test(a)){if(b=a.match(y))a=a.substring(b[0].length),b[0].replace(y,c),k=!1}else K.test(a)&&((b=a.match(z))?(b[4]&&(a=a.substring(b[0].length),b[0].replace(z,d)),k=!1):(l+=\"<\",a=a.substring(1)));k&&(b=a.indexOf(\"<\"),l+=0>b?a:a.substring(0,b),a=0>b?\"\":a.substring(b),f.chars&&f.chars(q(l)))}if(a==m)throw L(\"badparse\",a);m=a}c()}function q(a){if(!a)return\"\";A.innerHTML=\r\n a.replace(//g,\">\")}function r(a,f){var d=!1,c=h.bind(a,a.push);return{start:function(a,k,e){a=h.lowercase(a);!d&&w[a]&&(d=a);d||!0!==C[a]||(c(\"<\"),c(a),h.forEach(k,function(d,e){var k=h.lowercase(e),g=\"img\"===a&&\"src\"===k||\r\n \"background\"===k;!0!==O[k]||!0===D[k]&&!f(d,g)||(c(\" \"),c(e),c('=\"'),c(B(d)),c('\"'))}),c(e?\"/>\":\">\"))},end:function(a){a=h.lowercase(a);d||!0!==C[a]||(c(\"\"));a==d&&(d=!1)},chars:function(a){d||c(B(a))}}}var L=h.$$minErr(\"$sanitize\"),z=/^<((?:[a-zA-Z])[\\w:-]*)((?:\\s+[\\w:-]+(?:\\s*=\\s*(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>\\s]+))?)*)\\s*(\\/?)\\s*(>?)/,y=/^<\\/\\s*([\\w:-]+)[^>]*>/,G=/([\\w:-]+)(?:\\s*=\\s*(?:(?:\"((?:[^\"])*)\")|(?:'((?:[^'])*)')|([^>\\s]+)))?/g,K=/^]*?)>/i,\r\n I=/\"\\u201d\\u2019]/i,d=/^mailto:/i;return function(c,b){function k(a){a&&g.push(E(a))}function e(a,\r\n c){g.push(\"');k(c);g.push(\"\")}if(!c)return c;for(var m,l=c,g=[],n,p;m=l.match(f);)n=m[0],m[2]||m[4]||(n=(m[3]?\"http://\":\"mailto:\")+n),p=m.index,k(l.substr(0,p)),e(n,m[0].replace(d,\"\")),l=l.substring(p+m[0].length);k(l);return a(g.join(\"\"))}}])})(window,window.angular);\n\n//# sourceURL=webpack:///./src/public/js/vendor/angular/angular-sanitize.min.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/angular/angular.min.js": -/*!*****************************************************!*\ - !*** ./src/public/js/vendor/angular/angular.min.js ***! - \*****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function(__webpack_provided_window_dot_jQuery) {/*\r\n AngularJS v1.4.7\r\n (c) 2010-2015 Google, Inc. http://angularjs.org\r\n License: MIT\r\n */\r\n(function(Q,X,w){'use strict';function I(b){return function(){var a=arguments[0],c;c=\"[\"+(b?b+\":\":\"\")+a+\"] http://errors.angularjs.org/1.4.7/\"+(b?b+\"/\":\"\")+a;for(a=1;a\").append(b).html();try{return b[0].nodeType===Pa?F(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\\w\\-]+)/,function(a,b){return\"<\"+F(b)})}catch(d){return F(c)}}function xc(b){try{return decodeURIComponent(b)}catch(a){}}\r\n function yc(b){var a={};m((b||\"\").split(\"&\"),function(b){var d,e,f;b&&(e=b=b.replace(/\\+/g,\"%20\"),d=b.indexOf(\"=\"),-1!==d&&(e=b.substring(0,d),f=b.substring(d+1)),e=xc(e),A(e)&&(f=A(f)?xc(f):!0,ta.call(a,e)?J(a[e])?a[e].push(f):a[e]=[a[e],f]:a[e]=f))});return a}function Pb(b){var a=[];m(b,function(b,d){J(b)?m(b,function(b){a.push(la(d,!0)+(!0===b?\"\":\"=\"+la(b,!0)))}):a.push(la(d,!0)+(!0===b?\"\":\"=\"+la(b,!0)))});return a.length?a.join(\"&\"):\"\"}function ob(b){return la(b,!0).replace(/%26/gi,\"&\").replace(/%3D/gi,\r\n \"=\").replace(/%2B/gi,\"+\")}function la(b,a){return encodeURIComponent(b).replace(/%40/gi,\"@\").replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%3B/gi,\";\").replace(/%20/g,a?\"%20\":\"+\")}function Yd(b,a){var c,d,e=Qa.length;for(d=0;d/,\">\"));}a=a||[];a.unshift([\"$provide\",function(a){a.value(\"$rootElement\",b)}]);c.debugInfoEnabled&&a.push([\"$compileProvider\",function(a){a.debugInfoEnabled(!0)}]);a.unshift(\"ng\");d=fb(a,c.strictDi);d.invoke([\"$rootScope\",\r\n \"$rootElement\",\"$compile\",\"$injector\",function(a,b,c,d){a.$apply(function(){b.data(\"$injector\",d);c(b)(a)})}]);return d},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;Q&&e.test(Q.name)&&(c.debugInfoEnabled=!0,Q.name=Q.name.replace(e,\"\"));if(Q&&!f.test(Q.name))return d();Q.name=Q.name.replace(f,\"\");da.resumeBootstrap=function(b){m(b,function(b){a.push(b)});return d()};x(da.resumeDeferredBootstrap)&&da.resumeDeferredBootstrap()}function $d(){Q.name=\"NG_ENABLE_DEBUG_INFO!\"+Q.name;Q.location.reload()}\r\n function ae(b){b=da.element(b).injector();if(!b)throw Ea(\"test\");return b.get(\"$$testability\")}function Ac(b,a){a=a||\"_\";return b.replace(be,function(b,d){return(d?a:\"\")+b.toLowerCase()})}function ce(){var b;if(!Bc){var a=pb();(ra=v(a)?__webpack_provided_window_dot_jQuery:a?Q[a]:w)&&ra.fn.on?(B=ra,P(ra.fn,{scope:Ra.scope,isolateScope:Ra.isolateScope,controller:Ra.controller,injector:Ra.injector,inheritedData:Ra.inheritedData}),b=ra.cleanData,ra.cleanData=function(a){var d;if(Qb)Qb=!1;else for(var e=0,f;null!=(f=a[e]);e++)(d=\r\n ra._data(f,\"events\"))&&d.$destroy&&ra(f).triggerHandler(\"$destroy\");b(a)}):B=R;da.element=B;Bc=!0}}function qb(b,a,c){if(!b)throw Ea(\"areq\",a||\"?\",c||\"required\");return b}function Sa(b,a,c){c&&J(b)&&(b=b[b.length-1]);qb(x(b),a,\"not a function, got \"+(b&&\"object\"===typeof b?b.constructor.name||\"Object\":typeof b));return b}function Ta(b,a){if(\"hasOwnProperty\"===b)throw Ea(\"badname\",a);}function Cc(b,a,c){if(!a)return b;a=a.split(\".\");for(var d,e=b,f=a.length,h=0;h\")+d[2];for(d=d[0];d--;)c=c.lastChild;f=db(f,c.childNodes);c=e.firstChild;c.textContent=\"\"}else f.push(a.createTextNode(b));e.textContent=\"\";e.innerHTML=\"\";m(f,function(a){e.appendChild(a)});return e}function R(b){if(b instanceof R)return b;var a;G(b)&&(b=T(b),\r\n a=!0);if(!(this instanceof R)){if(a&&\"<\"!=b.charAt(0))throw Tb(\"nosel\");return new R(b)}if(a){a=X;var c;b=(c=Ef.exec(b))?[a.createElement(c[1])]:(c=Mc(b,a))?c.childNodes:[]}Nc(this,b)}function Ub(b){return b.cloneNode(!0)}function ub(b,a){a||vb(b);if(b.querySelectorAll)for(var c=b.querySelectorAll(\"*\"),d=0,e=c.length;dk&&this.remove(r.key);return b}},get:function(a){if(k\").parent()[0])});var f=\r\n S(a,b,a,c,d,e);W.$$addScopeClass(a);var g=null;return function(b,c,d){qb(b,\"scope\");d=d||{};var e=d.parentBoundTranscludeFn,h=d.transcludeControllers;d=d.futureParentElement;e&&e.$$boundTransclude&&(e=e.$$boundTransclude);g||(g=(d=d&&d[0])?\"foreignobject\"!==wa(d)&&d.toString().match(/SVG/)?\"svg\":\"html\":\"html\");d=\"html\"!==g?B(Xb(g,B(\"
        \").append(a).html())):c?Ra.clone.call(a):a;if(h)for(var k in h)d.data(\"$\"+k+\"Controller\",h[k].instance);W.$$addScopeInfo(d,b);c&&c(d,b);f&&f(b,d,d,e);return d}}function S(a,\r\n b,c,d,e,f){function g(a,c,d,e){var f,k,l,r,n,t,O;if(q)for(O=Array(c.length),r=0;rD.priority)break;if(M=D.scope)D.templateUrl||(C(M)?(Q(\"new/isolated scope\",\r\n u||S,D,v),u=D):Q(\"new/isolated scope\",u,D,v)),S=S||D;y=D.name;!D.templateUrl&&D.controller&&(M=D.controller,ba=ba||fa(),Q(\"'\"+y+\"' controller\",ba[y],D,v),ba[y]=D);if(M=D.transclude)N=!0,D.$$tlb||(Q(\"transclusion\",z,D,v),z=D),\"element\"==M?(ia=!0,H=D.priority,M=v,v=d.$$element=B(X.createComment(\" \"+y+\": \"+d[y]+\" \")),b=v[0],U(f,ua.call(M,0),b),Ka=W(M,e,H,g&&g.name,{nonTlbTranscludeDirective:z})):(M=B(Ub(b)).contents(),v.empty(),Ka=W(M,e));if(D.template)if(m=!0,Q(\"template\",L,D,v),L=D,M=x(D.template)?\r\n D.template(v,d):D.template,M=ha(M),D.replace){g=D;M=Sb.test(M)?Xc(Xb(D.templateNamespace,T(M))):[];b=M[0];if(1!=M.length||b.nodeType!==pa)throw ga(\"tplrt\",y,\"\");U(f,v,b);F={$attr:{}};M=ca(b,[],F);var Lf=a.splice(I+1,a.length-(I+1));u&&A(M);a=a.concat(M).concat(Lf);Yc(d,F);F=a.length}else v.html(M);if(D.templateUrl)m=!0,Q(\"template\",L,D,v),L=D,D.replace&&(g=D),K=Mf(a.splice(I,a.length-I),v,d,f,N&&Ka,h,k,{controllerDirectives:ba,newScopeDirective:S!==D&&S,newIsolateScopeDirective:u,templateDirective:L,\r\n nonTlbTranscludeDirective:z}),F=a.length;else if(D.compile)try{na=D.compile(v,d,Ka),x(na)?n(null,na,P,R):na&&n(na.pre,na.post,P,R)}catch(V){c(V,xa(v))}D.terminal&&(K.terminal=!0,H=Math.max(H,D.priority))}K.scope=S&&!0===S.scope;K.transcludeOnThisElement=N;K.templateOnThisElement=m;K.transclude=Ka;r.hasElementTranscludeDirective=ia;return K}function A(a){for(var b=0,c=a.length;bn.priority)&&-1!=n.restrict.indexOf(f)&&(k&&(n=Nb(n,{$$start:k,$$end:l})),b.push(n),h=n)}catch(H){c(H)}}return h}function I(b){if(e.hasOwnProperty(b))for(var c=a.get(b+\"Directive\"),d=0,f=c.length;d\"+b+\"\";return c.childNodes[0].childNodes;default:return b}}function R(a,b){if(\"srcdoc\"==b)return ia.HTML;var c=wa(a);if(\"xlinkHref\"==b||\"form\"==c&&\"action\"==b||\"img\"!=c&&(\"src\"==b||\r\n \"ngSrc\"==b))return ia.RESOURCE_URL}function V(a,c,d,e,f){var h=R(a,e);f=g[e]||f;var l=b(d,!0,h,f);if(l){if(\"multiple\"===e&&\"select\"===wa(a))throw ga(\"selmulti\",xa(a));c.push({priority:100,compile:function(){return{pre:function(a,c,g){c=g.$$observers||(g.$$observers=fa());if(k.test(e))throw ga(\"nodomevents\");var r=g[e];r!==d&&(l=r&&b(r,!0,h,f),d=r);l&&(g[e]=l(a),(c[e]||(c[e]=[])).$$inter=!0,(g.$$observers&&g.$$observers[e].$$scope||a).$watch(l,function(a,b){\"class\"===e&&a!=b?g.$updateClass(a,b):g.$set(e,\r\n a)}))}}}})}}function U(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g=a)return b;for(;a--;)8===b[a].nodeType&&Nf.call(b,a,1);return b}function Xe(){var b={},a=!1;this.register=function(a,d){Ta(a,\"controller\");C(a)?P(b,a):b[a]=d};this.allowGlobals=function(){a=!0};this.$get=[\"$injector\",\"$window\",function(c,d){function e(a,b,c,d){if(!a||!C(a.$scope))throw I(\"$controller\")(\"noscp\",d,b);a.$scope[b]=c}return function(f,h,g,l){var k,n,p;g=!0===g;l&&G(l)&&(p=l);if(G(f)){l=f.match(Vc);if(!l)throw Of(\"ctrlfmt\",f);\r\n n=l[1];p=p||l[3];f=b.hasOwnProperty(n)?b[n]:Cc(h.$scope,n,!0)||(a?Cc(d,n,!0):w);Sa(f,n,!0)}if(g)return g=(J(f)?f[f.length-1]:f).prototype,k=Object.create(g||null),p&&e(h,p,k,n||f.name),P(function(){var a=c.invoke(f,k,h,n);a!==k&&(C(a)||x(a))&&(k=a,p&&e(h,p,k,n||f.name));return k},{instance:k,identifier:p});k=c.instantiate(f,h,n);p&&e(h,p,k,n||f.name);return k}}]}function Ye(){this.$get=[\"$window\",function(b){return B(b.document)}]}function Ze(){this.$get=[\"$log\",function(b){return function(a,c){b.error.apply(b,\r\n arguments)}}]}function Yb(b){return C(b)?ea(b)?b.toISOString():eb(b):b}function df(){this.$get=function(){return function(b){if(!b)return\"\";var a=[];nc(b,function(b,d){null===b||v(b)||(J(b)?m(b,function(b,c){a.push(la(d)+\"=\"+la(Yb(b)))}):a.push(la(d)+\"=\"+la(Yb(b))))});return a.join(\"&\")}}}function ef(){this.$get=function(){return function(b){function a(b,e,f){null===b||v(b)||(J(b)?m(b,function(b,c){a(b,e+\"[\"+(C(b)?c:\"\")+\"]\")}):C(b)&&!ea(b)?nc(b,function(b,c){a(b,e+(f?\"\":\"[\")+c+(f?\"\":\"]\"))}):c.push(la(e)+\r\n \"=\"+la(Yb(b))))}if(!b)return\"\";var c=[];a(b,\"\",!0);return c.join(\"&\")}}}function Zb(b,a){if(G(b)){var c=b.replace(Pf,\"\").trim();if(c){var d=a(\"Content-Type\");(d=d&&0===d.indexOf(ad))||(d=(d=c.match(Qf))&&Rf[d[0]].test(c));d&&(b=vc(c))}}return b}function bd(b){var a=fa(),c;G(b)?m(b.split(\"\\n\"),function(b){c=b.indexOf(\":\");var e=F(T(b.substr(0,c)));b=T(b.substr(c+1));e&&(a[e]=a[e]?a[e]+\", \"+b:b)}):C(b)&&m(b,function(b,c){var f=F(c),h=T(b);f&&(a[f]=a[f]?a[f]+\", \"+h:h)});return a}function cd(b){var a;\r\n return function(c){a||(a=bd(b));return c?(c=a[F(c)],void 0===c&&(c=null),c):a}}function dd(b,a,c,d){if(x(d))return d(b,a,c);m(d,function(d){b=d(b,a,c)});return b}function cf(){var b=this.defaults={transformResponse:[Zb],transformRequest:[function(a){return C(a)&&\"[object File]\"!==va.call(a)&&\"[object Blob]\"!==va.call(a)&&\"[object FormData]\"!==va.call(a)?eb(a):a}],headers:{common:{Accept:\"application/json, text/plain, */*\"},post:ja($b),put:ja($b),patch:ja($b)},xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",\r\n paramSerializer:\"$httpParamSerializer\"},a=!1;this.useApplyAsync=function(b){return A(b)?(a=!!b,this):a};var c=!0;this.useLegacyPromiseExtensions=function(a){return A(a)?(c=!!a,this):c};var d=this.interceptors=[];this.$get=[\"$httpBackend\",\"$$cookieReader\",\"$cacheFactory\",\"$rootScope\",\"$q\",\"$injector\",function(e,f,h,g,l,k){function n(a){function d(a){var b=P({},a);b.data=a.data?dd(a.data,a.headers,a.status,f.transformResponse):a.data;a=a.status;return 200<=a&&300>a?b:l.reject(b)}function e(a,b){var c,\r\n d={};m(a,function(a,e){x(a)?(c=a(b),null!=c&&(d[e]=c)):d[e]=a});return d}if(!da.isObject(a))throw I(\"$http\")(\"badreq\",a);var f=P({method:\"get\",transformRequest:b.transformRequest,transformResponse:b.transformResponse,paramSerializer:b.paramSerializer},a);f.headers=function(a){var c=b.headers,d=P({},a.headers),f,g,h,c=P({},c.common,c[F(a.method)]);a:for(f in c){g=F(f);for(h in d)if(F(h)===g)continue a;d[f]=c[f]}return e(d,ja(a))}(a);f.method=sb(f.method);f.paramSerializer=G(f.paramSerializer)?k.get(f.paramSerializer):\r\n f.paramSerializer;var g=[function(a){var c=a.headers,e=dd(a.data,cd(c),w,a.transformRequest);v(e)&&m(c,function(a,b){\"content-type\"===F(b)&&delete c[b]});v(a.withCredentials)&&!v(b.withCredentials)&&(a.withCredentials=b.withCredentials);return p(a,e).then(d,d)},w],h=l.when(f);for(m(E,function(a){(a.request||a.requestError)&&g.unshift(a.request,a.requestError);(a.response||a.responseError)&&g.push(a.response,a.responseError)});g.length;){a=g.shift();var r=g.shift(),h=h.then(a,r)}c?(h.success=function(a){Sa(a,\r\n \"fn\");h.then(function(b){a(b.data,b.status,b.headers,f)});return h},h.error=function(a){Sa(a,\"fn\");h.then(null,function(b){a(b.data,b.status,b.headers,f)});return h}):(h.success=ed(\"success\"),h.error=ed(\"error\"));return h}function p(c,d){function h(b,c,d,e){function f(){k(c,b,d,e)}L&&(200<=b&&300>b?L.put(ba,[b,c,bd(d),e]):L.remove(ba));a?g.$applyAsync(f):(f(),g.$$phase||g.$apply())}function k(a,b,d,e){b=-1<=b?b:0;(200<=b&&300>b?O.resolve:O.reject)({data:a,status:b,headers:cd(d),config:c,statusText:e})}\r\n function p(a){k(a.data,a.status,ja(a.headers()),a.statusText)}function E(){var a=n.pendingRequests.indexOf(c);-1!==a&&n.pendingRequests.splice(a,1)}var O=l.defer(),H=O.promise,L,m,S=c.headers,ba=r(c.url,c.paramSerializer(c.params));n.pendingRequests.push(c);H.then(E,E);!c.cache&&!b.cache||!1===c.cache||\"GET\"!==c.method&&\"JSONP\"!==c.method||(L=C(c.cache)?c.cache:C(b.cache)?b.cache:t);L&&(m=L.get(ba),A(m)?m&&x(m.then)?m.then(p,p):J(m)?k(m[1],m[0],ja(m[2]),m[3]):k(m,200,{},\"OK\"):L.put(ba,H));v(m)&&((m=\r\n fd(c.url)?f()[c.xsrfCookieName||b.xsrfCookieName]:w)&&(S[c.xsrfHeaderName||b.xsrfHeaderName]=m),e(c.method,ba,d,h,S,c.timeout,c.withCredentials,c.responseType));return H}function r(a,b){0=l&&(u.resolve(E),\r\n t(q.$$intervalId),delete f[q.$$intervalId]);K||b.$apply()},g);f[q.$$intervalId]=u;return q}var f={};e.cancel=function(b){return b&&b.$$intervalId in f?(f[b.$$intervalId].reject(\"canceled\"),a.clearInterval(b.$$intervalId),delete f[b.$$intervalId],!0):!1};return e}]}function ac(b){b=b.split(\"/\");for(var a=b.length;a--;)b[a]=ob(b[a]);return b.join(\"/\")}function gd(b,a){var c=Aa(b);a.$$protocol=c.protocol;a.$$host=c.hostname;a.$$port=Y(c.port)||Tf[c.protocol]||null}function hd(b,a){var c=\"/\"!==b.charAt(0);\r\n c&&(b=\"/\"+b);var d=Aa(b);a.$$path=decodeURIComponent(c&&\"/\"===d.pathname.charAt(0)?d.pathname.substring(1):d.pathname);a.$$search=yc(d.search);a.$$hash=decodeURIComponent(d.hash);a.$$path&&\"/\"!=a.$$path.charAt(0)&&(a.$$path=\"/\"+a.$$path)}function sa(b,a){if(0===a.indexOf(b))return a.substr(b.length)}function Ja(b){var a=b.indexOf(\"#\");return-1==a?b:b.substr(0,a)}function Cb(b){return b.replace(/(#.+)|#$/,\"$1\")}function bc(b,a,c){this.$$html5=!0;c=c||\"\";gd(b,this);this.$$parse=function(b){var c=sa(a,\r\n b);if(!G(c))throw Db(\"ipthprfx\",b,a);hd(c,this);this.$$path||(this.$$path=\"/\");this.$$compose()};this.$$compose=function(){var b=Pb(this.$$search),c=this.$$hash?\"#\"+ob(this.$$hash):\"\";this.$$url=ac(this.$$path)+(b?\"?\"+b:\"\")+c;this.$$absUrl=a+this.$$url.substr(1)};this.$$parseLinkUrl=function(d,e){if(e&&\"#\"===e[0])return this.hash(e.slice(1)),!0;var f,h;A(f=sa(b,d))?(h=f,h=A(f=sa(c,f))?a+(sa(\"/\",f)||f):b+h):A(f=sa(a,d))?h=a+f:a==d+\"/\"&&(h=a);h&&this.$$parse(h);return!!h}}function cc(b,a,c){gd(b,this);\r\n this.$$parse=function(d){var e=sa(b,d)||sa(a,d),f;v(e)||\"#\"!==e.charAt(0)?this.$$html5?f=e:(f=\"\",v(e)&&(b=d,this.replace())):(f=sa(c,e),v(f)&&(f=e));hd(f,this);d=this.$$path;var e=b,h=/^\\/[A-Z]:(\\/.*)/;0===f.indexOf(e)&&(f=f.replace(e,\"\"));h.exec(f)||(d=(f=h.exec(d))?f[1]:d);this.$$path=d;this.$$compose()};this.$$compose=function(){var a=Pb(this.$$search),e=this.$$hash?\"#\"+ob(this.$$hash):\"\";this.$$url=ac(this.$$path)+(a?\"?\"+a:\"\")+e;this.$$absUrl=b+(this.$$url?c+this.$$url:\"\")};this.$$parseLinkUrl=\r\n function(a,c){return Ja(b)==Ja(a)?(this.$$parse(a),!0):!1}}function id(b,a,c){this.$$html5=!0;cc.apply(this,arguments);this.$$parseLinkUrl=function(d,e){if(e&&\"#\"===e[0])return this.hash(e.slice(1)),!0;var f,h;b==Ja(d)?f=d:(h=sa(a,d))?f=b+c+h:a===d+\"/\"&&(f=a);f&&this.$$parse(f);return!!f};this.$$compose=function(){var a=Pb(this.$$search),e=this.$$hash?\"#\"+ob(this.$$hash):\"\";this.$$url=ac(this.$$path)+(a?\"?\"+a:\"\")+e;this.$$absUrl=b+c+this.$$url}}function Eb(b){return function(){return this[b]}}function jd(b,\r\n a){return function(c){if(v(c))return this[b];this[b]=a(c);this.$$compose();return this}}function hf(){var b=\"\",a={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(a){return A(a)?(b=a,this):b};this.html5Mode=function(b){return bb(b)?(a.enabled=b,this):C(b)?(bb(b.enabled)&&(a.enabled=b.enabled),bb(b.requireBase)&&(a.requireBase=b.requireBase),bb(b.rewriteLinks)&&(a.rewriteLinks=b.rewriteLinks),this):a};this.$get=[\"$rootScope\",\"$browser\",\"$sniffer\",\"$rootElement\",\"$window\",function(c,\r\n d,e,f,h){function g(a,b,c){var e=k.url(),f=k.$$state;try{d.url(a,b,c),k.$$state=d.state()}catch(g){throw k.url(e),k.$$state=f,g;}}function l(a,b){c.$broadcast(\"$locationChangeSuccess\",k.absUrl(),a,k.$$state,b)}var k,n;n=d.baseHref();var p=d.url(),r;if(a.enabled){if(!n&&a.requireBase)throw Db(\"nobase\");r=p.substring(0,p.indexOf(\"/\",p.indexOf(\"//\")+2))+(n||\"/\");n=e.history?bc:id}else r=Ja(p),n=cc;var t=r.substr(0,Ja(r).lastIndexOf(\"/\")+1);k=new n(r,t,\"#\"+b);k.$$parseLinkUrl(p,p);k.$$state=d.state();\r\n var E=/^\\s*(javascript|mailto):/i;f.on(\"click\",function(b){if(a.rewriteLinks&&!b.ctrlKey&&!b.metaKey&&!b.shiftKey&&2!=b.which&&2!=b.button){for(var e=B(b.target);\"a\"!==wa(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var g=e.prop(\"href\"),l=e.attr(\"href\")||e.attr(\"xlink:href\");C(g)&&\"[object SVGAnimatedString]\"===g.toString()&&(g=Aa(g.animVal).href);E.test(g)||!g||e.attr(\"target\")||b.isDefaultPrevented()||!k.$$parseLinkUrl(g,l)||(b.preventDefault(),k.absUrl()!=d.url()&&(c.$apply(),h.angular[\"ff-684208-preventDefault\"]=\r\n !0))}});Cb(k.absUrl())!=Cb(p)&&d.url(k.absUrl(),!0);var K=!0;d.onUrlChange(function(a,b){v(sa(t,a))?h.location.href=a:(c.$evalAsync(function(){var d=k.absUrl(),e=k.$$state,f;k.$$parse(a);k.$$state=b;f=c.$broadcast(\"$locationChangeStart\",a,d,b,e).defaultPrevented;k.absUrl()===a&&(f?(k.$$parse(d),k.$$state=e,g(d,!1,e)):(K=!1,l(d,e)))}),c.$$phase||c.$digest())});c.$watch(function(){var a=Cb(d.url()),b=Cb(k.absUrl()),f=d.state(),h=k.$$replace,r=a!==b||k.$$html5&&e.history&&f!==k.$$state;if(K||r)K=!1,\r\n c.$evalAsync(function(){var b=k.absUrl(),d=c.$broadcast(\"$locationChangeStart\",b,a,k.$$state,f).defaultPrevented;k.absUrl()===b&&(d?(k.$$parse(a),k.$$state=f):(r&&g(b,h,f===k.$$state?null:k.$$state),l(a,f)))});k.$$replace=!1});return k}]}function jf(){var b=!0,a=this;this.debugEnabled=function(a){return A(a)?(b=a,this):b};this.$get=[\"$window\",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?\"Error: \"+a.message+\"\\n\"+a.stack:a.stack:a.sourceURL&&(a=\r\n a.message+\"\\n\"+a.sourceURL+\":\"+a.line));return a}function e(a){var b=c.console||{},e=b[a]||b.log||y;a=!1;try{a=!!e.apply}catch(l){}return a?function(){var a=[];m(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?\"\":b)}}return{log:e(\"log\"),info:e(\"info\"),warn:e(\"warn\"),error:e(\"error\"),debug:function(){var c=e(\"debug\");return function(){b&&c.apply(a,arguments)}}()}}]}function Xa(b,a){if(\"__defineGetter__\"===b||\"__defineSetter__\"===b||\"__lookupGetter__\"===b||\"__lookupSetter__\"===\r\n b||\"__proto__\"===b)throw Z(\"isecfld\",a);return b}function kd(b,a){b+=\"\";if(!G(b))throw Z(\"iseccst\",a);return b}function Ba(b,a){if(b){if(b.constructor===b)throw Z(\"isecfn\",a);if(b.window===b)throw Z(\"isecwindow\",a);if(b.children&&(b.nodeName||b.prop&&b.attr&&b.find))throw Z(\"isecdom\",a);if(b===Object)throw Z(\"isecobj\",a);}return b}function ld(b,a){if(b){if(b.constructor===b)throw Z(\"isecfn\",a);if(b===Uf||b===Vf||b===Wf)throw Z(\"isecff\",a);}}function md(b,a){if(b&&(b===(0).constructor||b===(!1).constructor||\r\n b===\"\".constructor||b==={}.constructor||b===[].constructor||b===Function.constructor))throw Z(\"isecaf\",a);}function Xf(b,a){return\"undefined\"!==typeof b?b:a}function nd(b,a){return\"undefined\"===typeof b?a:\"undefined\"===typeof a?b:b+a}function U(b,a){var c,d;switch(b.type){case s.Program:c=!0;m(b.body,function(b){U(b.expression,a);c=c&&b.expression.constant});b.constant=c;break;case s.Literal:b.constant=!0;b.toWatch=[];break;case s.UnaryExpression:U(b.argument,a);b.constant=b.argument.constant;b.toWatch=\r\n b.argument.toWatch;break;case s.BinaryExpression:U(b.left,a);U(b.right,a);b.constant=b.left.constant&&b.right.constant;b.toWatch=b.left.toWatch.concat(b.right.toWatch);break;case s.LogicalExpression:U(b.left,a);U(b.right,a);b.constant=b.left.constant&&b.right.constant;b.toWatch=b.constant?[]:[b];break;case s.ConditionalExpression:U(b.test,a);U(b.alternate,a);U(b.consequent,a);b.constant=b.test.constant&&b.alternate.constant&&b.consequent.constant;b.toWatch=b.constant?[]:[b];break;case s.Identifier:b.constant=\r\n !1;b.toWatch=[b];break;case s.MemberExpression:U(b.object,a);b.computed&&U(b.property,a);b.constant=b.object.constant&&(!b.computed||b.property.constant);b.toWatch=[b];break;case s.CallExpression:c=b.filter?!a(b.callee.name).$stateful:!1;d=[];m(b.arguments,function(b){U(b,a);c=c&&b.constant;b.constant||d.push.apply(d,b.toWatch)});b.constant=c;b.toWatch=b.filter&&!a(b.callee.name).$stateful?d:[b];break;case s.AssignmentExpression:U(b.left,a);U(b.right,a);b.constant=b.left.constant&&b.right.constant;\r\n b.toWatch=[b];break;case s.ArrayExpression:c=!0;d=[];m(b.elements,function(b){U(b,a);c=c&&b.constant;b.constant||d.push.apply(d,b.toWatch)});b.constant=c;b.toWatch=d;break;case s.ObjectExpression:c=!0;d=[];m(b.properties,function(b){U(b.value,a);c=c&&b.value.constant;b.value.constant||d.push.apply(d,b.value.toWatch)});b.constant=c;b.toWatch=d;break;case s.ThisExpression:b.constant=!1,b.toWatch=[]}}function od(b){if(1==b.length){b=b[0].expression;var a=b.toWatch;return 1!==a.length?a:a[0]!==b?a:w}}\r\n function pd(b){return b.type===s.Identifier||b.type===s.MemberExpression}function qd(b){if(1===b.body.length&&pd(b.body[0].expression))return{type:s.AssignmentExpression,left:b.body[0].expression,right:{type:s.NGValueParameter},operator:\"=\"}}function rd(b){return 0===b.body.length||1===b.body.length&&(b.body[0].expression.type===s.Literal||b.body[0].expression.type===s.ArrayExpression||b.body[0].expression.type===s.ObjectExpression)}function sd(b,a){this.astBuilder=b;this.$filter=a}function td(b,\r\n a){this.astBuilder=b;this.$filter=a}function Fb(b){return\"constructor\"==b}function dc(b){return x(b.valueOf)?b.valueOf():Yf.call(b)}function kf(){var b=fa(),a=fa();this.$get=[\"$filter\",function(c){function d(a,b){return null==a||null==b?a===b:\"object\"===typeof a&&(a=dc(a),\"object\"===typeof a)?!1:a===b||a!==a&&b!==b}function e(a,b,c,e,f){var g=e.inputs,h;if(1===g.length){var k=d,g=g[0];return a.$watch(function(a){var b=g(a);d(b,k)||(h=e(a,w,w,[b]),k=b&&dc(b));return h},b,c,f)}for(var l=[],n=[],p=0,\r\n m=g.length;p=this.promise.$$state.status&&d&&d.length&&b(function(){for(var b,e,f=0,g=d.length;fa)for(b in l++,f)ta.call(e,b)||(t--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$stateful=!0;var d=this,e,f,h,k=1\r\n t&&(D=4-t,u[D]||(u[D]=[]),u[D].push({msg:x(b.exp)?\"fn: \"+(b.exp.name||b.exp.toString()):b.exp,newVal:f,oldVal:g}));else if(b===d){r=!1;break a}}catch(y){h(y)}if(!(k=m.$$watchersCount&&m.$$childHead||m!==this&&m.$$nextSibling))for(;m!==this&&!(k=m.$$nextSibling);)m=m.$parent}while(m=k);if((r||z.length)&&!t--)throw q.$$phase=null,c(\"infdig\",a,u);}while(r||z.length);for(q.$$phase=null;N.length;)try{N.shift()()}catch(A){h(A)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast(\"$destroy\");\r\n this.$$destroyed=!0;this===q&&l.$$applicationDestroyed();r(this,-this.$$watchersCount);for(var b in this.$$listenerCount)t(this,this.$$listenerCount[b],b);a&&a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a&&a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=y;this.$on=\r\n this.$watch=this.$watchGroup=function(){return y};this.$$listeners={};this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=this.$$watchers=null}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a,b){q.$$phase||z.length||l.defer(function(){z.length&&q.$digest()});z.push({scope:this,expression:a,locals:b})},$$postDigest:function(a){N.push(a)},$apply:function(a){try{p(\"$apply\");try{return this.$eval(a)}finally{q.$$phase=null}}catch(b){h(b)}finally{try{q.$digest()}catch(c){throw h(c),\r\n c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&w.push(b);u()},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(c[d]=null,t(e,1,a))}},$emit:function(a,b){var c=[],d,e=this,f=!1,g={name:a,targetScope:e,stopPropagation:function(){f=!0},preventDefault:function(){g.defaultPrevented=!0},defaultPrevented:!1},\r\n k=db([g],arguments,1),l,n;do{d=e.$$listeners[a]||c;g.currentScope=e;l=0;for(n=d.length;lWa)throw Ca(\"iequirks\");var d=ja(oa);d.isEnabled=function(){return b};d.trustAs=c.trustAs;d.getTrusted=c.getTrusted;d.valueOf=c.valueOf;b||(d.trustAs=d.getTrusted=function(a,b){return b},d.valueOf=$a);d.parseAs=function(b,c){var e=a(c);return e.literal&&e.constant?e:a(c,function(a){return d.getTrusted(b,a)})};var e=d.parseAs,f=d.getTrusted,h=d.trustAs;m(oa,function(a,b){var c=F(b);d[gb(\"parse_as_\"+c)]=function(b){return e(a,b)};d[gb(\"get_trusted_\"+c)]=function(b){return f(a,b)};d[gb(\"trust_as_\"+\r\n c)]=function(b){return h(a,b)}});return d}]}function qf(){this.$get=[\"$window\",\"$document\",function(b,a){var c={},d=Y((/android (\\d+)/.exec(F((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),f=a[0]||{},h,g=/^(Moz|webkit|ms)(?=[A-Z])/,l=f.body&&f.body.style,k=!1,n=!1;if(l){for(var p in l)if(k=g.exec(p)){h=k[0];h=h.substr(0,1).toUpperCase()+h.substr(1);break}h||(h=\"WebkitOpacity\"in l&&\"webkit\");k=!!(\"transition\"in l||h+\"Transition\"in l);n=!!(\"animation\"in l||h+\"Animation\"in\r\n l);!d||k&&n||(k=G(l.webkitTransition),n=G(l.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hasEvent:function(a){if(\"input\"===a&&11>=Wa)return!1;if(v(c[a])){var b=f.createElement(\"div\");c[a]=\"on\"+a in b}return c[a]},csp:Fa(),vendorPrefix:h,transitions:k,animations:n,android:d}}]}function sf(){this.$get=[\"$templateCache\",\"$http\",\"$q\",\"$sce\",function(b,a,c,d){function e(f,h){e.totalPendingRequests++;G(f)&&b.get(f)||(f=d.getTrustedResourceUrl(f));var g=a.defaults&&a.defaults.transformResponse;\r\n J(g)?g=g.filter(function(a){return a!==Zb}):g===Zb&&(g=null);return a.get(f,{cache:b,transformResponse:g})[\"finally\"](function(){e.totalPendingRequests--}).then(function(a){b.put(f,a.data);return a.data},function(a){if(!h)throw ga(\"tpload\",f,a.status,a.statusText);return c.reject(a)})}e.totalPendingRequests=0;return e}]}function tf(){this.$get=[\"$rootScope\",\"$browser\",\"$location\",function(b,a,c){return{findBindings:function(a,b,c){a=a.getElementsByClassName(\"ng-binding\");var h=[];m(a,function(a){var d=\r\n da.element(a).data(\"$binding\");d&&m(d,function(d){c?(new RegExp(\"(^|\\\\s)\"+vd(b)+\"(\\\\s|\\\\||$)\")).test(d)&&h.push(a):-1!=d.indexOf(b)&&h.push(a)})});return h},findModels:function(a,b,c){for(var h=[\"ng-\",\"data-ng-\",\"ng\\\\:\"],g=0;gb;b=Math.abs(b);var h=Infinity===b;if(!h&&!isFinite(b))return\"\";var g=b+\"\",l=\"\",k=!1,n=[];h&&(l=\"\\u221e\");if(!h&&-1!==g.indexOf(\"e\")){var p=g.match(/([\\d\\.]+)e(-?)(\\d+)/);p&&\"-\"==p[2]&&p[3]>e+1?b=0:(l=g,k=!0)}if(h||k)0b&&(l=b.toFixed(e),b=parseFloat(l),l=l.replace(hc,d));else{h=(g.split(hc)[1]||\"\").length;v(e)&&(e=Math.min(Math.max(a.minFrac,h),a.maxFrac));b=+(Math.round(+(b.toString()+\"e\"+e)).toString()+\"e\"+-e);var h=(\"\"+b).split(hc),g=h[0],h=h[1]||\"\",p=0,\r\n r=a.lgSize,t=a.gSize;if(g.length>=r+t)for(p=g.length-r,k=0;kb&&(d=\"-\",b=-b);for(b=\"\"+b;b.length-c)e+=c;0===e&&-12==c&&(e=12);return Gb(e,a,d)}}function Hb(b,a){return function(c,d){var e=c[\"get\"+b](),f=sb(a?\"SHORT\"+b:b);return d[f][e]}}function Ed(b){var a=(new Date(b,0,1)).getDay();return new Date(b,0,(4>=a?5:12)-a)}function Fd(b){return function(a){var c=Ed(a.getFullYear());a=+new Date(a.getFullYear(),a.getMonth(),a.getDate()+(4-a.getDay()))-+c;a=1+Math.round(a/6048E5);return Gb(a,b)}}function ic(b,a){return 0>=b.getFullYear()?a.ERAS[0]:a.ERAS[1]}function Ad(b){function a(a){var b;if(b=\r\n a.match(c)){a=new Date(0);var f=0,h=0,g=b[8]?a.setUTCFullYear:a.setFullYear,l=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=Y(b[9]+b[10]),h=Y(b[9]+b[11]));g.call(a,Y(b[1]),Y(b[2])-1,Y(b[3]));f=Y(b[4]||0)-f;h=Y(b[5]||0)-h;g=Y(b[6]||0);b=Math.round(1E3*parseFloat(\"0.\"+(b[7]||0)));l.call(a,f,h,g,b)}return a}var c=/^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d+))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d))?)?$/;return function(c,e,f){var h=\"\",g=[],l,k;e=e||\"mediumDate\";e=b.DATETIME_FORMATS[e]||e;G(c)&&(c=\r\n fg.test(c)?Y(c):a(c));V(c)&&(c=new Date(c));if(!ea(c)||!isFinite(c.getTime()))return c;for(;e;)(k=gg.exec(e))?(g=db(g,k,1),e=g.pop()):(g.push(e),e=null);var n=c.getTimezoneOffset();f&&(n=wc(f,c.getTimezoneOffset()),c=Ob(c,f,!0));m(g,function(a){l=hg[a];h+=l?l(c,b.DATETIME_FORMATS,n):a.replace(/(^'|'$)/g,\"\").replace(/''/g,\"'\")});return h}}function ag(){return function(b,a){v(a)&&(a=2);return eb(b,a)}}function bg(){return function(b,a,c){a=Infinity===Math.abs(Number(a))?Number(a):Y(a);if(isNaN(a))return b;\r\n V(b)&&(b=b.toString());if(!J(b)&&!G(b))return b;c=!c||isNaN(c)?0:Y(c);c=0>c&&c>=-b.length?b.length+c:c;return 0<=a?b.slice(c,c+a):0===c?b.slice(a,b.length):b.slice(Math.max(0,c+a),c)}}function Cd(b){function a(a,c){c=c?-1:1;return a.map(function(a){var d=1,g=$a;if(x(a))g=a;else if(G(a)){if(\"+\"==a.charAt(0)||\"-\"==a.charAt(0))d=\"-\"==a.charAt(0)?-1:1,a=a.substring(1);if(\"\"!==a&&(g=b(a),g.constant))var l=g(),g=function(a){return a[l]}}return{get:g,descending:d*c}})}function c(a){switch(typeof a){case \"number\":case \"boolean\":case \"string\":return!0;\r\n default:return!1}}return function(b,e,f){if(!Da(b))return b;J(e)||(e=[e]);0===e.length&&(e=[\"+\"]);var h=a(e,f);h.push({get:function(){return{}},descending:f?-1:1});b=Array.prototype.map.call(b,function(a,b){return{value:a,predicateValues:h.map(function(d){var e=d.get(a);d=typeof e;if(null===e)d=\"string\",e=\"null\";else if(\"string\"===d)e=e.toLowerCase();else if(\"object\"===d)a:{if(\"function\"===typeof e.valueOf&&(e=e.valueOf(),c(e)))break a;if(qc(e)&&(e=e.toString(),c(e)))break a;e=b}return{value:e,type:d}})}});\r\n b.sort(function(a,b){for(var c=0,d=0,e=h.length;db||37<=b&&40>=b||n(a,this,this.value)});if(e.hasEvent(\"paste\"))a.on(\"paste cut\",n)}a.on(\"change\",l);d.$render=function(){var b=d.$isEmpty(d.$viewValue)?\r\n \"\":d.$viewValue;a.val()!==b&&a.val(b)}}function Kb(b,a){return function(c,d){var e,f;if(ea(c))return c;if(G(c)){'\"'==c.charAt(0)&&'\"'==c.charAt(c.length-1)&&(c=c.substring(1,c.length-1));if(ig.test(c))return new Date(c);b.lastIndex=0;if(e=b.exec(c))return e.shift(),f=d?{yyyy:d.getFullYear(),MM:d.getMonth()+1,dd:d.getDate(),HH:d.getHours(),mm:d.getMinutes(),ss:d.getSeconds(),sss:d.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},m(e,function(b,c){c=s};h.$observe(\"min\",function(a){s=r(a);g.$validate()})}if(A(h.max)||h.ngMax){var u;g.$validators.max=function(a){return!p(a)||v(u)||c(a)<=u};h.$observe(\"max\",function(a){u=r(a);g.$validate()})}}}function Id(b,a,c,d){(d.$$hasNativeValidators=C(a[0].validity))&&d.$parsers.push(function(b){var c=a.prop(\"validity\")||{};return c.badInput&&!c.typeMismatch?w:b})}function Jd(b,a,c,d,e){if(A(d)){b=\r\n b(d);if(!b.constant)throw lb(\"constexpr\",c,d);return b(a)}return e}function kc(b,a){b=\"ngClass\"+b;return[\"$animate\",function(c){function d(a,b){var c=[],d=0;a:for(;d(?:<\\/\\1>|)$/,Sb=/<|&#?\\w+;/,Cf=/<([\\w:-]+)/,Df=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:-]+)[^>]*)\\/>/gi,\r\n ma={option:[1,'\"],thead:[1,\"\",\"
        \"],col:[2,\"\",\"
        \"],tr:[2,\"\",\"
        \"],td:[3,\"\",\"
        \"],_default:[0,\"\",\"\"]};ma.optgroup=ma.option;ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead;ma.th=ma.td;var Ra=R.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;\"complete\"===X.readyState?setTimeout(a):(this.on(\"DOMContentLoaded\",a),R(Q).on(\"load\",a))},\r\n toString:function(){var b=[];m(this,function(a){b.push(\"\"+a)});return\"[\"+b.join(\", \")+\"]\"},eq:function(b){return 0<=b?B(this[b]):B(this[this.length+b])},length:0,push:kg,sort:[].sort,splice:[].splice},Bb={};m(\"multiple selected checked disabled readOnly required open\".split(\" \"),function(b){Bb[F(b)]=b});var Sc={};m(\"input select option textarea button form details\".split(\" \"),function(b){Sc[b]=!0});var $c={ngMinlength:\"minlength\",ngMaxlength:\"maxlength\",ngMin:\"min\",ngMax:\"max\",ngPattern:\"pattern\"};\r\n m({data:Vb,removeData:vb,hasData:function(b){for(var a in hb[b.ng339])return!0;return!1}},function(b,a){R[a]=b});m({data:Vb,inheritedData:Ab,scope:function(b){return B.data(b,\"$scope\")||Ab(b.parentNode||b,[\"$isolateScope\",\"$scope\"])},isolateScope:function(b){return B.data(b,\"$isolateScope\")||B.data(b,\"$isolateScopeNoTemplate\")},controller:Pc,injector:function(b){return Ab(b,\"$injector\")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:xb,css:function(b,a,c){a=gb(a);if(A(c))b.style[a]=c;else return b.style[a]},\r\n attr:function(b,a,c){var d=b.nodeType;if(d!==Pa&&2!==d&&8!==d)if(d=F(a),Bb[d])if(A(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||y).specified?d:w;else if(A(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?w:b},prop:function(b,a,c){if(A(c))b[a]=c;else return b[a]},text:function(){function b(a,b){if(v(b)){var d=a.nodeType;return d===pa||d===Pa?a.textContent:\"\"}a.textContent=b}b.$dv=\"\";return b}(),\r\n val:function(b,a){if(v(a)){if(b.multiple&&\"select\"===wa(b)){var c=[];m(b.options,function(a){a.selected&&c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(v(a))return b.innerHTML;ub(b,!0);b.innerHTML=a},empty:Qc},function(b,a){R.prototype[a]=function(a,d){var e,f,h=this.length;if(b!==Qc&&v(2==b.length&&b!==xb&&b!==Pc?a:d)){if(C(a)){for(e=0;e <= >= && || ! = |\".split(\" \"),function(a){Lb[a]=!0});var rg={n:\"\\n\",f:\"\\f\",r:\"\\r\",t:\"\\t\",v:\"\\v\",\"'\":\"'\",'\"':'\"'},ec=function(a){this.options=a};ec.prototype={constructor:ec,lex:function(a){this.text=a;this.index=0;for(this.tokens=\r\n [];this.index=a&&\"string\"===typeof a},isWhitespace:function(a){return\" \"===a||\"\\r\"===a||\"\\t\"===a||\"\\n\"===a||\"\\v\"===a||\"\\u00a0\"===a},isIdent:function(a){return\"a\"<=a&&\"z\">=a||\"A\"<=a&&\"Z\">=a||\"_\"===a||\"$\"===a},isExpOperator:function(a){return\"-\"===\r\n a||\"+\"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=A(c)?\"s \"+c+\"-\"+this.index+\" [\"+this.text.substring(c,d)+\"]\":\" \"+d;throw Z(\"lexerr\",a,c,this.text);},readNumber:function(){for(var a=\"\",c=this.index;this.index\",\"<=\",\">=\");)a={type:s.BinaryExpression,operator:c.text,\r\n left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect(\"+\",\"-\");)a={type:s.BinaryExpression,operator:c.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),c;c=this.expect(\"*\",\"/\",\"%\");)a={type:s.BinaryExpression,operator:c.text,left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect(\"+\",\"-\",\"!\"))?{type:s.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()},\r\n primary:function(){var a;this.expect(\"(\")?(a=this.filterChain(),this.consume(\")\")):this.expect(\"[\")?a=this.arrayDeclaration():this.expect(\"{\")?a=this.object():this.constants.hasOwnProperty(this.peek().text)?a=ha(this.constants[this.consume().text]):this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError(\"not a primary expression\",this.peek());for(var c;c=this.expect(\"(\",\"[\",\".\");)\"(\"===c.text?(a={type:s.CallExpression,callee:a,arguments:this.parseArguments()},\r\n this.consume(\")\")):\"[\"===c.text?(a={type:s.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume(\"]\")):\".\"===c.text?a={type:s.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError(\"IMPOSSIBLE\");return a},filter:function(a){a=[a];for(var c={type:s.CallExpression,callee:this.identifier(),arguments:a,filter:!0};this.expect(\":\");)a.push(this.expression());return c},parseArguments:function(){var a=[];if(\")\"!==this.peekToken().text){do a.push(this.expression());\r\n while(this.expect(\",\"))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError(\"is not a valid identifier\",a);return{type:s.Identifier,name:a.text}},constant:function(){return{type:s.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if(\"]\"!==this.peekToken().text){do{if(this.peek(\"]\"))break;a.push(this.expression())}while(this.expect(\",\"))}this.consume(\"]\");return{type:s.ArrayExpression,elements:a}},object:function(){var a=[],c;if(\"}\"!==this.peekToken().text){do{if(this.peek(\"}\"))break;\r\n c={type:s.Property,kind:\"init\"};this.peek().constant?c.key=this.constant():this.peek().identifier?c.key=this.identifier():this.throwError(\"invalid key\",this.peek());this.consume(\":\");c.value=this.expression();a.push(c)}while(this.expect(\",\"))}this.consume(\"}\");return{type:s.ObjectExpression,properties:a}},throwError:function(a,c){throw Z(\"syntax\",c.text,a,c.index+1,this.text,this.text.substring(c.index));},consume:function(a){if(0===this.tokens.length)throw Z(\"ueoe\",this.text);var c=this.expect(a);\r\n c||this.throwError(\"is unexpected, expecting [\"+a+\"]\",this.peek());return c},peekToken:function(){if(0===this.tokens.length)throw Z(\"ueoe\",this.text);return this.tokens[0]},peek:function(a,c,d,e){return this.peekAhead(0,a,c,d,e)},peekAhead:function(a,c,d,e,f){if(this.tokens.length>a){a=this.tokens[a];var h=a.text;if(h===c||h===d||h===e||h===f||!(c||d||e||f))return a}return!1},expect:function(a,c,d,e){return(a=this.peek(a,c,d,e))?(this.tokens.shift(),a):!1},constants:{\"true\":{type:s.Literal,value:!0},\r\n \"false\":{type:s.Literal,value:!1},\"null\":{type:s.Literal,value:null},undefined:{type:s.Literal,value:w},\"this\":{type:s.ThisExpression}}};sd.prototype={compile:function(a,c){var d=this,e=this.astBuilder.ast(a);this.state={nextId:0,filters:{},expensiveChecks:c,fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]};U(e,d.$filter);var f=\"\",h;this.stage=\"assign\";if(h=qd(e))this.state.computing=\"assign\",f=this.nextId(),this.recurse(h,f),this.return_(f),f=\"fn.assign=\"+this.generateFunction(\"assign\",\r\n \"s,v,l\");h=od(e.body);d.stage=\"inputs\";m(h,function(a,c){var e=\"fn\"+c;d.state[e]={vars:[],body:[],own:{}};d.state.computing=e;var f=d.nextId();d.recurse(a,f);d.return_(f);d.state.inputs.push(e);a.watchId=c});this.state.computing=\"fn\";this.stage=\"main\";this.recurse(e);f='\"'+this.USE+\" \"+this.STRICT+'\";\\n'+this.filterPrefix()+\"var fn=\"+this.generateFunction(\"fn\",\"s,l,a,i\")+f+this.watchFns()+\"return fn;\";f=(new Function(\"$filter\",\"ensureSafeMemberName\",\"ensureSafeObject\",\"ensureSafeFunction\",\"getStringValue\",\r\n \"ensureSafeAssignContext\",\"ifDefined\",\"plus\",\"text\",f))(this.$filter,Xa,Ba,ld,kd,md,Xf,nd,a);this.state=this.stage=w;f.literal=rd(e);f.constant=e.constant;return f},USE:\"use\",STRICT:\"strict\",watchFns:function(){var a=[],c=this.state.inputs,d=this;m(c,function(c){a.push(\"var \"+c+\"=\"+d.generateFunction(c,\"s\"))});c.length&&a.push(\"fn.inputs=[\"+c.join(\",\")+\"];\");return a.join(\"\")},generateFunction:function(a,c){return\"function(\"+c+\"){\"+this.varsPrefix(a)+this.body(a)+\"};\"},filterPrefix:function(){var a=\r\n [],c=this;m(this.state.filters,function(d,e){a.push(d+\"=$filter(\"+c.escape(e)+\")\")});return a.length?\"var \"+a.join(\",\")+\";\":\"\"},varsPrefix:function(a){return this.state[a].vars.length?\"var \"+this.state[a].vars.join(\",\")+\";\":\"\"},body:function(a){return this.state[a].body.join(\"\")},recurse:function(a,c,d,e,f,h){var g,l,k=this,n,p;e=e||y;if(!h&&A(a.watchId))c=c||this.nextId(),this.if_(\"i\",this.lazyAssign(c,this.computedMember(\"i\",a.watchId)),this.lazyRecurse(a,c,d,e,f,!0));else switch(a.type){case s.Program:m(a.body,\r\n function(c,d){k.recurse(c.expression,w,w,function(a){l=a});d!==a.body.length-1?k.current().body.push(l,\";\"):k.return_(l)});break;case s.Literal:p=this.escape(a.value);this.assign(c,p);e(p);break;case s.UnaryExpression:this.recurse(a.argument,w,w,function(a){l=a});p=a.operator+\"(\"+this.ifDefined(l,0)+\")\";this.assign(c,p);e(p);break;case s.BinaryExpression:this.recurse(a.left,w,w,function(a){g=a});this.recurse(a.right,w,w,function(a){l=a});p=\"+\"===a.operator?this.plus(g,l):\"-\"===a.operator?this.ifDefined(g,\r\n 0)+a.operator+this.ifDefined(l,0):\"(\"+g+\")\"+a.operator+\"(\"+l+\")\";this.assign(c,p);e(p);break;case s.LogicalExpression:c=c||this.nextId();k.recurse(a.left,c);k.if_(\"&&\"===a.operator?c:k.not(c),k.lazyRecurse(a.right,c));e(c);break;case s.ConditionalExpression:c=c||this.nextId();k.recurse(a.test,c);k.if_(c,k.lazyRecurse(a.alternate,c),k.lazyRecurse(a.consequent,c));e(c);break;case s.Identifier:c=c||this.nextId();d&&(d.context=\"inputs\"===k.stage?\"s\":this.assign(this.nextId(),this.getHasOwnProperty(\"l\",\r\n a.name)+\"?l:s\"),d.computed=!1,d.name=a.name);Xa(a.name);k.if_(\"inputs\"===k.stage||k.not(k.getHasOwnProperty(\"l\",a.name)),function(){k.if_(\"inputs\"===k.stage||\"s\",function(){f&&1!==f&&k.if_(k.not(k.nonComputedMember(\"s\",a.name)),k.lazyAssign(k.nonComputedMember(\"s\",a.name),\"{}\"));k.assign(c,k.nonComputedMember(\"s\",a.name))})},c&&k.lazyAssign(c,k.nonComputedMember(\"l\",a.name)));(k.state.expensiveChecks||Fb(a.name))&&k.addEnsureSafeObject(c);e(c);break;case s.MemberExpression:g=d&&(d.context=this.nextId())||\r\n this.nextId();c=c||this.nextId();k.recurse(a.object,g,w,function(){k.if_(k.notNull(g),function(){if(a.computed)l=k.nextId(),k.recurse(a.property,l),k.getStringValue(l),k.addEnsureSafeMemberName(l),f&&1!==f&&k.if_(k.not(k.computedMember(g,l)),k.lazyAssign(k.computedMember(g,l),\"{}\")),p=k.ensureSafeObject(k.computedMember(g,l)),k.assign(c,p),d&&(d.computed=!0,d.name=l);else{Xa(a.property.name);f&&1!==f&&k.if_(k.not(k.nonComputedMember(g,a.property.name)),k.lazyAssign(k.nonComputedMember(g,a.property.name),\r\n \"{}\"));p=k.nonComputedMember(g,a.property.name);if(k.state.expensiveChecks||Fb(a.property.name))p=k.ensureSafeObject(p);k.assign(c,p);d&&(d.computed=!1,d.name=a.property.name)}},function(){k.assign(c,\"undefined\")});e(c)},!!f);break;case s.CallExpression:c=c||this.nextId();a.filter?(l=k.filter(a.callee.name),n=[],m(a.arguments,function(a){var c=k.nextId();k.recurse(a,c);n.push(c)}),p=l+\"(\"+n.join(\",\")+\")\",k.assign(c,p),e(c)):(l=k.nextId(),g={},n=[],k.recurse(a.callee,l,g,function(){k.if_(k.notNull(l),\r\n function(){k.addEnsureSafeFunction(l);m(a.arguments,function(a){k.recurse(a,k.nextId(),w,function(a){n.push(k.ensureSafeObject(a))})});g.name?(k.state.expensiveChecks||k.addEnsureSafeObject(g.context),p=k.member(g.context,g.name,g.computed)+\"(\"+n.join(\",\")+\")\"):p=l+\"(\"+n.join(\",\")+\")\";p=k.ensureSafeObject(p);k.assign(c,p)},function(){k.assign(c,\"undefined\")});e(c)}));break;case s.AssignmentExpression:l=this.nextId();g={};if(!pd(a.left))throw Z(\"lval\");this.recurse(a.left,w,g,function(){k.if_(k.notNull(g.context),\r\n function(){k.recurse(a.right,l);k.addEnsureSafeObject(k.member(g.context,g.name,g.computed));k.addEnsureSafeAssignContext(g.context);p=k.member(g.context,g.name,g.computed)+a.operator+l;k.assign(c,p);e(c||p)})},1);break;case s.ArrayExpression:n=[];m(a.elements,function(a){k.recurse(a,k.nextId(),w,function(a){n.push(a)})});p=\"[\"+n.join(\",\")+\"]\";this.assign(c,p);e(p);break;case s.ObjectExpression:n=[];m(a.properties,function(a){k.recurse(a.value,k.nextId(),w,function(c){n.push(k.escape(a.key.type===\r\n s.Identifier?a.key.name:\"\"+a.key.value)+\":\"+c)})});p=\"{\"+n.join(\",\")+\"}\";this.assign(c,p);e(p);break;case s.ThisExpression:this.assign(c,\"s\");e(\"s\");break;case s.NGValueParameter:this.assign(c,\"v\"),e(\"v\")}},getHasOwnProperty:function(a,c){var d=a+\".\"+c,e=this.current().own;e.hasOwnProperty(d)||(e[d]=this.nextId(!1,a+\"&&(\"+this.escape(c)+\" in \"+a+\")\"));return e[d]},assign:function(a,c){if(a)return this.current().body.push(a,\"=\",c,\";\"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=\r\n this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,c){return\"ifDefined(\"+a+\",\"+this.escape(c)+\")\"},plus:function(a,c){return\"plus(\"+a+\",\"+c+\")\"},return_:function(a){this.current().body.push(\"return \",a,\";\")},if_:function(a,c,d){if(!0===a)c();else{var e=this.current().body;e.push(\"if(\",a,\"){\");c();e.push(\"}\");d&&(e.push(\"else{\"),d(),e.push(\"}\"))}},not:function(a){return\"!(\"+a+\")\"},notNull:function(a){return a+\"!=null\"},nonComputedMember:function(a,c){return a+\".\"+c},computedMember:function(a,\r\n c){return a+\"[\"+c+\"]\"},member:function(a,c,d){return d?this.computedMember(a,c):this.nonComputedMember(a,c)},addEnsureSafeObject:function(a){this.current().body.push(this.ensureSafeObject(a),\";\")},addEnsureSafeMemberName:function(a){this.current().body.push(this.ensureSafeMemberName(a),\";\")},addEnsureSafeFunction:function(a){this.current().body.push(this.ensureSafeFunction(a),\";\")},addEnsureSafeAssignContext:function(a){this.current().body.push(this.ensureSafeAssignContext(a),\";\")},ensureSafeObject:function(a){return\"ensureSafeObject(\"+\r\n a+\",text)\"},ensureSafeMemberName:function(a){return\"ensureSafeMemberName(\"+a+\",text)\"},ensureSafeFunction:function(a){return\"ensureSafeFunction(\"+a+\",text)\"},getStringValue:function(a){this.assign(a,\"getStringValue(\"+a+\",text)\")},ensureSafeAssignContext:function(a){return\"ensureSafeAssignContext(\"+a+\",text)\"},lazyRecurse:function(a,c,d,e,f,h){var g=this;return function(){g.recurse(a,c,d,e,f,h)}},lazyAssign:function(a,c){var d=this;return function(){d.assign(a,c)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,\r\n stringEscapeFn:function(a){return\"\\\\u\"+(\"0000\"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(G(a))return\"'\"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+\"'\";if(V(a))return a.toString();if(!0===a)return\"true\";if(!1===a)return\"false\";if(null===a)return\"null\";if(\"undefined\"===typeof a)return\"undefined\";throw Z(\"esc\");},nextId:function(a,c){var d=\"v\"+this.state.nextId++;a||this.current().vars.push(d+(c?\"=\"+c:\"\"));return d},current:function(){return this.state[this.state.computing]}};\r\n td.prototype={compile:function(a,c){var d=this,e=this.astBuilder.ast(a);this.expression=a;this.expensiveChecks=c;U(e,d.$filter);var f,h;if(f=qd(e))h=this.recurse(f);f=od(e.body);var g;f&&(g=[],m(f,function(a,c){var e=d.recurse(a);a.input=e;g.push(e);a.watchId=c}));var l=[];m(e.body,function(a){l.push(d.recurse(a.expression))});f=0===e.body.length?function(){}:1===e.body.length?l[0]:function(a,c){var d;m(l,function(e){d=e(a,c)});return d};h&&(f.assign=function(a,c,d){return h(a,d,c)});g&&(f.inputs=\r\n g);f.literal=rd(e);f.constant=e.constant;return f},recurse:function(a,c,d){var e,f,h=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case s.Literal:return this.value(a.value,c);case s.UnaryExpression:return f=this.recurse(a.argument),this[\"unary\"+a.operator](f,c);case s.BinaryExpression:return e=this.recurse(a.left),f=this.recurse(a.right),this[\"binary\"+a.operator](e,f,c);case s.LogicalExpression:return e=this.recurse(a.left),f=this.recurse(a.right),this[\"binary\"+a.operator](e,\r\n f,c);case s.ConditionalExpression:return this[\"ternary?:\"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),c);case s.Identifier:return Xa(a.name,h.expression),h.identifier(a.name,h.expensiveChecks||Fb(a.name),c,d,h.expression);case s.MemberExpression:return e=this.recurse(a.object,!1,!!d),a.computed||(Xa(a.property.name,h.expression),f=a.property.name),a.computed&&(f=this.recurse(a.property)),a.computed?this.computedMember(e,f,c,d,h.expression):this.nonComputedMember(e,f,\r\n h.expensiveChecks,c,d,h.expression);case s.CallExpression:return g=[],m(a.arguments,function(a){g.push(h.recurse(a))}),a.filter&&(f=this.$filter(a.callee.name)),a.filter||(f=this.recurse(a.callee,!0)),a.filter?function(a,d,e,h){for(var r=[],m=0;m\":function(a,c,d){return function(e,f,h,g){e=a(e,f,h,g)>c(e,f,h,g);return d?{value:e}:e}},\"binary<=\":function(a,c,d){return function(e,f,h,g){e=a(e,f,h,g)<=c(e,f,h,g);return d?{value:e}:e}},\"binary>=\":function(a,c,d){return function(e,f,h,g){e=a(e,f,h,g)>=c(e,f,h,g);return d?{value:e}:e}},\"binary&&\":function(a,c,d){return function(e,\r\n f,h,g){e=a(e,f,h,g)&&c(e,f,h,g);return d?{value:e}:e}},\"binary||\":function(a,c,d){return function(e,f,h,g){e=a(e,f,h,g)||c(e,f,h,g);return d?{value:e}:e}},\"ternary?:\":function(a,c,d,e){return function(f,h,g,l){f=a(f,h,g,l)?c(f,h,g,l):d(f,h,g,l);return e?{value:f}:f}},value:function(a,c){return function(){return c?{context:w,name:w,value:a}:a}},identifier:function(a,c,d,e,f){return function(h,g,l,k){h=g&&a in g?g:h;e&&1!==e&&h&&!h[a]&&(h[a]={});g=h?h[a]:w;c&&Ba(g,f);return d?{context:h,name:a,value:g}:\r\n g}},computedMember:function(a,c,d,e,f){return function(h,g,l,k){var n=a(h,g,l,k),p,m;null!=n&&(p=c(h,g,l,k),p=kd(p),Xa(p,f),e&&1!==e&&n&&!n[p]&&(n[p]={}),m=n[p],Ba(m,f));return d?{context:n,name:p,value:m}:m}},nonComputedMember:function(a,c,d,e,f,h){return function(g,l,k,n){g=a(g,l,k,n);f&&1!==f&&g&&!g[c]&&(g[c]={});l=null!=g?g[c]:w;(d||Fb(c))&&Ba(l,h);return e?{context:g,name:c,value:l}:l}},inputs:function(a,c){return function(d,e,f,h){return h?h[c]:a(d,e,f)}}};var fc=function(a,c,d){this.lexer=\r\n a;this.$filter=c;this.options=d;this.ast=new s(this.lexer);this.astCompiler=d.csp?new td(this.ast,c):new sd(this.ast,c)};fc.prototype={constructor:fc,parse:function(a){return this.astCompiler.compile(a,this.options.expensiveChecks)}};fa();fa();var Yf=Object.prototype.valueOf,Ca=I(\"$sce\"),oa={HTML:\"html\",CSS:\"css\",URL:\"url\",RESOURCE_URL:\"resourceUrl\",JS:\"js\"},ga=I(\"$compile\"),$=X.createElement(\"a\"),xd=Aa(Q.location.href);yd.$inject=[\"$document\"];Kc.$inject=[\"$provide\"];zd.$inject=[\"$locale\"];Bd.$inject=\r\n [\"$locale\"];var hc=\".\",hg={yyyy:aa(\"FullYear\",4),yy:aa(\"FullYear\",2,0,!0),y:aa(\"FullYear\",1),MMMM:Hb(\"Month\"),MMM:Hb(\"Month\",!0),MM:aa(\"Month\",2,1),M:aa(\"Month\",1,1),dd:aa(\"Date\",2),d:aa(\"Date\",1),HH:aa(\"Hours\",2),H:aa(\"Hours\",1),hh:aa(\"Hours\",2,-12),h:aa(\"Hours\",1,-12),mm:aa(\"Minutes\",2),m:aa(\"Minutes\",1),ss:aa(\"Seconds\",2),s:aa(\"Seconds\",1),sss:aa(\"Milliseconds\",3),EEEE:Hb(\"Day\"),EEE:Hb(\"Day\",!0),a:function(a,c){return 12>a.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a,c,d){a=-1*d;return a=(0<=\r\n a?\"+\":\"\")+(Gb(Math[0=a.getFullYear()?c.ERANAMES[0]:c.ERANAMES[1]}},gg=/((?:[^yMdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,fg=/^\\-?\\d+$/;Ad.$inject=[\"$locale\"];var cg=qa(F),dg=qa(sb);Cd.$inject=[\"$parse\"];var he=qa({restrict:\"E\",compile:function(a,c){if(!c.href&&!c.xlinkHref)return function(a,c){if(\"a\"===c[0].nodeName.toLowerCase()){var f=\"[object SVGAnimatedString]\"===\r\n va.call(c.prop(\"href\"))?\"xlink:href\":\"href\";c.on(\"click\",function(a){c.attr(f)||a.preventDefault()})}}}}),tb={};m(Bb,function(a,c){function d(a,d,f){a.$watch(f[e],function(a){f.$set(c,!!a)})}if(\"multiple\"!=a){var e=ya(\"ng-\"+c),f=d;\"checked\"===a&&(f=function(a,c,f){f.ngModel!==f[e]&&d(a,c,f)});tb[e]=function(){return{restrict:\"A\",priority:100,link:f}}}});m($c,function(a,c){tb[c]=function(){return{priority:100,link:function(a,e,f){if(\"ngPattern\"===c&&\"/\"==f.ngPattern.charAt(0)&&(e=f.ngPattern.match(jg))){f.$set(\"ngPattern\",\r\n new RegExp(e[1],e[2]));return}a.$watch(f[c],function(a){f.$set(c,a)})}}}});m([\"src\",\"srcset\",\"href\"],function(a){var c=ya(\"ng-\"+a);tb[c]=function(){return{priority:99,link:function(d,e,f){var h=a,g=a;\"href\"===a&&\"[object SVGAnimatedString]\"===va.call(e.prop(\"href\"))&&(g=\"xlinkHref\",f.$attr[g]=\"xlink:href\",h=null);f.$observe(c,function(c){c?(f.$set(g,c),Wa&&h&&e.prop(h,f[g])):\"href\"===a&&f.$set(g,null)})}}}});var Ib={$addControl:y,$$renameControl:function(a,c){a.$name=c},$removeControl:y,$setValidity:y,\r\n $setDirty:y,$setPristine:y,$setSubmitted:y};Gd.$inject=[\"$element\",\"$attrs\",\"$scope\",\"$animate\",\"$interpolate\"];var Od=function(a){return[\"$timeout\",\"$parse\",function(c,d){function e(a){return\"\"===a?d('this[\"\"]').assign:d(a).assign||y}return{name:\"form\",restrict:a?\"EAC\":\"E\",require:[\"form\",\"^^?form\"],controller:Gd,compile:function(d,h){d.addClass(Ya).addClass(mb);var g=h.name?\"name\":a&&h.ngForm?\"ngForm\":!1;return{pre:function(a,d,f,h){var m=h[0];if(!(\"action\"in f)){var t=function(c){a.$apply(function(){m.$commitViewValue();\r\n m.$setSubmitted()});c.preventDefault()};d[0].addEventListener(\"submit\",t,!1);d.on(\"$destroy\",function(){c(function(){d[0].removeEventListener(\"submit\",t,!1)},0,!1)})}(h[1]||m.$$parentForm).$addControl(m);var s=g?e(m.$name):y;g&&(s(a,m),f.$observe(g,function(c){m.$name!==c&&(s(a,w),m.$$parentForm.$$renameControl(m,c),s=e(m.$name),s(a,m))}));d.on(\"$destroy\",function(){m.$$parentForm.$removeControl(m);s(a,w);P(m,Ib)})}}}}}]},ie=Od(),ve=Od(!0),ig=/\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z)/,\r\n sg=/^(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?$/,tg=/^[a-z0-9!#$%&'*+\\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,ug=/^\\s*(\\-|\\+)?(\\d+|(\\d*(\\.\\d*)))([eE][+-]?\\d+)?\\s*$/,Pd=/^(\\d{4})-(\\d{2})-(\\d{2})$/,Qd=/^(\\d{4})-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/,lc=/^(\\d{4})-W(\\d\\d)$/,Rd=/^(\\d{4})-(\\d\\d)$/,Sd=/^(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/,Td={text:function(a,c,d,e,f,h){jb(a,c,d,e,f,h);jc(e)},date:kb(\"date\",\r\n Pd,Kb(Pd,[\"yyyy\",\"MM\",\"dd\"]),\"yyyy-MM-dd\"),\"datetime-local\":kb(\"datetimelocal\",Qd,Kb(Qd,\"yyyy MM dd HH mm ss sss\".split(\" \")),\"yyyy-MM-ddTHH:mm:ss.sss\"),time:kb(\"time\",Sd,Kb(Sd,[\"HH\",\"mm\",\"ss\",\"sss\"]),\"HH:mm:ss.sss\"),week:kb(\"week\",lc,function(a,c){if(ea(a))return a;if(G(a)){lc.lastIndex=0;var d=lc.exec(a);if(d){var e=+d[1],f=+d[2],h=d=0,g=0,l=0,k=Ed(e),f=7*(f-1);c&&(d=c.getHours(),h=c.getMinutes(),g=c.getSeconds(),l=c.getMilliseconds());return new Date(e,0,k.getDate()+f,d,h,g,l)}}return NaN},\"yyyy-Www\"),\r\n month:kb(\"month\",Rd,Kb(Rd,[\"yyyy\",\"MM\"]),\"yyyy-MM\"),number:function(a,c,d,e,f,h){Id(a,c,d,e);jb(a,c,d,e,f,h);e.$$parserName=\"number\";e.$parsers.push(function(a){return e.$isEmpty(a)?null:ug.test(a)?parseFloat(a):w});e.$formatters.push(function(a){if(!e.$isEmpty(a)){if(!V(a))throw lb(\"numfmt\",a);a=a.toString()}return a});if(A(d.min)||d.ngMin){var g;e.$validators.min=function(a){return e.$isEmpty(a)||v(g)||a>=g};d.$observe(\"min\",function(a){A(a)&&!V(a)&&(a=parseFloat(a,10));g=V(a)&&!isNaN(a)?a:w;e.$validate()})}if(A(d.max)||\r\n d.ngMax){var l;e.$validators.max=function(a){return e.$isEmpty(a)||v(l)||a<=l};d.$observe(\"max\",function(a){A(a)&&!V(a)&&(a=parseFloat(a,10));l=V(a)&&!isNaN(a)?a:w;e.$validate()})}},url:function(a,c,d,e,f,h){jb(a,c,d,e,f,h);jc(e);e.$$parserName=\"url\";e.$validators.url=function(a,c){var d=a||c;return e.$isEmpty(d)||sg.test(d)}},email:function(a,c,d,e,f,h){jb(a,c,d,e,f,h);jc(e);e.$$parserName=\"email\";e.$validators.email=function(a,c){var d=a||c;return e.$isEmpty(d)||tg.test(d)}},radio:function(a,c,\r\n d,e){v(d.name)&&c.attr(\"name\",++nb);c.on(\"click\",function(a){c[0].checked&&e.$setViewValue(d.value,a&&a.type)});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe(\"value\",e.$render)},checkbox:function(a,c,d,e,f,h,g,l){var k=Jd(l,a,\"ngTrueValue\",d.ngTrueValue,!0),n=Jd(l,a,\"ngFalseValue\",d.ngFalseValue,!1);c.on(\"click\",function(a){e.$setViewValue(c[0].checked,a&&a.type)});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return!1===a};e.$formatters.push(function(a){return ka(a,\r\n k)});e.$parsers.push(function(a){return a?k:n})},hidden:y,button:y,submit:y,reset:y,file:y},Ec=[\"$browser\",\"$sniffer\",\"$filter\",\"$parse\",function(a,c,d,e){return{restrict:\"E\",require:[\"?ngModel\"],link:{pre:function(f,h,g,l){l[0]&&(Td[F(g.type)]||Td.text)(f,h,g,l[0],c,a,d,e)}}}}],vg=/^(true|false|\\d+)$/,Ne=function(){return{restrict:\"A\",priority:100,compile:function(a,c){return vg.test(c.ngValue)?function(a,c,f){f.$set(\"value\",a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set(\"value\",\r\n a)})}}}},ne=[\"$compile\",function(a){return{restrict:\"AC\",compile:function(c){a.$$addBindingClass(c);return function(c,e,f){a.$$addBindingInfo(e,f.ngBind);e=e[0];c.$watch(f.ngBind,function(a){e.textContent=v(a)?\"\":a})}}}}],pe=[\"$interpolate\",\"$compile\",function(a,c){return{compile:function(d){c.$$addBindingClass(d);return function(d,f,h){d=a(f.attr(h.$attr.ngBindTemplate));c.$$addBindingInfo(f,d.expressions);f=f[0];h.$observe(\"ngBindTemplate\",function(a){f.textContent=v(a)?\"\":a})}}}}],oe=[\"$sce\",\"$parse\",\r\n \"$compile\",function(a,c,d){return{restrict:\"A\",compile:function(e,f){var h=c(f.ngBindHtml),g=c(f.ngBindHtml,function(a){return(a||\"\").toString()});d.$$addBindingClass(e);return function(c,e,f){d.$$addBindingInfo(e,f.ngBindHtml);c.$watch(g,function(){e.html(a.getTrustedHtml(h(c))||\"\")})}}}}],Me=qa({restrict:\"A\",require:\"ngModel\",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),qe=kc(\"\",!0),se=kc(\"Odd\",0),re=kc(\"Even\",1),te=Na({compile:function(a,c){c.$set(\"ngCloak\",\r\n w);a.removeClass(\"ng-cloak\")}}),ue=[function(){return{restrict:\"A\",scope:!0,controller:\"@\",priority:500}}],Jc={},wg={blur:!0,focus:!0};m(\"click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste\".split(\" \"),function(a){var c=ya(\"ng-\"+a);Jc[c]=[\"$parse\",\"$rootScope\",function(d,e){return{restrict:\"A\",compile:function(f,h){var g=d(h[c],null,!0);return function(c,d){d.on(a,function(d){var f=function(){g(c,{$event:d})};\r\n wg[a]&&e.$$phase?c.$evalAsync(f):c.$apply(f)})}}}}]});var xe=[\"$animate\",function(a){return{multiElement:!0,transclude:\"element\",priority:600,terminal:!0,restrict:\"A\",$$tlb:!0,link:function(c,d,e,f,h){var g,l,k;c.$watch(e.ngIf,function(c){c?l||h(function(c,f){l=f;c[c.length++]=X.createComment(\" end ngIf: \"+e.ngIf+\" \");g={clone:c};a.enter(c,d.parent(),d)}):(k&&(k.remove(),k=null),l&&(l.$destroy(),l=null),g&&(k=rb(g.clone),a.leave(k).then(function(){k=null}),g=null))})}}}],ye=[\"$templateRequest\",\"$anchorScroll\",\r\n \"$animate\",function(a,c,d){return{restrict:\"ECA\",priority:400,terminal:!0,transclude:\"element\",controller:da.noop,compile:function(e,f){var h=f.ngInclude||f.src,g=f.onload||\"\",l=f.autoscroll;return function(e,f,m,r,t){var s=0,v,u,q,z=function(){u&&(u.remove(),u=null);v&&(v.$destroy(),v=null);q&&(d.leave(q).then(function(){u=null}),u=q,q=null)};e.$watch(h,function(h){var m=function(){!A(l)||l&&!e.$eval(l)||c()},p=++s;h?(a(h,!0).then(function(a){if(p===s){var c=e.$new();r.template=a;a=t(c,function(a){z();\r\n d.enter(a,null,f).then(m)});v=c;q=a;v.$emit(\"$includeContentLoaded\",h);e.$eval(g)}},function(){p===s&&(z(),e.$emit(\"$includeContentError\",h))}),e.$emit(\"$includeContentRequested\",h)):(z(),r.template=null)})}}}}],Pe=[\"$compile\",function(a){return{restrict:\"ECA\",priority:-400,require:\"ngInclude\",link:function(c,d,e,f){/SVG/.test(d[0].toString())?(d.empty(),a(Mc(f.template,X).childNodes)(c,function(a){d.append(a)},{futureParentElement:d})):(d.html(f.template),a(d.contents())(c))}}}],ze=Na({priority:450,\r\n compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),Le=function(){return{restrict:\"A\",priority:100,require:\"ngModel\",link:function(a,c,d,e){var f=c.attr(d.$attr.ngList)||\", \",h=\"false\"!==d.ngTrim,g=h?T(f):f;e.$parsers.push(function(a){if(!v(a)){var c=[];a&&m(a.split(g),function(a){a&&c.push(h?T(a):a)});return c}});e.$formatters.push(function(a){return J(a)?a.join(f):w});e.$isEmpty=function(a){return!a||!a.length}}}},mb=\"ng-valid\",Kd=\"ng-invalid\",Ya=\"ng-pristine\",Jb=\"ng-dirty\",Md=\r\n \"ng-pending\",lb=I(\"ngModel\"),xg=[\"$scope\",\"$exceptionHandler\",\"$attrs\",\"$element\",\"$parse\",\"$animate\",\"$timeout\",\"$rootScope\",\"$q\",\"$interpolate\",function(a,c,d,e,f,h,g,l,k,n){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=w;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=\r\n w;this.$name=n(d.name||\"\",!1)(a);this.$$parentForm=Ib;var p=f(d.ngModel),r=p.assign,t=p,s=r,K=null,u,q=this;this.$$setOptions=function(a){if((q.$options=a)&&a.getterSetter){var c=f(d.ngModel+\"()\"),g=f(d.ngModel+\"($$$p)\");t=function(a){var d=p(a);x(d)&&(d=c(a));return d};s=function(a,c){x(p(a))?g(a,{$$$p:q.$modelValue}):r(a,q.$modelValue)}}else if(!p.assign)throw lb(\"nonassign\",d.ngModel,xa(e));};this.$render=y;this.$isEmpty=function(a){return v(a)||\"\"===a||null===a||a!==a};var z=0;Hd({ctrl:this,$element:e,\r\n set:function(a,c){a[c]=!0},unset:function(a,c){delete a[c]},$animate:h});this.$setPristine=function(){q.$dirty=!1;q.$pristine=!0;h.removeClass(e,Jb);h.addClass(e,Ya)};this.$setDirty=function(){q.$dirty=!0;q.$pristine=!1;h.removeClass(e,Ya);h.addClass(e,Jb);q.$$parentForm.$setDirty()};this.$setUntouched=function(){q.$touched=!1;q.$untouched=!0;h.setClass(e,\"ng-untouched\",\"ng-touched\")};this.$setTouched=function(){q.$touched=!0;q.$untouched=!1;h.setClass(e,\"ng-touched\",\"ng-untouched\")};this.$rollbackViewValue=\r\n function(){g.cancel(K);q.$viewValue=q.$$lastCommittedViewValue;q.$render()};this.$validate=function(){if(!V(q.$modelValue)||!isNaN(q.$modelValue)){var a=q.$$rawModelValue,c=q.$valid,d=q.$modelValue,e=q.$options&&q.$options.allowInvalid;q.$$runValidators(a,q.$$lastCommittedViewValue,function(f){e||c===f||(q.$modelValue=f?a:w,q.$modelValue!==d&&q.$$writeModelToScope())})}};this.$$runValidators=function(a,c,d){function e(){var d=!0;m(q.$validators,function(e,f){var h=e(a,c);d=d&&h;g(f,h)});return d?\r\n !0:(m(q.$asyncValidators,function(a,c){g(c,null)}),!1)}function f(){var d=[],e=!0;m(q.$asyncValidators,function(f,h){var k=f(a,c);if(!k||!x(k.then))throw lb(\"$asyncValidators\",k);g(h,w);d.push(k.then(function(){g(h,!0)},function(a){e=!1;g(h,!1)}))});d.length?k.all(d).then(function(){h(e)},y):h(!0)}function g(a,c){l===z&&q.$setValidity(a,c)}function h(a){l===z&&d(a)}z++;var l=z;(function(){var a=q.$$parserName||\"parse\";if(v(u))g(a,null);else return u||(m(q.$validators,function(a,c){g(c,null)}),m(q.$asyncValidators,\r\n function(a,c){g(c,null)})),g(a,u),u;return!0})()?e()?f():h(!1):h(!1)};this.$commitViewValue=function(){var a=q.$viewValue;g.cancel(K);if(q.$$lastCommittedViewValue!==a||\"\"===a&&q.$$hasNativeValidators)q.$$lastCommittedViewValue=a,q.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var c=q.$$lastCommittedViewValue;if(u=v(c)?w:!0)for(var d=0;df||e.$isEmpty(c)||c.length<=f}}}}},Hc=function(){return{restrict:\"A\",require:\"?ngModel\",link:function(a,c,d,e){if(e){var f=0;d.$observe(\"minlength\",function(a){f=Y(a)||0;e.$validate()});\r\n e.$validators.minlength=function(a,c){return e.$isEmpty(c)||c.length>=f}}}}};Q.angular.bootstrap?console.log(\"WARNING: Tried to load angular more than once.\"):(ce(),ee(da),da.module(\"ngLocale\",[],[\"$provide\",function(a){function c(a){a+=\"\";var c=a.indexOf(\".\");return-1==c?0:a.length-c-1}a.value(\"$locale\",{DATETIME_FORMATS:{AMPMS:[\"AM\",\"PM\"],DAY:\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),ERANAMES:[\"Before Christ\",\"Anno Domini\"],ERAS:[\"BC\",\"AD\"],FIRSTDAYOFWEEK:6,MONTH:\"January February March April May June July August September October November December\".split(\" \"),\r\n SHORTDAY:\"Sun Mon Tue Wed Thu Fri Sat\".split(\" \"),SHORTMONTH:\"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\".split(\" \"),WEEKENDRANGE:[5,6],fullDate:\"EEEE, MMMM d, y\",longDate:\"MMMM d, y\",medium:\"MMM d, y h:mm:ss a\",mediumDate:\"MMM d, y\",mediumTime:\"h:mm:ss a\",\"short\":\"M/d/yy h:mm a\",shortDate:\"M/d/yy\",shortTime:\"h:mm a\"},NUMBER_FORMATS:{CURRENCY_SYM:\"$\",DECIMAL_SEP:\".\",GROUP_SEP:\",\",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:\"-\",negSuf:\"\",posPre:\"\",posSuf:\"\"},{gSize:3,lgSize:3,\r\n maxFrac:2,minFrac:2,minInt:1,negPre:\"-\\u00a4\",negSuf:\"\",posPre:\"\\u00a4\",posSuf:\"\"}]},id:\"en-us\",pluralCat:function(a,e){var f=a|0,h=e;w===h&&(h=Math.min(c(a),3));Math.pow(10,h);return 1==f&&0==h?\"one\":\"other\"}})}]),B(X).ready(function(){Zd(X,zc)}))})(window,document);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend('');\n\n/*** EXPORTS FROM exports-loader ***/\nmodule.exports = angular;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\")))\n\n//# sourceURL=webpack:///./src/public/js/vendor/angular/angular.min.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/datatables/dataTables.grouping.js": -/*!****************************************************************!*\ - !*** ./src/public/js/vendor/datatables/dataTables.grouping.js ***! - \****************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("/* WEBPACK VAR INJECTION */(function(jQuery) {/*\r\n * File: jquery.dataTables.grouping.js\r\n * Version: 1.2.9.\r\n * Author: Jovan Popovic\r\n *\r\n * Copyright 2013 Jovan Popovic, all rights reserved.\r\n *\r\n * This source file is free software, under either the GPL v2 license or a\r\n * BSD style license, as supplied with this software.\r\n *\r\n * This source file is distributed in the hope that it will be useful, but\r\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r\n * or FITNESS FOR A PARTICULAR PURPOSE.\r\n * Parameters:\r\n * @iGroupingColumnIndex Integer Index of the column that will be used for grouping - default 0\r\n * @sGroupingColumnSortDirection Enumeration Sort direction of the group\r\n * @iGroupingOrderByColumnIndex Integer Index of the column that will be used for ordering groups\r\n * @sGroupingClass String Class that will be associated to the group row. Default - \"group\"\r\n * @sGroupItemClass String Class that will be associated to the group row of group items. Default - \"group-item\"\r\n * @bSetGroupingClassOnTR Boolean If set class will be set to the TR instead of the TD withing the grouping TR\r\n * @bHideGroupingColumn Boolean Hide column used for grouping once results are grouped. Default - true\r\n * @bHideGroupingOrderByColumn Boolean Hide column used for ordering groups once results are grouped. Default - true\r\n * @sGroupBy Enumeration Type of grouping that should be applied. Values \"name\"(default), \"letter\", \"year\"\r\n * @sGroupLabelPrefix String Prefix that will be added to each group cell\r\n * @bExpandableGrouping Boolean Attach expand/collapse handlers to the grouping rows\r\n * @bExpandSingleGroup Boolean Use accordon grouping\r\n * @iExpandGroupOffset Integer Number of pixels to set scroll position above the currently selected group. If -1 scroll will be alligned to the table\r\n * General settings\r\n * @sDateFormat: \"dd/MM/yyyy\" String Date format used for grouping\r\n * @sEmptyGroupLabel String Lable that will be placed as group if grouping cells are empty. Default \"-\"\r\n\r\n * Parameters used in the second level grouping\r\n * @iGroupingColumnIndex2 Integer Index of the secondary column that will be used for grouping - default 0\r\n * @sGroupingColumnSortDirection2 Enumeration Sort direction of the secondary group\r\n * @iGroupingOrderByColumnIndex2 Integer Index of the column that will be used for ordering secondary groups\r\n * @sGroupingClass2 String Class that will be associated to the secondary group row. Default \"subgroup\"\r\n * @sGroupItemClass2 String Class that will be associated to the secondary group row of group items. Default \"subgroup-item\"\r\n * @bHideGroupingColumn2 Boolean Hide column used for secondary grouping once results are grouped. Default - true,\r\n * @bHideGroupingOrderByColumn2 Boolean Hide column used for ordering secondary groups once results are grouped. Default - true,\r\n * @sGroupBy2 Enumeration Type of grouping that should be applied to secondary column. Values \"name\"(default), \"letter\", \"year\",\r\n * @sGroupLabelPrefix2 String Prefix that will be added to each secondary group cell\r\n * @fnOnGrouped Function Function that is called when grouping is finished. Function has no parameters.\r\n */\r\n(function(a){a.fn.rowGrouping=function(e){function b(){}function c(j,h,i){}function d(j,h,i){}function g(i){var h=[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"];return h[i-1]}var f={iGroupingColumnIndex:0,sGroupingColumnSortDirection:\"\",iGroupingOrderByColumnIndex:-1,sGroupingClass:\"group\",sGroupItemClass:\"group-item\",bHideGroupingColumn:true,bHideGroupingOrderByColumn:true,sGroupBy:\"name\",sGroupLabelPrefix:\"\",fnGroupLabelFormat:function(h){return h},bExpandableGrouping:false,bExpandSingleGroup:false,iExpandGroupOffset:100,asExpandedGroups:null,sDateFormat:\"dd/MM/yyyy\",sEmptyGroupLabel:\"-\",bSetGroupingClassOnTR:false,iGroupingColumnIndex2:-1,sGroupingColumnSortDirection2:\"\",iGroupingOrderByColumnIndex2:-1,sGroupingClass2:\"subgroup\",sGroupItemClass2:\"subgroup-item\",bHideGroupingColumn2:true,bHideGroupingOrderByColumn2:true,sGroupBy2:\"name\",sGroupLabelPrefix2:\"\",fnGroupLabelFormat2:function(h){return h},bExpandableGrouping2:false,fnOnGrouped:b,fnOnGroupCreated:c,fnOnGroupCompleted:d,oHideEffect:null,oShowEffect:null,bUseFilteringForGrouping:false};return this.each(function(s,J){var E=a(J).dataTable();var B=new Array();a(this).dataTableExt.aoGroups=B;function q(T,i,P){var R=document.createElement(\"tr\");var S=document.createElement(\"td\");R.id=\"group-id-\"+E.attr(\"id\")+\"_\"+T;var Q={id:R.id,key:T,text:i,level:0,groupItemClass:\".group-item-\"+T,dataGroup:T,aoSubgroups:new Array()};if(t.bSetGroupingClassOnTR){R.className=t.sGroupingClass+\" \"+T}else{S.className=t.sGroupingClass+\" \"+T}S.colSpan=P;S.innerHTML=t.sGroupLabelPrefix+t.fnGroupLabelFormat(i==\"\"?t.sEmptyGroupLabel:i,Q);if(t.bExpandableGrouping){if(!I(T)){S.className+=\" expanded-group\";Q.state=\"expanded\"}else{S.className+=\" collapsed-group\";Q.state=\"collapsed\"}S.className+=\" group-item-expander\";a(S).attr(\"data-group\",Q.dataGroup);a(S).attr(\"data-group-level\",Q.level);a(S).click(h)}R.appendChild(S);B[T]=Q;Q.nGroup=R;t.fnOnGroupCreated(Q,T,1);return Q}function w(R,Q,P,T){var i=document.createElement(\"tr\");i.id=T.id+\"_\"+R;var V=document.createElement(\"td\");var U=T.dataGroup+\"_\"+R;var S={id:i.id,key:R,text:Q,level:T.level+1,groupItemClass:\".group-item-\"+U,dataGroup:U,aoSubgroups:new Array()};if(t.bSetGroupingClassOnTR){i.className=t.sGroupingClass2+\" \"+R}else{V.className=t.sGroupingClass2+\" \"+R}V.colSpan=P;V.innerHTML=t.sGroupLabelPrefix2+t.fnGroupLabelFormat2(Q==\"\"?t.sEmptyGroupLabel:Q,S);if(t.bExpandableGrouping){i.className+=\" group-item-\"+T.dataGroup}if(t.bExpandableGrouping&&t.bExpandableGrouping2){if(!I(S.dataGroup)){V.className+=\" expanded-group\";S.state=\"expanded\"}else{V.className+=\" collapsed-group\";S.state=\"collapsed\"}V.className+=\" group-item-expander\";a(V).attr(\"data-group\",S.dataGroup);a(V).attr(\"data-group-level\",S.level);a(V).click(h)}i.appendChild(V);T.aoSubgroups[S.dataGroup]=S;B[S.dataGroup]=S;S.nGroup=i;t.fnOnGroupCreated(S,R,2);return S}function I(i){if(B[i]!=null){return(B[i].state==\"collapsed\")}else{if(i.indexOf(\"_\")>-1){true}else{if(l&&(j==null||j.length==0)){return false}else{return(a.inArray(i,j)==-1)}}}}function L(i){if(i.length<(x+K)){return i}else{return i.substr(x,K)}}function y(i){return i}function M(i){return i.substr(0,1)}function O(i){return L(i)}function C(i){return i.substr(x,K)+\" \"+g(i.substr(r,H))}function u(i){if(i===\"\"){return\"-\"}return i.toLowerCase().replace(/[^a-zA-Z0-9\\u0080-\\uFFFF]+/g,\"-\")}function D(R,P,i){if(R.nTable.id!==E[0].id){return true}var Q=P[t.iGroupingColumnIndex];if(typeof Q===\"undefined\"){Q=P[R.aoColumns[t.iGroupingColumnIndex].mDataProp]}if(I(u(Q))){if(E.fnIsOpen(E.fnGetNodes(i))){if(t.fnOnRowClosed!=null){t.fnOnRowClosed(this)}E.fnClose(E.fnGetNodes(i))}return false}return true}function p(i){B[i].state=\"expanded\";a(\"td[data-group^='\"+i+\"']\").removeClass(\"collapsed-group\");a(\"td[data-group^='\"+i+\"']\").addClass(\"expanded-group\");if(t.bUseFilteringForGrouping){E.fnDraw();return}if(jQuery.inArray(i,j)==-1){j.push(i)}if(t.oHideEffect!=null){a(\".group-item-\"+i,E)[t.oShowEffect.method](t.oShowEffect.duration,t.oShowEffect.easing,function(){})}else{a(\".group-item-\"+i,E).show()}}function m(i){B[i].state=\"collapsed\";a(\"td[data-group^='\"+i+\"']\").removeClass(\"expanded-group\");a(\"td[data-group^='\"+i+\"']\").addClass(\"collapsed-group\");if(t.bUseFilteringForGrouping){E.fnDraw();return}a(\".group-item-\"+i).each(function(){if(E.fnIsOpen(this)){if(t.fnOnRowClosed!=null){t.fnOnRowClosed(this)}E.fnClose(this)}});if(t.oHideEffect!=null){a(\".group-item-\"+i,E)[t.oHideEffect.method](t.oHideEffect.duration,t.oHideEffect.easing,function(){})}else{a(\".group-item-\"+i,E).hide()}}function h(T){var Q=a(this).attr(\"data-group\");var S=a(this).attr(\"data-group-level\");var R=!I(Q);if(t.bExpandSingleGroup){if(!R){var P=a(\"td.expanded-group\").attr(\"data-group\");m(P);p(Q);if(t.iExpandGroupOffset!=-1){var i=a(\"#group-id-\"+E.attr(\"id\")+\"_\"+Q).offset().top-t.iExpandGroupOffset;window.scroll(0,i)}else{var i=E.offset().top;window.scroll(0,i)}}}else{if(R){m(Q)}else{p(Q)}}T.preventDefault()}function A(V){if(E.fnSettings().oFeatures.bServerSide){l=true}var Z=false;if(t.iGroupingColumnIndex2!=-1){Z=true}if(V.aiDisplayMaster.length==0){return}var T=a(\"tbody tr\",E);var Q=0;for(var ae=0;ae0){for(var ag=0;ag 0) {\r\n // IPV6\r\n var count = 0;\r\n for(i = 0; i < n.length; i++) {\r\n item = n[i];\r\n\r\n if (i > 0) {\r\n xa += \":\";\r\n }\r\n\r\n if(item.length === 0) {\r\n count += 0;\r\n }\r\n else if(item.length == 1) {\r\n xa += \"000\" + item;\r\n count += 4;\r\n }\r\n else if(item.length == 2) {\r\n xa += \"00\" + item;\r\n count += 4;\r\n }\r\n else if(item.length == 3) {\r\n xa += \"0\" + item;\r\n count += 4;\r\n }\r\n else {\r\n xa += item;\r\n count += 4;\r\n }\r\n }\r\n\r\n // Padding the ::\r\n n = xa.split(\":\");\r\n var paddDone = 0;\r\n\r\n for (i = 0; i < n.length; i++) {\r\n item = n[i];\r\n\r\n if (item.length === 0 && paddDone === 0) {\r\n for (var padding = 0 ; padding < (32-count) ; padding++) {\r\n x += \"0\";\r\n paddDone = 1;\r\n }\r\n }\r\n else {\r\n x += item;\r\n }\r\n }\r\n }\r\n\r\n return x;\r\n },\r\n\r\n \"ip-address-asc\": function ( a, b ) {\r\n return ((a < b) ? -1 : ((a > b) ? 1 : 0));\r\n },\r\n\r\n \"ip-address-desc\": function ( a, b ) {\r\n return ((a < b) ? 1 : ((a > b) ? -1 : 0));\r\n }\r\n});\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! jquery */ \"./src/public/js/vendor/jquery/jquery.js\")))\n\n//# sourceURL=webpack:///./src/public/js/vendor/datatables/dataTables.ipaddress.js?"); - -/***/ }), - -/***/ "./src/public/js/vendor/datatables/dataTables.responsive.js": -/*!******************************************************************!*\ - !*** ./src/public/js/vendor/datatables/dataTables.responsive.js ***! - \******************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! Responsive 1.0.1\r\n * 2014 SpryMedia Ltd - datatables.net/license\r\n */\r\n\r\n/**\r\n * @summary Responsive\r\n * @description Responsive tables plug-in for DataTables\r\n * @version 1.0.1\r\n * @file dataTables.responsive.js\r\n * @author SpryMedia Ltd (www.sprymedia.co.uk)\r\n * @contact www.sprymedia.co.uk/contact\r\n * @copyright Copyright 2014 SpryMedia Ltd.\r\n *\r\n * This source file is free software, available under the following license:\r\n * MIT license - http://datatables.net/license/mit\r\n *\r\n * This source file is distributed in the hope that it will be useful, but\r\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r\n * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.\r\n *\r\n * For details please refer to: http://www.datatables.net\r\n */\r\n\r\n(function(window, document, undefined) {\r\n\r\n\r\nvar factory = function( $, DataTable ) {\r\n\"use strict\";\r\n\r\n/**\r\n * Responsive is a plug-in for the DataTables library that makes use of\r\n * DataTables' ability to change the visibility of columns, changing the\r\n * visibility of columns so the displayed columns fit into the table container.\r\n * The end result is that complex tables will be dynamically adjusted to fit\r\n * into the viewport, be it on a desktop, tablet or mobile browser.\r\n *\r\n * Responsive for DataTables has two modes of operation, which can used\r\n * individually or combined:\r\n *\r\n * * Class name based control - columns assigned class names that match the\r\n * breakpoint logic can be shown / hidden as required for each breakpoint.\r\n * * Automatic control - columns are automatically hidden when there is no\r\n * room left to display them. Columns removed from the right.\r\n *\r\n * In additional to column visibility control, Responsive also has built into\r\n * options to use DataTables' child row display to show / hide the information\r\n * from the table that has been hidden. There are also two modes of operation\r\n * for this child row display:\r\n *\r\n * * Inline - when the control element that the user can use to show / hide\r\n * child rows is displayed inside the first column of the table.\r\n * * Column - where a whole column is dedicated to be the show / hide control.\r\n *\r\n * Initialisation of Responsive is performed by:\r\n *\r\n * * Adding the class `responsive` or `dt-responsive` to the table. In this case\r\n * Responsive will automatically be initialised with the default configuration\r\n * options when the DataTable is created.\r\n * * Using the `responsive` option in the DataTables configuration options. This\r\n * can also be used to specify the configuration options, or simply set to\r\n * `true` to use the defaults.\r\n *\r\n * @class\r\n * @param {object} settings DataTables settings object for the host table\r\n * @param {object} [opts] Configuration options\r\n * @requires jQuery 1.7+\r\n * @requires DataTables 1.10.1+\r\n *\r\n * @example\r\n * $('#example').DataTable( {\r\n * responsive: true\r\n * } );\r\n * } );\r\n */\r\nvar Responsive = function ( settings, opts ) {\r\n\t// Sanity check that we are using DataTables 1.10 or newer\r\n\tif ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.1' ) ) {\r\n\t\tthrow 'DataTables Responsive requires DataTables 1.10.1 or newer';\r\n\t}\r\n\telse if ( settings.responsive ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tthis.s = {\r\n\t\tdt: new DataTable.Api( settings ),\r\n\t\tcolumns: []\r\n\t};\r\n\r\n\t// details is an object, but for simplicity the user can give it as a string\r\n\tif ( opts && typeof opts.details === 'string' ) {\r\n\t\topts.details = { type: opts.details };\r\n\t}\r\n\r\n\tthis.c = $.extend( true, {}, Responsive.defaults, opts );\r\n\tsettings.responsive = this;\r\n\tthis._constructor();\r\n};\r\n\r\nResponsive.prototype = {\r\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n\t * Constructor\r\n\t */\r\n\r\n\t/**\r\n\t * Initialise the Responsive instance\r\n\t *\r\n\t * @private\r\n\t */\r\n\t_constructor: function ()\r\n\t{\r\n\t\tvar that = this;\r\n\t\tvar dt = this.s.dt;\r\n\r\n\t\tdt.settings()[0]._responsive = this;\r\n\r\n\t\t// Use DataTables' private throttle function to avoid processor thrashing\r\n\t\t$(window).on( 'resize.dtr orientationchange.dtr', dt.settings()[0].oApi._fnThrottle( function () {\r\n\t\t\tthat._resize();\r\n\t\t} ) );\r\n\r\n\t\t// Destroy event handler\r\n\t\tdt.on( 'destroy.dtr', function () {\r\n\t\t\t$(window).off( 'resize.dtr orientationchange.dtr' );\r\n\t\t} );\r\n\r\n\t\t// Reorder the breakpoints array here in case they have been added out\r\n\t\t// of order\r\n\t\tthis.c.breakpoints.sort( function (a, b) {\r\n\t\t\treturn a.width < b.width ? 1 :\r\n\t\t\t\ta.width > b.width ? -1 : 0;\r\n\t\t} );\r\n\r\n\t\tthis._classLogic();\r\n\t\tthis._resizeAuto();\r\n\r\n\t\t// First pass - draw the table for the current viewport size\r\n\t\tthis._resize();\r\n\r\n\t\t// Details handler\r\n\t\tvar details = this.c.details;\r\n\t\tif ( details.type ) {\r\n\t\t\tthat._detailsInit();\r\n\t\t\tthis._detailsVis();\r\n\r\n\t\t\tdt.on( 'column-visibility.dtr', function () {\r\n\t\t\t\tthat._detailsVis();\r\n\t\t\t} );\r\n\r\n\t\t\t$(dt.table().node()).addClass( 'dtr-'+details.type );\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\r\n\t * Private methods\r\n\t */\r\n\r\n\t/**\r\n\t * Calculate the visibility for the columns in a table for a given\r\n\t * breakpoint. The result is pre-determined based on the class logic if\r\n\t * class names are used to control all columns, but the width of the table\r\n\t * is also used if there are columns which are to be automatically shown\r\n\t * and hidden.\r\n\t *\r\n\t * @param {string} breakpoint Breakpoint name to use for the calculation\r\n\t * @return {array} Array of boolean values initiating the visibility of each\r\n\t * column.\r\n\t * @private\r\n\t */\r\n\t_columnsVisiblity: function ( breakpoint )\r\n\t{\r\n\t\tvar dt = this.s.dt;\r\n\t\tvar columns = this.s.columns;\r\n\t\tvar i, ien;\r\n\r\n\t\t// Class logic - determine which columns are in this breakpoint based\r\n\t\t// on the classes. If no class control (i.e. `auto`) then `-` is used\r\n\t\t// to indicate this to the rest of the function\r\n\t\tvar display = $.map( columns, function ( col ) {\r\n\t\t\treturn col.auto && col.minWidth === null ?\r\n\t\t\t\tfalse :\r\n\t\t\t\tcol.auto === true ?\r\n\t\t\t\t\t'-' :\r\n\t\t\t\t\tcol.includeIn.indexOf( breakpoint ) !== -1;\r\n\t\t} );\r\n\r\n\t\t// Auto column control - first pass: how much width is taken by the\r\n\t\t// ones that must be included from the non-auto columns\r\n\t\tvar requiredWidth = 0;\r\n\t\tfor ( i=0, ien=display.length ; i
        "].join("")).appendTo("body")).dialog=modal.find(".uk-modal-dialog:first"),modal.content=modal.find(".uk-lightbox-content:first"),modal.loader=modal.find(".uk-modal-spinner:first"),modal.closer=modal.find(".uk-close.uk-close-alt"),modal.modal=UI.modal(modal,{modal:!1}),modal.on("swipeRight swipeLeft",function(e){modal.lightbox["swipeLeft"==e.type?"next":"previous"]()}).on("click","[data-lightbox-previous], [data-lightbox-next]",function(e){e.preventDefault(),modal.lightbox[UI.$(this).is("[data-lightbox-next]")?"next":"previous"]()}),modal.on("hide.uk.modal",function(e){modal.content.html("")}),UI.$win.on("load resize orientationchange",UI.Utils.debounce(function(e){modal.is(":visible")&&!UI.Utils.isFullscreen()&&modal.lightbox.fitSize()}.bind(this),100)),modal.lightbox=lightbox,modal}(this),this.modal.dialog.stop(),this.modal.content.stop();var data,item,$this=this,promise=UI.$.Deferred();"object"==typeof(index=index||0)&&this.siblings.forEach(function(s,idx){index[0]===s.link[0]&&(index=idx)}),index<0?index=this.siblings.length-index:this.siblings[index]||(index=0),item=this.siblings[index],data={lightbox:$this,source:item.source,type:item.type,index:index,promise:promise,title:item.title,item:item,meta:{content:"",width:null,height:null}},this.index=index,this.modal.content.empty(),this.modal.is(":visible")||(this.modal.content.css({width:"",height:""}).empty(),this.modal.modal.show()),this.modal.loader.removeClass("uk-hidden"),promise.promise().done(function(){$this.data=data,$this.fitSize(data)}).fail(function(){data.meta.content='
        Loading resource failed!
        ',data.meta.width=400,data.meta.height=300,$this.data=data,$this.fitSize(data)}),$this.trigger("showitem.uk.lightbox",[data])},fitSize:function(){var $this=this,data=this.data,pad=this.modal.dialog.outerWidth()-this.modal.dialog.width(),dpad=parseInt(this.modal.dialog.css("margin-top"),10)+parseInt(this.modal.dialog.css("margin-bottom"),10),content=data.meta.content,duration=$this.options.duration;1',''].join(""));var maxwidth,maxheight,tmp=UI.$("
         
        ").css({opacity:0,position:"absolute",top:0,left:0,width:"100%","max-width":$this.modal.dialog.css("max-width"),padding:$this.modal.dialog.css("padding"),margin:$this.modal.dialog.css("margin")}),w=data.meta.width,h=data.meta.height;tmp.appendTo("body").width(),maxwidth=tmp.width(),maxheight=window.innerHeight-dpad,tmp.remove(),this.modal.dialog.find(".uk-modal-caption").remove(),data.title&&(this.modal.dialog.append('
        '+data.title+"
        "),maxheight-=this.modal.dialog.find(".uk-modal-caption").outerHeight()),maxwidth',width:width,height:height},data.type="image",data.promise.resolve()};if(cache[data.source])resolve(data.source,cache[data.source].width,cache[data.source].height);else{var img=new Image;img.onerror=function(){data.promise.reject("Loading image failed")},img.onload=function(){cache[data.source]={width:img.width,height:img.height},resolve(data.source,cache[data.source].width,cache[data.source].height)},img.src=data.source}}})}}),UI.plugin("lightbox","youtube",{init:function(lightbox){var youtubeRegExp=/(\/\/.*?youtube\.[a-z]+)\/watch\?v=([^&]+)&?(.*)/,youtubeRegExpShort=/youtu\.be\/(.*)/;lightbox.on("showitem.uk.lightbox",function(e,data){var id,matches,resolve=function(id,width,height){data.meta={content:'',width:width,height:height},data.type="iframe",data.promise.resolve()};if((matches=data.source.match(youtubeRegExp))&&(id=matches[2]),(matches=data.source.match(youtubeRegExpShort))&&(id=matches[1]),id){if(cache[id])resolve(id,cache[id].width,cache[id].height);else{var img=new Image,lowres=!1;img.onerror=function(){cache[id]={width:640,height:320},resolve(id,cache[id].width,cache[id].height)},img.onload=function(){120==img.width&&90==img.height?lowres?(cache[id]={width:640,height:320},resolve(id,cache[id].width,cache[id].height)):(lowres=!0,img.src="//img.youtube.com/vi/"+id+"/0.jpg"):(cache[id]={width:img.width,height:img.height},resolve(id,img.width,img.height))},img.src="//img.youtube.com/vi/"+id+"/maxresdefault.jpg"}e.stopImmediatePropagation()}})}}),UI.plugin("lightbox","vimeo",{init:function(lightbox){var matches,regex=/(\/\/.*?)vimeo\.[a-z]+\/([0-9]+).*?/;lightbox.on("showitem.uk.lightbox",function(e,data){var id,resolve=function(id,width,height){data.meta={content:'',width:width,height:height},data.type="iframe",data.promise.resolve()};(matches=data.source.match(regex))&&(id=matches[2],cache[id]?resolve(id,cache[id].width,cache[id].height):UI.$.ajax({type:"GET",url:"http://vimeo.com/api/oembed.json?url="+encodeURI(data.source),jsonp:"callback",dataType:"jsonp",success:function(data){cache[id]={width:data.width,height:data.height},resolve(id,cache[id].width,cache[id].height)}}),e.stopImmediatePropagation())})}}),UI.plugin("lightbox","video",{init:function(lightbox){lightbox.on("showitem.uk.lightbox",function(e,data){var resolve=function(source,width,height){data.meta={content:'',width:width,height:height},data.type="video",data.promise.resolve()};if("video"==data.type||data.source.match(/\.(mp4|webm|ogv)$/i))if(cache[data.source])resolve(data.source,cache[data.source].width,cache[data.source].height);else var vid=UI.$('').attr("src",data.source).appendTo("body"),idle=setInterval(function(){vid[0].videoWidth&&(clearInterval(idle),cache[data.source]={width:vid[0].videoWidth,height:vid[0].videoHeight},resolve(data.source,cache[data.source].width,cache[data.source].height),vid.remove())},20)})}}),UI.lightbox.create=function(items,options){if(items){var group=[];return items.forEach(function(item){group.push(UI.$.extend({source:"",title:"",type:"auto",link:!1},"string"==typeof item?{source:item}:item))}),UI.lightbox(UI.$.extend({},options,{group:group}))}},UI.lightbox}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-nestable",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";var draggingElement,hasTouch="ontouchstart"in window,html=UI.$html,touchedlists=[],$win=UI.$win,eStart=hasTouch?"touchstart":"mousedown",eMove=hasTouch?"touchmove":"mousemove",eEnd=hasTouch?"touchend":"mouseup",eCancel=hasTouch?"touchcancel":"mouseup";return UI.component("nestable",{defaults:{listBaseClass:"uk-nestable",listClass:"uk-nestable-list",listItemClass:"uk-nestable-item",dragClass:"uk-nestable-dragged",movingClass:"uk-nestable-moving",noChildrenClass:"uk-nestable-nochildren",emptyClass:"uk-nestable-empty",handleClass:"",collapsedClass:"uk-collapsed",placeholderClass:"uk-nestable-placeholder",noDragClass:"uk-nestable-nodrag",group:!1,maxDepth:10,threshold:20,idlethreshold:10},boot:function(){UI.$html.on("mousemove touchmove",function(e){if(draggingElement){var top=draggingElement.offset().top;topwindow.innerHeight+UI.$win.scrollTop()&&UI.$win.scrollTop(UI.$win.scrollTop()+Math.ceil(draggingElement.height()/2))}}),UI.ready(function(context){UI.$("[data-uk-nestable]",context).each(function(){var ele=UI.$(this);ele.data("nestable")||UI.nestable(ele,UI.Utils.options(ele.attr("data-uk-nestable")))})})},init:function(){var $this=this;Object.keys(this.options).forEach(function(key){-1!=String(key).indexOf("Class")&&($this.options["_"+key]="."+$this.options[key])}),this.find(this.options._listItemClass).find(">ul").addClass(this.options.listClass),this.checkEmptyList(),this.reset(),this.element.data("nestable-group",this.options.group||UI.Utils.uid("nestable-group")),this.find(this.options._listItemClass).each(function(){$this.setParent(UI.$(this))}),this.on("click","[data-nestable-action]",function(e){if(!$this.dragEl&&(hasTouch||0===e.button)){e.preventDefault();var target=UI.$(e.currentTarget),action=target.data("nestableAction"),item=target.closest($this.options._listItemClass);"collapse"===action&&$this.collapseItem(item),"expand"===action&&$this.expandItem(item),"toggle"===action&&$this.toggleItem(item)}});var onStartEvent=function(e){var handle=UI.$(e.target);e.target!==$this.element[0]&&(handle.is($this.options._noDragClass)||handle.closest($this.options._noDragClass).length||handle.is("[data-nestable-action]")||handle.closest("[data-nestable-action]").length||($this.options.handleClass&&!handle.hasClass($this.options.handleClass)&&$this.options.handleClass&&(handle=handle.closest($this.options._handleClass)),!handle.length||$this.dragEl||!hasTouch&&0!==e.button||hasTouch&&1!==e.touches.length||(e.originalEvent&&e.originalEvent.touches&&(e=evt.originalEvent.touches[0]),$this.delayMove=function(evt){evt.preventDefault(),$this.dragStart(e),$this.trigger("start.uk.nestable",[$this]),$this.delayMove=!1},$this.delayMove.x=parseInt(e.pageX,10),$this.delayMove.y=parseInt(e.pageY,10),$this.delayMove.threshold=$this.options.idlethreshold,e.preventDefault())))},onMoveEvent=function(e){e.originalEvent&&e.originalEvent.touches&&(e=e.originalEvent.touches[0]),$this.delayMove&&(Math.abs(e.pageX-$this.delayMove.x)>$this.delayMove.threshold||Math.abs(e.pageY-$this.delayMove.y)>$this.delayMove.threshold)&&(window.getSelection().toString()?$this.delayMove=!1:$this.delayMove(e)),$this.dragEl&&(e.preventDefault(),$this.dragMove(e),$this.trigger("move.uk.nestable",[$this]))},onEndEvent=function(e){$this.dragEl&&(e.preventDefault(),$this.dragStop(hasTouch?e.touches[0]:e)),draggingElement=!1,$this.delayMove=!1};hasTouch?(this.element[0].addEventListener(eStart,onStartEvent,!1),window.addEventListener(eMove,onMoveEvent,!1),window.addEventListener(eEnd,onEndEvent,!1),window.addEventListener(eCancel,onEndEvent,!1)):(this.on(eStart,onStartEvent),$win.on(eMove,onMoveEvent),$win.on(eEnd,onEndEvent))},serialize:function(){var list=this,step=function(level,depth){var array=[];return level.children(list.options._listItemClass).each(function(){for(var attribute,li=UI.$(this),item={},sub=li.children(list.options._listClass),i=0;i").addClass(this.options.listClass+" "+this.options.dragClass).append(dragItem.clone()),this.dragEl.css("width",dragItem.width()),this.placeEl.addClass(this.options.placeholderClass),draggingElement=this.dragEl,this.tmpDragOnSiblings=[dragItem[0].previousSibling,dragItem[0].nextSibling],UI.$body.append(this.dragEl),this.dragEl.css({left:offset.left,top:offset.top});var i,depth,items=this.dragEl.find(this.options._listItemClass);for(i=0;ithis.dragDepth&&(this.dragDepth=depth);html.addClass(this.options.movingClass)},dragStop:function(e){var el=UI.$(this.placeEl),root=this.placeEl.parents(this.options._listBaseClass+":first");this.placeEl.removeClass(this.options.placeholderClass),this.dragEl.remove(),this.element[0]!==root[0]?(root.trigger("change.uk.nestable",[root.data("nestable"),el,"added"]),this.element.trigger("change.uk.nestable",[this,el,"removed"])):this.element.trigger("change.uk.nestable",[this,el,"moved"]),this.trigger("stop.uk.nestable",[this,el]),this.reset(),html.removeClass(this.options.movingClass)},dragMove:function(e){var list,parent,prev,opt=this.options,mouse=this.mouse,maxDepth=this.dragRootEl?this.dragRootEl.data("nestable").options.maxDepth:opt.maxDepth;this.dragEl.css({left:e.pageX-mouse.offsetX,top:e.pageY-mouse.offsetY}),mouse.lastX=mouse.nowX,mouse.lastY=mouse.nowY,mouse.nowX=e.pageX,mouse.nowY=e.pageY,mouse.distX=mouse.nowX-mouse.lastX,mouse.distY=mouse.nowY-mouse.lastY,mouse.lastDirX=mouse.dirX,mouse.lastDirY=mouse.dirY,mouse.dirX=0===mouse.distX?0:0Math.abs(mouse.distY)?1:0;if(!mouse.moving)return mouse.dirAx=newAx,void(mouse.moving=!0);if(mouse.dirAx!==newAx?(mouse.distAxX=0,mouse.distAxY=0):(mouse.distAxX+=Math.abs(mouse.distX),0!==mouse.dirX&&mouse.dirX!==mouse.lastDirX&&(mouse.distAxX=0),mouse.distAxY+=Math.abs(mouse.distY),0!==mouse.dirY&&mouse.dirY!==mouse.lastDirY&&(mouse.distAxY=0)),mouse.dirAx=newAx,mouse.dirAx&&mouse.distAxX>=opt.threshold&&(mouse.distAxX=0,prev=this.placeEl.prev("li"),0").addClass(opt.listClass)).append(this.placeEl),prev.append(list),this.setParent(prev)))),mouse.distX<0&&!this.placeEl.next(opt._listItemClass).length)){var parentUl=this.placeEl.closest([opt._listBaseClass,opt._listClass].join(",")),surroundingLi=parentUl.closest(opt._listItemClass);surroundingLi.length&&(surroundingLi.after(this.placeEl),parentUl.children().length||this.unsetParent(surroundingLi))}var isEmpty=!1,pointX=e.pageX-(window.pageXOffset||document.scrollLeft||0),pointY=e.pageY-(window.pageYOffset||document.documentElement.scrollTop);if(this.pointEl=UI.$(document.elementFromPoint(pointX,pointY)),opt.handleClass&&this.pointEl.hasClass(opt.handleClass))this.pointEl=this.pointEl.closest(opt._listItemClass);else{var nestableitem=this.pointEl.closest(opt._listItemClass);nestableitem.length&&(this.pointEl=nestableitem)}if(!this.placeEl.find(this.pointEl).length){if(this.pointEl.data("nestable")&&!this.pointEl.children().length)isEmpty=!0,this.checkEmptyList(this.pointEl);else if(!this.pointEl.length||!this.pointEl.hasClass(opt.listItemClass))return;var pointElRoot=this.element,tmpRoot=this.pointEl.closest(this.options._listBaseClass),isNewRoot=pointElRoot[0]!=tmpRoot[0];if(!mouse.dirAx||isNewRoot||isEmpty){if(isNewRoot&&opt.group!==tmpRoot.data("nestable-group"))return;if(touchedlists.push(pointElRoot),maxDepth','',"
        ",""].join("")).data("notifyMessage",this),this.content(this.options.message),this.options.status&&(this.element.addClass("uk-notify-message-"+this.options.status),this.currentstatus=this.options.status),this.group=this.options.group,messages[this.uuid]=this,containers[this.options.pos]||(containers[this.options.pos]=UI.$('
        ').appendTo("body").on("click",".uk-notify-message",function(){var message=UI.$(this).data("notifyMessage");message.element.trigger("manualclose.uk.notify",[message]),message.close()}))};return UI.$.extend(Message.prototype,{uuid:!1,element:!1,timout:!1,currentstatus:"",group:!1,show:function(){if(!this.element.is(":visible")){var $this=this;containers[this.options.pos].show().prepend(this.element);var marginbottom=parseInt(this.element.css("margin-bottom"),10);return this.element.css({opacity:0,"margin-top":-1*this.element.outerHeight(),"margin-bottom":0}).animate({opacity:1,"margin-top":0,"margin-bottom":marginbottom},function(){if($this.options.timeout){var closefn=function(){$this.close()};$this.timeout=setTimeout(closefn,$this.options.timeout),$this.element.hover(function(){clearTimeout($this.timeout)},function(){$this.timeout=setTimeout(closefn,$this.options.timeout)})}}),this}},close:function(instantly){var $this=this,finalize=function(){$this.element.remove(),containers[$this.options.pos].children().length||containers[$this.options.pos].hide(),$this.options.onClose.apply($this,[]),$this.element.trigger("close.uk.notify",[$this]),delete messages[$this.uuid]};this.timeout&&clearTimeout(this.timeout),instantly?finalize():this.element.animate({opacity:0,"margin-top":-1*this.element.outerHeight(),"margin-bottom":0},function(){finalize()})},content:function(html){var container=this.element.find(">div");return html?(container.html(html),this):container.html()},status:function(status){return status?(this.element.removeClass("uk-notify-message-"+this.currentstatus).addClass("uk-notify-message-"+status),this.currentstatus=status,this):this.currentstatus}}),Message.defaults={message:"",status:"",timeout:5e3,group:null,pos:"top-center",onClose:function(){}},UI.notify=notify,UI.notify.message=Message,UI.notify.closeAll=function(group,instantly){var id;if(group)for(id in messages)group===messages[id].group&&messages[id].close(instantly);else for(id in messages)messages[id].close(instantly)},notify}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-pagination",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";return UI.component("pagination",{defaults:{items:1,itemsOnPage:1,pages:0,displayedPages:7,edges:1,currentPage:0,lblPrev:!1,lblNext:!1,onSelectPage:function(){}},boot:function(){UI.ready(function(context){UI.$("[data-uk-pagination]",context).each(function(){var ele=UI.$(this);ele.data("pagination")||UI.pagination(ele,UI.Utils.options(ele.attr("data-uk-pagination")))})})},init:function(){var $this=this;this.pages=this.options.pages?this.options.pages:Math.ceil(this.options.items/this.options.itemsOnPage)?Math.ceil(this.options.items/this.options.itemsOnPage):1,this.currentPage=this.options.currentPage,this.halfDisplayed=this.options.displayedPages/2,this.on("click","a[data-page]",function(e){e.preventDefault(),$this.selectPage(UI.$(this).data("page"))}),this._render()},_getInterval:function(){return{start:Math.ceil(this.currentPage>this.halfDisplayed?Math.max(Math.min(this.currentPage-this.halfDisplayed,this.pages-this.options.displayedPages),0):0),end:Math.ceil(this.currentPage>this.halfDisplayed?Math.min(this.currentPage+this.halfDisplayed,this.pages):Math.min(this.options.displayedPages,this.pages))}},render:function(pages){this.pages=pages||this.pages,this._render()},selectPage:function(pageIndex,pages){this.currentPage=pageIndex,this.render(pages),this.options.onSelectPage.apply(this,[pageIndex]),this.trigger("select.uk.pagination",[pageIndex,this])},_render:function(){var i,o=this.options,interval=this._getInterval();if(this.element.empty(),o.lblPrev&&this._append(this.currentPage-1,{text:o.lblPrev}),0..."):interval.start-o.edges==1&&this._append(o.edges)}for(i=interval.start;iinterval.end&&this.pages-o.edges-interval.end!=1?this.element.append("
      • ...
      • "):this.pages-o.edges-interval.end==1&&this._append(interval.end++),i=Math.max(this.pages-o.edges,interval.end);i'+options.text+"":'
      • '+options.text+"
      • ",this.element.append(item)}}),UI.pagination}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-parallax",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";var parallaxes=[],supports3d=!1,scrolltop=0,wh=window.innerHeight,checkParallaxes=function(){scrolltop=UI.$win.scrollTop(),window.requestAnimationFrame(function(){for(var i=0;iwindow.innerHeight&&(width*=1.2,height*=1.2)):(width=w,height=Math.ceil(w/ratio)),element.css({"background-size":width+"px "+height+"px"}).data("bgsize",{w:width,h:height})},img.onerror=function(){},img.onload=function(){size={w:img.width,h:img.height},ratio=img.width/img.height,UI.$win.on("load resize orientationchange",UI.Utils.debounce(function(){check()},50)),check()},img.src=url,!0}(this,prop,opts)),prop){case"x":css.transform+=supports3d?" translate3d("+val+"px, 0, 0)":" translateX("+val+"px)";break;case"xp":css.transform+=supports3d?" translate3d("+val+"%, 0, 0)":" translateX("+val+"%)";break;case"y":css.transform+=supports3d?" translate3d(0, "+val+"px, 0)":" translateY("+val+"px)";break;case"yp":css.transform+=supports3d?" translate3d(0, "+val+"%, 0)":" translateY("+val+"%)";break;case"rotate":css.transform+=" rotate("+val+"deg)";break;case"scale":css.transform+=" scale("+val+")";break;case"bg":css["background-position"]="50% "+val+"px";break;case"bgp":css["background-position"]="50% "+val+"%";break;case"color":case"background-color":case"border-color":css[prop]=(start=opts.start,end=opts.end,pos=compercent,start=parseColor(start),end=parseColor(end),function(begin,end,pos){var color="rgba("+parseInt(begin[0]+pos*(end[0]-begin[0]),10)+","+parseInt(begin[1]+pos*(end[1]-begin[1]),10)+","+parseInt(begin[2]+pos*(end[2]-begin[2]),10)+","+(begin&&end?parseFloat(begin[3]+pos*(end[3]-begin[3])):1);return color+=")"}(start,end,pos=pos||0));break;default:css[prop]=val}var start,end,pos}.bind(this)),this.element.css(css),this._percent=compercent)},_getStartValue:function(prop){var value=0;switch(prop){case"scale":value=1;break;default:value=this.element.css(prop)}return value||0}});var colors={black:[0,0,0,1],blue:[0,0,255,1],brown:[165,42,42,1],cyan:[0,255,255,1],fuchsia:[255,0,255,1],gold:[255,215,0,1],green:[0,128,0,1],indigo:[75,0,130,1],khaki:[240,230,140,1],lime:[0,255,0,1],magenta:[255,0,255,1],maroon:[128,0,0,1],navy:[0,0,128,1],olive:[128,128,0,1],orange:[255,165,0,1],pink:[255,192,203,1],purple:[128,0,128,1],violet:[128,0,128,1],red:[255,0,0,1],silver:[192,192,192,1],white:[255,255,255,1],yellow:[255,255,0,1],transparent:[255,255,255,0]};function parseColor(color){var match;return(match=/#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})/.exec(color))?[parseInt(match[1],16),parseInt(match[2],16),parseInt(match[3],16),1]:(match=/#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/.exec(color))?[17*parseInt(match[1],16),17*parseInt(match[2],16),17*parseInt(match[3],16),1]:(match=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))?[parseInt(match[1]),parseInt(match[2]),parseInt(match[3]),1]:(match=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9\.]*)\s*\)/.exec(color))?[parseInt(match[1],10),parseInt(match[2],10),parseInt(match[3],10),parseFloat(match[4])]:colors[color]||[255,255,255,0]}return UI.parallax}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-grid-parallax",["uikit"],function(){return component||addon(UIkit)})}(function(UI){var parallaxes=[],checkParallaxes=function(){requestAnimationFrame(function(){for(var i=0;i=top);column++);return column||1}UI.component("gridparallax",{defaults:{target:!1,smooth:150,translate:150},boot:function(){UI.$doc.on("scrolling.uk.document",checkParallaxes),UI.$win.on("load resize orientationchange",UI.Utils.debounce(function(){checkParallaxes()},50)),UI.ready(function(context){UI.$("[data-uk-grid-parallax]",context).each(function(){var parallax=UI.$(this);parallax.data("gridparallax")||UI.gridparallax(parallax,UI.Utils.options(parallax.attr("data-uk-grid-parallax")))})})},init:function(){var fn,$this=this;this.initItems().process(),parallaxes.push(this),UI.$win.on("load resize orientationchange",(fn=function(){var columns=getcolumns($this.element);$this.element.css("margin-bottom",""),1 {{#msgResultsHeader}}
      • {{msgResultsHeader}}
      • {{/msgResultsHeader}} {{#items && items.length}} {{~items}}
      • {{{$item.title}}} {{#$item.text}}
        {{{$item.text}}}
        {{/$item.text}}
      • {{/items}} {{#msgMoreResults}}
      • {{msgMoreResults}}
      • {{/msgMoreResults}} {{/end}} {{^items.length}} {{#msgNoResults}}
      • {{msgNoResults}}
      • {{/msgNoResults}} {{/end}} ',renderer:function(data){var opts=this.options;this.dropdown.append(this.template({items:data.results||[],msgResultsHeader:opts.msgResultsHeader,msgMoreResults:opts.msgMoreResults,msgNoResults:opts.msgNoResults})),this.show()}},boot:function(){UI.$html.on("focus.search.uikit","[data-uk-search]",function(e){var ele=UI.$(this);ele.data("search")||UI.search(ele,UI.Utils.options(ele.attr("data-uk-search")))})},init:function(){var $this=this;this.autocomplete=UI.autocomplete(this.element,this.options),this.autocomplete.dropdown.addClass("uk-dropdown-search"),this.autocomplete.input.on("keyup",function(){$this.element[$this.autocomplete.input.val()?"addClass":"removeClass"]("uk-active")}).closest("form").on("reset",function(){$this.value="",$this.element.removeClass("uk-active")}),this.on("selectitem.uk.autocomplete",function(e,data){data.url?location.href=data.url:data.moreresults&&$this.autocomplete.input.closest("form").submit()}),this.element.data("search",this)}})}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-slider",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";var dragging,delayIdle,anchor,dragged,store={};return UI.component("slider",{defaults:{center:!1,threshold:10,infinite:!0,autoplay:!1,autoplayInterval:7e3,pauseOnHover:!0,activecls:"uk-active"},boot:function(){UI.ready(function(context){setTimeout(function(){UI.$("[data-uk-slider]",context).each(function(){var ele=UI.$(this);ele.data("slider")||UI.slider(ele,UI.Utils.options(ele.attr("data-uk-slider")))})},0)})},init:function(){var $this=this;this.container=this.element.find(".uk-slider"),this.focus=0,UI.$win.on("resize load",UI.Utils.debounce(function(){$this.resize(!0)},100)),this.on("click.uk.slider","[data-uk-slider-item]",function(e){e.preventDefault();var item=UI.$(this).attr("data-uk-slider-item");if($this.focus!=item)switch($this.stop(),item){case"next":case"previous":$this["next"==item?"next":"previous"]();break;default:$this.updateFocus(parseInt(item,10))}}),this.container.on({"touchstart mousedown":function(evt){evt.originalEvent&&evt.originalEvent.touches&&(evt=evt.originalEvent.touches[0]),evt.button&&2==evt.button||!$this.active||($this.stop(),anchor=UI.$(evt.target).is("a")?UI.$(evt.target):UI.$(evt.target).parents("a:first"),dragged=!1,anchor.length&&anchor.one("click",function(e){dragged&&e.preventDefault()}),(delayIdle=function(e){dragged=!0,dragging=$this,store={touchx:parseInt(e.pageX,10),dir:1,focus:$this.focus,base:$this.options.center?"center":"area"},e.originalEvent&&e.originalEvent.touches&&(e=e.originalEvent.touches[0]),dragging.element.data({"pointer-start":{x:parseInt(e.pageX,10),y:parseInt(e.pageY,10)},"pointer-pos-start":$this.pos}),$this.container.addClass("uk-drag"),delayIdle=!1}).x=parseInt(evt.pageX,10),delayIdle.threshold=$this.options.threshold)},mouseenter:function(){$this.options.pauseOnHover&&($this.hovering=!0)},mouseleave:function(){$this.hovering=!1}}),this.resize(!0),this.on("display.uk.check",function(){$this.element.is(":visible")&&$this.resize(!0)}),this.element.find("a,img").attr("draggable","false"),this.options.autoplay&&this.start()},resize:function(focus){var item,width,cwidth,size,$this=this,pos=0,maxheight=0;if(this.items=this.container.children().filter(":visible"),this.vp=this.element[0].getBoundingClientRect().width,this.container.css({"min-width":"","min-height":""}),this.items.each(function(idx){item=UI.$(this),size=item.css({left:"",width:""})[0].getBoundingClientRect(),width=size.width,cwidth=item.width(),maxheight=Math.max(maxheight,size.height),item.css({left:pos,width:width}).data({idx:idx,left:pos,width:width,cwidth:cwidth,area:pos+width,center:pos-($this.vp/2-cwidth/2)}),pos+=width}),this.container.css({"min-width":pos,"min-height":maxheight}),this.options.infinite&&(pos<=2*this.vp||this.items.length<5)&&!this.itemsResized)return this.container.children().each(function(idx){$this.container.append($this.items.eq(idx).clone(!0).attr("id",""))}).each(function(idx){$this.container.append($this.items.eq(idx).clone(!0).attr("id",""))}),this.itemsResized=!0,this.resize();this.cw=pos,this.pos=0,this.active=pos>=this.vp,this.container.css({"-ms-transform":"","-webkit-transform":"",transform:""}),focus&&this.updateFocus(this.focus)},updatePos:function(pos){this.pos=pos,this.container.css({"-ms-transform":"translateX("+pos+"px)","-webkit-transform":"translateX("+pos+"px)",transform:"translateX("+pos+"px)"})},updateFocus:function(idx,dir){if(this.active){dir=dir||(idx>this.focus?1:-1);var area,i,item=this.items.eq(idx);if(this.options.infinite&&this.infinite(idx,dir),this.options.center)this.updatePos(-1*item.data("center")),this.items.filter("."+this.options.activecls).removeClass(this.options.activecls),item.addClass(this.options.activecls);else if(this.options.infinite)this.updatePos(-1*item.data("left"));else{for(area=0,i=idx;ithis.vp)this.updatePos(-1*item.data("left"));else if(1==dir){for(area=0,i=this.items.length-1;0<=i;i--){if((area+=this.items.eq(i).data("width"))==this.vp){idx=i;break}if(area>this.vp){idx=ithis.vp?this.updatePos(-1*(this.container.width()-this.vp)):this.updatePos(-1*this.items.eq(idx).data("left"))}}var left=this.items.eq(idx).data("left");this.items.removeClass("uk-slide-before uk-slide-after").each(function(i){i!==idx&&UI.$(this).addClass(UI.$(this).data("left")this.vp));i++)z=z+1==this.items.length?0:z+1;move.length&&move.forEach(function(itm){var left=item.data("area");itm.css({left:left}).data({left:left,area:left+itm.data("width"),center:left-($this.vp/2-itm.data("cwidth")/2)}),item=itm})}else{for(i=this.items.length-1;-1this.vp));i--)z=z-1==-1?this.items.length-1:z-1;move.length&&move.forEach(function(itm){var left=item.data("left")-itm.data("width");itm.css({left:left}).data({left:left,area:left+itm.data("width"),center:left-($this.vp/2-itm.data("cwidth")/2)}),item=itm})}}}),UI.$doc.on("mousemove.uk.slider touchmove.uk.slider",function(e){if(e.originalEvent&&e.originalEvent.touches&&(e=e.originalEvent.touches[0]),delayIdle&&Math.abs(e.pageX-delayIdle.x)>delayIdle.threshold&&(window.getSelection().toString()?dragging=delayIdle=!1:delayIdle(e)),dragging){var x,xDiff,pos,dir,focus,item,diff,i,z,itm;if(e.clientX||e.clientY?x=e.clientX:(e.pageX||e.pageY)&&(x=e.pageX-document.body.scrollLeft-document.documentElement.scrollLeft),focus=store.focus,xDiff=x-dragging.element.data("pointer-start").x,pos=dragging.element.data("pointer-pos-start")+xDiff,dir=x>dragging.element.data("pointer-start").x?-1:1,item=dragging.items.eq(store.focus),1==dir)for(diff=item.data("left")+Math.abs(xDiff),i=0,z=store.focus;idiff){focus=z;break}z=z+1==dragging.items.length?0:z+1}else for(diff=item.data("left")-Math.abs(xDiff),i=0,z=store.focus;istore.diff){focus=z;break}z=z+1==dragging.items.length?0:z+1}else for(i=0,z=store.focus;i').css({"background-image":"url("+media.attr("src")+")"});media.attr("width")&&media.attr("height")&&(placeholder=UI.$("").attr({width:media.attr("width"),height:media.attr("height")}),media.replaceWith(placeholder),media=placeholder,placeholder=void 0),media.css({width:"100%",height:"auto",opacity:0}),slide.prepend(cover).data("cover",cover);break;case"IFRAME":var src=media[0].src,iframeId="sw-"+ ++playerId;media.attr("src","").on("load",function(){if((index!==$this.current||index==$this.current&&!$this.options.videoautoplay)&&$this.pausemedia(media),$this.options.videomute){$this.mutemedia(media);var inv=setInterval((ic=0,function(){$this.mutemedia(media),4<=++ic&&clearInterval(inv)}),250)}var ic}).data("slideshow",$this).attr("data-player-id",iframeId).attr("src",[src,-1").attr({width:media[0].width,height:media[0].height});var img=UI.$('').attr("src",canvas[0].toDataURL());slide.prepend(img),slide.data("sizer",img)}}else slide.data("sizer",slide);$this.hasKenBurns(slide)&&slide.data("cover").css({"-webkit-animation-duration":kbanimduration,"animation-duration":kbanimduration})}),this.on("click.uk.slideshow","[data-uk-slideshow-item]",function(e){e.preventDefault();var slide=UI.$(this).attr("data-uk-slideshow-item");if($this.current!=slide){switch(slide){case"next":case"previous":$this["next"==slide?"next":"previous"]();break;default:$this.show(parseInt(slide,10))}$this.stop()}}),this.slides.attr("aria-hidden","true").eq(this.current).addClass("uk-active").attr("aria-hidden","false"),this.triggers.filter('[data-uk-slideshow-item="'+this.current+'"]').addClass("uk-active"),UI.$win.on("resize load",UI.Utils.debounce(function(){$this.resize(),$this.fixFullscreen&&($this.container.css("height",window.innerHeight),$this.slides.css("height",window.innerHeight))},100)),setTimeout(function(){$this.resize()},80),this.options.autoplay&&this.start(),this.options.videoautoplay&&this.slides.eq(this.current).data("media")&&this.playmedia(this.slides.eq(this.current).data("media")),this.options.kenburns&&this.applyKenBurns(this.slides.eq(this.current)),this.container.on({mouseenter:function(){$this.options.pauseOnHover&&($this.hovering=!0)},mouseleave:function(){$this.hovering=!1}}),this.on("swipeRight swipeLeft",function(e){$this["swipeLeft"==e.type?"next":"previous"]()}),this.on("display.uk.check",function(){$this.element.is(":visible")&&($this.resize(),$this.fixFullscreen&&($this.container.css("height",window.innerHeight),$this.slides.css("height",window.innerHeight)))})},resize:function(){if(!this.container.hasClass("uk-slideshow-fullscreen")){var height=this.options.height;"auto"===this.options.height&&(height=0,this.slides.css("height","").each(function(){height=Math.max(height,UI.$(this).height())})),this.container.css("height",height),this.slides.css("height",height)}},show:function(index,direction){if(!this.animating&&this.current!=index){this.animating=!0;var $this=this,current=this.slides.eq(this.current),next=this.slides.eq(index),dir=direction||(this.current").css({top:0,left:0,width:this.container.width(),height:this.container.height(),opacity:1,zIndex:15}),ghostWidth=ghost.width(),ghostHeight=ghost.height(),i=0;i').css({position:"absolute",top:0,left:0,width:ghostWidth,height:ghostHeight,"background-image":bgimage,clip:clipfrom,opacity:0,transition:"all "+this.options.duration+"ms ease-in-out "+60*i+"ms","-webkit-transition":"all "+this.options.duration+"ms ease-in-out "+60*i+"ms"}).data("clip",clipto),ghost.append(bar)}return this.container.append(ghost),ghost.children().last().on(UI.support.transition.end,function(){ghost.remove(),d.resolve()}),ghost.width(),ghost.children().each(function(){var bar=UI.$(this);bar.css({clip:bar.data("clip"),opacity:1})}),d.promise()},"slice-up":function(current,next,dir){return Animations.slice.apply(this,[current,next,dir,"slice-up"])},"slice-down":function(current,next,dir){return Animations.slice.apply(this,[current,next,dir,"slice-down"])},"slice-up-down":function(current,next,dir){return Animations.slice.apply(this,[current,next,dir,"slice-up-down"])},fold:function(current,next,dir){if(!next.data("cover"))return Animations.fade.apply(this,arguments);for(var bar,d=UI.$.Deferred(),sliceWidth=Math.ceil(this.element.width()/this.options.slices),bgimage=next.data("cover").css("background-image"),ghost=UI.$("
      • ").css({width:next.width(),height:next.height(),opacity:1,zIndex:15}),ghostWidth=next.width(),ghostHeight=next.height(),i=0;i').css({position:"absolute",top:0,left:0,width:ghostWidth,height:ghostHeight,"background-image":bgimage,"transform-origin":sliceWidth*i+"px 0 0",clip:"rect(0px, "+sliceWidth*(i+1)+"px, "+ghostHeight+"px, "+sliceWidth*i+"px)",opacity:0,transform:"scaleX(0.000001)",transition:"all "+this.options.duration+"ms ease-in-out "+(100+60*i)+"ms","-webkit-transition":"all "+this.options.duration+"ms ease-in-out "+(100+60*i)+"ms"}),ghost.prepend(bar);return this.container.append(ghost),ghost.width(),ghost.children().first().on(UI.support.transition.end,function(){ghost.remove(),d.resolve()}).end().css({transform:"scaleX(1)",opacity:1}),d.promise()},puzzle:function(current,next,dir){if(!next.data("cover"))return Animations.fade.apply(this,arguments);for(var box,rect,d=UI.$.Deferred(),$this=this,boxCols=Math.round(this.options.slices/2),boxWidth=Math.round(next.width()/boxCols),boxRows=Math.round(next.height()/boxWidth),boxHeight=Math.round(next.height()/boxRows)+1,bgimage=next.data("cover").css("background-image"),ghost=UI.$("
      • ").css({width:this.container.width(),height:this.container.height(),opacity:1,zIndex:15}),ghostWidth=this.container.width(),ghostHeight=this.container.height(),rows=0;rows').css({position:"absolute",top:0,left:0,opacity:0,width:ghostWidth,height:ghostHeight,"background-image":bgimage,clip:"rect("+rect.join(",")+")","-webkit-transform":"translateZ(0)",transform:"translateZ(0)"}),ghost.append(box);this.container.append(ghost);var boxes=shuffle(ghost.children());return boxes.each(function(i){UI.$(this).css({transition:"all "+$this.options.duration+"ms ease-in-out "+(50+25*i)+"ms","-webkit-transition":"all "+$this.options.duration+"ms ease-in-out "+(50+25*i)+"ms"})}).last().on(UI.support.transition.end,function(){ghost.remove(),d.resolve()}),ghost.width(),boxes.css({opacity:1}),d.promise()},boxes:function(current,next,dir,fromfx){if(!next.data("cover"))return Animations.fade.apply(this,arguments);for(var box,rect,cols,d=UI.$.Deferred(),boxCols=Math.round(this.options.slices/2),boxWidth=Math.round(next.width()/boxCols),boxRows=Math.round(next.height()/boxWidth),boxHeight=Math.round(next.height()/boxRows)+1,bgimage=next.data("cover").css("background-image"),ghost=UI.$("
      • ").css({width:next.width(),height:next.height(),opacity:1,zIndex:15}),ghostWidth=next.width(),ghostHeight=next.height(),rows=0;rows').css({position:"absolute",top:0,left:0,opacity:1,width:ghostWidth,height:ghostHeight,"background-image":bgimage,"transform-origin":rect[3]+" "+rect[0]+" 0",clip:"rect("+rect.join(",")+")","-webkit-transform":"scale(0.0000000000000001)",transform:"scale(0.0000000000000001)"}),ghost.append(box);this.container.append(ghost);var prevCol,rowIndex=0,colIndex=0,timeBuff=0,box2Darr=[[]],boxes=ghost.children();for("boxes-reverse"==fromfx&&(boxes=[].reverse.apply(boxes)),boxes.each(function(){box2Darr[rowIndex][colIndex]=UI.$(this),++colIndex==boxCols&&(colIndex=0,box2Darr[++rowIndex]=[])}),prevCol=cols=0;colsdelayIdle.threshold||Math.abs(src.pageY-delayIdle.pos.y)>delayIdle.threshold)&&delayIdle.apply(src)}if(draggingPlaceholder){moving||(moving=!0,draggingPlaceholder.show(),draggingPlaceholder.$current.addClass(draggingPlaceholder.$sortable.options.placeholderClass),draggingPlaceholder.$sortable.element.children().addClass(draggingPlaceholder.$sortable.options.childClass),UI.$html.addClass(draggingPlaceholder.$sortable.options.dragMovingClass));var offset=draggingPlaceholder.data("mouse-offset"),left=parseInt(e.originalEvent.pageX,10)+offset.left,top=parseInt(e.originalEvent.pageY,10)+offset.top;if(draggingPlaceholder.css({left:left,top:top}),top+draggingPlaceholder.height()/3>document.body.offsetHeight)return;topwindow.innerHeight+UI.$win.scrollTop()&&UI.$win.scrollTop(UI.$win.scrollTop()+Math.ceil(draggingPlaceholder.height()/3))}}),UI.$html.on("mouseup touchend",function(e){if(delayIdle=!1,currentlyDraggingElement&&draggingPlaceholder){var sortable=function(ele){ele=UI.$(ele);do{if(ele.data("sortable"))return ele;ele=UI.$(ele).parent()}while(ele.length);return ele}(currentlyDraggingElement),component=draggingPlaceholder.$sortable,ev={type:e.type};sortable[0]&&component.dragDrop(ev,component.element),component.dragEnd(ev,component.element)}else currentlyDraggingElement=draggingPlaceholder=null})},init:function(){var $this=this,element=this.element[0];touchedlists=[],this.checkEmptyList(),this.element.data("sortable-group",this.options.group?this.options.group:UI.Utils.uid("sortable-group"));var handleDragStart=delegate(function(e){if(!e.data||!e.data.sortable){var $target=UI.$(e.target),$link=$target.is("a[href]")?$target:$target.parents("a[href]");if(!$target.is(":input"))return e.preventDefault(),!supportsTouch&&$link.length&&$link.one("click",function(e){e.preventDefault()}).one("mouseup",function(){moved||$link.trigger("click")}),e.data=e.data||{},e.data.sortable=element,$this.dragStart(e,this)}}),handleDragEnter=delegate(UI.Utils.debounce(function(e){return $this.dragEnter(e,this)})),handleDragLeave=delegate(function(e){var previousCounter=$this.dragenterData(this);$this.dragenterData(this,previousCounter-1),$this.dragenterData(this)||(UI.$(this).removeClass($this.options.overClass),$this.dragenterData(this,!1))}),handleTouchMove=delegate(function(e){return!currentlyDraggingElement||currentlyDraggingElement===this||currentlyDraggingTarget===this||($this.element.children().removeClass($this.options.overClass),currentlyDraggingTarget=this,$this.moveElementNextTo(currentlyDraggingElement,this),function(e){e.stopPropagation&&e.stopPropagation();e.preventDefault&&e.preventDefault();e.returnValue=!1}(e))});function delegate(fn){return function(e){var target,context;e&&(target=(supportsTouch&&e.touches&&e.touches[0]||{}).target||e.target,supportsTouch&&document.elementFromPoint&&(target=document.elementFromPoint(e.pageX-document.body.scrollLeft,e.pageY-document.body.scrollTop)),overElement=UI.$(target)),UI.$(target).hasClass($this.options.childClass)?fn.apply(target,[e]):target!==element&&(context=function(parent,child){var cur=child;if(cur==parent)return null;for(;cur;){if(cur.parentNode===parent)return cur;if(!(cur=cur.parentNode)||!cur.ownerDocument||11===cur.nodeType)break}return null}(element,target))&&fn.apply(context,[e])}}this.addDragHandlers=function(){supportsTouch?element.addEventListener("touchmove",handleTouchMove,!1):(element.addEventListener("mouseover",handleDragEnter,!1),element.addEventListener("mouseout",handleDragLeave,!1))},this.removeDragHandlers=function(){supportsTouch?element.removeEventListener("touchmove",handleTouchMove,!1):(element.removeEventListener("mouseover",handleDragEnter,!1),element.removeEventListener("mouseout",handleDragLeave,!1))},window.addEventListener(supportsTouch?"touchmove":"mousemove",function(e){currentlyDraggingElement&&$this.dragMove(e,$this)},!1),element.addEventListener(supportsTouch?"touchstart":"mousedown",handleDragStart,!1)},dragStart:function(e,elem){moving=moved=!1;var $this=this,target=UI.$(e.target);if(supportsTouch||2!=e.button){if($this.options.handleClass)if(!(target.hasClass($this.options.handleClass)?target:target.closest("."+$this.options.handleClass,$this.element)).length)return;if(!target.is("."+$this.options.noDragClass)&&!target.closest("."+$this.options.noDragClass).length&&!target.is(":input")){currentlyDraggingElement=elem,draggingPlaceholder&&draggingPlaceholder.remove();var $current=UI.$(currentlyDraggingElement),offset=$current.offset();delayIdle={pos:{x:e.pageX,y:e.pageY},threshold:$this.options.threshold,apply:function(evt){(draggingPlaceholder=UI.$('
        ').css({display:"none",top:offset.top,left:offset.left,width:$current.width(),height:$current.height(),padding:$current.css("padding")}).data({"mouse-offset":{left:offset.left-parseInt(evt.pageX,10),top:offset.top-parseInt(evt.pageY,10)},origin:$this.element,index:$current.index()}).append($current.html()).appendTo("body")).$current=$current,draggingPlaceholder.$sortable=$this,$current.data({"start-list":$current.parent(),"start-index":$current.index(),"sortable-group":$this.options.group}),$this.addDragHandlers(),$this.options.start(this,currentlyDraggingElement),$this.trigger("start.uk.sortable",[$this,currentlyDraggingElement]),delayIdle=!(moved=!0)}}}}},dragMove:function(e,elem){var overChild,overRoot=(overElement=UI.$(document.elementFromPoint(e.pageX-(document.body.scrollLeft||document.scrollLeft||0),e.pageY-(document.body.scrollTop||document.documentElement.scrollTop||0)))).closest("."+this.options.baseClass),groupOver=overRoot.data("sortable-group"),$current=UI.$(currentlyDraggingElement),currentRoot=$current.parent(),groupCurrent=$current.data("sortable-group");overRoot[0]!==currentRoot[0]&&void 0!==groupCurrent&&groupOver===groupCurrent&&(overRoot.data("sortable").addDragHandlers(),touchedlists.push(overRoot),overRoot.children().addClass(this.options.childClass),0documentHeight-containerBottom-(sticky.top<0?0:sticky.top)?documentHeight-containerBottom-(scrollTop+stickyHeight):newTop}if(sticky.currentTop!=newTop){if(sticky.element.css({position:"fixed",top:newTop,width:sticky.getWidthFrom.length?sticky.getWidthFrom.width():sticky.element.width()}),!sticky.init&&(sticky.element.addClass(sticky.options.clsinit),location.hash&&0').parent(),this.computeWrapper(),this.element.css("margin",0),boundary&&(!0===boundary||"!"===boundary[0]?(boundary=!0===boundary?this.wrapper.parent():this.wrapper.closest(boundary.substr(1)),boundtoparent=!0):"string"==typeof boundary&&(boundary=UI.$(boundary))),this.sticky={self:this,options:this.options,element:this.element,currentTop:null,wrapper:this.wrapper,init:!1,getWidthFrom:UI.$(this.options.getWidthFrom||this.wrapper),boundary:boundary,boundtoparent:boundtoparent,top:0,calcTop:function(){var top=this.options.top;if(this.options.top&&"string"==typeof this.options.top)if(this.options.top.match(/^(-|)(\d+)vh$/))top=window.innerHeight*parseInt(this.options.top,10)/100;else{var topElement=UI.$(this.options.top).first();topElement.length&&topElement.is(":visible")&&(top=-1*(topElement.offset().top+topElement.outerHeight()-this.wrapper.offset().top))}this.top=top},reset:function(force){this.calcTop();var finalize=function(){this.element.css({position:"",top:"",width:"",left:"",margin:"0"}),this.element.removeClass([this.options.animation,"uk-animation-reverse",this.options.clsactive].join(" ")),this.element.addClass(this.options.clsinactive),this.element.trigger("inactive.uk.sticky"),this.currentTop=null,this.animate=!1}.bind(this);!force&&this.options.animation&&UI.support.animation&&!UI.Utils.isInView(this.wrapper)?(this.animate=!0,this.element.removeClass(this.options.animation).one(UI.support.animation.end,function(){finalize()}).width(),this.element.addClass(this.options.animation+" uk-animation-reverse")):finalize()},check:function(){if(this.options.disabled)return!1;if(this.options.media)switch(typeof this.options.media){case"number":if(window.innerWidth{{~items}}
      • {{$item.value}}
      • {{/items}}',this.options.source=function(release){release(times[$this.options.format]||times["12h"])},container=this.element.is("input")?(this.element.wrap('
        '),this.element.parent()):this.element.addClass("uk-autocomplete"),this.autocomplete=UI.autocomplete(container,this.options),this.autocomplete.dropdown.addClass("uk-dropdown-small uk-dropdown-scrollable"),this.autocomplete.on("show.uk.autocomplete",function(){var selected=$this.autocomplete.dropdown.find('[data-value="'+$this.autocomplete.input.val()+'"]');setTimeout(function(){$this.autocomplete.pick(selected,!0)},10)}),this.autocomplete.input.on("focus",function(){$this.autocomplete.value=Math.random(),$this.autocomplete.triggercomplete()}).on("blur",UI.Utils.debounce(function(){$this.checkTime()},100)),this.element.data("timepicker",this)},checkTime:function(){var arr,timeArray,hour,minute,meridian="AM",time=this.autocomplete.input.val();"12h"==this.options.format?(timeArray=(arr=time.split(" "))[0].split(":"),meridian=arr[1]):timeArray=time.split(":"),hour=parseInt(timeArray[0],10),minute=parseInt(timeArray[1],10),isNaN(hour)&&(hour=0),isNaN(minute)&&(minute=0),"12h"==this.options.format?(12').appendTo("body")),this.on({focus:function(e){$this.show()},blur:function(e){$this.hide()},mouseenter:function(e){$this.show()},mouseleave:function(e){$this.hide()}})},show:function(){if(this.tip="function"==typeof this.options.src?this.options.src(this.element):this.options.src,tooltipdelay&&clearTimeout(tooltipdelay),checkdelay&&clearTimeout(checkdelay),"string"==typeof this.tip&&this.tip.length){$tooltip.stop().css({top:-2e3,visibility:"hidden"}).removeClass(this.options.activeClass).show(),$tooltip.html('
        '+this.tip+"
        ");var $this=this,pos=UI.$.extend({},this.element.offset(),{width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}),width=$tooltip[0].offsetWidth,height=$tooltip[0].offsetHeight,offset="function"==typeof this.options.offset?this.options.offset.call(this.element):this.options.offset,position="function"==typeof this.options.pos?this.options.pos.call(this.element):this.options.pos,tmppos=position.split("-"),tcss={display:"none",visibility:"visible",top:pos.top+pos.height+height,left:pos.left};if("fixed"==UI.$html.css("position")||"fixed"==UI.$body.css("position")){var bodyoffset=UI.$("body").offset(),htmloffset=UI.$("html").offset(),docoffset_top=htmloffset.top+bodyoffset.top,docoffset_left=htmloffset.left+bodyoffset.left;pos.left-=docoffset_left,pos.top-=docoffset_top}"left"!=tmppos[0]&&"right"!=tmppos[0]||"right"!=UI.langdirection||(tmppos[0]="left"==tmppos[0]?"right":"left");var variants={bottom:{top:pos.top+pos.height+offset,left:pos.left+pos.width/2-width/2},top:{top:pos.top-height-offset,left:pos.left+pos.width/2-width/2},left:{top:pos.top+pos.height/2-height/2,left:pos.left-width-offset},right:{top:pos.top+pos.height/2-height/2,left:pos.left+pos.width+offset}};UI.$.extend(tcss,variants[tmppos[0]]),2==tmppos.length&&(tcss.left="left"==tmppos[1]?pos.left:pos.left+pos.width-width);var boundary=this.checkBoundary(tcss.left,tcss.top,width,height);if(boundary){switch(boundary){case"x":position=2==tmppos.length?tmppos[0]+"-"+(tcss.left<0?"left":"right"):tcss.left<0?"right":"left";break;case"y":position=2==tmppos.length?(tcss.top<0?"bottom":"top")+"-"+tmppos[1]:tcss.top<0?"bottom":"top";break;case"xy":position=2==tmppos.length?(tcss.top<0?"bottom":"top")+"-"+(tcss.left<0?"left":"right"):tcss.left<0?"right":"left"}tmppos=position.split("-"),UI.$.extend(tcss,variants[tmppos[0]]),2==tmppos.length&&(tcss.left="left"==tmppos[1]?pos.left:pos.left+pos.width-width)}tcss.left-=UI.$body.position().left,tooltipdelay=setTimeout(function(){$tooltip.css(tcss).attr("class",["uk-tooltip","uk-tooltip-"+position,$this.options.cls].join(" ")),$this.options.animation?$tooltip.css({opacity:0,display:"block"}).addClass($this.options.activeClass).animate({opacity:1},parseInt($this.options.animation,10)||400):$tooltip.show().addClass($this.options.activeClass),tooltipdelay=!1,checkdelay=setInterval(function(){$this.element.is(":visible")||$this.hide()},150)},parseInt(this.options.delay,10)||0)}},hide:function(){if(!this.element.is("input")||this.element[0]!==document.activeElement)if(tooltipdelay&&clearTimeout(tooltipdelay),checkdelay&&clearTimeout(checkdelay),$tooltip.stop(),this.options.animation){var $this=this;$tooltip.fadeOut(parseInt(this.options.animation,10)||400,function(){$tooltip.removeClass($this.options.activeClass)})}else $tooltip.hide().removeClass(this.options.activeClass)},content:function(){return this.tip},checkBoundary:function(left,top,width,height){var axis="";return(left<0||left-UI.$win.scrollLeft()+width>window.innerWidth)&&(axis+="x"),(top<0||top-UI.$win.scrollTop()+height>window.innerHeight)&&(axis+="y"),axis}}),UI.tooltip}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-upload",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";var xhr,fi;function xhrupload(files,settings){if(!UI.support.ajaxupload)return this;if(settings=UI.$.extend({},xhrupload.defaults,settings),files.length){if("*.*"!==settings.allow)for(var file,i=0;file=files[i];i++)if(!matchName(settings.allow,file.name))return void("string"==typeof settings.notallowed?alert(settings.notallowed):settings.notallowed(file,settings));var complete=settings.complete;if(settings.single){var count=files.length,uploaded=0,allow=!0;settings.beforeAll(files),settings.complete=function(response,xhr){uploaded+=1,complete(response,xhr),settings.filelimit&&uploaded>=settings.filelimit&&(allow=!1),allow&&uploaded
        ',$body.on("show.uk.modal",".uk-modal-dialog-replace",function(){setTimeout(function(){var dialogReplace=$(".uk-modal-dialog-replace");if(dialogReplace.find(".uk-button-primary").length){var actionBtn=dialogReplace.find(".uk-button-primary").toggleClass("uk-button-primary md-btn-flat-primary");actionBtn.next("button")&&actionBtn.next("button").after(actionBtn)}dialogReplace.find(".uk-button").length&&dialogReplace.find(".uk-button").toggleClass("uk-button md-btn md-btn-flat"),dialogReplace.find(".uk-margin-small-top").length&&dialogReplace.find(".uk-margin-small-top").toggleClass("uk-margin-small-top uk-margin-top"),dialogReplace.find("input.uk-width-1-1").length&&dialogReplace.find("input.uk-width-1-1").toggleClass("uk-width-1-1 md-input"),dialogReplace.find(".uk-form").length&&dialogReplace.find(".uk-form").removeClass("uk-form")},50)})}void 0!==UIkit.components.tooltip&&$.extend(UIkit.components.tooltip.prototype.defaults,{animation:280,offset:8}),void 0!==UIkit.components.sortable&&Modernizr.touch&&$("[data-uk-sortable]").children().addClass("needsclick")}); \ No newline at end of file +!(function (core) { + if ( + ('function' == typeof define && + define.amd && + define('uikit', function () { + var uikit = window.UIkit || core(window, window.jQuery, window.document) + return ( + (uikit.load = function (res, req, onload, config) { + var i, + resources = res.split(','), + load = [], + base = (config.config && config.config.uikit && config.config.uikit.base + ? config.config.uikit.base + : '' + ).replace(/\/+$/g, '') + if (!base) throw new Error('Please define base path to UIkit in the requirejs config.') + for (i = 0; i < resources.length; i += 1) { + var resource = resources[i].replace(/\./g, '/') + load.push(base + '/components/' + resource) + } + req(load, function () { + onload(uikit) + }) + }), + uikit + ) + }), + !window.jQuery) + ) + throw new Error('UIkit requires jQuery') + window && window.jQuery && core(window, window.jQuery, window.document) +})(function (global, $, doc) { + 'use strict' + var transitionEnd, + animationEnd, + domReady, + UI = {}, + _UI = global.UIkit ? Object.create(global.UIkit) : void 0 + if ( + ((UI.version = '2.25.0'), + (UI.noConflict = function () { + return _UI && ((global.UIkit = _UI), ($.UIkit = _UI), ($.fn.uk = _UI.fn)), UI + }), + (UI.prefix = function (str) { + return str + }), + (UI.$ = $), + (UI.$doc = UI.$(document)), + (UI.$win = UI.$(window)), + (UI.$html = UI.$('html')), + (UI.support = {}), + (UI.support.transition = (transitionEnd = (function () { + var name, + element = doc.body || doc.documentElement, + transEndEventNames = { + WebkitTransition: 'webkitTransitionEnd', + MozTransition: 'transitionend', + OTransition: 'oTransitionEnd otransitionend', + transition: 'transitionend' + } + for (name in transEndEventNames) if (void 0 !== element.style[name]) return transEndEventNames[name] + })()) && { end: transitionEnd }), + (UI.support.animation = (animationEnd = (function () { + var name, + element = doc.body || doc.documentElement, + animEndEventNames = { + WebkitAnimation: 'webkitAnimationEnd', + MozAnimation: 'animationend', + OAnimation: 'oAnimationEnd oanimationend', + animation: 'animationend' + } + for (name in animEndEventNames) if (void 0 !== element.style[name]) return animEndEventNames[name] + })()) && { end: animationEnd }), + (function () { + Date.now = + Date.now || + function () { + return new Date().getTime() + } + for (var vendors = ['webkit', 'moz'], i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) { + var vp = vendors[i] + ;(window.requestAnimationFrame = window[vp + 'RequestAnimationFrame']), + (window.cancelAnimationFrame = + window[vp + 'CancelAnimationFrame'] || window[vp + 'CancelRequestAnimationFrame']) + } + if ( + /iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || + !window.requestAnimationFrame || + !window.cancelAnimationFrame + ) { + var lastTime = 0 + ;(window.requestAnimationFrame = function (callback) { + var now = Date.now(), + nextTime = Math.max(lastTime + 16, now) + return setTimeout(function () { + callback((lastTime = nextTime)) + }, nextTime - now) + }), + (window.cancelAnimationFrame = clearTimeout) + } + })(), + (UI.support.touch = + 'ontouchstart' in document || + (global.DocumentTouch && document instanceof global.DocumentTouch) || + (global.navigator.msPointerEnabled && 0 < global.navigator.msMaxTouchPoints) || + (global.navigator.pointerEnabled && 0 < global.navigator.maxTouchPoints) || + !1), + (UI.support.mutationobserver = global.MutationObserver || global.WebKitMutationObserver || null), + (UI.Utils = {}), + (UI.Utils.isFullscreen = function () { + return ( + document.webkitFullscreenElement || + document.mozFullScreenElement || + document.msFullscreenElement || + document.fullscreenElement || + !1 + ) + }), + (UI.Utils.str2json = function (str, notevil) { + try { + return notevil + ? JSON.parse( + str + .replace(/([\$\w]+)\s*:/g, function (_, $1) { + return '"' + $1 + '":' + }) + .replace(/'([^']+)'/g, function (_, $1) { + return '"' + $1 + '"' + }) + ) + : new Function('', 'var json = ' + str + '; return JSON.parse(JSON.stringify(json));')() + } catch (e) { + return !1 + } + }), + (UI.Utils.debounce = function (func, wait, immediate) { + var timeout + return function () { + var context = this, + args = arguments, + callNow = immediate && !timeout + clearTimeout(timeout), + (timeout = setTimeout(function () { + ;(timeout = null), immediate || func.apply(context, args) + }, wait)), + callNow && func.apply(context, args) + } + }), + (UI.Utils.removeCssRules = function (selectorRegEx) { + var idx, idxs, stylesheet, _i, _j, _k, _len, _len1, _len2, _ref + selectorRegEx && + setTimeout(function () { + try { + for (_ref = document.styleSheets, _i = 0, _len = _ref.length; _i < _len; _i++) { + for ( + stylesheet = _ref[_i], + idxs = [], + stylesheet.cssRules = stylesheet.cssRules, + idx = _j = 0, + _len1 = stylesheet.cssRules.length; + _j < _len1; + idx = ++_j + ) + stylesheet.cssRules[idx].type === CSSRule.STYLE_RULE && + selectorRegEx.test(stylesheet.cssRules[idx].selectorText) && + idxs.unshift(idx) + for (_k = 0, _len2 = idxs.length; _k < _len2; _k++) stylesheet.deleteRule(idxs[_k]) + } + } catch (_error) {} + }, 0) + }), + (UI.Utils.isInView = function (element, options) { + var $element = $(element) + if (!$element.is(':visible')) return !1 + var window_left = UI.$win.scrollLeft(), + window_top = UI.$win.scrollTop(), + offset = $element.offset(), + left = offset.left, + top = offset.top + return ( + (options = $.extend({ topoffset: 0, leftoffset: 0 }, options)), + top + $element.height() >= window_top && + top - options.topoffset <= window_top + UI.$win.height() && + left + $element.width() >= window_left && + left - options.leftoffset <= window_left + UI.$win.width() + ) + }), + (UI.Utils.checkDisplay = function (context, initanimation) { + var elements = UI.$( + '[data-uk-margin], [data-uk-grid-match], [data-uk-grid-margin], [data-uk-check-display]', + context || document + ) + return ( + context && !elements.length && (elements = $(context)), + elements.trigger('display.uk.check'), + initanimation && + ('string' != typeof initanimation && (initanimation = '[class*="uk-animation-"]'), + elements.find(initanimation).each(function () { + var ele = UI.$(this), + anim = ele.attr('class').match(/uk\-animation\-(.+)/) + ele.removeClass(anim[0]).width(), ele.addClass(anim[0]) + })), + elements + ) + }), + (UI.Utils.options = function (string) { + if ('string' != $.type(string)) return string + ;-1 != string.indexOf(':') && '}' != string.trim().substr(-1) && (string = '{' + string + '}') + var start = string ? string.indexOf('{') : -1, + options = {} + if (-1 != start) + try { + options = UI.Utils.str2json(string.substr(start)) + } catch (e) {} + return options + }), + (UI.Utils.animate = function (element, cls) { + var d = $.Deferred() + return ( + (element = UI.$(element)) + .css('display', 'none') + .addClass(cls) + .one(UI.support.animation.end, function () { + element.removeClass(cls), d.resolve() + }), + element.css('display', ''), + d.promise() + ) + }), + (UI.Utils.uid = function (prefix) { + return (prefix || 'id') + new Date().getTime() + 'RAND' + Math.ceil(1e5 * Math.random()) + }), + (UI.Utils.template = function (str, data) { + for ( + var toc, + cmd, + prop, + fn, + tokens = str + .replace(/\n/g, '\\n') + .replace(/\{\{\{\s*(.+?)\s*\}\}\}/g, '{{!$1}}') + .split(/(\{\{\s*(.+?)\s*\}\})/g), + i = 0, + output = [], + openblocks = 0; + i < tokens.length; + + ) { + if ((toc = tokens[i]).match(/\{\{\s*(.+?)\s*\}\}/)) + switch ( + ((cmd = (toc = tokens[(i += 1)])[0]), (prop = toc.substring(toc.match(/^(\^|\#|\!|\~|\:)/) ? 1 : 0)), cmd) + ) { + case '~': + output.push('for(var $i=0;$i<' + prop + '.length;$i++) { var $item = ' + prop + '[$i];'), openblocks++ + break + case ':': + output.push('for(var $key in ' + prop + ') { var $val = ' + prop + '[$key];'), openblocks++ + break + case '#': + output.push('if(' + prop + ') {'), openblocks++ + break + case '^': + output.push('if(!' + prop + ') {'), openblocks++ + break + case '/': + output.push('}'), openblocks-- + break + case '!': + output.push('__ret.push(' + prop + ');') + break + default: + output.push('__ret.push(escape(' + prop + '));') + } + else output.push("__ret.push('" + toc.replace(/\'/g, "\\'") + "');") + i += 1 + } + return ( + (fn = new Function( + '$data', + [ + 'var __ret = [];', + 'try {', + 'with($data){', + openblocks ? '__ret = ["Not all blocks are closed correctly."]' : output.join(''), + '};', + '}catch(e){__ret = [e.message];}', + 'return __ret.join("").replace(/\\n\\n/g, "\\n");', + "function escape(html) { return String(html).replace(/&/g, '&').replace(/\"/g, '"').replace(//g, '>');}" + ].join('\n') + )), + data ? fn(data) : fn + ) + }), + (UI.Utils.events = {}), + (UI.Utils.events.click = UI.support.touch ? 'tap' : 'click'), + ((global.UIkit = UI).fn = function (command, options) { + var args = arguments, + cmd = command.match(/^([a-z\-]+)(?:\.([a-z]+))?/i), + component = cmd[1], + method = cmd[2] + return UI[component] + ? this.each(function () { + var $this = $(this), + data = $this.data(component) + data || $this.data(component, (data = UI[component](this, method ? void 0 : options))), + method && data[method].apply(data, Array.prototype.slice.call(args, 1)) + }) + : ($.error('UIkit component [' + component + '] does not exist.'), this) + }), + ($.UIkit = UI), + ($.fn.uk = UI.fn), + (UI.langdirection = 'rtl' == UI.$html.attr('dir') ? 'right' : 'left'), + (UI.components = {}), + (UI.component = function (name, def) { + var fn = function (element, options) { + var $this = this + return ( + (this.UIkit = UI), + (this.element = element ? UI.$(element) : null), + (this.options = $.extend(!0, {}, this.defaults, options)), + (this.plugins = {}), + this.element && this.element.data(name, this), + this.init(), + (this.options.plugins.length ? this.options.plugins : Object.keys(fn.plugins)).forEach(function (plugin) { + fn.plugins[plugin].init && (fn.plugins[plugin].init($this), ($this.plugins[plugin] = !0)) + }), + this.trigger('init.uk.component', [name, this]), + this + ) + } + return ( + (fn.plugins = {}), + $.extend( + !0, + fn.prototype, + { + defaults: { plugins: [] }, + boot: function () {}, + init: function () {}, + on: function (a1, a2, a3) { + return UI.$(this.element || this).on(a1, a2, a3) + }, + one: function (a1, a2, a3) { + return UI.$(this.element || this).one(a1, a2, a3) + }, + off: function (evt) { + return UI.$(this.element || this).off(evt) + }, + trigger: function (evt, params) { + return UI.$(this.element || this).trigger(evt, params) + }, + find: function (selector) { + return UI.$(this.element ? this.element : []).find(selector) + }, + proxy: function (obj, methods) { + var $this = this + methods.split(' ').forEach(function (method) { + $this[method] || + ($this[method] = function () { + return obj[method].apply(obj, arguments) + }) + }) + }, + mixin: function (obj, methods) { + var $this = this + methods.split(' ').forEach(function (method) { + $this[method] || ($this[method] = obj[method].bind($this)) + }) + }, + option: function () { + if (1 == arguments.length) return this.options[arguments[0]] || void 0 + 2 == arguments.length && (this.options[arguments[0]] = arguments[1]) + } + }, + def + ), + (this.components[name] = fn), + (this[name] = function () { + var element, options + if (arguments.length) + switch (arguments.length) { + case 1: + 'string' == typeof arguments[0] || arguments[0].nodeType || arguments[0] instanceof jQuery + ? (element = $(arguments[0])) + : (options = arguments[0]) + break + case 2: + ;(element = $(arguments[0])), (options = arguments[1]) + } + return element && element.data(name) ? element.data(name) : new UI.components[name](element, options) + }), + UI.domready && UI.component.boot(name), + fn + ) + }), + (UI.plugin = function (component, name, def) { + this.components[component].plugins[name] = def + }), + (UI.component.boot = function (name) { + UI.components[name].prototype && + UI.components[name].prototype.boot && + !UI.components[name].booted && + (UI.components[name].prototype.boot.apply(UI, []), (UI.components[name].booted = !0)) + }), + (UI.component.bootComponents = function () { + for (var component in UI.components) UI.component.boot(component) + }), + (UI.domObservers = []), + (UI.domready = !1), + (UI.ready = function (fn) { + UI.domObservers.push(fn), UI.domready && fn(document) + }), + (UI.on = function (a1, a2, a3) { + return a1 && -1 < a1.indexOf('ready.uk.dom') && UI.domready && a2.apply(UI.$doc), UI.$doc.on(a1, a2, a3) + }), + (UI.one = function (a1, a2, a3) { + return a1 && -1 < a1.indexOf('ready.uk.dom') && UI.domready + ? (a2.apply(UI.$doc), UI.$doc) + : UI.$doc.one(a1, a2, a3) + }), + (UI.trigger = function (evt, params) { + return UI.$doc.trigger(evt, params) + }), + (UI.domObserve = function (selector, fn) { + UI.support.mutationobserver && + ((fn = fn || function () {}), + UI.$(selector).each(function () { + var element = this, + $element = UI.$(element) + if (!$element.data('observer')) + try { + var observer = new UI.support.mutationobserver( + UI.Utils.debounce(function (mutations) { + fn.apply(element, []), $element.trigger('changed.uk.dom') + }, 50) + ) + observer.observe(element, { childList: !0, subtree: !0 }), $element.data('observer', observer) + } catch (e) {} + })) + }), + (UI.init = function (root) { + ;(root = root || document), + UI.domObservers.forEach(function (fn) { + fn(root) + }) + }), + UI.on('domready.uk.dom', function () { + UI.init(), UI.domready && UI.Utils.checkDisplay() + }), + document.addEventListener( + 'DOMContentLoaded', + ((domReady = function () { + var memory, fn + ;(UI.$body = UI.$('body')), + UI.ready(function (context) { + UI.domObserve('[data-uk-observe]') + }), + UI.on('changed.uk.dom', function (e) { + UI.init(e.target), UI.Utils.checkDisplay(e.target) + }), + UI.trigger('beforeready.uk.dom'), + UI.component.bootComponents(), + requestAnimationFrame( + ((memory = { dir: { x: 0, y: 0 }, x: window.pageXOffset, y: window.pageYOffset }), + (fn = function () { + var wpxo = window.pageXOffset, + wpyo = window.pageYOffset + ;(memory.x == wpxo && memory.y == wpyo) || + (wpxo != memory.x ? (memory.dir.x = wpxo > memory.x ? 1 : -1) : (memory.dir.x = 0), + wpyo != memory.y ? (memory.dir.y = wpyo > memory.y ? 1 : -1) : (memory.dir.y = 0), + (memory.x = wpxo), + (memory.y = wpyo), + UI.$doc.trigger('scrolling.uk.document', [ + { dir: { x: memory.dir.x, y: memory.dir.y }, x: wpxo, y: wpyo } + ])), + requestAnimationFrame(fn) + }), + UI.support.touch && UI.$html.on('touchmove touchend MSPointerMove MSPointerUp pointermove pointerup', fn), + (memory.x || memory.y) && fn(), + fn) + ), + UI.trigger('domready.uk.dom'), + UI.support.touch && + navigator.userAgent.match(/(iPad|iPhone|iPod)/g) && + UI.$win.on( + 'load orientationchange resize', + UI.Utils.debounce( + (function () { + var fn = function () { + return $('.uk-height-viewport').css('height', window.innerHeight), fn + } + return fn() + })(), + 100 + ) + ), + UI.trigger('afterready.uk.dom'), + (UI.domready = !0) + }), + ('complete' != document.readyState && 'interactive' != document.readyState) || setTimeout(domReady), + domReady) + ), + UI.$html.addClass(UI.support.touch ? 'uk-touch' : 'uk-notouch'), + UI.support.touch) + ) { + var exclude, + hoverset = !1, + selector = '.uk-overlay, .uk-overlay-hover, .uk-overlay-toggle, .uk-animation-hover, .uk-has-hover' + UI.$html + .on('mouseenter touchstart MSPointerDown pointerdown', selector, function () { + hoverset && $('.uk-hover').removeClass('uk-hover'), (hoverset = $(this).addClass('uk-hover')) + }) + .on('mouseleave touchend MSPointerUp pointerup', function (e) { + ;(exclude = $(e.target).parents(selector)), hoverset && hoverset.not(exclude).removeClass('uk-hover') + }) + } + return UI +}), + (function ($) { + if (!$.fn.swipeLeft) { + var touchTimeout, + tapTimeout, + swipeTimeout, + longTapTimeout, + gesture, + touch = {} + $(function () { + var now, + delta, + firstTouch, + deltaX = 0, + deltaY = 0 + 'MSGesture' in window && ((gesture = new MSGesture()).target = document.body), + $(document) + .on('MSGestureEnd gestureend', function (e) { + var swipeDirectionFromVelocity = + 1 < e.originalEvent.velocityX + ? 'Right' + : e.originalEvent.velocityX < -1 + ? 'Left' + : 1 < e.originalEvent.velocityY + ? 'Down' + : e.originalEvent.velocityY < -1 + ? 'Up' + : null + swipeDirectionFromVelocity && + void 0 !== touch.el && + (touch.el.trigger('swipe'), touch.el.trigger('swipe' + swipeDirectionFromVelocity)) + }) + .on('touchstart MSPointerDown pointerdown', function (e) { + ;('MSPointerDown' != e.type || isPrimaryTouch(e.originalEvent)) && + ((firstTouch = 'MSPointerDown' == e.type || 'pointerdown' == e.type ? e : e.originalEvent.touches[0]), + (now = Date.now()), + (delta = now - (touch.last || now)), + (touch.el = $('tagName' in firstTouch.target ? firstTouch.target : firstTouch.target.parentNode)), + touchTimeout && clearTimeout(touchTimeout), + (touch.x1 = firstTouch.pageX), + (touch.y1 = firstTouch.pageY), + 0 < delta && delta <= 250 && (touch.isDoubleTap = !0), + (touch.last = now), + (longTapTimeout = setTimeout(longTap, 750)), + !gesture || + ('MSPointerDown' != e.type && 'pointerdown' != e.type && 'touchstart' != e.type) || + gesture.addPointer(e.originalEvent.pointerId)) + }) + .on('touchmove MSPointerMove pointermove', function (e) { + ;('MSPointerMove' != e.type || isPrimaryTouch(e.originalEvent)) && + ((firstTouch = 'MSPointerMove' == e.type || 'pointermove' == e.type ? e : e.originalEvent.touches[0]), + cancelLongTap(), + (touch.x2 = firstTouch.pageX), + (touch.y2 = firstTouch.pageY), + (deltaX += Math.abs(touch.x1 - touch.x2)), + (deltaY += Math.abs(touch.y1 - touch.y2))) + }) + .on('touchend MSPointerUp pointerup', function (e) { + ;('MSPointerUp' != e.type || isPrimaryTouch(e.originalEvent)) && + (cancelLongTap(), + (touch.x2 && 30 < Math.abs(touch.x1 - touch.x2)) || (touch.y2 && 30 < Math.abs(touch.y1 - touch.y2)) + ? (swipeTimeout = setTimeout(function () { + var x1, x2, y1, y2 + void 0 !== touch.el && + (touch.el.trigger('swipe'), + touch.el.trigger( + 'swipe' + + ((x1 = touch.x1), + (x2 = touch.x2), + (y1 = touch.y1), + (y2 = touch.y2), + Math.abs(x1 - x2) >= Math.abs(y1 - y2) + ? 0 < x1 - x2 + ? 'Left' + : 'Right' + : 0 < y1 - y2 + ? 'Up' + : 'Down') + )), + (touch = {}) + }, 0)) + : 'last' in touch && + (isNaN(deltaX) || (deltaX < 30 && deltaY < 30) + ? (tapTimeout = setTimeout(function () { + var event = $.Event('tap') + ;(event.cancelTouch = cancelAll), + void 0 !== touch.el && touch.el.trigger(event), + touch.isDoubleTap + ? (void 0 !== touch.el && touch.el.trigger('doubleTap'), (touch = {})) + : (touchTimeout = setTimeout(function () { + ;(touchTimeout = null), + void 0 !== touch.el && touch.el.trigger('singleTap'), + (touch = {}) + }, 250)) + }, 0)) + : (touch = {}), + (deltaX = deltaY = 0))) + }) + .on('touchcancel MSPointerCancel', cancelAll), + $(window).on('scroll', cancelAll) + }), + [ + 'swipe', + 'swipeLeft', + 'swipeRight', + 'swipeUp', + 'swipeDown', + 'doubleTap', + 'tap', + 'singleTap', + 'longTap' + ].forEach(function (eventName) { + $.fn[eventName] = function (callback) { + return $(this).on(eventName, callback) + } + }) + } + function longTap () { + ;(longTapTimeout = null), touch.last && (void 0 !== touch.el && touch.el.trigger('longTap'), (touch = {})) + } + function cancelLongTap () { + longTapTimeout && clearTimeout(longTapTimeout), (longTapTimeout = null) + } + function cancelAll () { + touchTimeout && clearTimeout(touchTimeout), + tapTimeout && clearTimeout(tapTimeout), + swipeTimeout && clearTimeout(swipeTimeout), + longTapTimeout && clearTimeout(longTapTimeout), + (touchTimeout = tapTimeout = swipeTimeout = longTapTimeout = null), + (touch = {}) + } + function isPrimaryTouch (event) { + return event.pointerType == event.MSPOINTER_TYPE_TOUCH && event.isPrimary + } + })(jQuery), + (function (UI) { + 'use strict' + var elements, + check, + cacheSvgs, + stacks = [] + UI.component('stackMargin', { + defaults: { cls: 'uk-margin-small-top', rowfirst: !1 }, + boot: function () { + UI.ready(function (context) { + UI.$('[data-uk-margin]', context).each(function () { + var ele = UI.$(this) + ele.data('stackMargin') || UI.stackMargin(ele, UI.Utils.options(ele.attr('data-uk-margin'))) + }) + }) + }, + init: function () { + var fn, + $this = this + UI.$win.on( + 'resize orientationchange', + ((fn = function () { + $this.process() + }), + UI.$(function () { + fn(), UI.$win.on('load', fn) + }), + UI.Utils.debounce(fn, 20)) + ), + UI.$html.on('changed.uk.dom', function (e) { + $this.process() + }), + this.on( + 'display.uk.check', + function (e) { + this.element.is(':visible') && this.process() + }.bind(this) + ), + stacks.push(this) + }, + process: function () { + var $this = this, + columns = this.element.children() + if ((UI.Utils.stackMargin(columns, this.options), !this.options.rowfirst)) return this + var pos_cache = columns + .removeClass(this.options.rowfirst) + .filter(':visible') + .first() + .position() + return ( + pos_cache && + columns.each(function () { + UI.$(this)[UI.$(this).position().left == pos_cache.left ? 'addClass' : 'removeClass']( + $this.options.rowfirst + ) + }), + this + ) + } + }), + (elements = []), + (check = function (ele) { + if (ele.is(':visible')) { + var width = ele.parent().width(), + iwidth = ele.data('width'), + ratio = width / iwidth, + height = Math.floor(ratio * ele.data('height')) + ele.css({ height: width < iwidth ? height : ele.data('height') }) + } + }), + UI.component('responsiveElement', { + defaults: {}, + boot: function () { + UI.ready(function (context) { + UI.$('iframe.uk-responsive-width, [data-uk-responsive]', context).each(function () { + var ele = UI.$(this) + ele.data('responsiveElement') || UI.responsiveElement(ele, {}) + }) + }) + }, + init: function () { + var ele = this.element + ele.attr('width') && + ele.attr('height') && + (ele.data({ width: ele.attr('width'), height: ele.attr('height') }).on('display.uk.check', function () { + check(ele) + }), + check(ele), + elements.push(ele)) + } + }), + UI.$win.on( + 'resize load', + UI.Utils.debounce(function () { + elements.forEach(function (ele) { + check(ele) + }) + }, 15) + ), + (UI.Utils.stackMargin = function (elements, options) { + ;((options = UI.$.extend({ cls: 'uk-margin-small-top' }, options)).cls = options.cls), + (elements = UI.$(elements).removeClass(options.cls)) + var skip = !1, + firstvisible = elements.filter(':visible:first'), + offset = !!firstvisible.length && firstvisible.position().top + firstvisible.outerHeight() - 1 + !1 !== offset && + 1 != elements.length && + elements.each(function () { + var column = UI.$(this) + column.is(':visible') && + (skip + ? column.addClass(options.cls) + : column.position().top >= offset && (skip = column.addClass(options.cls))) + }) + }), + (UI.Utils.matchHeights = function (elements, options) { + ;(elements = UI.$(elements).css('min-height', '')), (options = UI.$.extend({ row: !0 }, options)) + var matchHeights = function (group) { + if (!(group.length < 2)) { + var max = 0 + group + .each(function () { + max = Math.max(max, UI.$(this).outerHeight()) + }) + .each(function () { + var element = UI.$(this), + height = + max - ('border-box' == element.css('box-sizing') ? 0 : element.outerHeight() - element.height()) + element.css('min-height', height + 'px') + }) + } + } + options.row + ? (elements.first().width(), + setTimeout(function () { + var lastoffset = !1, + group = [] + elements.each(function () { + var ele = UI.$(this), + offset = ele.offset().top + offset != lastoffset && + group.length && + (matchHeights(UI.$(group)), (group = []), (offset = ele.offset().top)), + group.push(ele), + (lastoffset = offset) + }), + group.length && matchHeights(UI.$(group)) + }, 0)) + : matchHeights(elements) + }), + (cacheSvgs = {}), + (UI.Utils.inlineSvg = function (selector, root) { + UI.$(selector || 'img[src$=".svg"]', root || document).each(function () { + var img = UI.$(this), + src = img.attr('src') + if (!cacheSvgs[src]) { + var d = UI.$.Deferred() + UI.$.get(src, { nc: Math.random() }, function (data) { + d.resolve(UI.$(data).find('svg')) + }), + (cacheSvgs[src] = d.promise()) + } + cacheSvgs[src].then(function (svg) { + var $svg = UI.$(svg).clone() + img.attr('id') && $svg.attr('id', img.attr('id')), + img.attr('class') && $svg.attr('class', img.attr('class')), + img.attr('style') && $svg.attr('style', img.attr('style')), + img.attr('width') && + ($svg.attr('width', img.attr('width')), img.attr('height') || $svg.removeAttr('height')), + img.attr('height') && + ($svg.attr('height', img.attr('height')), img.attr('width') || $svg.removeAttr('width')), + img.replaceWith($svg) + }) + }) + }), + UI.ready(function (context) { + UI.Utils.inlineSvg('[data-uk-svg]', context) + }) + })(UIkit), + (function (UI) { + 'use strict' + function scrollToElement (ele, options) { + options = UI.$.extend({ duration: 1e3, transition: 'easeOutExpo', offset: 0, complete: function () {} }, options) + var target = ele.offset().top - options.offset, + docheight = UI.$doc.height(), + winheight = window.innerHeight + docheight < target + winheight && (target = docheight - winheight), + UI.$('html,body') + .stop() + .animate({ scrollTop: target }, options.duration, options.transition) + .promise() + .done(options.complete) + } + UI.component('smoothScroll', { + boot: function () { + UI.$html.on('click.smooth-scroll.uikit', '[data-uk-smooth-scroll]', function (e) { + var ele = UI.$(this) + if (!ele.data('smoothScroll')) { + UI.smoothScroll(ele, UI.Utils.options(ele.attr('data-uk-smooth-scroll'))) + ele.trigger('click') + } + return !1 + }) + }, + init: function () { + var $this = this + this.on('click', function (e) { + e.preventDefault(), scrollToElement(UI.$(this.hash).length ? UI.$(this.hash) : UI.$('body'), $this.options) + }) + } + }), + (UI.Utils.scrollToElement = scrollToElement), + UI.$.easing.easeOutExpo || + (UI.$.easing.easeOutExpo = function (x, t, b, c, d) { + return t == d ? b + c : c * (1 - Math.pow(2, (-10 * t) / d)) + b + }) + })(UIkit), + (function (UI) { + 'use strict' + var $win = UI.$win, + $doc = UI.$doc, + scrollspies = [], + checkScrollSpy = function () { + for (var i = 0; i < scrollspies.length; i++) window.requestAnimationFrame.apply(window, [scrollspies[i].check]) + } + UI.component('scrollspy', { + defaults: { + target: !1, + cls: 'uk-scrollspy-inview', + initcls: 'uk-scrollspy-init-inview', + topoffset: 0, + leftoffset: 0, + repeat: !1, + delay: 0 + }, + boot: function () { + $doc.on('scrolling.uk.document', checkScrollSpy), + $win.on('load resize orientationchange', UI.Utils.debounce(checkScrollSpy, 50)), + UI.ready(function (context) { + UI.$('[data-uk-scrollspy]', context).each(function () { + var element = UI.$(this) + if (!element.data('scrollspy')) UI.scrollspy(element, UI.Utils.options(element.attr('data-uk-scrollspy'))) + }) + }) + }, + init: function () { + var initinview, + $this = this, + togglecls = this.options.cls.split(/,/), + fn = function () { + var elements = $this.options.target ? $this.element.find($this.options.target) : $this.element, + delayIdx = 1 === elements.length ? 1 : 0, + toggleclsIdx = 0 + elements.each(function (idx) { + var element = UI.$(this), + inviewstate = element.data('inviewstate'), + inview = UI.Utils.isInView(element, $this.options), + toggle = element.data('ukScrollspyCls') || togglecls[toggleclsIdx].trim() + !inview || + inviewstate || + element.data('scrollspy-idle') || + (initinview || + (element.addClass($this.options.initcls), + ($this.offset = element.offset()), + (initinview = !0), + element.trigger('init.uk.scrollspy')), + element.data( + 'scrollspy-idle', + setTimeout(function () { + element + .addClass('uk-scrollspy-inview') + .toggleClass(toggle) + .width(), + element.trigger('inview.uk.scrollspy'), + element.data('scrollspy-idle', !1), + element.data('inviewstate', !0) + }, $this.options.delay * delayIdx) + ), + delayIdx++), + !inview && + inviewstate && + $this.options.repeat && + (element.data('scrollspy-idle') && + (clearTimeout(element.data('scrollspy-idle')), element.data('scrollspy-idle', !1)), + element.removeClass('uk-scrollspy-inview').toggleClass(toggle), + element.data('inviewstate', !1), + element.trigger('outview.uk.scrollspy')), + (toggleclsIdx = togglecls[toggleclsIdx + 1] ? toggleclsIdx + 1 : 0) + }) + } + fn(), (this.check = fn), scrollspies.push(this) + } + }) + var scrollspynavs = [], + checkScrollSpyNavs = function () { + for (var i = 0; i < scrollspynavs.length; i++) + window.requestAnimationFrame.apply(window, [scrollspynavs[i].check]) + } + UI.component('scrollspynav', { + defaults: { cls: 'uk-active', closest: !1, topoffset: 0, leftoffset: 0, smoothscroll: !1 }, + boot: function () { + $doc.on('scrolling.uk.document', checkScrollSpyNavs), + $win.on('resize orientationchange', UI.Utils.debounce(checkScrollSpyNavs, 50)), + UI.ready(function (context) { + UI.$('[data-uk-scrollspy-nav]', context).each(function () { + var element = UI.$(this) + if (!element.data('scrollspynav')) + UI.scrollspynav(element, UI.Utils.options(element.attr('data-uk-scrollspy-nav'))) + }) + }) + }, + init: function () { + var inviews, + ids = [], + links = this.find("a[href^='#']").each(function () { + '#' !== this.getAttribute('href').trim() && ids.push(this.getAttribute('href')) + }), + targets = UI.$(ids.join(',')), + clsActive = this.options.cls, + clsClosest = this.options.closest || this.options.closest, + $this = this, + fn = function () { + inviews = [] + for (var i = 0; i < targets.length; i++) + UI.Utils.isInView(targets.eq(i), $this.options) && inviews.push(targets.eq(i)) + if (inviews.length) { + var navitems, + scrollTop = $win.scrollTop(), + target = (function () { + for (var i = 0; i < inviews.length; i++) if (inviews[i].offset().top >= scrollTop) return inviews[i] + })() + if (!target) return + ;(navitems = $this.options.closest + ? (links + .blur() + .closest(clsClosest) + .removeClass(clsActive), + links + .filter("a[href='#" + target.attr('id') + "']") + .closest(clsClosest) + .addClass(clsActive)) + : links + .removeClass(clsActive) + .filter("a[href='#" + target.attr('id') + "']") + .addClass(clsActive)), + $this.element.trigger('inview.uk.scrollspynav', [target, navitems]) + } + } + this.options.smoothscroll && + UI.smoothScroll && + links.each(function () { + UI.smoothScroll(this, $this.options.smoothscroll) + }), + fn(), + this.element.data('scrollspynav', this), + (this.check = fn), + scrollspynavs.push(this) + } + }) + })(UIkit), + (function (UI) { + 'use strict' + var toggles = [] + UI.component('toggle', { + defaults: { target: !1, cls: 'uk-hidden', animation: !1, duration: 200 }, + boot: function () { + UI.ready(function (context) { + UI.$('[data-uk-toggle]', context).each(function () { + var ele = UI.$(this) + if (!ele.data('toggle')) UI.toggle(ele, UI.Utils.options(ele.attr('data-uk-toggle'))) + }), + setTimeout(function () { + toggles.forEach(function (toggle) { + toggle.getToggles() + }) + }, 0) + }) + }, + init: function () { + var $this = this + ;(this.aria = -1 !== this.options.cls.indexOf('uk-hidden')), + this.getToggles(), + this.on('click', function (e) { + $this.element.is('a[href="#"]') && e.preventDefault(), $this.toggle() + }), + toggles.push(this) + }, + toggle: function () { + if (this.totoggle.length) { + if (this.options.animation && UI.support.animation) { + var $this = this, + animations = this.options.animation.split(',') + 1 == animations.length && (animations[1] = animations[0]), + (animations[0] = animations[0].trim()), + (animations[1] = animations[1].trim()), + this.totoggle.css('animation-duration', this.options.duration + 'ms'), + this.totoggle.each(function () { + var ele = UI.$(this) + ele.hasClass($this.options.cls) + ? (ele.toggleClass($this.options.cls), + UI.Utils.animate(ele, animations[0]).then(function () { + ele.css('animation-duration', ''), UI.Utils.checkDisplay(ele) + })) + : UI.Utils.animate(this, animations[1] + ' uk-animation-reverse').then(function () { + ele.toggleClass($this.options.cls).css('animation-duration', ''), UI.Utils.checkDisplay(ele) + }) + }) + } else this.totoggle.toggleClass(this.options.cls), UI.Utils.checkDisplay(this.totoggle) + this.updateAria() + } + }, + getToggles: function () { + ;(this.totoggle = this.options.target ? UI.$(this.options.target) : []), this.updateAria() + }, + updateAria: function () { + this.aria && + this.totoggle.length && + this.totoggle.each(function () { + UI.$(this).attr('aria-hidden', UI.$(this).hasClass('uk-hidden')) + }) + } + }) + })(UIkit), + (function (UI) { + 'use strict' + UI.component('alert', { + defaults: { fade: !0, duration: 200, trigger: '.uk-alert-close' }, + boot: function () { + UI.$html.on('click.alert.uikit', '[data-uk-alert]', function (e) { + var ele = UI.$(this) + if (!ele.data('alert')) { + var alert = UI.alert(ele, UI.Utils.options(ele.attr('data-uk-alert'))) + UI.$(e.target).is(alert.options.trigger) && (e.preventDefault(), alert.close()) + } + }) + }, + init: function () { + var $this = this + this.on('click', this.options.trigger, function (e) { + e.preventDefault(), $this.close() + }) + }, + close: function () { + var element = this.trigger('close.uk.alert'), + removeElement = function () { + this.trigger('closed.uk.alert').remove() + }.bind(this) + this.options.fade + ? element + .css('overflow', 'hidden') + .css('max-height', element.height()) + .animate( + { height: 0, opacity: 0, 'padding-top': 0, 'padding-bottom': 0, 'margin-top': 0, 'margin-bottom': 0 }, + this.options.duration, + removeElement + ) + : removeElement() + } + }) + })(UIkit), + (function (UI) { + 'use strict' + UI.component('buttonRadio', { + defaults: { activeClass: 'uk-active', target: '.uk-button' }, + boot: function () { + UI.$html.on('click.buttonradio.uikit', '[data-uk-button-radio]', function (e) { + var ele = UI.$(this) + if (!ele.data('buttonRadio')) { + var obj = UI.buttonRadio(ele, UI.Utils.options(ele.attr('data-uk-button-radio'))), + target = UI.$(e.target) + target.is(obj.options.target) && target.trigger('click') + } + }) + }, + init: function () { + var $this = this + this.find($this.options.target) + .attr('aria-checked', 'false') + .filter('.' + $this.options.activeClass) + .attr('aria-checked', 'true'), + this.on('click', this.options.target, function (e) { + var ele = UI.$(this) + ele.is('a[href="#"]') && e.preventDefault(), + $this + .find($this.options.target) + .not(ele) + .removeClass($this.options.activeClass) + .blur(), + ele.addClass($this.options.activeClass), + $this + .find($this.options.target) + .not(ele) + .attr('aria-checked', 'false'), + ele.attr('aria-checked', 'true'), + $this.trigger('change.uk.button', [ele]) + }) + }, + getSelected: function () { + return this.find('.' + this.options.activeClass) + } + }), + UI.component('buttonCheckbox', { + defaults: { activeClass: 'uk-active', target: '.uk-button' }, + boot: function () { + UI.$html.on('click.buttoncheckbox.uikit', '[data-uk-button-checkbox]', function (e) { + var ele = UI.$(this) + if (!ele.data('buttonCheckbox')) { + var obj = UI.buttonCheckbox(ele, UI.Utils.options(ele.attr('data-uk-button-checkbox'))), + target = UI.$(e.target) + target.is(obj.options.target) && target.trigger('click') + } + }) + }, + init: function () { + var $this = this + this.find($this.options.target) + .attr('aria-checked', 'false') + .filter('.' + $this.options.activeClass) + .attr('aria-checked', 'true'), + this.on('click', this.options.target, function (e) { + var ele = UI.$(this) + ele.is('a[href="#"]') && e.preventDefault(), + ele.toggleClass($this.options.activeClass).blur(), + ele.attr('aria-checked', ele.hasClass($this.options.activeClass)), + $this.trigger('change.uk.button', [ele]) + }) + }, + getSelected: function () { + return this.find('.' + this.options.activeClass) + } + }), + UI.component('button', { + defaults: {}, + boot: function () { + UI.$html.on('click.button.uikit', '[data-uk-button]', function (e) { + var ele = UI.$(this) + if (!ele.data('button')) { + UI.button(ele, UI.Utils.options(ele.attr('data-uk-button'))) + ele.trigger('click') + } + }) + }, + init: function () { + var $this = this + this.element.attr('aria-pressed', this.element.hasClass('uk-active')), + this.on('click', function (e) { + $this.element.is('a[href="#"]') && e.preventDefault(), + $this.toggle(), + $this.trigger('change.uk.button', [$this.element.blur().hasClass('uk-active')]) + }) + }, + toggle: function () { + this.element.toggleClass('uk-active'), this.element.attr('aria-pressed', this.element.hasClass('uk-active')) + } + }) + })(UIkit), + (function (UI) { + 'use strict' + var hoverIdle, + active = !1, + flips = { + x: { + 'bottom-left': 'bottom-right', + 'bottom-right': 'bottom-left', + 'bottom-center': 'bottom-center', + 'top-left': 'top-right', + 'top-right': 'top-left', + 'top-center': 'top-center', + 'left-top': 'right-top', + 'left-bottom': 'right-bottom', + 'left-center': 'right-center', + 'right-top': 'left-top', + 'right-bottom': 'left-bottom', + 'right-center': 'left-center' + }, + y: { + 'bottom-left': 'top-left', + 'bottom-right': 'top-right', + 'bottom-center': 'top-center', + 'top-left': 'bottom-left', + 'top-right': 'bottom-right', + 'top-center': 'bottom-center', + 'left-top': 'left-bottom', + 'left-bottom': 'left-top', + 'left-center': 'left-center', + 'right-top': 'right-bottom', + 'right-bottom': 'right-top', + 'right-center': 'right-center' + }, + xy: { + 'bottom-left': 'top-right', + 'bottom-right': 'top-left', + 'bottom-center': 'top-center', + 'top-left': 'bottom-right', + 'top-right': 'bottom-left', + 'top-center': 'bottom-center', + 'left-top': 'right-bottom', + 'left-bottom': 'right-top', + 'left-center': 'right-center', + 'right-top': 'left-bottom', + 'right-bottom': 'left-top', + 'right-center': 'left-center' + } + } + function justify (ele, justifyTo, boundarywidth, offset) { + if ( + ((ele = UI.$(ele)), + (justifyTo = UI.$(justifyTo)), + (boundarywidth = boundarywidth || window.innerWidth), + (offset = offset || ele.offset()), + justifyTo.length) + ) { + var jwidth = justifyTo.outerWidth() + if ((ele.css('min-width', jwidth), 'right' == UI.langdirection)) { + var right1 = boundarywidth - (justifyTo.offset().left + jwidth), + right2 = boundarywidth - (ele.offset().left + ele.outerWidth()) + ele.css('margin-right', right1 - right2) + } else ele.css('margin-left', justifyTo.offset().left - offset.left) + } + } + UI.component('dropdown', { + defaults: { + mode: 'hover', + pos: 'bottom-left', + offset: 0, + remaintime: 800, + justify: !1, + boundary: UI.$win, + delay: 0, + dropdownSelector: '.uk-dropdown,.uk-dropdown-blank', + hoverDelayIdle: 250, + preventflip: !1 + }, + remainIdle: !1, + boot: function () { + var triggerevent = UI.support.touch ? 'click' : 'mouseenter' + UI.$html.on(triggerevent + '.dropdown.uikit', '[data-uk-dropdown]', function (e) { + var ele = UI.$(this) + if (!ele.data('dropdown')) { + var dropdown = UI.dropdown(ele, UI.Utils.options(ele.attr('data-uk-dropdown'))) + ;('click' == triggerevent || ('mouseenter' == triggerevent && 'hover' == dropdown.options.mode)) && + dropdown.element.trigger(triggerevent), + dropdown.element.find(dropdown.options.dropdownSelector).length && e.preventDefault() + } + }) + }, + init: function () { + var $this = this + ;(this.dropdown = this.find(this.options.dropdownSelector)), + (this.offsetParent = this.dropdown + .parents() + .filter(function () { + return -1 !== UI.$.inArray(UI.$(this).css('position'), ['relative', 'fixed', 'absolute']) + }) + .slice(0, 1)), + (this.centered = this.dropdown.hasClass('uk-dropdown-center')), + (this.justified = !!this.options.justify && UI.$(this.options.justify)), + (this.boundary = UI.$(this.options.boundary)), + this.boundary.length || (this.boundary = UI.$win), + this.dropdown.hasClass('uk-dropdown-up') && (this.options.pos = 'top-left'), + this.dropdown.hasClass('uk-dropdown-flip') && (this.options.pos = this.options.pos.replace('left', 'right')), + this.dropdown.hasClass('uk-dropdown-center') && + (this.options.pos = this.options.pos.replace(/(left|right)/, 'center')), + this.element.attr('aria-haspopup', 'true'), + this.element.attr('aria-expanded', this.element.hasClass('uk-open')), + 'click' == this.options.mode || UI.support.touch + ? this.on('click.uk.dropdown', function (e) { + var $target = UI.$(e.target) + $target.parents($this.options.dropdownSelector).length || + (($target.is("a[href='#']") || + $target.parent().is("a[href='#']") || + ($this.dropdown.length && !$this.dropdown.is(':visible'))) && + e.preventDefault(), + $target.blur()), + $this.element.hasClass('uk-open') + ? (!$this.dropdown.find(e.target).length || + $target.is('.uk-dropdown-close') || + $target.parents('.uk-dropdown-close').length) && + $this.hide() + : $this.show() + }) + : this.on('mouseenter', function (e) { + $this.trigger('pointerenter.uk.dropdown', [$this]), + $this.remainIdle && clearTimeout($this.remainIdle), + hoverIdle && clearTimeout(hoverIdle), + (active && active == $this) || + (hoverIdle = + active && active != $this + ? setTimeout(function () { + hoverIdle = setTimeout($this.show.bind($this), $this.options.delay) + }, $this.options.hoverDelayIdle) + : setTimeout($this.show.bind($this), $this.options.delay)) + }) + .on('mouseleave', function () { + hoverIdle && clearTimeout(hoverIdle), + ($this.remainIdle = setTimeout(function () { + active && active == $this && $this.hide() + }, $this.options.remaintime)), + $this.trigger('pointerleave.uk.dropdown', [$this]) + }) + .on('click', function (e) { + var $target = UI.$(e.target) + $this.remainIdle && clearTimeout($this.remainIdle), + active && active == $this + ? (!$this.dropdown.find(e.target).length || + $target.is('.uk-dropdown-close') || + $target.parents('.uk-dropdown-close').length) && + $this.hide() + : (($target.is("a[href='#']") || $target.parent().is("a[href='#']")) && e.preventDefault(), + $this.show()) + }) + }, + show: function () { + UI.$html.off('click.outer.dropdown'), + active && active != this && active.hide(!0), + hoverIdle && clearTimeout(hoverIdle), + this.trigger('beforeshow.uk.dropdown', [this]), + this.checkDimensions(), + this.element.addClass('uk-open'), + this.element.attr('aria-expanded', 'true'), + this.trigger('show.uk.dropdown', [this]), + UI.Utils.checkDisplay(this.dropdown, !0), + (active = this).registerOuterClick() + }, + hide: function (force) { + this.trigger('beforehide.uk.dropdown', [this, force]), + this.element.removeClass('uk-open'), + this.remainIdle && clearTimeout(this.remainIdle), + (this.remainIdle = !1), + this.element.attr('aria-expanded', 'false'), + this.trigger('hide.uk.dropdown', [this, force]), + active == this && (active = !1) + }, + registerOuterClick: function () { + var $this = this + UI.$html.off('click.outer.dropdown'), + setTimeout(function () { + UI.$html.on('click.outer.dropdown', function (e) { + hoverIdle && clearTimeout(hoverIdle) + UI.$(e.target) + active != $this || + $this.element.find(e.target).length || + ($this.hide(!0), UI.$html.off('click.outer.dropdown')) + }) + }, 10) + }, + checkDimensions: function () { + if (this.dropdown.length) { + this.dropdown + .removeClass('uk-dropdown-top uk-dropdown-bottom uk-dropdown-left uk-dropdown-right uk-dropdown-stack') + .css({ 'top-left': '', left: '', 'margin-left': '', 'margin-right': '' }), + this.justified && this.justified.length && this.dropdown.css('min-width', '') + var pp, + pos = UI.$.extend({}, this.offsetParent.offset(), { + width: this.offsetParent[0].offsetWidth, + height: this.offsetParent[0].offsetHeight + }), + posoffset = this.options.offset, + dropdown = this.dropdown, + width = (dropdown.show().offset(), dropdown.outerWidth()), + height = dropdown.outerHeight(), + boundarywidth = this.boundary.width(), + dpos = (this.boundary[0] !== window && this.boundary.offset() && this.boundary.offset(), this.options.pos), + variants = { + 'bottom-left': { top: 0 + pos.height + posoffset, left: 0 }, + 'bottom-right': { top: 0 + pos.height + posoffset, left: 0 + pos.width - width }, + 'bottom-center': { top: 0 + pos.height + posoffset, left: 0 + pos.width / 2 - width / 2 }, + 'top-left': { top: 0 - height - posoffset, left: 0 }, + 'top-right': { top: 0 - height - posoffset, left: 0 + pos.width - width }, + 'top-center': { top: 0 - height - posoffset, left: 0 + pos.width / 2 - width / 2 }, + 'left-top': { top: 0, left: 0 - width - posoffset }, + 'left-bottom': { top: 0 + pos.height - height, left: 0 - width - posoffset }, + 'left-center': { top: 0 + pos.height / 2 - height / 2, left: 0 - width - posoffset }, + 'right-top': { top: 0, left: 0 + pos.width + posoffset }, + 'right-bottom': { top: 0 + pos.height - height, left: 0 + pos.width + posoffset }, + 'right-center': { top: 0 + pos.height / 2 - height / 2, left: 0 + pos.width + posoffset } + }, + css = {} + if ( + ((pp = dpos.split('-')), + (css = variants[dpos] ? variants[dpos] : variants['bottom-left']), + this.justified && this.justified.length) + ) + justify(dropdown.css({ left: 0 }), this.justified, boundarywidth) + else if (!0 !== this.options.preventflip) { + var fdpos + switch (this.checkBoundary(pos.left + css.left, pos.top + css.top, width, height, boundarywidth)) { + case 'x': + 'x' !== this.options.preventflip && (fdpos = flips.x[dpos] || 'right-top') + break + case 'y': + 'y' !== this.options.preventflip && (fdpos = flips.y[dpos] || 'top-left') + break + case 'xy': + this.options.preventflip || (fdpos = flips.xy[dpos] || 'right-bottom') + } + fdpos && + ((pp = fdpos.split('-')), + (css = variants[fdpos] ? variants[fdpos] : variants['bottom-left']), + this.checkBoundary(pos.left + css.left, pos.top + css.top, width, height, boundarywidth) && + ((pp = dpos.split('-')), (css = variants[dpos] ? variants[dpos] : variants['bottom-left']))) + } + boundarywidth < width && (dropdown.addClass('uk-dropdown-stack'), this.trigger('stack.uk.dropdown', [this])), + dropdown + .css(css) + .css('display', '') + .addClass('uk-dropdown-' + pp[0]) + } + }, + checkBoundary: function (left, top, width, height, boundarywidth) { + var axis = '' + return ( + (left < 0 || left - UI.$win.scrollLeft() + width > boundarywidth) && (axis += 'x'), + (top - UI.$win.scrollTop() < 0 || top - UI.$win.scrollTop() + height > window.innerHeight) && (axis += 'y'), + axis + ) + } + }), + UI.component('dropdownOverlay', { + defaults: { justify: !1, cls: '', duration: 200 }, + boot: function () { + UI.ready(function (context) { + UI.$('[data-uk-dropdown-overlay]', context).each(function () { + var ele = UI.$(this) + ele.data('dropdownOverlay') || + UI.dropdownOverlay(ele, UI.Utils.options(ele.attr('data-uk-dropdown-overlay'))) + }) + }) + }, + init: function () { + var $this = this + ;(this.justified = !!this.options.justify && UI.$(this.options.justify)), + (this.overlay = this.element.find('uk-dropdown-overlay')), + this.overlay.length || + (this.overlay = UI.$('
        ').appendTo(this.element)), + this.overlay.addClass(this.options.cls), + this.on({ + 'beforeshow.uk.dropdown': function (e, dropdown) { + ;($this.dropdown = dropdown), + $this.justified && + $this.justified.length && + justify( + $this.overlay.css({ display: 'block', 'margin-left': '', 'margin-right': '' }), + $this.justified, + $this.justified.outerWidth() + ) + }, + 'show.uk.dropdown': function (e, dropdown) { + var h = $this.dropdown.dropdown.outerHeight(!0) + $this.dropdown.element.removeClass('uk-open'), + $this.overlay + .stop() + .css('display', 'block') + .animate({ height: h }, $this.options.duration, function () { + $this.dropdown.dropdown.css('visibility', ''), + $this.dropdown.element.addClass('uk-open'), + UI.Utils.checkDisplay($this.dropdown.dropdown, !0) + }), + ($this.pointerleave = !1) + }, + 'hide.uk.dropdown': function () { + $this.overlay.stop().animate({ height: 0 }, $this.options.duration) + }, + 'pointerenter.uk.dropdown': function (e, dropdown) { + clearTimeout($this.remainIdle) + }, + 'pointerleave.uk.dropdown': function (e, dropdown) { + $this.pointerleave = !0 + } + }), + this.overlay.on({ + mouseenter: function () { + $this.remainIdle && (clearTimeout($this.dropdown.remainIdle), clearTimeout($this.remainIdle)) + }, + mouseleave: function () { + $this.pointerleave && + active && + ($this.remainIdle = setTimeout(function () { + active && active.hide() + }, active.options.remaintime)) + } + }) + } + }) + })(UIkit), + (function (UI) { + 'use strict' + var grids = [] + UI.component('gridMatchHeight', { + defaults: { target: !1, row: !0, ignorestacked: !1 }, + boot: function () { + UI.ready(function (context) { + UI.$('[data-uk-grid-match]', context).each(function () { + var grid = UI.$(this) + grid.data('gridMatchHeight') || UI.gridMatchHeight(grid, UI.Utils.options(grid.attr('data-uk-grid-match'))) + }) + }) + }, + init: function () { + var fn, + $this = this + ;((this.columns = this.element.children()), + (this.elements = this.options.target ? this.find(this.options.target) : this.columns), + this.columns.length) && + (UI.$win.on( + 'load resize orientationchange', + ((fn = function () { + $this.match() + }), + UI.$(function () { + fn() + }), + UI.Utils.debounce(fn, 50)) + ), + UI.$html.on('changed.uk.dom', function (e) { + ;($this.columns = $this.element.children()), + ($this.elements = $this.options.target ? $this.find($this.options.target) : $this.columns), + $this.match() + }), + this.on( + 'display.uk.check', + function (e) { + this.element.is(':visible') && this.match() + }.bind(this) + ), + grids.push(this)) + }, + match: function () { + var firstvisible = this.columns.filter(':visible:first') + if (firstvisible.length) + return ( + 100 <= + Math.ceil( + (100 * parseFloat(firstvisible.css('width'))) / parseFloat(firstvisible.parent().css('width')) + ) && !this.options.ignorestacked + ? this.revert() + : UI.Utils.matchHeights(this.elements, this.options), + this + ) + }, + revert: function () { + return this.elements.css('min-height', ''), this + } + }), + UI.component('gridMargin', { + defaults: { cls: 'uk-grid-margin', rowfirst: 'uk-row-first' }, + boot: function () { + UI.ready(function (context) { + UI.$('[data-uk-grid-margin]', context).each(function () { + var grid = UI.$(this) + grid.data('gridMargin') || UI.gridMargin(grid, UI.Utils.options(grid.attr('data-uk-grid-margin'))) + }) + }) + }, + init: function () { + UI.stackMargin(this.element, this.options) + } + }) + })(UIkit), + (function (UI) { + 'use strict' + var body, + active = !1, + activeCount = 0, + $html = UI.$html + UI.component('modal', { + defaults: { keyboard: !0, bgclose: !0, minScrollHeight: 150, center: !1, modal: !0 }, + scrollable: !1, + transition: !1, + hasTransitioned: !0, + init: function () { + if ((body || (body = UI.$('body')), this.element.length)) { + var $this = this + ;(this.paddingdir = 'padding-' + ('left' == UI.langdirection ? 'right' : 'left')), + (this.dialog = this.find('.uk-modal-dialog')), + (this.active = !1), + this.element.attr('aria-hidden', this.element.hasClass('uk-open')), + this.on('click', '.uk-modal-close', function (e) { + e.preventDefault(), $this.hide() + }).on('click', function (e) { + UI.$(e.target)[0] == $this.element[0] && $this.options.bgclose && $this.hide() + }) + } + }, + toggle: function () { + return this[this.isActive() ? 'hide' : 'show']() + }, + show: function () { + if (this.element.length) { + var $this = this + if (!this.isActive()) + return ( + this.options.modal && active && active.hide(!0), + this.element.removeClass('uk-open').show(), + this.resize(), + this.options.modal && (active = this), + (this.active = !0), + activeCount++, + UI.support.transition + ? ((this.hasTransitioned = !1), + this.element + .one(UI.support.transition.end, function () { + $this.hasTransitioned = !0 + }) + .addClass('uk-open')) + : this.element.addClass('uk-open'), + $html.addClass('uk-modal-page').height(), + this.element.attr('aria-hidden', 'false'), + this.element.trigger('show.uk.modal'), + UI.Utils.checkDisplay(this.dialog, !0), + this + ) + } + }, + hide: function (force) { + if (!force && UI.support.transition && this.hasTransitioned) { + var $this = this + this.one(UI.support.transition.end, function () { + $this._hide() + }).removeClass('uk-open') + } else this._hide() + return this + }, + resize: function () { + var bodywidth = body.width() + if ( + ((this.scrollbarwidth = window.innerWidth - bodywidth), + body.css(this.paddingdir, this.scrollbarwidth), + this.element.css('overflow-y', this.scrollbarwidth ? 'scroll' : 'auto'), + !this.updateScrollable() && this.options.center) + ) { + var dh = this.dialog.outerHeight(), + pad = parseInt(this.dialog.css('margin-top'), 10) + parseInt(this.dialog.css('margin-bottom'), 10) + dh + pad < window.innerHeight + ? this.dialog.css({ top: window.innerHeight / 2 - dh / 2 - pad }) + : this.dialog.css({ top: '' }) + } + }, + updateScrollable: function () { + var scrollable = this.dialog.find('.uk-overflow-container:visible:first') + if (scrollable.length) { + scrollable.css('height', 0) + var offset = Math.abs(parseInt(this.dialog.css('margin-top'), 10)), + dh = this.dialog.outerHeight(), + h = window.innerHeight - 2 * (offset < 20 ? 20 : offset) - dh + return scrollable.css({ 'max-height': h < this.options.minScrollHeight ? '' : h, height: '' }), !0 + } + return !1 + }, + _hide: function () { + ;(this.active = !1), + 0 < activeCount ? activeCount-- : (activeCount = 0), + this.element.hide().removeClass('uk-open'), + this.element.attr('aria-hidden', 'true'), + activeCount || ($html.removeClass('uk-modal-page'), body.css(this.paddingdir, '')), + active === this && (active = !1), + this.trigger('hide.uk.modal') + }, + isActive: function () { + return this.active + } + }), + UI.component('modalTrigger', { + boot: function () { + UI.$html.on('click.modal.uikit', '[data-uk-modal]', function (e) { + var ele = UI.$(this) + ;(ele.is('a') && e.preventDefault(), ele.data('modalTrigger')) || + UI.modalTrigger(ele, UI.Utils.options(ele.attr('data-uk-modal'))).show() + }), + UI.$html.on('keydown.modal.uikit', function (e) { + active && 27 === e.keyCode && active.options.keyboard && (e.preventDefault(), active.hide()) + }), + UI.$win.on( + 'resize orientationchange', + UI.Utils.debounce(function () { + active && active.resize() + }, 150) + ) + }, + init: function () { + var $this = this + ;(this.options = UI.$.extend( + { target: !!$this.element.is('a') && $this.element.attr('href') }, + this.options + )), + (this.modal = UI.modal(this.options.target, this.options)), + this.on('click', function (e) { + e.preventDefault(), $this.show() + }), + this.proxy(this.modal, 'show hide isActive') + } + }), + (UI.modal.dialog = function (content, options) { + var modal = UI.modal(UI.$(UI.modal.dialog.template).appendTo('body'), options) + return ( + modal.on('hide.uk.modal', function () { + modal.persist && (modal.persist.appendTo(modal.persist.data('modalPersistParent')), (modal.persist = !1)), + modal.element.remove() + }), + (function (content, modal) { + if (!modal) return + 'object' == typeof content + ? (content = content instanceof jQuery ? content : UI.$(content)).parent().length && + ((modal.persist = content), modal.persist.data('modalPersistParent', content.parent())) + : (content = + 'string' == typeof content || 'number' == typeof content + ? UI.$('
        ').html(content) + : UI.$('
        ').html('UIkit.modal Error: Unsupported data type: ' + typeof content)) + content.appendTo(modal.element.find('.uk-modal-dialog')) + })(content, modal), + modal + ) + }), + (UI.modal.dialog.template = + '
        '), + (UI.modal.alert = function (content, options) { + options = UI.$.extend(!0, { bgclose: !1, keyboard: !1, modal: !1, labels: UI.modal.labels }, options) + var modal = UI.modal.dialog( + [ + '
        ' + String(content) + '
        ', + '' + ].join(''), + options + ) + return ( + modal.on('show.uk.modal', function () { + setTimeout(function () { + modal.element.find('button:first').focus() + }, 50) + }), + modal.show() + ) + }), + (UI.modal.confirm = function (content, onconfirm, oncancel) { + var options = 1 < arguments.length && arguments[arguments.length - 1] ? arguments[arguments.length - 1] : {} + ;(onconfirm = UI.$.isFunction(onconfirm) ? onconfirm : function () {}), + (oncancel = UI.$.isFunction(oncancel) ? oncancel : function () {}), + (options = UI.$.extend( + !0, + { + bgclose: !1, + keyboard: !1, + modal: !1, + labels: UI.modal.labels, + confirmButtonClass: '', + cancelButtonClass: '' + }, + UI.$.isFunction(options) ? {} : options + )) + var modal = UI.modal.dialog( + [ + '
        ' + String(content) + '
        ', + '' + ].join(''), + options + ) + return ( + modal.element.find('.js-modal-confirm, .js-modal-confirm-cancel').on('click', function () { + UI.$(this).is('.js-modal-confirm') ? onconfirm() : oncancel(), modal.hide() + }), + modal.on('show.uk.modal', function () { + setTimeout(function () { + modal.element.find('.js-modal-confirm').focus() + }, 50) + }), + modal.show() + ) + }), + (UI.modal.prompt = function (text, value, onsubmit, options) { + ;(onsubmit = UI.$.isFunction(onsubmit) ? onsubmit : function (value) {}), + (options = UI.$.extend(!0, { bgclose: !1, keyboard: !1, modal: !1, labels: UI.modal.labels }, options)) + var modal = UI.modal.dialog( + [ + text ? '
        ' + String(text) + '
        ' : '', + '

        ', + '' + ].join(''), + options + ), + input = modal.element + .find("input[type='text']") + .val(value || '') + .on('keyup', function (e) { + 13 == e.keyCode && modal.element.find('.js-modal-ok').trigger('click') + }) + return ( + modal.element.find('.js-modal-ok').on('click', function () { + !1 !== onsubmit(input.val()) && modal.hide() + }), + modal.on('show.uk.modal', function () { + setTimeout(function () { + input.focus() + }, 50) + }), + modal.show() + ) + }), + (UI.modal.blockUI = function (content, options) { + var modal = UI.modal.dialog( + [ + '
        ' + + String(content || '
        ...
        ') + + '
        ' + ].join(''), + UI.$.extend({ bgclose: !1, keyboard: !1, modal: !1 }, options) + ) + return (modal.content = modal.element.find('.uk-modal-content:first')), modal.show() + }), + (UI.modal.labels = { Ok: 'Ok', Cancel: 'Cancel' }) + })(UIkit), + (function (UI) { + 'use strict' + UI.component('nav', { + defaults: { toggle: ">li.uk-parent > a[href='#']", lists: '>li.uk-parent > ul', multiple: !1 }, + boot: function () { + UI.ready(function (context) { + UI.$('[data-uk-nav]', context).each(function () { + var nav = UI.$(this) + if (!nav.data('nav')) UI.nav(nav, UI.Utils.options(nav.attr('data-uk-nav'))) + }) + }) + }, + init: function () { + var $this = this + this.on('click.uk.nav', this.options.toggle, function (e) { + e.preventDefault() + var ele = UI.$(this) + $this.open(ele.parent()[0] == $this.element[0] ? ele : ele.parent('li')) + }), + this.find(this.options.lists).each(function () { + var $ele = UI.$(this), + parent = $ele.parent(), + active = parent.hasClass('uk-active') + $ele.wrap('
        '), + parent.data('list-container', $ele.parent()[active ? 'removeClass' : 'addClass']('uk-hidden')), + parent.attr('aria-expanded', parent.hasClass('uk-open')), + active && $this.open(parent, !0) + }) + }, + open: function (li, noanimation) { + var $this = this, + element = this.element, + $li = UI.$(li), + $container = $li.data('list-container') + this.options.multiple || + element + .children('.uk-open') + .not(li) + .each(function () { + var ele = UI.$(this) + ele.data('list-container') && + ele + .data('list-container') + .stop() + .animate({ height: 0 }, function () { + UI.$(this) + .parent() + .removeClass('uk-open') + .end() + .addClass('uk-hidden') + }) + }), + $li.toggleClass('uk-open'), + $li.attr('aria-expanded', $li.hasClass('uk-open')), + $container && + ($li.hasClass('uk-open') && $container.removeClass('uk-hidden'), + noanimation + ? ($container.stop().height($li.hasClass('uk-open') ? 'auto' : 0), + $li.hasClass('uk-open') || $container.addClass('uk-hidden'), + this.trigger('display.uk.check')) + : $container.stop().animate( + { + height: $li.hasClass('uk-open') + ? (function (ele) { + var $ele = UI.$(ele), + height = 'auto' + if ($ele.is(':visible')) height = $ele.outerHeight() + else { + var tmp = { + position: $ele.css('position'), + visibility: $ele.css('visibility'), + display: $ele.css('display') + } + ;(height = $ele + .css({ position: 'absolute', visibility: 'hidden', display: 'block' }) + .outerHeight()), + $ele.css(tmp) + } + return height + })($container.find('ul:first')) + : 0 + }, + function () { + $li.hasClass('uk-open') ? $container.css('height', '') : $container.addClass('uk-hidden'), + $this.trigger('display.uk.check') + } + )) + } + }) + })(UIkit), + (function (UI) { + 'use strict' + var scrollpos = { x: window.scrollX, y: window.scrollY }, + $html = (UI.$win, UI.$doc, UI.$html), + Offcanvas = { + show: function (element, options) { + if ((element = UI.$(element)).length) { + options = UI.$.extend({ mode: 'push' }, options) + var $body = UI.$('body'), + bar = element.find('.uk-offcanvas-bar:first'), + rtl = 'right' == UI.langdirection, + dir = (bar.hasClass('uk-offcanvas-bar-flip') ? -1 : 1) * (rtl ? -1 : 1), + scrollbarwidth = window.innerWidth - $body.width() + ;(scrollpos = { x: window.pageXOffset, y: window.pageYOffset }), + bar.attr('mode', options.mode), + element.addClass('uk-active'), + $body + .css({ width: window.innerWidth - scrollbarwidth, height: window.innerHeight }) + .addClass('uk-offcanvas-page'), + ('push' != options.mode && 'reveal' != options.mode) || + $body.css(rtl ? 'margin-right' : 'margin-left', (rtl ? -1 : 1) * (bar.outerWidth() * dir)), + 'reveal' == options.mode && bar.css('clip', 'rect(0, ' + bar.outerWidth() + 'px, 100vh, 0)'), + $html.css('margin-top', -1 * scrollpos.y).width(), + bar.addClass('uk-offcanvas-bar-show'), + this._initElement(element), + bar.trigger('show.uk.offcanvas', [element, bar]), + element.attr('aria-hidden', 'false') + } + }, + hide: function (force) { + var $body = UI.$('body'), + panel = UI.$('.uk-offcanvas.uk-active'), + rtl = 'right' == UI.langdirection, + bar = panel.find('.uk-offcanvas-bar:first'), + finalize = function () { + $body.removeClass('uk-offcanvas-page').css({ width: '', height: '', marginLeft: '', marginRight: '' }), + panel.removeClass('uk-active'), + bar.removeClass('uk-offcanvas-bar-show'), + $html.css('margin-top', ''), + window.scrollTo(scrollpos.x, scrollpos.y), + bar.trigger('hide.uk.offcanvas', [panel, bar]), + panel.attr('aria-hidden', 'true') + } + panel.length && + ('none' == bar.attr('mode') && (force = !0), + UI.support.transition && !force + ? ($body + .one(UI.support.transition.end, function () { + finalize() + }) + .css(rtl ? 'margin-right' : 'margin-left', ''), + 'reveal' == bar.attr('mode') && bar.css('clip', ''), + setTimeout(function () { + bar.removeClass('uk-offcanvas-bar-show') + }, 0)) + : finalize()) + }, + _initElement: function (element) { + element.data('OffcanvasInit') || + (element.on('click.uk.offcanvas swipeRight.uk.offcanvas swipeLeft.uk.offcanvas', function (e) { + var target = UI.$(e.target) + if (!e.type.match(/swipe/) && !target.hasClass('uk-offcanvas-close')) { + if (target.hasClass('uk-offcanvas-bar')) return + if (target.parents('.uk-offcanvas-bar:first').length) return + } + e.stopImmediatePropagation(), Offcanvas.hide() + }), + element.on('click', 'a[href*="#"]', function (e) { + var link = UI.$(this), + href = link.attr('href') + '#' != href && + (UI.$doc.one('hide.uk.offcanvas', function () { + var target + try { + target = UI.$(link[0].hash) + } catch (e) { + target = '' + } + target.length || (target = UI.$('[name="' + link[0].hash.replace('#', '') + '"]')), + target.length && UI.Utils.scrollToElement + ? UI.Utils.scrollToElement(target, UI.Utils.options(link.attr('data-uk-smooth-scroll') || '{}')) + : (window.location.href = href) + }), + Offcanvas.hide()) + }), + element.data('OffcanvasInit', !0)) + } + } + UI.component('offcanvasTrigger', { + boot: function () { + $html.on('click.offcanvas.uikit', '[data-uk-offcanvas]', function (e) { + e.preventDefault() + var ele = UI.$(this) + if (!ele.data('offcanvasTrigger')) { + UI.offcanvasTrigger(ele, UI.Utils.options(ele.attr('data-uk-offcanvas'))) + ele.trigger('click') + } + }), + $html.on('keydown.uk.offcanvas', function (e) { + 27 === e.keyCode && Offcanvas.hide() + }) + }, + init: function () { + var $this = this + ;(this.options = UI.$.extend( + { target: !!$this.element.is('a') && $this.element.attr('href'), mode: 'push' }, + this.options + )), + this.on('click', function (e) { + e.preventDefault(), Offcanvas.show($this.options.target, $this.options) + }) + } + }), + (UI.offcanvas = Offcanvas) + })(UIkit), + (function (UI) { + 'use strict' + var Animations + function coreAnimation (cls, current, next) { + var release, + d = UI.$.Deferred(), + clsIn = cls, + clsOut = cls + return ( + next[0] === current[0] + ? d.resolve() + : ('object' == typeof cls && ((clsIn = cls[0]), (clsOut = cls[1] || cls[0])), + UI.$body.css('overflow-x', 'hidden'), + (release = function () { + current && current.hide().removeClass('uk-active ' + clsOut + ' uk-animation-reverse'), + next + .addClass(clsIn) + .one( + UI.support.animation.end, + function () { + next.removeClass('' + clsIn).css({ opacity: '', display: '' }), + d.resolve(), + UI.$body.css('overflow-x', ''), + current && current.css({ opacity: '', display: '' }) + }.bind(this) + ) + .show() + }), + next.css('animation-duration', this.options.duration + 'ms'), + current && current.length + ? (current.css('animation-duration', this.options.duration + 'ms'), + current + .css('display', 'none') + .addClass(clsOut + ' uk-animation-reverse') + .one( + UI.support.animation.end, + function () { + release() + }.bind(this) + ) + .css('display', '')) + : (next.addClass('uk-active'), release())), + d.promise() + ) + } + UI.component('switcher', { + defaults: { connect: !1, toggle: '>*', active: 0, animation: !1, duration: 200, swiping: !0 }, + animating: !1, + boot: function () { + UI.ready(function (context) { + UI.$('[data-uk-switcher]', context).each(function () { + var switcher = UI.$(this) + if (!switcher.data('switcher')) UI.switcher(switcher, UI.Utils.options(switcher.attr('data-uk-switcher'))) + }) + }) + }, + init: function () { + var $this = this + if ( + (this.on('click.uk.switcher', this.options.toggle, function (e) { + e.preventDefault(), $this.show(this) + }), + this.options.connect) + ) { + ;(this.connect = UI.$(this.options.connect)), + this.connect.find('.uk-active').removeClass('.uk-active'), + this.connect.length && + (this.connect.children().attr('aria-hidden', 'true'), + this.connect.on('click', '[data-uk-switcher-item]', function (e) { + e.preventDefault() + var item = UI.$(this).attr('data-uk-switcher-item') + if ($this.index != item) + switch (item) { + case 'next': + case 'previous': + $this.show($this.index + ('next' == item ? 1 : -1)) + break + default: + $this.show(parseInt(item, 10)) + } + }), + this.options.swiping && + this.connect.on('swipeRight swipeLeft', function (e) { + e.preventDefault(), + window.getSelection().toString() || $this.show($this.index + ('swipeLeft' == e.type ? 1 : -1)) + })) + var toggles = this.find(this.options.toggle), + active = toggles.filter('.uk-active') + if (active.length) this.show(active, !1) + else { + if (!1 === this.options.active) return + ;(active = toggles.eq(this.options.active)), this.show(active.length ? active : toggles.eq(0), !1) + } + toggles.not(active).attr('aria-expanded', 'false'), + active.attr('aria-expanded', 'true'), + this.on('changed.uk.dom', function () { + $this.connect = UI.$($this.options.connect) + }) + } + }, + show: function (tab, animate) { + if (!this.animating) { + if (isNaN(tab)) tab = UI.$(tab) + else { + var toggles = this.find(this.options.toggle) + ;(tab = tab < 0 ? toggles.length - 1 : tab), (tab = toggles.eq(toggles[tab] ? tab : 0)) + } + var $this = this, + active = ((toggles = this.find(this.options.toggle)), UI.$(tab)), + animation = + Animations[this.options.animation] || + function (current, next) { + if (!$this.options.animation) return Animations.none.apply($this) + var anim = $this.options.animation.split(',') + return ( + 1 == anim.length && (anim[1] = anim[0]), + (anim[0] = anim[0].trim()), + (anim[1] = anim[1].trim()), + coreAnimation.apply($this, [anim, current, next]) + ) + } + ;(!1 !== animate && UI.support.animation) || (animation = Animations.none), + active.hasClass('uk-disabled') || + (toggles.attr('aria-expanded', 'false'), + active.attr('aria-expanded', 'true'), + toggles.filter('.uk-active').removeClass('uk-active'), + active.addClass('uk-active'), + this.options.connect && + this.connect.length && + ((this.index = this.find(this.options.toggle).index(active)), + -1 == this.index && (this.index = 0), + this.connect.each(function () { + var container = UI.$(this), + children = UI.$(container.children()), + current = UI.$(children.filter('.uk-active')), + next = UI.$(children.eq($this.index)) + ;($this.animating = !0), + animation.apply($this, [current, next]).then(function () { + current.removeClass('uk-active'), + next.addClass('uk-active'), + current.attr('aria-hidden', 'true'), + next.attr('aria-hidden', 'false'), + UI.Utils.checkDisplay(next, !0), + ($this.animating = !1) + }) + })), + this.trigger('show.uk.switcher', [active])) + } + } + }), + (Animations = { + none: function () { + var d = UI.$.Deferred() + return d.resolve(), d.promise() + }, + fade: function (current, next) { + return coreAnimation.apply(this, ['uk-animation-fade', current, next]) + }, + 'slide-bottom': function (current, next) { + return coreAnimation.apply(this, ['uk-animation-slide-bottom', current, next]) + }, + 'slide-top': function (current, next) { + return coreAnimation.apply(this, ['uk-animation-slide-top', current, next]) + }, + 'slide-vertical': function (current, next, dir) { + var anim = ['uk-animation-slide-top', 'uk-animation-slide-bottom'] + return ( + current && current.index() > next.index() && anim.reverse(), + coreAnimation.apply(this, [anim, current, next]) + ) + }, + 'slide-left': function (current, next) { + return coreAnimation.apply(this, ['uk-animation-slide-left', current, next]) + }, + 'slide-right': function (current, next) { + return coreAnimation.apply(this, ['uk-animation-slide-right', current, next]) + }, + 'slide-horizontal': function (current, next, dir) { + var anim = ['uk-animation-slide-right', 'uk-animation-slide-left'] + return ( + current && current.index() > next.index() && anim.reverse(), + coreAnimation.apply(this, [anim, current, next]) + ) + }, + scale: function (current, next) { + return coreAnimation.apply(this, ['uk-animation-scale-up', current, next]) + } + }), + (UI.switcher.animations = Animations) + })(UIkit), + (function (UI) { + 'use strict' + UI.component('tab', { + defaults: { + target: '>li:not(.uk-tab-responsive, .uk-disabled)', + connect: !1, + active: 0, + animation: !1, + duration: 200, + swiping: !0 + }, + boot: function () { + UI.ready(function (context) { + UI.$('[data-uk-tab]', context).each(function () { + var tab = UI.$(this) + if (!tab.data('tab')) UI.tab(tab, UI.Utils.options(tab.attr('data-uk-tab'))) + }) + }) + }, + init: function () { + var $this = this + ;(this.current = !1), + this.on('click.uk.tab', this.options.target, function (e) { + if ((e.preventDefault(), !$this.switcher || !$this.switcher.animating)) { + var current = $this.find($this.options.target).not(this) + current.removeClass('uk-active').blur(), + $this.trigger('change.uk.tab', [UI.$(this).addClass('uk-active'), $this.current]), + ($this.current = UI.$(this)), + $this.options.connect || + (current.attr('aria-expanded', 'false'), UI.$(this).attr('aria-expanded', 'true')) + } + }), + this.options.connect && (this.connect = UI.$(this.options.connect)), + (this.responsivetab = UI.$('
      • ').append( + '
          ' + )), + (this.responsivetab.dropdown = this.responsivetab.find('.uk-dropdown')), + (this.responsivetab.lst = this.responsivetab.dropdown.find('ul')), + (this.responsivetab.caption = this.responsivetab.find('a:first')), + this.element.hasClass('uk-tab-bottom') && this.responsivetab.dropdown.addClass('uk-dropdown-up'), + this.responsivetab.lst.on('click.uk.tab', 'a', function (e) { + e.preventDefault(), e.stopPropagation() + var link = UI.$(this) + $this.element + .children('li:not(.uk-tab-responsive)') + .eq(link.data('index')) + .trigger('click') + }), + this.on('show.uk.switcher change.uk.tab', function (e, tab) { + $this.responsivetab.caption.html(tab.text()) + }), + this.element.append(this.responsivetab), + this.options.connect && + (this.switcher = UI.switcher(this.element, { + toggle: '>li:not(.uk-tab-responsive)', + connect: this.options.connect, + active: this.options.active, + animation: this.options.animation, + duration: this.options.duration, + swiping: this.options.swiping + })), + UI.dropdown(this.responsivetab, { mode: 'click', preventflip: 'y' }), + $this.trigger('change.uk.tab', [ + this.element + .find(this.options.target) + .not('.uk-tab-responsive') + .filter('.uk-active') + ]), + this.check(), + UI.$win.on( + 'resize orientationchange', + UI.Utils.debounce(function () { + $this.element.is(':visible') && $this.check() + }, 100) + ), + this.on('display.uk.check', function () { + $this.element.is(':visible') && $this.check() + }) + }, + check: function () { + var children = this.element.children('li:not(.uk-tab-responsive)').removeClass('uk-hidden') + if (children.length) { + var item, + clone, + top = children.eq(0).offset().top + Math.ceil(children.eq(0).height() / 2), + doresponsive = !1 + if ( + (this.responsivetab.lst.empty(), + children.each(function () { + UI.$(this).offset().top > top && (doresponsive = !0) + }), + doresponsive) + ) + for (var i = 0; i < children.length; i++) + (item = UI.$(children.eq(i))).find('a'), + 'none' == item.css('float') || + item.attr('uk-dropdown') || + (item.hasClass('uk-disabled') || + ((clone = item[0].outerHTML.replace('
          ') + .parent()).attr('aria-expanded', 'false'), + ($toggle = $this.toggle.eq(index)), + $wrapper.data('toggle', $toggle), + $wrapper.data('content', $content), + $toggle.data('wrapper', $wrapper), + $content.data('wrapper', $wrapper) + }), + this.element.trigger('update.uk.accordion', [this]) + } + }), + UI.accordion + ) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-autocomplete', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + var active + return ( + UI.component('autocomplete', { + defaults: { + minLength: 3, + param: 'search', + method: 'post', + delay: 300, + loadingClass: 'uk-loading', + flipDropdown: !1, + skipClass: 'uk-skip', + hoverClass: 'uk-active', + source: null, + renderer: null, + template: + '' + }, + visible: !1, + value: null, + selected: null, + boot: function () { + UI.$html.on('focus.autocomplete.uikit', '[data-uk-autocomplete]', function (e) { + var ele = UI.$(this) + ele.data('autocomplete') || UI.autocomplete(ele, UI.Utils.options(ele.attr('data-uk-autocomplete'))) + }), + UI.$html.on('click.autocomplete.uikit', function (e) { + active && e.target != active.input[0] && active.hide() + }) + }, + init: function () { + var $this = this, + select = !1, + trigger = UI.Utils.debounce(function (e) { + if (select) return (select = !1) + $this.handle() + }, this.options.delay) + ;(this.dropdown = this.find('.uk-dropdown')), + (this.template = this.find('script[type="text/autocomplete"]').html()), + (this.template = UI.Utils.template(this.template || this.options.template)), + (this.input = this.find('input:first').attr('autocomplete', 'off')), + this.dropdown.length || (this.dropdown = UI.$('
          ').appendTo(this.element)), + this.options.flipDropdown && this.dropdown.addClass('uk-dropdown-flip'), + this.dropdown.attr('aria-expanded', 'false'), + this.input.on({ + keydown: function (e) { + if (e && e.which && !e.shiftKey) + switch (e.which) { + case 13: + ;(select = !0), $this.selected && (e.preventDefault(), $this.select()) + break + case 38: + e.preventDefault(), $this.pick('prev', !0) + break + case 40: + e.preventDefault(), $this.pick('next', !0) + break + case 27: + case 9: + $this.hide() + } + }, + keyup: trigger + }), + this.dropdown.on('click', '.uk-autocomplete-results > *', function () { + $this.select() + }), + this.dropdown.on('mouseover', '.uk-autocomplete-results > *', function () { + $this.pick(UI.$(this)) + }), + (this.triggercomplete = trigger) + }, + handle: function () { + var old = this.value + return ( + (this.value = this.input.val()), + this.value.length < this.options.minLength ? this.hide() : (this.value != old && this.request(), this) + ) + }, + pick: function (item, scrollinview) { + var items = UI.$( + this.dropdown.find('.uk-autocomplete-results').children(':not(.' + this.options.skipClass + ')') + ), + selected = !1 + if ('string' == typeof item || item.hasClass(this.options.skipClass)) { + if ('next' == item || 'prev' == item) { + if (this.selected) { + var index = items.index(this.selected) + selected = + 'next' == item + ? items.eq(index + 1 < items.length ? index + 1 : 0) + : items.eq(index - 1 < 0 ? items.length - 1 : index - 1) + } else selected = items['next' == item ? 'first' : 'last']() + selected = UI.$(selected) + } + } else selected = item + if ( + selected && + selected.length && + ((this.selected = selected), + items.removeClass(this.options.hoverClass), + this.selected.addClass(this.options.hoverClass), + scrollinview) + ) { + var top = selected.position().top, + scrollTop = this.dropdown.scrollTop() + ;(this.dropdown.height() < top || top < 0) && this.dropdown.scrollTop(scrollTop + top) + } + }, + select: function () { + if (this.selected) { + var data = this.selected.data() + this.trigger('selectitem.uk.autocomplete', [data, this]), + data.value && this.input.val(data.value).trigger('change'), + this.hide() + } + }, + show: function () { + if (!this.visible) + return ( + (this.visible = !0), + this.element.addClass('uk-open'), + active && active !== this && active.hide(), + (active = this).dropdown.attr('aria-expanded', 'true'), + this + ) + }, + hide: function () { + if (this.visible) + return ( + (this.visible = !1), + this.element.removeClass('uk-open'), + active === this && (active = !1), + this.dropdown.attr('aria-expanded', 'false'), + this + ) + }, + request: function () { + var $this = this, + release = function (data) { + data && $this.render(data), $this.element.removeClass($this.options.loadingClass) + } + if ((this.element.addClass(this.options.loadingClass), this.options.source)) { + var source = this.options.source + switch (typeof this.options.source) { + case 'function': + this.options.source.apply(this, [release]) + break + case 'object': + if (source.length) { + var items = [] + source.forEach(function (item) { + item.value && -1 != item.value.toLowerCase().indexOf($this.value.toLowerCase()) && items.push(item) + }), + release(items) + } + break + case 'string': + var params = {} + ;(params[this.options.param] = this.value), + UI.$.ajax({ + url: this.options.source, + data: params, + type: this.options.method, + dataType: 'json' + }).done(function (json) { + release(json || []) + }) + break + default: + release(null) + } + } else this.element.removeClass($this.options.loadingClass) + }, + render: function (data) { + return ( + this.dropdown.empty(), + (this.selected = !1), + this.options.renderer + ? this.options.renderer.apply(this, [data]) + : data && + data.length && + (this.dropdown.append(this.template({ items: data })), + this.show(), + this.trigger('show.uk.autocomplete')), + this + ) + } + }), + UI.autocomplete + ) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-datepicker', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + var dropdown, + moment, + active = !1 + return ( + UI.component('datepicker', { + defaults: { + mobile: !1, + weekstart: 1, + i18n: { + months: [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December' + ], + weekdays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] + }, + format: 'YYYY-MM-DD', + offsettop: 5, + maxDate: !1, + minDate: !1, + pos: 'auto', + template: function (data, opts) { + var i, + content = '' + if ( + ((content += '
          '), + (content += ''), + (content += ''), + UI.formSelect) + ) { + var months, + minYear, + maxYear, + currentyear = new Date().getFullYear(), + options = [] + for (i = 0; i < opts.i18n.months.length; i++) + i == data.month + ? options.push('') + : options.push('') + for ( + months = + '' + + opts.i18n.months[data.month] + + '', + options = [], + minYear = data.minDate ? data.minDate.year() : currentyear - 50, + maxYear = data.maxDate ? data.maxDate.year() : currentyear + 20, + i = minYear; + i <= maxYear; + i++ + ) + i == data.year + ? options.push('') + : options.push('') + content += + '
          ' + + months + + ' ' + + ('' + + data.year + + '') + + '
          ' + } else + content += + '
          ' + opts.i18n.months[data.month] + ' ' + data.year + '
          ' + for ( + content += '
          ', content += '', content += '', i = 0; + i < data.weekdays.length; + i++ + ) + data.weekdays[i] && (content += '') + for (content += '', content += '', i = 0; i < data.days.length; i++) + if (data.days[i] && data.days[i].length) { + content += '' + for (var d = 0; d < data.days[i].length; d++) + if (data.days[i][d]) { + var day = data.days[i][d], + cls = [] + day.inmonth || cls.push('uk-datepicker-table-muted'), + day.selected && cls.push('uk-active'), + day.disabled && cls.push('uk-datepicker-date-disabled uk-datepicker-table-muted'), + (content += + '') + } + content += '' + } + return (content += ''), (content += '
          ' + data.weekdays[i] + '
          ' + + day.day.format('D') + + '
          ') + } + }, + boot: function () { + UI.$win.on('resize orientationchange', function () { + active && active.hide() + }), + UI.$html.on('focus.datepicker.uikit', '[data-uk-datepicker]', function (e) { + var ele = UI.$(this) + ele.data('datepicker') || + (e.preventDefault(), + UI.datepicker(ele, UI.Utils.options(ele.attr('data-uk-datepicker'))), + ele.trigger('focus')) + }), + UI.$html.on('click focus', '*', function (e) { + var target = UI.$(e.target) + !active || + target[0] == dropdown[0] || + target.data('datepicker') || + target.parents('.uk-datepicker:first').length || + active.hide() + }) + }, + init: function () { + if (!UI.support.touch || 'date' != this.element.attr('type') || this.options.mobile) { + var $this = this + ;(this.current = this.element.val() ? moment(this.element.val(), this.options.format) : moment()), + this.on('click focus', function () { + active !== $this && + $this.pick(this.value ? this.value : $this.options.minDate ? $this.options.minDate : '') + }).on('change', function () { + $this.element.val() && + !moment($this.element.val(), $this.options.format).isValid() && + $this.element.val(moment().format($this.options.format)) + }), + dropdown || + ((dropdown = UI.$('
          ')).on( + 'click', + '.uk-datepicker-next, .uk-datepicker-previous, [data-date]', + function (e) { + e.stopPropagation(), e.preventDefault() + var ele = UI.$(this) + if (ele.hasClass('uk-datepicker-date-disabled')) return !1 + ele.is('[data-date]') + ? ((active.current = moment(ele.data('date'))), + active.element.val(active.current.format(active.options.format)).trigger('change'), + active.hide()) + : active.add(ele.hasClass('uk-datepicker-next') ? 1 : -1, 'months') + } + ), + dropdown.on('change', '.update-picker-month, .update-picker-year', function () { + var select = UI.$(this) + active[select.is('.update-picker-year') ? 'setYear' : 'setMonth'](Number(select.val())) + }), + dropdown.appendTo('body')) + } + }, + pick: function (initdate) { + var offset = this.element.offset(), + css = { left: offset.left, right: '' } + ;(this.current = isNaN(initdate) ? moment(initdate, this.options.format) : moment()), + (this.initdate = this.current.format('YYYY-MM-DD')), + this.update(), + 'right' == UI.langdirection && + ((css.right = window.innerWidth - (css.left + this.element.outerWidth())), (css.left = '')) + var posTop = + offset.top - + this.element.outerHeight() + + this.element.height() - + this.options.offsettop - + dropdown.outerHeight(), + posBottom = offset.top + this.element.outerHeight() + this.options.offsettop + ;(css.top = posBottom), + 'top' == this.options.pos + ? (css.top = posTop) + : 'auto' == this.options.pos && + window.innerHeight - posBottom - dropdown.outerHeight() < 0 && + 0 <= posTop && + (css.top = posTop), + dropdown.css(css).show(), + this.trigger('show.uk.datepicker'), + (active = this) + }, + add: function (unit, value) { + this.current.add(unit, value), this.update() + }, + setMonth: function (month) { + this.current.month(month), this.update() + }, + setYear: function (year) { + this.current.year(year), this.update() + }, + update: function () { + var data = this.getRows(this.current.year(), this.current.month()), + tpl = this.options.template(data, this.options) + dropdown.html(tpl), this.trigger('update.uk.datepicker') + }, + getRows: function (year, month) { + var opts = this.options, + now = moment().format('YYYY-MM-DD'), + days = [ + 31, + (year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ? 29 : 28, + 31, + 30, + 31, + 30, + 31, + 31, + 30, + 31, + 30, + 31 + ][month], + before = new Date(year, month, 1, 12).getDay(), + data = { month: month, year: year, weekdays: [], days: [], maxDate: !1, minDate: !1 }, + row = [] + !1 !== opts.maxDate && + (data.maxDate = isNaN(opts.maxDate) + ? moment(opts.maxDate, opts.format) + : moment().add(opts.maxDate, 'days')), + !1 !== opts.minDate && + (data.minDate = isNaN(opts.minDate) + ? moment(opts.minDate, opts.format) + : moment().add(opts.minDate - 1, 'days')), + (data.weekdays = (function () { + for (var i = 0, arr = []; i < 7; i++) { + for (var day = i + (opts.weekstart || 0); 7 <= day; ) day -= 7 + arr.push(opts.i18n.weekdays[day]) + } + return arr + })()), + opts.weekstart && 0 < opts.weekstart && (before -= opts.weekstart) < 0 && (before += 7) + for (var day, isDisabled, isSelected, isToday, isInMonth, cells = days + before, after = cells; 7 < after; ) + after -= 7 + cells += 7 - after + for (var i = 0, r = 0; i < cells; i++) + (day = new Date(year, month, i - before + 1, 12)), + (isDisabled = (data.minDate && data.minDate > day) || (data.maxDate && day > data.maxDate)), + (isInMonth = !(i < before || days + before <= i)), + (day = moment(day)), + (isSelected = this.initdate == day.format('YYYY-MM-DD')), + (isToday = now == day.format('YYYY-MM-DD')), + row.push({ selected: isSelected, today: isToday, disabled: isDisabled, day: day, inmonth: isInMonth }), + 7 == ++r && (data.days.push(row), (row = []), (r = 0)) + return data + }, + hide: function () { + active && active === this && (dropdown.hide(), (active = !1), this.trigger('hide.uk.datepicker')) + } + }), + (moment = window.moment), + (UI.Utils.moment = moment), + UI.datepicker + ) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-form-password', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + return ( + UI.component('formPassword', { + defaults: { lblShow: 'Show', lblHide: 'Hide' }, + boot: function () { + UI.$html.on('click.formpassword.uikit', '[data-uk-form-password]', function (e) { + var ele = UI.$(this) + ele.data('formPassword') || + (e.preventDefault(), + UI.formPassword(ele, UI.Utils.options(ele.attr('data-uk-form-password'))), + ele.trigger('click')) + }) + }, + init: function () { + var $this = this + this.on('click', function (e) { + if ((e.preventDefault(), $this.input.length)) { + var type = $this.input.attr('type') + $this.input.attr('type', 'text' == type ? 'password' : 'text'), + $this.element.html($this.options['text' == type ? 'lblShow' : 'lblHide']) + } + }), + (this.input = this.element.next('input').length ? this.element.next('input') : this.element.prev('input')), + this.element.html(this.options[this.input.is("[type='password']") ? 'lblShow' : 'lblHide']), + this.element.data('formPassword', this) + } + }), + UI.formPassword + ) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-form-select', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + return ( + UI.component('formSelect', { + defaults: { target: '>span:first', activeClass: 'uk-active' }, + boot: function () { + UI.ready(function (context) { + UI.$('[data-uk-form-select]', context).each(function () { + var ele = UI.$(this) + ele.data('formSelect') || UI.formSelect(ele, UI.Utils.options(ele.attr('data-uk-form-select'))) + }) + }) + }, + init: function () { + var select, + fn, + $this = this + ;(this.target = this.find(this.options.target)), + (this.select = this.find('select')), + this.select.on( + 'change', + ((select = $this.select[0]), + (fn = function () { + try { + $this.target.text(select.options[select.selectedIndex].text) + } catch (e) {} + return $this.element[$this.select.val() ? 'addClass' : 'removeClass']($this.options.activeClass), fn + })()) + ), + this.element.data('formSelect', this) + } + }), + UI.formSelect + ) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-grid', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + UI.component('grid', { + defaults: { colwidth: 'auto', animation: !0, duration: 300, gutter: 0, controls: !1, filter: !1 }, + boot: function () { + UI.ready(function (context) { + UI.$('[data-uk-grid]', context).each(function () { + var ele = UI.$(this) + ele.data('grid') || UI.grid(ele, UI.Utils.options(ele.attr('data-uk-grid'))) + }) + }) + }, + init: function () { + var $this = this, + gutter = String(this.options.gutter) + .trim() + .split(' ') + ;(this.gutterv = parseInt(gutter[0], 10)), + (this.gutterh = parseInt(gutter[1] || gutter[0], 10)), + this.element.css({ position: 'relative' }), + (this.controls = null), + this.options.controls && + ((this.controls = UI.$(this.options.controls)), + this.controls.on('click', '[data-uk-filter]', function (e) { + e.preventDefault(), $this.filter(UI.$(this).data('ukFilter')) + }), + this.controls.on('click', '[data-uk-sort]', function (e) { + e.preventDefault() + var cmd = UI.$(this) + .attr('data-uk-sort') + .split(':') + $this.sort(cmd[0], cmd[1]) + })), + UI.$win.on( + 'load resize orientationchange', + UI.Utils.debounce( + function () { + $this.currentfilter ? $this.filter($this.currentfilter) : this.updateLayout() + }.bind(this), + 100 + ) + ), + this.on('display.uk.check', function () { + $this.element.is(':visible') && $this.updateLayout() + }), + UI.$html.on('changed.uk.dom', function (e) { + $this.updateLayout() + }), + !1 !== this.options.filter ? this.filter(this.options.filter) : this.updateLayout() + }, + _prepareElements: function () { + var css, + children = this.element.children(':not([data-grid-prepared])') + children.length && + ((css = { + position: 'absolute', + 'box-sizing': 'border-box', + width: 'auto' == this.options.colwidth ? '' : this.options.colwidth + }), + this.options.gutter && + ((css['padding-left'] = this.gutterh), + (css['padding-bottom'] = this.gutterv), + this.element.css('margin-left', -1 * this.gutterh)), + children.attr('data-grid-prepared', 'true').css(css)) + }, + updateLayout: function (elements) { + this._prepareElements() + var item, + width, + height, + pos, + i, + z, + max, + size, + children = (elements = elements || this.element.children(':visible')), + maxwidth = this.element.width() + 2 * this.gutterh + 2, + left = 0, + top = 0, + positions = [] + this.trigger('beforeupdate.uk.grid', [children]), + children.each(function (index) { + for ( + size = _getSize(this), + item = UI.$(this), + width = size.outerWidth, + height = size.outerHeight, + i = top = left = 0, + max = positions.length; + i < max; + i++ + ) + (pos = positions[i]), + left <= pos.aX && (left = pos.aX), + maxwidth < left + width && (left = 0), + top <= pos.aY && (top = pos.aY) + positions.push({ + ele: item, + top: top, + left: left, + width: width, + height: height, + aY: top + height, + aX: left + width + }) + }) + var posPrev, + maxHeight = 0 + for (i = 0, max = positions.length; i < max; i++) { + for (pos = positions[i], z = top = 0; z < i; z++) + (posPrev = positions[z]), pos.left < posPrev.aX && posPrev.left + 1 < pos.aX && (top = posPrev.aY) + ;(pos.top = top), (pos.aY = top + pos.height), (maxHeight = Math.max(maxHeight, pos.aY)) + } + ;(maxHeight -= this.gutterv), + this.options.animation + ? (this.element.stop().animate({ height: maxHeight }, 100), + positions.forEach( + function (pos) { + pos.ele.stop().animate({ top: pos.top, left: pos.left, opacity: 1 }, this.options.duration) + }.bind(this) + )) + : (this.element.css('height', maxHeight), + positions.forEach( + function (pos) { + pos.ele.css({ top: pos.top, left: pos.left, opacity: 1 }) + }.bind(this) + )), + setTimeout(function () { + UI.$doc.trigger('scrolling.uk.document') + }, 2 * this.options.duration * (this.options.animation ? 1 : 0)), + this.trigger('afterupdate.uk.grid', [children]) + }, + filter: function (filter) { + 'number' == typeof (filter = (this.currentfilter = filter) || []) && (filter = filter.toString()), + 'string' == typeof filter && + (filter = filter.split(/,/).map(function (item) { + return item.trim() + })) + var children = this.element.children(), + elements = { visible: [], hidden: [] } + children.each(function (index) { + var ele = UI.$(this), + f = ele.attr('data-uk-filter'), + infilter = !filter.length + f && + ((f = f.split(/,/).map(function (item) { + return item.trim() + })), + filter.forEach(function (item) { + ;-1 < f.indexOf(item) && (infilter = !0) + })), + elements[infilter ? 'visible' : 'hidden'].push(ele) + }), + (elements.hidden = UI.$(elements.hidden).map(function () { + return this[0] + })), + (elements.visible = UI.$(elements.visible).map(function () { + return this[0] + })), + elements.hidden + .attr('aria-hidden', 'true') + .filter(':visible') + .fadeOut(this.options.duration), + elements.visible + .attr('aria-hidden', 'false') + .filter(':hidden') + .css('opacity', 0) + .show(), + this.updateLayout(elements.visible), + this.controls && + this.controls.length && + this.controls + .find('[data-uk-filter]') + .removeClass('uk-active') + .filter('[data-uk-filter="' + filter + '"]') + .addClass('uk-active') + }, + sort: function (by, order) { + 'string' == typeof (order = order || 1) && (order = 'desc' == order.toLowerCase() ? -1 : 1) + var elements = this.element.children() + elements + .sort(function (a, b) { + return (a = UI.$(a)), ((b = UI.$(b)).data(by) || '') < (a.data(by) || '') ? order : -1 * order + }) + .appendTo(this.element), + this.updateLayout(elements.filter(':visible')), + this.controls && + this.controls.length && + this.controls + .find('[data-uk-sort]') + .removeClass('uk-active') + .filter('[data-uk-sort="' + by + ':' + (-1 == order ? 'desc' : 'asc') + '"]') + .addClass('uk-active') + } + }) + var _getSize = (function () { + var prefixes = 'Webkit Moz ms Ms O'.split(' '), + docElemStyle = document.documentElement.style + function getStyleSize (value) { + var num = parseFloat(value) + return -1 === value.indexOf('%') && !isNaN(num) && num + } + var logError = + 'undefined' == typeof console + ? function () {} + : function (message) { + console.error(message) + }, + measurements = [ + 'paddingLeft', + 'paddingRight', + 'paddingTop', + 'paddingBottom', + 'marginLeft', + 'marginRight', + 'marginTop', + 'marginBottom', + 'borderLeftWidth', + 'borderRightWidth', + 'borderTopWidth', + 'borderBottomWidth' + ] + var getStyle, + boxSizingProp, + isBoxSizeOuter, + isSetup = !1 + function setup () { + if (!isSetup) { + isSetup = !0 + var getStyleFn, + getComputedStyle = window.getComputedStyle + if ( + ((getStyleFn = getComputedStyle + ? function (elem) { + return getComputedStyle(elem, null) + } + : function (elem) { + return elem.currentStyle + }), + (getStyle = function (elem) { + var style = getStyleFn(elem) + return ( + style || + logError( + 'Style returned ' + + style + + '. Are you running this code in a hidden iframe on Firefox? See http://bit.ly/getsizebug1' + ), + style + ) + }), + (boxSizingProp = (function (propName) { + if (propName) { + if ('string' == typeof docElemStyle[propName]) return propName + var prefixed + propName = propName.charAt(0).toUpperCase() + propName.slice(1) + for (var i = 0, len = prefixes.length; i < len; i++) + if (((prefixed = prefixes[i] + propName), 'string' == typeof docElemStyle[prefixed])) return prefixed + } + })('boxSizing'))) + ) { + var div = document.createElement('div') + ;(div.style.width = '200px'), + (div.style.padding = '1px 2px 3px 4px'), + (div.style.borderStyle = 'solid'), + (div.style.borderWidth = '1px 2px 3px 4px'), + (div.style[boxSizingProp] = 'border-box') + var body = document.body || document.documentElement + body.appendChild(div) + var style = getStyle(div) + ;(isBoxSizeOuter = 200 === getStyleSize(style.width)), body.removeChild(div) + } + } + } + return function (elem) { + if ( + (setup(), + 'string' == typeof elem && (elem = document.querySelector(elem)), + elem && 'object' == typeof elem && elem.nodeType) + ) { + var style = getStyle(elem) + if ('none' === style.display) + return (function () { + for ( + var size = { width: 0, height: 0, innerWidth: 0, innerHeight: 0, outerWidth: 0, outerHeight: 0 }, + i = 0, + len = measurements.length; + i < len; + i++ + ) + size[measurements[i]] = 0 + return size + })() + var size = {} + ;(size.width = elem.offsetWidth), (size.height = elem.offsetHeight) + for ( + var isBorderBox = (size.isBorderBox = !( + !boxSizingProp || + !style[boxSizingProp] || + 'border-box' !== style[boxSizingProp] + )), + i = 0, + len = measurements.length; + i < len; + i++ + ) { + var measurement = measurements[i], + value = style[measurement], + num = parseFloat(value) + size[measurement] = isNaN(num) ? 0 : num + } + var paddingWidth = size.paddingLeft + size.paddingRight, + paddingHeight = size.paddingTop + size.paddingBottom, + marginWidth = size.marginLeft + size.marginRight, + marginHeight = size.marginTop + size.marginBottom, + borderWidth = size.borderLeftWidth + size.borderRightWidth, + borderHeight = size.borderTopWidth + size.borderBottomWidth, + isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter, + styleWidth = getStyleSize(style.width) + !1 !== styleWidth && (size.width = styleWidth + (isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth)) + var styleHeight = getStyleSize(style.height) + return ( + !1 !== styleHeight && + (size.height = styleHeight + (isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight)), + (size.innerWidth = size.width - (paddingWidth + borderWidth)), + (size.innerHeight = size.height - (paddingHeight + borderHeight)), + (size.outerWidth = size.width + marginWidth), + (size.outerHeight = size.height + marginHeight), + size + ) + } + } + })() + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-htmleditor', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + var editors = [] + return ( + UI.component('htmleditor', { + defaults: { + iframe: !1, + mode: 'split', + markdown: !1, + autocomplete: !0, + height: 500, + maxsplitsize: 1e3, + codemirror: { + mode: 'htmlmixed', + lineWrapping: !0, + dragDrop: !1, + autoCloseTags: !0, + matchTags: !0, + autoCloseBrackets: !0, + matchBrackets: !0, + indentUnit: 4, + indentWithTabs: !1, + tabSize: 4, + hintOptions: { completionSingle: !1 } + }, + toolbar: ['bold', 'italic', 'strike', 'link', 'image', 'blockquote', 'listUl', 'listOl'], + lblPreview: 'Preview', + lblCodeview: 'HTML', + lblMarkedview: 'Markdown' + }, + boot: function () { + UI.ready(function (context) { + UI.$('textarea[data-uk-htmleditor]', context).each(function () { + var editor = UI.$(this) + editor.data('htmleditor') || UI.htmleditor(editor, UI.Utils.options(editor.attr('data-uk-htmleditor'))) + }) + }) + }, + init: function () { + var $this = this, + tpl = UI.components.htmleditor.template + ;(this.CodeMirror = this.options.CodeMirror || CodeMirror), + (this.buttons = {}), + (tpl = (tpl = tpl.replace(/\{:lblPreview}/g, this.options.lblPreview)).replace( + /\{:lblCodeview}/g, + this.options.lblCodeview + )), + (this.htmleditor = UI.$(tpl)), + (this.content = this.htmleditor.find('.uk-htmleditor-content')), + (this.toolbar = this.htmleditor.find('.uk-htmleditor-toolbar')), + (this.preview = this.htmleditor + .find('.uk-htmleditor-preview') + .children() + .eq(0)), + (this.code = this.htmleditor.find('.uk-htmleditor-code')), + this.element.before(this.htmleditor).appendTo(this.code), + (this.editor = this.CodeMirror.fromTextArea(this.element[0], this.options.codemirror)), + (this.editor.htmleditor = this).editor.on( + 'change', + UI.Utils.debounce(function () { + $this.render() + }, 150) + ), + this.editor.on('change', function () { + $this.editor.save(), $this.element.trigger('input') + }), + this.code.find('.CodeMirror').css('height', this.options.height), + this.options.iframe + ? ((this.iframe = UI.$( + '' + )), + this.preview.append(this.iframe), + this.iframe[0].contentWindow.document.open(), + this.iframe[0].contentWindow.document.close(), + (this.preview.container = UI.$(this.iframe[0].contentWindow.document).find('body')), + 'string' == typeof this.options.iframe && + this.preview.container.parent().append('')) + : (this.preview.container = this.preview), + UI.$win.on( + 'resize load', + UI.Utils.debounce(function () { + $this.fit() + }, 200) + ) + var previewContainer = this.iframe ? this.preview.container : $this.preview.parent(), + codeContent = this.code.find('.CodeMirror-sizer'), + codeScroll = this.code.find('.CodeMirror-scroll').on( + 'scroll', + UI.Utils.debounce(function () { + if ('tab' != $this.htmleditor.attr('data-mode')) { + var codeHeight = codeContent.height() - codeScroll.height(), + ratio = + (previewContainer[0].scrollHeight - + ($this.iframe ? $this.iframe.height() : previewContainer.height())) / + codeHeight, + previewPosition = codeScroll.scrollTop() * ratio + previewContainer.scrollTop(previewPosition) + } + }, 10) + ) + this.htmleditor.on('click', '.uk-htmleditor-button-code, .uk-htmleditor-button-preview', function (e) { + e.preventDefault(), + 'tab' == $this.htmleditor.attr('data-mode') && + ($this.htmleditor + .find('.uk-htmleditor-button-code, .uk-htmleditor-button-preview') + .removeClass('uk-active') + .filter(this) + .addClass('uk-active'), + ($this.activetab = UI.$(this).hasClass('uk-htmleditor-button-code') ? 'code' : 'preview'), + $this.htmleditor.attr('data-active-tab', $this.activetab), + $this.editor.refresh()) + }), + this.htmleditor.on('click', 'a[data-htmleditor-button]', function () { + $this.code.is(':visible') && + $this.trigger('action.' + UI.$(this).data('htmleditor-button'), [$this.editor]) + }), + this.preview.parent().css('height', this.code.height()), + this.options.autocomplete && + this.CodeMirror.showHint && + this.CodeMirror.hint && + this.CodeMirror.hint.html && + this.editor.on( + 'inputRead', + UI.Utils.debounce(function () { + var POS = $this.editor.getDoc().getCursor() + if ( + 'xml' == + $this.CodeMirror.innerMode($this.editor.getMode(), $this.editor.getTokenAt(POS).state).mode.name + ) { + var cur = $this.editor.getCursor(), + token = $this.editor.getTokenAt(cur) + ;('<' != token.string.charAt(0) && 'attribute' != token.type) || + $this.CodeMirror.showHint($this.editor, $this.CodeMirror.hint.html, { completeSingle: !1 }) + } + }, 100) + ), + (this.debouncedRedraw = UI.Utils.debounce(function () { + $this.redraw() + }, 5)), + this.on('init.uk.component', function () { + $this.debouncedRedraw() + }), + this.element.attr('data-uk-check-display', 1).on( + 'display.uk.check', + function (e) { + this.htmleditor.is(':visible') && this.fit() + }.bind(this) + ), + editors.push(this) + }, + addButton: function (name, button) { + this.buttons[name] = button + }, + addButtons: function (buttons) { + UI.$.extend(this.buttons, buttons) + }, + replaceInPreview: function (regexp, callback) { + var editor = this.editor, + results = [], + value = editor.getValue(), + offset = -1, + index = 0 + function translateOffset (offset) { + var result = editor + .getValue() + .substring(0, offset) + .split('\n') + return { line: result.length - 1, ch: result[result.length - 1].length } + } + return ( + (this.currentvalue = this.currentvalue.replace(regexp, function () { + var match = { + matches: arguments, + from: translateOffset((offset = value.indexOf(arguments[0], ++offset))), + to: translateOffset(offset + arguments[0].length), + replace: function (value) { + editor.replaceRange(value, match.from, match.to) + }, + inRange: function (cursor) { + return cursor.line === match.from.line && cursor.line === match.to.line + ? cursor.ch >= match.from.ch && cursor.ch < match.to.ch + : (cursor.line === match.from.line && cursor.ch >= match.from.ch) || + (cursor.line > match.from.line && cursor.line < match.to.line) || + (cursor.line === match.to.line && cursor.ch < match.to.ch) + } + }, + result = callback(match, index) + return result ? (index++, results.push(match), result) : arguments[0] + })), + results + ) + }, + _buildtoolbar: function () { + if (this.options.toolbar && this.options.toolbar.length) { + var $this = this, + bar = [] + this.toolbar.empty(), + this.options.toolbar.forEach(function (button) { + if ($this.buttons[button]) { + var title = $this.buttons[button].title ? $this.buttons[button].title : button + bar.push( + '
        • ' + + $this.buttons[button].label + + '
        • ' + ) + } + }), + this.toolbar.html(bar.join('\n')) + } + }, + fit: function () { + var mode = this.options.mode + 'split' == mode && this.htmleditor.width() < this.options.maxsplitsize && (mode = 'tab'), + 'tab' == mode && + (this.activetab || ((this.activetab = 'code'), this.htmleditor.attr('data-active-tab', this.activetab)), + this.htmleditor + .find('.uk-htmleditor-button-code, .uk-htmleditor-button-preview') + .removeClass('uk-active') + .filter('code' == this.activetab ? '.uk-htmleditor-button-code' : '.uk-htmleditor-button-preview') + .addClass('uk-active')), + this.editor.refresh(), + this.preview.parent().css('height', this.code.height()), + this.htmleditor.attr('data-mode', mode) + }, + redraw: function () { + this._buildtoolbar(), this.render(), this.fit() + }, + getMode: function () { + return this.editor.getOption('mode') + }, + getCursorMode: function () { + var param = { mode: 'html' } + return this.trigger('cursorMode', [param]), param.mode + }, + render: function () { + if (((this.currentvalue = this.editor.getValue()), !this.currentvalue)) + return this.element.val(''), void this.preview.container.html('') + this.trigger('render', [this]), + this.trigger('renderLate', [this]), + this.preview.container.html(this.currentvalue) + }, + addShortcut: function (name, callback) { + var map = {} + return ( + UI.$.isArray(name) || (name = [name]), + name.forEach(function (key) { + map[key] = callback + }), + this.editor.addKeyMap(map), + map + ) + }, + addShortcutAction: function (action, shortcuts) { + var editor = this + this.addShortcut(shortcuts, function () { + editor.element.trigger('action.' + action, [editor.editor]) + }) + }, + replaceSelection: function (replace) { + var text = this.editor.getSelection() + if (!text.length) { + for ( + var cur = this.editor.getCursor(), curLine = this.editor.getLine(cur.line), start = cur.ch, end = start; + end < curLine.length && /[\w$]+/.test(curLine.charAt(end)); + + ) + ++end + for (; start && /[\w$]+/.test(curLine.charAt(start - 1)); ) --start + var curWord = start != end && curLine.slice(start, end) + curWord && + (this.editor.setSelection({ line: cur.line, ch: start }, { line: cur.line, ch: end }), (text = curWord)) + } + var html = replace.replace('$1', text) + this.editor.replaceSelection(html, 'end'), this.editor.focus() + }, + replaceLine: function (replace) { + var pos = this.editor.getDoc().getCursor(), + text = this.editor.getLine(pos.line), + html = replace.replace('$1', text) + this.editor.replaceRange(html, { line: pos.line, ch: 0 }, { line: pos.line, ch: text.length }), + this.editor.setCursor({ line: pos.line, ch: html.length }), + this.editor.focus() + }, + save: function () { + this.editor.save() + } + }), + (UI.components.htmleditor.template = [ + '
          ', + '
          ', + '
            ', + '
            ', + '', + '
            ', + '
            ', + '
            ', + '
            ', + '
            ', + '
            ', + '
            ' + ].join('')), + UI.plugin('htmleditor', 'base', { + init: function (editor) { + editor.addButtons({ + fullscreen: { title: 'Fullscreen', label: '' }, + bold: { title: 'Bold', label: '' }, + italic: { title: 'Italic', label: '' }, + strike: { title: 'Strikethrough', label: '' }, + blockquote: { title: 'Blockquote', label: '' }, + link: { title: 'Link', label: '' }, + image: { title: 'Image', label: '' }, + listUl: { title: 'Unordered List', label: '' }, + listOl: { title: 'Ordered List', label: '' } + }), + addAction('bold', '$1'), + addAction('italic', '$1'), + addAction('strike', '$1'), + addAction('blockquote', '

            $1

            ', 'replaceLine'), + addAction('link', '$1'), + addAction('image', '$1') + var listfn = function () { + if ('html' == editor.getCursorMode()) { + for ( + var cm = editor.editor, + pos = cm.getDoc().getCursor(!0), + posend = cm.getDoc().getCursor(!1), + i = pos.line; + i < posend.line + 1; + i++ + ) + cm.replaceRange( + '
          • ' + cm.getLine(i) + '
          • ', + { line: i, ch: 0 }, + { line: i, ch: cm.getLine(i).length } + ) + cm.setCursor({ line: posend.line, ch: cm.getLine(posend.line).length }), cm.focus() + } + } + function addAction (name, replace, mode) { + editor.on('action.' + name, function () { + 'html' == editor.getCursorMode() && + editor['replaceLine' == mode ? 'replaceLine' : 'replaceSelection'](replace) + }) + } + editor.on('action.listUl', function () { + listfn() + }), + editor.on('action.listOl', function () { + listfn() + }), + editor.htmleditor.on('click', 'a[data-htmleditor-button="fullscreen"]', function () { + editor.htmleditor.toggleClass('uk-htmleditor-fullscreen') + var wrap = editor.editor.getWrapperElement() + if (editor.htmleditor.hasClass('uk-htmleditor-fullscreen')) + (editor.editor.state.fullScreenRestore = { + scrollTop: window.pageYOffset, + scrollLeft: window.pageXOffset, + width: wrap.style.width, + height: wrap.style.height + }), + (wrap.style.width = ''), + (wrap.style.height = editor.content.height() + 'px'), + (document.documentElement.style.overflow = 'hidden') + else { + document.documentElement.style.overflow = '' + var info = editor.editor.state.fullScreenRestore + ;(wrap.style.width = info.width), + (wrap.style.height = info.height), + window.scrollTo(info.scrollLeft, info.scrollTop) + } + setTimeout(function () { + editor.fit(), UI.$win.trigger('resize') + }, 50) + }), + editor.addShortcut(['Ctrl-S', 'Cmd-S'], function () { + editor.element.trigger('htmleditor-save', [editor]) + }), + editor.addShortcutAction('bold', ['Ctrl-B', 'Cmd-B']) + } + }), + UI.plugin('htmleditor', 'markdown', { + init: function (editor) { + var parser = editor.options.mdparser || marked || null + function enableMarkdown () { + editor.editor.setOption('mode', 'gfm'), + editor.htmleditor.find('.uk-htmleditor-button-code a').html(editor.options.lblMarkedview) + } + function addAction (name, replace, mode) { + editor.on('action.' + name, function () { + 'markdown' == editor.getCursorMode() && + editor['replaceLine' == mode ? 'replaceLine' : 'replaceSelection'](replace) + }) + } + parser && + (editor.options.markdown && enableMarkdown(), + addAction('bold', '**$1**'), + addAction('italic', '*$1*'), + addAction('strike', '~~$1~~'), + addAction('blockquote', '> $1', 'replaceLine'), + addAction('link', '[$1](http://)'), + addAction('image', '![$1](http://)'), + editor.on('action.listUl', function () { + if ('markdown' == editor.getCursorMode()) { + for ( + var cm = editor.editor, + pos = cm.getDoc().getCursor(!0), + posend = cm.getDoc().getCursor(!1), + i = pos.line; + i < posend.line + 1; + i++ + ) + cm.replaceRange('* ' + cm.getLine(i), { line: i, ch: 0 }, { line: i, ch: cm.getLine(i).length }) + cm.setCursor({ line: posend.line, ch: cm.getLine(posend.line).length }), cm.focus() + } + }), + editor.on('action.listOl', function () { + if ('markdown' == editor.getCursorMode()) { + var matches, + cm = editor.editor, + pos = cm.getDoc().getCursor(!0), + posend = cm.getDoc().getCursor(!1), + prefix = 1 + if (0 < pos.line) + (matches = cm.getLine(pos.line - 1).match(/^(\d+)\./)) && (prefix = Number(matches[1]) + 1) + for (var i = pos.line; i < posend.line + 1; i++) + cm.replaceRange( + prefix + '. ' + cm.getLine(i), + { line: i, ch: 0 }, + { line: i, ch: cm.getLine(i).length } + ), + prefix++ + cm.setCursor({ line: posend.line, ch: cm.getLine(posend.line).length }), cm.focus() + } + }), + editor.on('renderLate', function () { + 'gfm' == editor.editor.options.mode && (editor.currentvalue = parser(editor.currentvalue)) + }), + editor.on('cursorMode', function (e, param) { + if ('gfm' == editor.editor.options.mode) { + var pos = editor.editor.getDoc().getCursor() + editor.editor.getTokenAt(pos).state.base.htmlState || (param.mode = 'markdown') + } + }), + UI.$.extend(editor, { + enableMarkdown: function () { + enableMarkdown(), this.render() + }, + disableMarkdown: function () { + this.editor.setOption('mode', 'htmlmixed'), + this.htmleditor.find('.uk-htmleditor-button-code a').html(this.options.lblCodeview), + this.render() + } + }), + editor.on({ + enableMarkdown: function () { + editor.enableMarkdown() + }, + disableMarkdown: function () { + editor.disableMarkdown() + } + })) + } + }), + UI.htmleditor + ) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-lightbox', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + var modal, + cache = {} + return ( + UI.component('lightbox', { + defaults: { group: !1, duration: 400, keyboard: !0 }, + index: 0, + items: !1, + boot: function () { + UI.$html.on('click', '[data-uk-lightbox]', function (e) { + e.preventDefault() + var link = UI.$(this) + link.data('lightbox') || UI.lightbox(link, UI.Utils.options(link.attr('data-uk-lightbox'))), + link.data('lightbox').show(link) + }), + UI.$doc.on('keyup', function (e) { + if (modal && modal.is(':visible') && modal.lightbox.options.keyboard) + switch ((e.preventDefault(), e.keyCode)) { + case 37: + modal.lightbox.previous() + break + case 39: + modal.lightbox.next() + } + }) + }, + init: function () { + var siblings = [] + if (((this.index = 0), (this.siblings = []), this.element && this.element.length)) { + var domSiblings = this.options.group + ? UI.$( + [ + '[data-uk-lightbox*="' + this.options.group + '"]', + "[data-uk-lightbox*='" + this.options.group + "']" + ].join(',') + ) + : this.element + domSiblings.each(function () { + var ele = UI.$(this) + siblings.push({ + source: ele.attr('href'), + title: ele.attr('data-title') || ele.attr('title'), + type: ele.attr('data-lightbox-type') || 'auto', + link: ele + }) + }), + (this.index = domSiblings.index(this.element)), + (this.siblings = siblings) + } else this.options.group && this.options.group.length && (this.siblings = this.options.group) + this.trigger('lightbox-init', [this]) + }, + show: function (index) { + ;(this.modal = (function (lightbox) { + if (modal) return (modal.lightbox = lightbox), modal + return ( + ((modal = UI.$( + [ + '
            ', + '
            ', + '', + '
            ', + '
            ', + '
            ', + '
            ' + ].join('') + ).appendTo('body')).dialog = modal.find('.uk-modal-dialog:first')), + (modal.content = modal.find('.uk-lightbox-content:first')), + (modal.loader = modal.find('.uk-modal-spinner:first')), + (modal.closer = modal.find('.uk-close.uk-close-alt')), + (modal.modal = UI.modal(modal, { modal: !1 })), + modal + .on('swipeRight swipeLeft', function (e) { + modal.lightbox['swipeLeft' == e.type ? 'next' : 'previous']() + }) + .on('click', '[data-lightbox-previous], [data-lightbox-next]', function (e) { + e.preventDefault(), modal.lightbox[UI.$(this).is('[data-lightbox-next]') ? 'next' : 'previous']() + }), + modal.on('hide.uk.modal', function (e) { + modal.content.html('') + }), + UI.$win.on( + 'load resize orientationchange', + UI.Utils.debounce( + function (e) { + modal.is(':visible') && !UI.Utils.isFullscreen() && modal.lightbox.fitSize() + }.bind(this), + 100 + ) + ), + (modal.lightbox = lightbox), + modal + ) + })(this)), + this.modal.dialog.stop(), + this.modal.content.stop() + var data, + item, + $this = this, + promise = UI.$.Deferred() + 'object' == typeof (index = index || 0) && + this.siblings.forEach(function (s, idx) { + index[0] === s.link[0] && (index = idx) + }), + index < 0 ? (index = this.siblings.length - index) : this.siblings[index] || (index = 0), + (item = this.siblings[index]), + (data = { + lightbox: $this, + source: item.source, + type: item.type, + index: index, + promise: promise, + title: item.title, + item: item, + meta: { content: '', width: null, height: null } + }), + (this.index = index), + this.modal.content.empty(), + this.modal.is(':visible') || + (this.modal.content.css({ width: '', height: '' }).empty(), this.modal.modal.show()), + this.modal.loader.removeClass('uk-hidden'), + promise + .promise() + .done(function () { + ;($this.data = data), $this.fitSize(data) + }) + .fail(function () { + ;(data.meta.content = + '
            Loading resource failed!
            '), + (data.meta.width = 400), + (data.meta.height = 300), + ($this.data = data), + $this.fitSize(data) + }), + $this.trigger('showitem.uk.lightbox', [data]) + }, + fitSize: function () { + var $this = this, + data = this.data, + pad = this.modal.dialog.outerWidth() - this.modal.dialog.width(), + dpad = + parseInt(this.modal.dialog.css('margin-top'), 10) + parseInt(this.modal.dialog.css('margin-bottom'), 10), + content = data.meta.content, + duration = $this.options.duration + 1 < this.siblings.length && + (content = [ + content, + '', + '' + ].join('')) + var maxwidth, + maxheight, + tmp = UI.$('
             
            ').css({ + opacity: 0, + position: 'absolute', + top: 0, + left: 0, + width: '100%', + 'max-width': $this.modal.dialog.css('max-width'), + padding: $this.modal.dialog.css('padding'), + margin: $this.modal.dialog.css('margin') + }), + w = data.meta.width, + h = data.meta.height + tmp.appendTo('body').width(), + (maxwidth = tmp.width()), + (maxheight = window.innerHeight - dpad), + tmp.remove(), + this.modal.dialog.find('.uk-modal-caption').remove(), + data.title && + (this.modal.dialog.append('
            ' + data.title + '
            '), + (maxheight -= this.modal.dialog.find('.uk-modal-caption').outerHeight())), + maxwidth < data.meta.width && ((h = Math.floor(h * (maxwidth / w))), (w = maxwidth)), + maxheight < h && + ((h = Math.floor(maxheight)), (w = Math.ceil(data.meta.width * (maxheight / data.meta.height)))), + this.modal.content + .css('opacity', 0) + .width(w) + .html(content), + 'iframe' == data.type && this.modal.content.find('iframe:first').height(h) + var dh = h + pad, + t = Math.floor(window.innerHeight / 2 - dh / 2) - dpad + t < 0 && (t = 0), + this.modal.closer.addClass('uk-hidden'), + $this.modal.data('mwidth') == w && $this.modal.data('mheight') == h && (duration = 0), + this.modal.dialog.animate({ width: w + pad, height: h + pad, top: t }, duration, 'swing', function () { + $this.modal.loader.addClass('uk-hidden'), + $this.modal.content.css({ width: '' }).animate({ opacity: 1 }, function () { + $this.modal.closer.removeClass('uk-hidden') + }), + $this.modal.data({ mwidth: w, mheight: h }) + }) + }, + next: function () { + this.show(this.siblings[this.index + 1] ? this.index + 1 : 0) + }, + previous: function () { + this.show(this.siblings[this.index - 1] ? this.index - 1 : this.siblings.length - 1) + } + }), + UI.plugin('lightbox', 'image', { + init: function (lightbox) { + lightbox.on('showitem.uk.lightbox', function (e, data) { + if ('image' == data.type || (data.source && data.source.match(/\.(jpg|jpeg|png|gif|svg)$/i))) { + var resolve = function (source, width, height) { + ;(data.meta = { + content: + '', + width: width, + height: height + }), + (data.type = 'image'), + data.promise.resolve() + } + if (cache[data.source]) resolve(data.source, cache[data.source].width, cache[data.source].height) + else { + var img = new Image() + ;(img.onerror = function () { + data.promise.reject('Loading image failed') + }), + (img.onload = function () { + ;(cache[data.source] = { width: img.width, height: img.height }), + resolve(data.source, cache[data.source].width, cache[data.source].height) + }), + (img.src = data.source) + } + } + }) + } + }), + UI.plugin('lightbox', 'youtube', { + init: function (lightbox) { + var youtubeRegExp = /(\/\/.*?youtube\.[a-z]+)\/watch\?v=([^&]+)&?(.*)/, + youtubeRegExpShort = /youtu\.be\/(.*)/ + lightbox.on('showitem.uk.lightbox', function (e, data) { + var id, + matches, + resolve = function (id, width, height) { + ;(data.meta = { + content: + '', + width: width, + height: height + }), + (data.type = 'iframe'), + data.promise.resolve() + } + if ( + ((matches = data.source.match(youtubeRegExp)) && (id = matches[2]), + (matches = data.source.match(youtubeRegExpShort)) && (id = matches[1]), + id) + ) { + if (cache[id]) resolve(id, cache[id].width, cache[id].height) + else { + var img = new Image(), + lowres = !1 + ;(img.onerror = function () { + ;(cache[id] = { width: 640, height: 320 }), resolve(id, cache[id].width, cache[id].height) + }), + (img.onload = function () { + 120 == img.width && 90 == img.height + ? lowres + ? ((cache[id] = { width: 640, height: 320 }), resolve(id, cache[id].width, cache[id].height)) + : ((lowres = !0), (img.src = '//img.youtube.com/vi/' + id + '/0.jpg')) + : ((cache[id] = { width: img.width, height: img.height }), resolve(id, img.width, img.height)) + }), + (img.src = '//img.youtube.com/vi/' + id + '/maxresdefault.jpg') + } + e.stopImmediatePropagation() + } + }) + } + }), + UI.plugin('lightbox', 'vimeo', { + init: function (lightbox) { + var matches, + regex = /(\/\/.*?)vimeo\.[a-z]+\/([0-9]+).*?/ + lightbox.on('showitem.uk.lightbox', function (e, data) { + var id, + resolve = function (id, width, height) { + ;(data.meta = { + content: + '', + width: width, + height: height + }), + (data.type = 'iframe'), + data.promise.resolve() + } + ;(matches = data.source.match(regex)) && + ((id = matches[2]), + cache[id] + ? resolve(id, cache[id].width, cache[id].height) + : UI.$.ajax({ + type: 'GET', + url: 'http://vimeo.com/api/oembed.json?url=' + encodeURI(data.source), + jsonp: 'callback', + dataType: 'jsonp', + success: function (data) { + ;(cache[id] = { width: data.width, height: data.height }), + resolve(id, cache[id].width, cache[id].height) + } + }), + e.stopImmediatePropagation()) + }) + } + }), + UI.plugin('lightbox', 'video', { + init: function (lightbox) { + lightbox.on('showitem.uk.lightbox', function (e, data) { + var resolve = function (source, width, height) { + ;(data.meta = { + content: + '', + width: width, + height: height + }), + (data.type = 'video'), + data.promise.resolve() + } + if ('video' == data.type || data.source.match(/\.(mp4|webm|ogv)$/i)) + if (cache[data.source]) resolve(data.source, cache[data.source].width, cache[data.source].height) + else + var vid = UI.$('') + .attr('src', data.source) + .appendTo('body'), + idle = setInterval(function () { + vid[0].videoWidth && + (clearInterval(idle), + (cache[data.source] = { width: vid[0].videoWidth, height: vid[0].videoHeight }), + resolve(data.source, cache[data.source].width, cache[data.source].height), + vid.remove()) + }, 20) + }) + } + }), + (UI.lightbox.create = function (items, options) { + if (items) { + var group = [] + return ( + items.forEach(function (item) { + group.push( + UI.$.extend( + { source: '', title: '', type: 'auto', link: !1 }, + 'string' == typeof item ? { source: item } : item + ) + ) + }), + UI.lightbox(UI.$.extend({}, options, { group: group })) + ) + } + }), + UI.lightbox + ) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-nestable', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + var draggingElement, + hasTouch = 'ontouchstart' in window, + html = UI.$html, + touchedlists = [], + $win = UI.$win, + eStart = hasTouch ? 'touchstart' : 'mousedown', + eMove = hasTouch ? 'touchmove' : 'mousemove', + eEnd = hasTouch ? 'touchend' : 'mouseup', + eCancel = hasTouch ? 'touchcancel' : 'mouseup' + return ( + UI.component('nestable', { + defaults: { + listBaseClass: 'uk-nestable', + listClass: 'uk-nestable-list', + listItemClass: 'uk-nestable-item', + dragClass: 'uk-nestable-dragged', + movingClass: 'uk-nestable-moving', + noChildrenClass: 'uk-nestable-nochildren', + emptyClass: 'uk-nestable-empty', + handleClass: '', + collapsedClass: 'uk-collapsed', + placeholderClass: 'uk-nestable-placeholder', + noDragClass: 'uk-nestable-nodrag', + group: !1, + maxDepth: 10, + threshold: 20, + idlethreshold: 10 + }, + boot: function () { + UI.$html.on('mousemove touchmove', function (e) { + if (draggingElement) { + var top = draggingElement.offset().top + top < UI.$win.scrollTop() + ? UI.$win.scrollTop(UI.$win.scrollTop() - Math.ceil(draggingElement.height() / 2)) + : top + draggingElement.height() > window.innerHeight + UI.$win.scrollTop() && + UI.$win.scrollTop(UI.$win.scrollTop() + Math.ceil(draggingElement.height() / 2)) + } + }), + UI.ready(function (context) { + UI.$('[data-uk-nestable]', context).each(function () { + var ele = UI.$(this) + ele.data('nestable') || UI.nestable(ele, UI.Utils.options(ele.attr('data-uk-nestable'))) + }) + }) + }, + init: function () { + var $this = this + Object.keys(this.options).forEach(function (key) { + ;-1 != String(key).indexOf('Class') && ($this.options['_' + key] = '.' + $this.options[key]) + }), + this.find(this.options._listItemClass) + .find('>ul') + .addClass(this.options.listClass), + this.checkEmptyList(), + this.reset(), + this.element.data('nestable-group', this.options.group || UI.Utils.uid('nestable-group')), + this.find(this.options._listItemClass).each(function () { + $this.setParent(UI.$(this)) + }), + this.on('click', '[data-nestable-action]', function (e) { + if (!$this.dragEl && (hasTouch || 0 === e.button)) { + e.preventDefault() + var target = UI.$(e.currentTarget), + action = target.data('nestableAction'), + item = target.closest($this.options._listItemClass) + 'collapse' === action && $this.collapseItem(item), + 'expand' === action && $this.expandItem(item), + 'toggle' === action && $this.toggleItem(item) + } + }) + var onStartEvent = function (e) { + var handle = UI.$(e.target) + e.target !== $this.element[0] && + (handle.is($this.options._noDragClass) || + handle.closest($this.options._noDragClass).length || + handle.is('[data-nestable-action]') || + handle.closest('[data-nestable-action]').length || + ($this.options.handleClass && + !handle.hasClass($this.options.handleClass) && + $this.options.handleClass && + (handle = handle.closest($this.options._handleClass)), + !handle.length || + $this.dragEl || + (!hasTouch && 0 !== e.button) || + (hasTouch && 1 !== e.touches.length) || + (e.originalEvent && e.originalEvent.touches && (e = evt.originalEvent.touches[0]), + ($this.delayMove = function (evt) { + evt.preventDefault(), + $this.dragStart(e), + $this.trigger('start.uk.nestable', [$this]), + ($this.delayMove = !1) + }), + ($this.delayMove.x = parseInt(e.pageX, 10)), + ($this.delayMove.y = parseInt(e.pageY, 10)), + ($this.delayMove.threshold = $this.options.idlethreshold), + e.preventDefault()))) + }, + onMoveEvent = function (e) { + e.originalEvent && e.originalEvent.touches && (e = e.originalEvent.touches[0]), + $this.delayMove && + (Math.abs(e.pageX - $this.delayMove.x) > $this.delayMove.threshold || + Math.abs(e.pageY - $this.delayMove.y) > $this.delayMove.threshold) && + (window.getSelection().toString() ? ($this.delayMove = !1) : $this.delayMove(e)), + $this.dragEl && (e.preventDefault(), $this.dragMove(e), $this.trigger('move.uk.nestable', [$this])) + }, + onEndEvent = function (e) { + $this.dragEl && (e.preventDefault(), $this.dragStop(hasTouch ? e.touches[0] : e)), + (draggingElement = !1), + ($this.delayMove = !1) + } + hasTouch + ? (this.element[0].addEventListener(eStart, onStartEvent, !1), + window.addEventListener(eMove, onMoveEvent, !1), + window.addEventListener(eEnd, onEndEvent, !1), + window.addEventListener(eCancel, onEndEvent, !1)) + : (this.on(eStart, onStartEvent), $win.on(eMove, onMoveEvent), $win.on(eEnd, onEndEvent)) + }, + serialize: function () { + var list = this, + step = function (level, depth) { + var array = [] + return ( + level.children(list.options._listItemClass).each(function () { + for ( + var attribute, li = UI.$(this), item = {}, sub = li.children(list.options._listClass), i = 0; + i < li[0].attributes.length; + i++ + ) + 0 === (attribute = li[0].attributes[i]).name.indexOf('data-') && + (item[attribute.name.substr(5)] = UI.Utils.str2json(attribute.value)) + sub.length && (item.children = step(sub, depth + 1)), array.push(item) + }), + array + ) + } + return step(list.element, 0) + }, + list: function (options) { + var data = [], + step = function (level, depth, parent) { + level.children(options._listItemClass).each(function (index) { + var li = UI.$(this), + item = UI.$.extend({ parent_id: parent || null, depth: depth, order: index }, li.data()), + sub = li.children(options._listClass) + data.push(item), sub.length && step(sub, depth + 1, li.data(options.idProperty || 'id')) + }) + } + return (options = UI.$.extend({}, this.options, options)), step(this.element, 0), data + }, + reset: function () { + ;(this.mouse = { + offsetX: 0, + offsetY: 0, + startX: 0, + startY: 0, + lastX: 0, + lastY: 0, + nowX: 0, + nowY: 0, + distX: 0, + distY: 0, + dirAx: 0, + dirX: 0, + dirY: 0, + lastDirX: 0, + lastDirY: 0, + distAxX: 0, + distAxY: 0 + }), + (this.moving = !1), + (this.dragEl = null), + (this.dragRootEl = null), + (this.dragDepth = 0), + (this.hasNewRoot = !1), + (this.pointEl = null) + for (var i = 0; i < touchedlists.length; i++) this.checkEmptyList(touchedlists[i]) + touchedlists = [] + }, + toggleItem: function (li) { + this[li.hasClass(this.options.collapsedClass) ? 'expandItem' : 'collapseItem'](li) + }, + expandItem: function (li) { + li.removeClass(this.options.collapsedClass) + }, + collapseItem: function (li) { + li.children(this.options._listClass).length && li.addClass(this.options.collapsedClass) + }, + expandAll: function () { + var list = this + this.find(list.options._listItemClass).each(function () { + list.expandItem(UI.$(this)) + }) + }, + collapseAll: function () { + var list = this + this.find(list.options._listItemClass).each(function () { + list.collapseItem(UI.$(this)) + }) + }, + setParent: function (li) { + li.children(this.options._listClass).length && li.addClass('uk-parent') + }, + unsetParent: function (li) { + li.removeClass('uk-parent ' + this.options.collapsedClass), li.children(this.options._listClass).remove() + }, + dragStart: function (e) { + var mouse = this.mouse, + dragItem = UI.$(e.target).closest(this.options._listItemClass), + offset = dragItem.offset() + ;(this.placeEl = dragItem), + (mouse.offsetX = e.pageX - offset.left), + (mouse.offsetY = e.pageY - offset.top), + (mouse.startX = mouse.lastX = offset.left), + (mouse.startY = mouse.lastY = offset.top), + (this.dragRootEl = this.element), + (this.dragEl = UI.$('
              ') + .addClass(this.options.listClass + ' ' + this.options.dragClass) + .append(dragItem.clone())), + this.dragEl.css('width', dragItem.width()), + this.placeEl.addClass(this.options.placeholderClass), + (draggingElement = this.dragEl), + (this.tmpDragOnSiblings = [dragItem[0].previousSibling, dragItem[0].nextSibling]), + UI.$body.append(this.dragEl), + this.dragEl.css({ left: offset.left, top: offset.top }) + var i, + depth, + items = this.dragEl.find(this.options._listItemClass) + for (i = 0; i < items.length; i++) + (depth = UI.$(items[i]).parents(this.options._listClass + ',' + this.options._listBaseClass).length) > + this.dragDepth && (this.dragDepth = depth) + html.addClass(this.options.movingClass) + }, + dragStop: function (e) { + var el = UI.$(this.placeEl), + root = this.placeEl.parents(this.options._listBaseClass + ':first') + this.placeEl.removeClass(this.options.placeholderClass), + this.dragEl.remove(), + this.element[0] !== root[0] + ? (root.trigger('change.uk.nestable', [root.data('nestable'), el, 'added']), + this.element.trigger('change.uk.nestable', [this, el, 'removed'])) + : this.element.trigger('change.uk.nestable', [this, el, 'moved']), + this.trigger('stop.uk.nestable', [this, el]), + this.reset(), + html.removeClass(this.options.movingClass) + }, + dragMove: function (e) { + var list, + parent, + prev, + opt = this.options, + mouse = this.mouse, + maxDepth = this.dragRootEl ? this.dragRootEl.data('nestable').options.maxDepth : opt.maxDepth + this.dragEl.css({ left: e.pageX - mouse.offsetX, top: e.pageY - mouse.offsetY }), + (mouse.lastX = mouse.nowX), + (mouse.lastY = mouse.nowY), + (mouse.nowX = e.pageX), + (mouse.nowY = e.pageY), + (mouse.distX = mouse.nowX - mouse.lastX), + (mouse.distY = mouse.nowY - mouse.lastY), + (mouse.lastDirX = mouse.dirX), + (mouse.lastDirY = mouse.dirY), + (mouse.dirX = 0 === mouse.distX ? 0 : 0 < mouse.distX ? 1 : -1), + (mouse.dirY = 0 === mouse.distY ? 0 : 0 < mouse.distY ? 1 : -1) + var newAx = Math.abs(mouse.distX) > Math.abs(mouse.distY) ? 1 : 0 + if (!mouse.moving) return (mouse.dirAx = newAx), void (mouse.moving = !0) + if ( + (mouse.dirAx !== newAx + ? ((mouse.distAxX = 0), (mouse.distAxY = 0)) + : ((mouse.distAxX += Math.abs(mouse.distX)), + 0 !== mouse.dirX && mouse.dirX !== mouse.lastDirX && (mouse.distAxX = 0), + (mouse.distAxY += Math.abs(mouse.distY)), + 0 !== mouse.dirY && mouse.dirY !== mouse.lastDirY && (mouse.distAxY = 0)), + (mouse.dirAx = newAx), + mouse.dirAx && + mouse.distAxX >= opt.threshold && + ((mouse.distAxX = 0), + (prev = this.placeEl.prev('li')), + 0 < mouse.distX && + prev.length && + !prev.hasClass(opt.collapsedClass) && + !prev.hasClass(opt.noChildrenClass) && + ((list = prev.find(opt._listClass).last()), + this.placeEl.parents(opt._listClass + ',' + opt._listBaseClass).length + this.dragDepth <= maxDepth && + (list.length + ? (list = prev.children(opt._listClass).last()).append(this.placeEl) + : ((list = UI.$('
                ').addClass(opt.listClass)).append(this.placeEl), + prev.append(list), + this.setParent(prev)))), + mouse.distX < 0 && !this.placeEl.next(opt._listItemClass).length)) + ) { + var parentUl = this.placeEl.closest([opt._listBaseClass, opt._listClass].join(',')), + surroundingLi = parentUl.closest(opt._listItemClass) + surroundingLi.length && + (surroundingLi.after(this.placeEl), parentUl.children().length || this.unsetParent(surroundingLi)) + } + var isEmpty = !1, + pointX = e.pageX - (window.pageXOffset || document.scrollLeft || 0), + pointY = e.pageY - (window.pageYOffset || document.documentElement.scrollTop) + if ( + ((this.pointEl = UI.$(document.elementFromPoint(pointX, pointY))), + opt.handleClass && this.pointEl.hasClass(opt.handleClass)) + ) + this.pointEl = this.pointEl.closest(opt._listItemClass) + else { + var nestableitem = this.pointEl.closest(opt._listItemClass) + nestableitem.length && (this.pointEl = nestableitem) + } + if (!this.placeEl.find(this.pointEl).length) { + if (this.pointEl.data('nestable') && !this.pointEl.children().length) + (isEmpty = !0), this.checkEmptyList(this.pointEl) + else if (!this.pointEl.length || !this.pointEl.hasClass(opt.listItemClass)) return + var pointElRoot = this.element, + tmpRoot = this.pointEl.closest(this.options._listBaseClass), + isNewRoot = pointElRoot[0] != tmpRoot[0] + if (!mouse.dirAx || isNewRoot || isEmpty) { + if (isNewRoot && opt.group !== tmpRoot.data('nestable-group')) return + if ( + (touchedlists.push(pointElRoot), + maxDepth < this.dragDepth - 1 + this.pointEl.parents(opt._listClass + ',' + opt._listBaseClass).length) + ) + return + var before = e.pageY < this.pointEl.offset().top + this.pointEl.height() / 2 + ;(parent = this.placeEl.parent()), + isEmpty + ? this.pointEl.append(this.placeEl) + : before + ? this.pointEl.before(this.placeEl) + : this.pointEl.after(this.placeEl), + parent.children().length || parent.data('nestable') || this.unsetParent(parent.parent()), + this.checkEmptyList(this.dragRootEl), + this.checkEmptyList(pointElRoot), + isNewRoot && ((this.dragRootEl = tmpRoot), (this.hasNewRoot = this.element[0] !== this.dragRootEl[0])) + } + } + }, + checkEmptyList: function (list) { + ;(list = list ? UI.$(list) : this.element), + this.options.emptyClass && + list[list.children().length ? 'removeClass' : 'addClass'](this.options.emptyClass) + } + }), + UI.nestable + ) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-notify', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + var containers = {}, + messages = {}, + notify = function (options) { + return ( + 'string' == UI.$.type(options) && (options = { message: options }), + arguments[1] && + (options = UI.$.extend( + options, + 'string' == UI.$.type(arguments[1]) ? { status: arguments[1] } : arguments[1] + )), + new Message(options).show() + ) + }, + Message = function (options) { + ;(this.options = UI.$.extend({}, Message.defaults, options)), + (this.uuid = UI.Utils.uid('notifymsg')), + (this.element = UI.$( + ['
                ', '', '
                ', '
                '].join('') + ).data('notifyMessage', this)), + this.content(this.options.message), + this.options.status && + (this.element.addClass('uk-notify-message-' + this.options.status), + (this.currentstatus = this.options.status)), + (this.group = this.options.group), + (messages[this.uuid] = this), + containers[this.options.pos] || + (containers[this.options.pos] = UI.$('
                ') + .appendTo('body') + .on('click', '.uk-notify-message', function () { + var message = UI.$(this).data('notifyMessage') + message.element.trigger('manualclose.uk.notify', [message]), message.close() + })) + } + return ( + UI.$.extend(Message.prototype, { + uuid: !1, + element: !1, + timout: !1, + currentstatus: '', + group: !1, + show: function () { + if (!this.element.is(':visible')) { + var $this = this + containers[this.options.pos].show().prepend(this.element) + var marginbottom = parseInt(this.element.css('margin-bottom'), 10) + return ( + this.element + .css({ opacity: 0, 'margin-top': -1 * this.element.outerHeight(), 'margin-bottom': 0 }) + .animate({ opacity: 1, 'margin-top': 0, 'margin-bottom': marginbottom }, function () { + if ($this.options.timeout) { + var closefn = function () { + $this.close() + } + ;($this.timeout = setTimeout(closefn, $this.options.timeout)), + $this.element.hover( + function () { + clearTimeout($this.timeout) + }, + function () { + $this.timeout = setTimeout(closefn, $this.options.timeout) + } + ) + } + }), + this + ) + } + }, + close: function (instantly) { + var $this = this, + finalize = function () { + $this.element.remove(), + containers[$this.options.pos].children().length || containers[$this.options.pos].hide(), + $this.options.onClose.apply($this, []), + $this.element.trigger('close.uk.notify', [$this]), + delete messages[$this.uuid] + } + this.timeout && clearTimeout(this.timeout), + instantly + ? finalize() + : this.element.animate( + { opacity: 0, 'margin-top': -1 * this.element.outerHeight(), 'margin-bottom': 0 }, + function () { + finalize() + } + ) + }, + content: function (html) { + var container = this.element.find('>div') + return html ? (container.html(html), this) : container.html() + }, + status: function (status) { + return status + ? (this.element + .removeClass('uk-notify-message-' + this.currentstatus) + .addClass('uk-notify-message-' + status), + (this.currentstatus = status), + this) + : this.currentstatus + } + }), + (Message.defaults = { + message: '', + status: '', + timeout: 5e3, + group: null, + pos: 'top-center', + onClose: function () {} + }), + (UI.notify = notify), + (UI.notify.message = Message), + (UI.notify.closeAll = function (group, instantly) { + var id + if (group) for (id in messages) group === messages[id].group && messages[id].close(instantly) + else for (id in messages) messages[id].close(instantly) + }), + notify + ) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-pagination', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + return ( + UI.component('pagination', { + defaults: { + items: 1, + itemsOnPage: 1, + pages: 0, + displayedPages: 7, + edges: 1, + currentPage: 0, + lblPrev: !1, + lblNext: !1, + onSelectPage: function () {} + }, + boot: function () { + UI.ready(function (context) { + UI.$('[data-uk-pagination]', context).each(function () { + var ele = UI.$(this) + ele.data('pagination') || UI.pagination(ele, UI.Utils.options(ele.attr('data-uk-pagination'))) + }) + }) + }, + init: function () { + var $this = this + ;(this.pages = this.options.pages + ? this.options.pages + : Math.ceil(this.options.items / this.options.itemsOnPage) + ? Math.ceil(this.options.items / this.options.itemsOnPage) + : 1), + (this.items = this.options.items), + (this.currentPage = this.options.currentPage), + (this.halfDisplayed = this.options.displayedPages / 2), + this.on('click', 'a[data-page]', function (e) { + e.preventDefault(), $this.selectPage(UI.$(this).data('page')) + }), + this._render() + }, + _getInterval: function () { + return { + start: Math.ceil( + this.currentPage > this.halfDisplayed + ? Math.max(Math.min(this.currentPage - this.halfDisplayed, this.pages - this.options.displayedPages), 0) + : 0 + ), + end: Math.ceil( + this.currentPage > this.halfDisplayed + ? Math.min(this.currentPage + this.halfDisplayed, this.pages) + : Math.min(this.options.displayedPages, this.pages) + ) + } + }, + render: function (pages) { + ;(this.pages = pages || this.pages), this._render() + }, + selectPage: function (pageIndex, pages) { + ;(this.currentPage = pageIndex), + this.render(pages), + this.options.onSelectPage.apply(this, [pageIndex]), + this.trigger('select.uk.pagination', [pageIndex, this]) + }, + _render: function () { + var i, + o = this.options, + interval = this._getInterval() + if ( + (this.element.empty(), + o.lblPrev && this._append(this.currentPage - 1, { text: o.lblPrev }), + 0 < interval.start && 0 < o.edges) + ) { + var end = Math.min(o.edges, interval.start) + for (i = 0; i < end; i++) this._append(i) + o.edges < interval.start && interval.start - o.edges != 1 + ? this.element.append('
              • ...
              • ') + : interval.start - o.edges == 1 && this._append(o.edges) + } + for (i = interval.start; i < interval.end; i++) this._append(i) + if (interval.end < this.pages && 0 < o.edges) + for ( + this.pages - o.edges > interval.end && this.pages - o.edges - interval.end != 1 + ? this.element.append('
              • ...
              • ') + : this.pages - o.edges - interval.end == 1 && this._append(interval.end++), + i = Math.max(this.pages - o.edges, interval.end); + i < this.pages; + i++ + ) + this._append(i) + o.lblNext && this._append(this.currentPage + 1, { text: o.lblNext }) + }, + _append: function (pageIndex, opts) { + var item, options + ;(pageIndex = pageIndex < 0 ? 0 : pageIndex < this.pages ? pageIndex : this.pages - 1), + (options = UI.$.extend({ text: pageIndex + 1 }, opts)), + (item = + pageIndex == this.currentPage + ? '
              • ' + options.text + '
              • ' + : '
              • ' + + options.text + + '
              • '), + this.element.append(item) + } + }), + UI.pagination + ) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-parallax', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + var parallaxes = [], + supports3d = !1, + scrolltop = 0, + wh = window.innerHeight, + checkParallaxes = function () { + ;(scrolltop = UI.$win.scrollTop()), + window.requestAnimationFrame(function () { + for (var i = 0; i < parallaxes.length; i++) parallaxes[i].process() + }) + } + UI.component('parallax', { + defaults: { velocity: 0.5, target: !1, viewport: !1, media: !1 }, + boot: function () { + ;(supports3d = (function () { + var has3d, + el = document.createElement('div'), + transforms = { + WebkitTransform: '-webkit-transform', + MSTransform: '-ms-transform', + MozTransform: '-moz-transform', + Transform: 'transform' + } + for (var t in (document.body.insertBefore(el, null), transforms)) + void 0 !== el.style[t] && + ((el.style[t] = 'translate3d(1px,1px,1px)'), + (has3d = window.getComputedStyle(el).getPropertyValue(transforms[t]))) + return document.body.removeChild(el), void 0 !== has3d && 0 < has3d.length && 'none' !== has3d + })()), + UI.$doc.on('scrolling.uk.document', checkParallaxes), + UI.$win.on( + 'load resize orientationchange', + UI.Utils.debounce(function () { + ;(wh = window.innerHeight), checkParallaxes() + }, 50) + ), + UI.ready(function (context) { + UI.$('[data-uk-parallax]', context).each(function () { + var parallax = UI.$(this) + parallax.data('parallax') || UI.parallax(parallax, UI.Utils.options(parallax.attr('data-uk-parallax'))) + }) + }) + }, + init: function () { + ;(this.base = this.options.target ? UI.$(this.options.target) : this.element), + (this.props = {}), + (this.velocity = this.options.velocity || 1) + var reserved = ['target', 'velocity', 'viewport', 'plugins', 'media'] + Object.keys(this.options).forEach( + function (prop) { + if (-1 === reserved.indexOf(prop)) { + var start, + end, + dir, + diff, + startend = String(this.options[prop]).split(',') + prop.match(/color/i) + ? ((start = startend[1] ? startend[0] : this._getStartValue(prop)), + (end = startend[1] ? startend[1] : startend[0]), + start || (start = 'rgba(255,255,255,0)')) + : ((diff = + (start = parseFloat(startend[1] ? startend[0] : this._getStartValue(prop))) < + (end = parseFloat(startend[1] ? startend[1] : startend[0])) + ? end - start + : start - end), + (dir = start < end ? 1 : -1)), + (this.props[prop] = { start: start, end: end, dir: dir, diff: diff }) + } + }.bind(this) + ), + parallaxes.push(this) + }, + process: function () { + if (this.options.media) + switch (typeof this.options.media) { + case 'number': + if (window.innerWidth < this.options.media) return !1 + break + case 'string': + if (window.matchMedia && !window.matchMedia(this.options.media).matches) return !1 + } + var percent = this.percentageInViewport() + !1 !== this.options.viewport && (percent = 0 === this.options.viewport ? 1 : percent / this.options.viewport), + this.update(percent) + }, + percentageInViewport: function () { + var distance, + top = this.base.offset().top, + height = this.base.outerHeight() + return scrolltop + wh < top + ? 0 + : top + height < scrolltop + ? 1 + : top + height < wh + ? (scrolltop < wh ? scrolltop : scrolltop - wh) / (top + height) + : ((distance = scrolltop + wh - top), Math.round(distance / ((wh + height) / 100)) / 100) + }, + update: function (percent) { + var opts, + val, + css = { transform: '' }, + compercent = percent * (1 - (this.velocity - this.velocity * percent)) + compercent < 0 && (compercent = 0), + 1 < compercent && (compercent = 1), + (void 0 !== this._percent && this._percent == compercent) || + (Object.keys(this.props).forEach( + function (prop) { + switch ( + ((opts = this.props[prop]), + 0 === percent + ? (val = opts.start) + : 1 === percent + ? (val = opts.end) + : void 0 !== opts.diff && (val = opts.start + opts.diff * compercent * opts.dir), + ('bg' != prop && 'bgp' != prop) || + this._bgcover || + (this._bgcover = (function (obj, prop, opts) { + var url, + element, + size, + check, + ratio, + width, + height, + img = new Image() + return ( + (element = obj.element.css({ 'background-size': 'cover', 'background-repeat': 'no-repeat' })), + (url = element + .css('background-image') + .replace(/^url\(/g, '') + .replace(/\)$/g, '') + .replace(/("|')/g, '')), + (check = function () { + var w = element.innerWidth(), + h = element.innerHeight(), + extra = 'bg' == prop ? opts.diff : (opts.diff / 100) * h + if (((h += extra), (w += Math.ceil(extra * ratio)) - extra < size.w && h < size.h)) + return obj.element.css({ 'background-size': 'auto' }) + w / ratio < h + ? ((width = Math.ceil(h * ratio)), + (height = h) > window.innerHeight && ((width *= 1.2), (height *= 1.2))) + : ((width = w), (height = Math.ceil(w / ratio))), + element + .css({ 'background-size': width + 'px ' + height + 'px' }) + .data('bgsize', { w: width, h: height }) + }), + (img.onerror = function () {}), + (img.onload = function () { + ;(size = { w: img.width, h: img.height }), + (ratio = img.width / img.height), + UI.$win.on( + 'load resize orientationchange', + UI.Utils.debounce(function () { + check() + }, 50) + ), + check() + }), + (img.src = url), + !0 + ) + })(this, prop, opts)), + prop) + ) { + case 'x': + css.transform += supports3d ? ' translate3d(' + val + 'px, 0, 0)' : ' translateX(' + val + 'px)' + break + case 'xp': + css.transform += supports3d ? ' translate3d(' + val + '%, 0, 0)' : ' translateX(' + val + '%)' + break + case 'y': + css.transform += supports3d ? ' translate3d(0, ' + val + 'px, 0)' : ' translateY(' + val + 'px)' + break + case 'yp': + css.transform += supports3d ? ' translate3d(0, ' + val + '%, 0)' : ' translateY(' + val + '%)' + break + case 'rotate': + css.transform += ' rotate(' + val + 'deg)' + break + case 'scale': + css.transform += ' scale(' + val + ')' + break + case 'bg': + css['background-position'] = '50% ' + val + 'px' + break + case 'bgp': + css['background-position'] = '50% ' + val + '%' + break + case 'color': + case 'background-color': + case 'border-color': + css[prop] = ((start = opts.start), + (end = opts.end), + (pos = compercent), + (start = parseColor(start)), + (end = parseColor(end)), + (function (begin, end, pos) { + var color = + 'rgba(' + + parseInt(begin[0] + pos * (end[0] - begin[0]), 10) + + ',' + + parseInt(begin[1] + pos * (end[1] - begin[1]), 10) + + ',' + + parseInt(begin[2] + pos * (end[2] - begin[2]), 10) + + ',' + + (begin && end ? parseFloat(begin[3] + pos * (end[3] - begin[3])) : 1) + return (color += ')') + })(start, end, (pos = pos || 0))) + break + default: + css[prop] = val + } + var start, end, pos + }.bind(this) + ), + this.element.css(css), + (this._percent = compercent)) + }, + _getStartValue: function (prop) { + var value = 0 + switch (prop) { + case 'scale': + value = 1 + break + default: + value = this.element.css(prop) + } + return value || 0 + } + }) + var colors = { + black: [0, 0, 0, 1], + blue: [0, 0, 255, 1], + brown: [165, 42, 42, 1], + cyan: [0, 255, 255, 1], + fuchsia: [255, 0, 255, 1], + gold: [255, 215, 0, 1], + green: [0, 128, 0, 1], + indigo: [75, 0, 130, 1], + khaki: [240, 230, 140, 1], + lime: [0, 255, 0, 1], + magenta: [255, 0, 255, 1], + maroon: [128, 0, 0, 1], + navy: [0, 0, 128, 1], + olive: [128, 128, 0, 1], + orange: [255, 165, 0, 1], + pink: [255, 192, 203, 1], + purple: [128, 0, 128, 1], + violet: [128, 0, 128, 1], + red: [255, 0, 0, 1], + silver: [192, 192, 192, 1], + white: [255, 255, 255, 1], + yellow: [255, 255, 0, 1], + transparent: [255, 255, 255, 0] + } + function parseColor (color) { + var match + return (match = /#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})/.exec(color)) + ? [parseInt(match[1], 16), parseInt(match[2], 16), parseInt(match[3], 16), 1] + : (match = /#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/.exec(color)) + ? [17 * parseInt(match[1], 16), 17 * parseInt(match[2], 16), 17 * parseInt(match[3], 16), 1] + : (match = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) + ? [parseInt(match[1]), parseInt(match[2]), parseInt(match[3]), 1] + : (match = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9\.]*)\s*\)/.exec(color)) + ? [parseInt(match[1], 10), parseInt(match[2], 10), parseInt(match[3], 10), parseFloat(match[4])] + : colors[color] || [255, 255, 255, 0] + } + return UI.parallax + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-grid-parallax', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + var parallaxes = [], + checkParallaxes = function () { + requestAnimationFrame(function () { + for (var i = 0; i < parallaxes.length; i++) parallaxes[i].process() + }) + } + function getcolumns (element) { + for ( + var children = element.children(), + first = children.filter(':visible:first'), + top = first[0].offsetTop + first.outerHeight(), + column = 0; + column < children.length && !(children[column].offsetTop >= top); + column++ + ); + return column || 1 + } + UI.component('gridparallax', { + defaults: { target: !1, smooth: 150, translate: 150 }, + boot: function () { + UI.$doc.on('scrolling.uk.document', checkParallaxes), + UI.$win.on( + 'load resize orientationchange', + UI.Utils.debounce(function () { + checkParallaxes() + }, 50) + ), + UI.ready(function (context) { + UI.$('[data-uk-grid-parallax]', context).each(function () { + var parallax = UI.$(this) + parallax.data('gridparallax') || + UI.gridparallax(parallax, UI.Utils.options(parallax.attr('data-uk-grid-parallax'))) + }) + }) + }, + init: function () { + var fn, + $this = this + this.initItems().process(), + parallaxes.push(this), + UI.$win.on( + 'load resize orientationchange', + ((fn = function () { + var columns = getcolumns($this.element) + $this.element.css('margin-bottom', ''), + 1 < columns && + $this.element.css( + 'margin-bottom', + $this.options.translate + parseInt($this.element.css('margin-bottom')) + ) + }), + UI.$(function () { + fn() + }), + UI.Utils.debounce(fn, 50)) + ) + }, + initItems: function () { + var smooth = this.options.smooth + return ( + (this.items = (this.options.target ? this.element.find(this.options.target) : this.element.children()).each( + function () { + UI.$(this).css({ transition: 'transform ' + smooth + 'ms linear', transform: '' }) + } + )), + this + ) + }, + process: function () { + var percent = (function (element) { + var distance, + percent, + top = element.offset().top, + height = element.outerHeight(), + scrolltop = UIkit.$win.scrollTop(), + wh = window.innerHeight + scrolltop + wh < top + ? (percent = 0) + : top + height < scrolltop + ? (percent = 1) + : ((percent = + top + height < wh + ? (scrolltop < wh ? scrolltop : scrolltop - wh) / (top + height) + : ((distance = scrolltop + wh - top), Math.round(distance / ((wh + height) / 100)) / 100)), + top < wh && (percent = (percent * scrolltop) / (top + height - wh))) + return 1 < percent ? 1 : percent + })(this.element), + columns = getcolumns(this.element), + items = this.items, + mods = [columns - 1] + if (1 != columns && percent) { + for (; mods.length < columns && mods[mods.length - 1] - 2; ) mods.push(mods[mods.length - 1] - 2) + var percenttranslate = percent * this.options.translate + items.each(function (idx, ele, translate) { + ;(translate = -1 != mods.indexOf((idx + 1) % columns) ? percenttranslate : percenttranslate / 8), + UI.$(this).css('transform', 'translate3d(0,' + translate + 'px, 0)') + }) + } else items.css('transform', '') + } + }) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-search', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + UI.component('search', { + defaults: { + msgResultsHeader: 'Search Results', + msgMoreResults: 'More Results', + msgNoResults: 'No results found', + template: + '', + renderer: function (data) { + var opts = this.options + this.dropdown.append( + this.template({ + items: data.results || [], + msgResultsHeader: opts.msgResultsHeader, + msgMoreResults: opts.msgMoreResults, + msgNoResults: opts.msgNoResults + }) + ), + this.show() + } + }, + boot: function () { + UI.$html.on('focus.search.uikit', '[data-uk-search]', function (e) { + var ele = UI.$(this) + ele.data('search') || UI.search(ele, UI.Utils.options(ele.attr('data-uk-search'))) + }) + }, + init: function () { + var $this = this + ;(this.autocomplete = UI.autocomplete(this.element, this.options)), + this.autocomplete.dropdown.addClass('uk-dropdown-search'), + this.autocomplete.input + .on('keyup', function () { + $this.element[$this.autocomplete.input.val() ? 'addClass' : 'removeClass']('uk-active') + }) + .closest('form') + .on('reset', function () { + ;($this.value = ''), $this.element.removeClass('uk-active') + }), + this.on('selectitem.uk.autocomplete', function (e, data) { + data.url + ? (location.href = data.url) + : data.moreresults && $this.autocomplete.input.closest('form').submit() + }), + this.element.data('search', this) + } + }) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-slider', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + var dragging, + delayIdle, + anchor, + dragged, + store = {} + return ( + UI.component('slider', { + defaults: { + center: !1, + threshold: 10, + infinite: !0, + autoplay: !1, + autoplayInterval: 7e3, + pauseOnHover: !0, + activecls: 'uk-active' + }, + boot: function () { + UI.ready(function (context) { + setTimeout(function () { + UI.$('[data-uk-slider]', context).each(function () { + var ele = UI.$(this) + ele.data('slider') || UI.slider(ele, UI.Utils.options(ele.attr('data-uk-slider'))) + }) + }, 0) + }) + }, + init: function () { + var $this = this + ;(this.container = this.element.find('.uk-slider')), + (this.focus = 0), + UI.$win.on( + 'resize load', + UI.Utils.debounce(function () { + $this.resize(!0) + }, 100) + ), + this.on('click.uk.slider', '[data-uk-slider-item]', function (e) { + e.preventDefault() + var item = UI.$(this).attr('data-uk-slider-item') + if ($this.focus != item) + switch (($this.stop(), item)) { + case 'next': + case 'previous': + $this['next' == item ? 'next' : 'previous']() + break + default: + $this.updateFocus(parseInt(item, 10)) + } + }), + this.container.on({ + 'touchstart mousedown': function (evt) { + evt.originalEvent && evt.originalEvent.touches && (evt = evt.originalEvent.touches[0]), + (evt.button && 2 == evt.button) || + !$this.active || + ($this.stop(), + (anchor = UI.$(evt.target).is('a') ? UI.$(evt.target) : UI.$(evt.target).parents('a:first')), + (dragged = !1), + anchor.length && + anchor.one('click', function (e) { + dragged && e.preventDefault() + }), + ((delayIdle = function (e) { + ;(dragged = !0), + (dragging = $this), + (store = { + touchx: parseInt(e.pageX, 10), + dir: 1, + focus: $this.focus, + base: $this.options.center ? 'center' : 'area' + }), + e.originalEvent && e.originalEvent.touches && (e = e.originalEvent.touches[0]), + dragging.element.data({ + 'pointer-start': { x: parseInt(e.pageX, 10), y: parseInt(e.pageY, 10) }, + 'pointer-pos-start': $this.pos + }), + $this.container.addClass('uk-drag'), + (delayIdle = !1) + }).x = parseInt(evt.pageX, 10)), + (delayIdle.threshold = $this.options.threshold)) + }, + mouseenter: function () { + $this.options.pauseOnHover && ($this.hovering = !0) + }, + mouseleave: function () { + $this.hovering = !1 + } + }), + this.resize(!0), + this.on('display.uk.check', function () { + $this.element.is(':visible') && $this.resize(!0) + }), + this.element.find('a,img').attr('draggable', 'false'), + this.options.autoplay && this.start() + }, + resize: function (focus) { + var item, + width, + cwidth, + size, + $this = this, + pos = 0, + maxheight = 0 + if ( + ((this.items = this.container.children().filter(':visible')), + (this.vp = this.element[0].getBoundingClientRect().width), + this.container.css({ 'min-width': '', 'min-height': '' }), + this.items.each(function (idx) { + ;(item = UI.$(this)), + (size = item.css({ left: '', width: '' })[0].getBoundingClientRect()), + (width = size.width), + (cwidth = item.width()), + (maxheight = Math.max(maxheight, size.height)), + item + .css({ left: pos, width: width }) + .data({ + idx: idx, + left: pos, + width: width, + cwidth: cwidth, + area: pos + width, + center: pos - ($this.vp / 2 - cwidth / 2) + }), + (pos += width) + }), + this.container.css({ 'min-width': pos, 'min-height': maxheight }), + this.options.infinite && (pos <= 2 * this.vp || this.items.length < 5) && !this.itemsResized) + ) + return ( + this.container + .children() + .each(function (idx) { + $this.container.append( + $this.items + .eq(idx) + .clone(!0) + .attr('id', '') + ) + }) + .each(function (idx) { + $this.container.append( + $this.items + .eq(idx) + .clone(!0) + .attr('id', '') + ) + }), + (this.itemsResized = !0), + this.resize() + ) + ;(this.cw = pos), + (this.pos = 0), + (this.active = pos >= this.vp), + this.container.css({ '-ms-transform': '', '-webkit-transform': '', transform: '' }), + focus && this.updateFocus(this.focus) + }, + updatePos: function (pos) { + ;(this.pos = pos), + this.container.css({ + '-ms-transform': 'translateX(' + pos + 'px)', + '-webkit-transform': 'translateX(' + pos + 'px)', + transform: 'translateX(' + pos + 'px)' + }) + }, + updateFocus: function (idx, dir) { + if (this.active) { + dir = dir || (idx > this.focus ? 1 : -1) + var area, + i, + item = this.items.eq(idx) + if ((this.options.infinite && this.infinite(idx, dir), this.options.center)) + this.updatePos(-1 * item.data('center')), + this.items.filter('.' + this.options.activecls).removeClass(this.options.activecls), + item.addClass(this.options.activecls) + else if (this.options.infinite) this.updatePos(-1 * item.data('left')) + else { + for (area = 0, i = idx; i < this.items.length; i++) area += this.items.eq(i).data('width') + if (area > this.vp) this.updatePos(-1 * item.data('left')) + else if (1 == dir) { + for (area = 0, i = this.items.length - 1; 0 <= i; i--) { + if ((area += this.items.eq(i).data('width')) == this.vp) { + idx = i + break + } + if (area > this.vp) { + idx = i < this.items.length - 1 ? i + 1 : i + break + } + } + area > this.vp + ? this.updatePos(-1 * (this.container.width() - this.vp)) + : this.updatePos(-1 * this.items.eq(idx).data('left')) + } + } + var left = this.items.eq(idx).data('left') + this.items.removeClass('uk-slide-before uk-slide-after').each(function (i) { + i !== idx && UI.$(this).addClass(UI.$(this).data('left') < left ? 'uk-slide-before' : 'uk-slide-after') + }), + (this.focus = idx), + this.trigger('focusitem.uk.slider', [idx, this.items.eq(idx), this]) + } + }, + next: function () { + var focus = this.items[this.focus + 1] ? this.focus + 1 : this.options.infinite ? 0 : this.focus + this.updateFocus(focus, 1) + }, + previous: function () { + var focus = this.items[this.focus - 1] + ? this.focus - 1 + : this.options.infinite + ? this.items[this.focus - 1] + ? this.items - 1 + : this.items.length - 1 + : this.focus + this.updateFocus(focus, -1) + }, + start: function () { + this.stop() + var $this = this + this.interval = setInterval(function () { + $this.hovering || $this.next() + }, this.options.autoplayInterval) + }, + stop: function () { + this.interval && clearInterval(this.interval) + }, + infinite: function (baseidx, direction) { + var i, + $this = this, + item = this.items.eq(baseidx), + z = baseidx, + move = [], + area = 0 + if (1 == direction) { + for ( + i = 0; + i < this.items.length && + (z != baseidx && ((area += this.items.eq(z).data('width')), move.push(this.items.eq(z))), + !(area > this.vp)); + i++ + ) + z = z + 1 == this.items.length ? 0 : z + 1 + move.length && + move.forEach(function (itm) { + var left = item.data('area') + itm + .css({ left: left }) + .data({ + left: left, + area: left + itm.data('width'), + center: left - ($this.vp / 2 - itm.data('cwidth') / 2) + }), + (item = itm) + }) + } else { + for ( + i = this.items.length - 1; + -1 < i && + ((area += this.items.eq(z).data('width')), + z != baseidx && move.push(this.items.eq(z)), + !(area > this.vp)); + i-- + ) + z = z - 1 == -1 ? this.items.length - 1 : z - 1 + move.length && + move.forEach(function (itm) { + var left = item.data('left') - itm.data('width') + itm + .css({ left: left }) + .data({ + left: left, + area: left + itm.data('width'), + center: left - ($this.vp / 2 - itm.data('cwidth') / 2) + }), + (item = itm) + }) + } + } + }), + UI.$doc.on('mousemove.uk.slider touchmove.uk.slider', function (e) { + if ( + (e.originalEvent && e.originalEvent.touches && (e = e.originalEvent.touches[0]), + delayIdle && + Math.abs(e.pageX - delayIdle.x) > delayIdle.threshold && + (window.getSelection().toString() ? (dragging = delayIdle = !1) : delayIdle(e)), + dragging) + ) { + var x, xDiff, pos, dir, focus, item, diff, i, z, itm + if ( + (e.clientX || e.clientY + ? (x = e.clientX) + : (e.pageX || e.pageY) && (x = e.pageX - document.body.scrollLeft - document.documentElement.scrollLeft), + (focus = store.focus), + (xDiff = x - dragging.element.data('pointer-start').x), + (pos = dragging.element.data('pointer-pos-start') + xDiff), + (dir = x > dragging.element.data('pointer-start').x ? -1 : 1), + (item = dragging.items.eq(store.focus)), + 1 == dir) + ) + for (diff = item.data('left') + Math.abs(xDiff), i = 0, z = store.focus; i < dragging.items.length; i++) { + if ( + ((itm = dragging.items.eq(z)), z != store.focus && itm.data('left') < diff && itm.data('area') > diff) + ) { + focus = z + break + } + z = z + 1 == dragging.items.length ? 0 : z + 1 + } + else + for (diff = item.data('left') - Math.abs(xDiff), i = 0, z = store.focus; i < dragging.items.length; i++) { + if ( + ((itm = dragging.items.eq(z)), + z != store.focus && itm.data('area') <= item.data('left') && itm.data('center') < diff) + ) { + focus = z + break + } + z = z - 1 == -1 ? dragging.items.length - 1 : z - 1 + } + dragging.options.infinite && focus != store._focus && dragging.infinite(focus, dir), + dragging.updatePos(pos), + (store.dir = dir), + (store._focus = focus), + (store.touchx = parseInt(e.pageX, 10)), + (store.diff = diff) + } + }), + UI.$doc.on('mouseup.uk.slider touchend.uk.slider', function (e) { + if (dragging) { + dragging.container.removeClass('uk-drag'), dragging.items.eq(store.focus) + var itm, + i, + z, + focus = !1 + if (1 == store.dir) + for (i = 0, z = store.focus; i < dragging.items.length; i++) { + if (((itm = dragging.items.eq(z)), z != store.focus && itm.data('left') > store.diff)) { + focus = z + break + } + z = z + 1 == dragging.items.length ? 0 : z + 1 + } + else + for (i = 0, z = store.focus; i < dragging.items.length; i++) { + if (((itm = dragging.items.eq(z)), z != store.focus && itm.data('left') < store.diff)) { + focus = z + break + } + z = z - 1 == -1 ? dragging.items.length - 1 : z - 1 + } + dragging.updateFocus(!1 !== focus ? focus : store._focus) + } + dragging = delayIdle = !1 + }), + UI.slider + ) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-slideshow', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + var Animations, + playerId = 0 + UI.component('slideshow', { + defaults: { + animation: 'fade', + duration: 500, + height: 'auto', + start: 0, + autoplay: !1, + autoplayInterval: 7e3, + videoautoplay: !0, + videomute: !0, + slices: 15, + pauseOnHover: !0, + kenburns: !1, + kenburnsanimations: [ + 'uk-animation-middle-left', + 'uk-animation-top-right', + 'uk-animation-bottom-left', + 'uk-animation-top-center', + '', + 'uk-animation-bottom-right' + ] + }, + current: !1, + interval: null, + hovering: !1, + boot: function () { + UI.ready(function (context) { + UI.$('[data-uk-slideshow]', context).each(function () { + var slideshow = UI.$(this) + slideshow.data('slideshow') || + UI.slideshow(slideshow, UI.Utils.options(slideshow.attr('data-uk-slideshow'))) + }) + }) + }, + init: function () { + var canvas, + kbanimduration, + $this = this + ;(this.container = this.element.hasClass('uk-slideshow') ? this.element : UI.$(this.find('.uk-slideshow'))), + (this.slides = this.container.children()), + (this.slidesCount = this.slides.length), + (this.current = this.options.start), + (this.animating = !1), + (this.triggers = this.find('[data-uk-slideshow-item]')), + (this.fixFullscreen = + navigator.userAgent.match(/(iPad|iPhone|iPod)/g) && this.container.hasClass('uk-slideshow-fullscreen')), + this.options.kenburns && + ((kbanimduration = !0 === this.options.kenburns ? '15s' : this.options.kenburns), + String(kbanimduration).match(/(ms|s)$/) || (kbanimduration += 'ms'), + 'string' == typeof this.options.kenburnsanimations && + (this.options.kenburnsanimations = this.options.kenburnsanimations.split(','))), + this.slides.each(function (index) { + var slide = UI.$(this), + media = slide.children('img,video,iframe').eq(0) + if ((slide.data('media', media), slide.data('sizer', media), media.length)) { + var placeholder + switch (media[0].nodeName) { + case 'IMG': + var cover = UI.$('
                ').css({ + 'background-image': 'url(' + media.attr('src') + ')' + }) + media.attr('width') && + media.attr('height') && + ((placeholder = UI.$('').attr({ + width: media.attr('width'), + height: media.attr('height') + })), + media.replaceWith(placeholder), + (media = placeholder), + (placeholder = void 0)), + media.css({ width: '100%', height: 'auto', opacity: 0 }), + slide.prepend(cover).data('cover', cover) + break + case 'IFRAME': + var src = media[0].src, + iframeId = 'sw-' + ++playerId + media + .attr('src', '') + .on('load', function () { + if ( + ((index !== $this.current || (index == $this.current && !$this.options.videoautoplay)) && + $this.pausemedia(media), + $this.options.videomute) + ) { + $this.mutemedia(media) + var inv = setInterval( + ((ic = 0), + function () { + $this.mutemedia(media), 4 <= ++ic && clearInterval(inv) + }), + 250 + ) + } + var ic + }) + .data('slideshow', $this) + .attr('data-player-id', iframeId) + .attr( + 'src', + [src, -1 < src.indexOf('?') ? '&' : '?', 'enablejsapi=1&api=1&player_id=' + iframeId].join('') + ) + .addClass('uk-position-absolute'), + UI.support.touch || media.css('pointer-events', 'none'), + (placeholder = !0), + UI.cover && (UI.cover(media), media.attr('data-uk-cover', '{}')) + break + case 'VIDEO': + media.addClass('uk-cover-object uk-position-absolute'), + (placeholder = !0), + $this.options.videomute && $this.mutemedia(media) + } + if (placeholder) { + canvas = UI.$('').attr({ width: media[0].width, height: media[0].height }) + var img = UI.$('').attr('src', canvas[0].toDataURL()) + slide.prepend(img), slide.data('sizer', img) + } + } else slide.data('sizer', slide) + $this.hasKenBurns(slide) && + slide + .data('cover') + .css({ '-webkit-animation-duration': kbanimduration, 'animation-duration': kbanimduration }) + }), + this.on('click.uk.slideshow', '[data-uk-slideshow-item]', function (e) { + e.preventDefault() + var slide = UI.$(this).attr('data-uk-slideshow-item') + if ($this.current != slide) { + switch (slide) { + case 'next': + case 'previous': + $this['next' == slide ? 'next' : 'previous']() + break + default: + $this.show(parseInt(slide, 10)) + } + $this.stop() + } + }), + this.slides + .attr('aria-hidden', 'true') + .eq(this.current) + .addClass('uk-active') + .attr('aria-hidden', 'false'), + this.triggers.filter('[data-uk-slideshow-item="' + this.current + '"]').addClass('uk-active'), + UI.$win.on( + 'resize load', + UI.Utils.debounce(function () { + $this.resize(), + $this.fixFullscreen && + ($this.container.css('height', window.innerHeight), $this.slides.css('height', window.innerHeight)) + }, 100) + ), + setTimeout(function () { + $this.resize() + }, 80), + this.options.autoplay && this.start(), + this.options.videoautoplay && + this.slides.eq(this.current).data('media') && + this.playmedia(this.slides.eq(this.current).data('media')), + this.options.kenburns && this.applyKenBurns(this.slides.eq(this.current)), + this.container.on({ + mouseenter: function () { + $this.options.pauseOnHover && ($this.hovering = !0) + }, + mouseleave: function () { + $this.hovering = !1 + } + }), + this.on('swipeRight swipeLeft', function (e) { + $this['swipeLeft' == e.type ? 'next' : 'previous']() + }), + this.on('display.uk.check', function () { + $this.element.is(':visible') && + ($this.resize(), + $this.fixFullscreen && + ($this.container.css('height', window.innerHeight), $this.slides.css('height', window.innerHeight))) + }) + }, + resize: function () { + if (!this.container.hasClass('uk-slideshow-fullscreen')) { + var height = this.options.height + 'auto' === this.options.height && + ((height = 0), + this.slides.css('height', '').each(function () { + height = Math.max(height, UI.$(this).height()) + })), + this.container.css('height', height), + this.slides.css('height', height) + } + }, + show: function (index, direction) { + if (!this.animating && this.current != index) { + this.animating = !0 + var $this = this, + current = this.slides.eq(this.current), + next = this.slides.eq(index), + dir = direction || (this.current < index ? 1 : -1), + currentmedia = current.data('media'), + animation = Animations[this.options.animation] ? this.options.animation : 'fade', + nextmedia = next.data('media') + $this.applyKenBurns(next), + UI.support.animation || (animation = 'none'), + (current = UI.$(current)), + (next = UI.$(next)), + $this.trigger('beforeshow.uk.slideshow', [next, current, $this]), + Animations[animation].apply(this, [current, next, dir]).then(function () { + $this.animating && + (currentmedia && currentmedia.is('video,iframe') && $this.pausemedia(currentmedia), + nextmedia && nextmedia.is('video,iframe') && $this.playmedia(nextmedia), + next.addClass('uk-active').attr('aria-hidden', 'false'), + current.removeClass('uk-active').attr('aria-hidden', 'true'), + ($this.animating = !1), + ($this.current = index), + UI.Utils.checkDisplay(next, '[class*="uk-animation-"]:not(.uk-cover-background.uk-position-cover)'), + $this.trigger('show.uk.slideshow', [next, current, $this])) + }), + $this.triggers.removeClass('uk-active'), + $this.triggers.filter('[data-uk-slideshow-item="' + index + '"]').addClass('uk-active') + } + }, + applyKenBurns: function (slide) { + if (this.hasKenBurns(slide)) { + var animations = this.options.kenburnsanimations, + index = this.kbindex || 0 + slide + .data('cover') + .attr('class', 'uk-cover-background uk-position-cover') + .width(), + slide + .data('cover') + .addClass(['uk-animation-scale', 'uk-animation-reverse', animations[index].trim()].join(' ')), + (this.kbindex = animations[index + 1] ? index + 1 : 0) + } + }, + hasKenBurns: function (slide) { + return this.options.kenburns && slide.data('cover') + }, + next: function () { + this.show(this.slides[this.current + 1] ? this.current + 1 : 0, 1) + }, + previous: function () { + this.show(this.slides[this.current - 1] ? this.current - 1 : this.slides.length - 1, -1) + }, + start: function () { + this.stop() + var $this = this + this.interval = setInterval(function () { + $this.hovering || $this.next() + }, this.options.autoplayInterval) + }, + stop: function () { + this.interval && clearInterval(this.interval) + }, + playmedia: function (media) { + if (media && media[0]) + switch (media[0].nodeName) { + case 'VIDEO': + this.options.videomute || (media[0].muted = !1), media[0].play() + break + case 'IFRAME': + this.options.videomute || + media[0].contentWindow.postMessage( + '{ "event": "command", "func": "unmute", "method":"setVolume", "value":1}', + '*' + ), + media[0].contentWindow.postMessage('{ "event": "command", "func": "playVideo", "method":"play"}', '*') + } + }, + pausemedia: function (media) { + switch (media[0].nodeName) { + case 'VIDEO': + media[0].pause() + break + case 'IFRAME': + media[0].contentWindow.postMessage('{ "event": "command", "func": "pauseVideo", "method":"pause"}', '*') + } + }, + mutemedia: function (media) { + switch (media[0].nodeName) { + case 'VIDEO': + media[0].muted = !0 + break + case 'IFRAME': + media[0].contentWindow.postMessage( + '{ "event": "command", "func": "mute", "method":"setVolume", "value":0}', + '*' + ) + } + } + }), + (Animations = { + none: function () { + var d = UI.$.Deferred() + return d.resolve(), d.promise() + }, + scroll: function (current, next, dir) { + var d = UI.$.Deferred() + return ( + current.css('animation-duration', this.options.duration + 'ms'), + next.css('animation-duration', this.options.duration + 'ms'), + next.css('opacity', 1).one( + UI.support.animation.end, + function () { + current.removeClass(-1 == dir ? 'uk-slideshow-scroll-backward-out' : 'uk-slideshow-scroll-forward-out'), + next + .css('opacity', '') + .removeClass(-1 == dir ? 'uk-slideshow-scroll-backward-in' : 'uk-slideshow-scroll-forward-in'), + d.resolve() + }.bind(this) + ), + current.addClass(-1 == dir ? 'uk-slideshow-scroll-backward-out' : 'uk-slideshow-scroll-forward-out'), + next.addClass(-1 == dir ? 'uk-slideshow-scroll-backward-in' : 'uk-slideshow-scroll-forward-in'), + next.width(), + d.promise() + ) + }, + swipe: function (current, next, dir) { + var d = UI.$.Deferred() + return ( + current.css('animation-duration', this.options.duration + 'ms'), + next.css('animation-duration', this.options.duration + 'ms'), + next.css('opacity', 1).one( + UI.support.animation.end, + function () { + current.removeClass(-1 === dir ? 'uk-slideshow-swipe-backward-out' : 'uk-slideshow-swipe-forward-out'), + next + .css('opacity', '') + .removeClass(-1 === dir ? 'uk-slideshow-swipe-backward-in' : 'uk-slideshow-swipe-forward-in'), + d.resolve() + }.bind(this) + ), + current.addClass(-1 == dir ? 'uk-slideshow-swipe-backward-out' : 'uk-slideshow-swipe-forward-out'), + next.addClass(-1 == dir ? 'uk-slideshow-swipe-backward-in' : 'uk-slideshow-swipe-forward-in'), + next.width(), + d.promise() + ) + }, + scale: function (current, next, dir) { + var d = UI.$.Deferred() + return ( + current.css('animation-duration', this.options.duration + 'ms'), + next.css('animation-duration', this.options.duration + 'ms'), + next.css('opacity', 1), + current.one( + UI.support.animation.end, + function () { + current.removeClass('uk-slideshow-scale-out'), next.css('opacity', ''), d.resolve() + }.bind(this) + ), + current.addClass('uk-slideshow-scale-out'), + current.width(), + d.promise() + ) + }, + fade: function (current, next, dir) { + var d = UI.$.Deferred() + return ( + current.css('animation-duration', this.options.duration + 'ms'), + next.css('animation-duration', this.options.duration + 'ms'), + next.css('opacity', 1), + next.data('cover') || + next.data('placeholder') || + next + .css('opacity', 1) + .one(UI.support.animation.end, function () { + next.removeClass('uk-slideshow-fade-in') + }) + .addClass('uk-slideshow-fade-in'), + current.one( + UI.support.animation.end, + function () { + current.removeClass('uk-slideshow-fade-out'), next.css('opacity', ''), d.resolve() + }.bind(this) + ), + current.addClass('uk-slideshow-fade-out'), + current.width(), + d.promise() + ) + } + }), + (UI.slideshow.animations = Animations), + window.addEventListener( + 'message', + function (e) { + var iframe, + data = e.data + if ('string' == typeof data) + try { + data = JSON.parse(data) + } catch (err) { + data = {} + } + e.origin && + -1 < e.origin.indexOf('vimeo') && + 'ready' == data.event && + data.player_id && + (iframe = UI.$('[data-player-id="' + data.player_id + '"]')).length && + iframe.data('slideshow').mutemedia(iframe) + }, + !1 + ) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-slideshow-fx', ['uikit', 'uikit-slideshow'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + var Animations = UI.slideshow.animations + UI.$.extend(UI.slideshow.animations, { + slice: function (current, next, dir, fromfx) { + if (!current.data('cover')) return Animations.fade.apply(this, arguments) + for ( + var bar, + d = UI.$.Deferred(), + sliceWidth = Math.ceil(this.element.width() / this.options.slices), + bgimage = next.data('cover').css('background-image'), + ghost = UI.$('
              • ').css({ + top: 0, + left: 0, + width: this.container.width(), + height: this.container.height(), + opacity: 1, + zIndex: 15 + }), + ghostWidth = ghost.width(), + ghostHeight = ghost.height(), + i = 0; + i < this.options.slices; + i++ + ) { + 'slice-up-down' == fromfx && (((i % 2) + 2) % 2 == 0 ? '0' : ghostHeight) + var clipfrom, + width = (this.options.slices, sliceWidth), + clipto = 'rect(0px, ' + width * (i + 1) + 'px, ' + ghostHeight + 'px, ' + sliceWidth * i + 'px)' + ;(clipfrom = 'rect(0px, ' + width * (i + 1) + 'px, 0px, ' + sliceWidth * i + 'px)'), + ('slice-up' == fromfx || ('slice-up-down' == fromfx && ((i % 2) + 2) % 2 == 0)) && + (clipfrom = + 'rect(' + + ghostHeight + + 'px, ' + + width * (i + 1) + + 'px, ' + + ghostHeight + + 'px, ' + + sliceWidth * i + + 'px)'), + (bar = UI.$('
                ') + .css({ + position: 'absolute', + top: 0, + left: 0, + width: ghostWidth, + height: ghostHeight, + 'background-image': bgimage, + clip: clipfrom, + opacity: 0, + transition: 'all ' + this.options.duration + 'ms ease-in-out ' + 60 * i + 'ms', + '-webkit-transition': 'all ' + this.options.duration + 'ms ease-in-out ' + 60 * i + 'ms' + }) + .data('clip', clipto)), + ghost.append(bar) + } + return ( + this.container.append(ghost), + ghost + .children() + .last() + .on(UI.support.transition.end, function () { + ghost.remove(), d.resolve() + }), + ghost.width(), + ghost.children().each(function () { + var bar = UI.$(this) + bar.css({ clip: bar.data('clip'), opacity: 1 }) + }), + d.promise() + ) + }, + 'slice-up': function (current, next, dir) { + return Animations.slice.apply(this, [current, next, dir, 'slice-up']) + }, + 'slice-down': function (current, next, dir) { + return Animations.slice.apply(this, [current, next, dir, 'slice-down']) + }, + 'slice-up-down': function (current, next, dir) { + return Animations.slice.apply(this, [current, next, dir, 'slice-up-down']) + }, + fold: function (current, next, dir) { + if (!next.data('cover')) return Animations.fade.apply(this, arguments) + for ( + var bar, + d = UI.$.Deferred(), + sliceWidth = Math.ceil(this.element.width() / this.options.slices), + bgimage = next.data('cover').css('background-image'), + ghost = UI.$('
              • ').css({ width: next.width(), height: next.height(), opacity: 1, zIndex: 15 }), + ghostWidth = next.width(), + ghostHeight = next.height(), + i = 0; + i < this.options.slices; + i++ + ) + (bar = UI.$('
                ').css({ + position: 'absolute', + top: 0, + left: 0, + width: ghostWidth, + height: ghostHeight, + 'background-image': bgimage, + 'transform-origin': sliceWidth * i + 'px 0 0', + clip: 'rect(0px, ' + sliceWidth * (i + 1) + 'px, ' + ghostHeight + 'px, ' + sliceWidth * i + 'px)', + opacity: 0, + transform: 'scaleX(0.000001)', + transition: 'all ' + this.options.duration + 'ms ease-in-out ' + (100 + 60 * i) + 'ms', + '-webkit-transition': 'all ' + this.options.duration + 'ms ease-in-out ' + (100 + 60 * i) + 'ms' + })), + ghost.prepend(bar) + return ( + this.container.append(ghost), + ghost.width(), + ghost + .children() + .first() + .on(UI.support.transition.end, function () { + ghost.remove(), d.resolve() + }) + .end() + .css({ transform: 'scaleX(1)', opacity: 1 }), + d.promise() + ) + }, + puzzle: function (current, next, dir) { + if (!next.data('cover')) return Animations.fade.apply(this, arguments) + for ( + var box, + rect, + d = UI.$.Deferred(), + $this = this, + boxCols = Math.round(this.options.slices / 2), + boxWidth = Math.round(next.width() / boxCols), + boxRows = Math.round(next.height() / boxWidth), + boxHeight = Math.round(next.height() / boxRows) + 1, + bgimage = next.data('cover').css('background-image'), + ghost = UI.$('
              • ').css({ + width: this.container.width(), + height: this.container.height(), + opacity: 1, + zIndex: 15 + }), + ghostWidth = this.container.width(), + ghostHeight = this.container.height(), + rows = 0; + rows < boxRows; + rows++ + ) + for (var cols = 0; cols < boxCols; cols++) + (rect = [ + boxHeight * rows + 'px', + (cols == boxCols - 1 ? boxWidth + 2 : boxWidth) * (cols + 1) + 'px', + boxHeight * (rows + 1) + 'px', + boxWidth * cols + 'px' + ]), + (box = UI.$('
                ').css({ + position: 'absolute', + top: 0, + left: 0, + opacity: 0, + width: ghostWidth, + height: ghostHeight, + 'background-image': bgimage, + clip: 'rect(' + rect.join(',') + ')', + '-webkit-transform': 'translateZ(0)', + transform: 'translateZ(0)' + })), + ghost.append(box) + this.container.append(ghost) + var boxes = shuffle(ghost.children()) + return ( + boxes + .each(function (i) { + UI.$(this).css({ + transition: 'all ' + $this.options.duration + 'ms ease-in-out ' + (50 + 25 * i) + 'ms', + '-webkit-transition': 'all ' + $this.options.duration + 'ms ease-in-out ' + (50 + 25 * i) + 'ms' + }) + }) + .last() + .on(UI.support.transition.end, function () { + ghost.remove(), d.resolve() + }), + ghost.width(), + boxes.css({ opacity: 1 }), + d.promise() + ) + }, + boxes: function (current, next, dir, fromfx) { + if (!next.data('cover')) return Animations.fade.apply(this, arguments) + for ( + var box, + rect, + cols, + d = UI.$.Deferred(), + boxCols = Math.round(this.options.slices / 2), + boxWidth = Math.round(next.width() / boxCols), + boxRows = Math.round(next.height() / boxWidth), + boxHeight = Math.round(next.height() / boxRows) + 1, + bgimage = next.data('cover').css('background-image'), + ghost = UI.$('
              • ').css({ width: next.width(), height: next.height(), opacity: 1, zIndex: 15 }), + ghostWidth = next.width(), + ghostHeight = next.height(), + rows = 0; + rows < boxRows; + rows++ + ) + for (cols = 0; cols < boxCols; cols++) + (rect = [ + boxHeight * rows + 'px', + (cols == boxCols - 1 ? boxWidth + 2 : boxWidth) * (cols + 1) + 'px', + boxHeight * (rows + 1) + 'px', + boxWidth * cols + 'px' + ]), + (box = UI.$('
                ').css({ + position: 'absolute', + top: 0, + left: 0, + opacity: 1, + width: ghostWidth, + height: ghostHeight, + 'background-image': bgimage, + 'transform-origin': rect[3] + ' ' + rect[0] + ' 0', + clip: 'rect(' + rect.join(',') + ')', + '-webkit-transform': 'scale(0.0000000000000001)', + transform: 'scale(0.0000000000000001)' + })), + ghost.append(box) + this.container.append(ghost) + var prevCol, + rowIndex = 0, + colIndex = 0, + timeBuff = 0, + box2Darr = [[]], + boxes = ghost.children() + for ( + 'boxes-reverse' == fromfx && (boxes = [].reverse.apply(boxes)), + boxes.each(function () { + ;(box2Darr[rowIndex][colIndex] = UI.$(this)), + ++colIndex == boxCols && ((colIndex = 0), (box2Darr[++rowIndex] = [])) + }), + prevCol = cols = 0; + cols < boxCols * boxRows; + cols++ + ) { + prevCol = cols + for (var row = 0; row < boxRows; row++) + 0 <= prevCol && + prevCol < boxCols && + box2Darr[row][prevCol].css({ + transition: 'all ' + this.options.duration + 'ms linear ' + (50 + timeBuff) + 'ms', + '-webkit-transition': 'all ' + this.options.duration + 'ms linear ' + (50 + timeBuff) + 'ms' + }), + prevCol-- + timeBuff += 100 + } + return ( + boxes.last().on(UI.support.transition.end, function () { + ghost.remove(), d.resolve() + }), + ghost.width(), + boxes.css({ '-webkit-transform': 'scale(1)', transform: 'scale(1)' }), + d.promise() + ) + }, + 'boxes-reverse': function (current, next, dir) { + return Animations.boxes.apply(this, [current, next, dir, 'boxes-reverse']) + }, + 'random-fx': function () { + var animations = ['slice-up', 'fold', 'puzzle', 'slice-down', 'boxes', 'slice-up-down', 'boxes-reverse'] + return ( + (this.fxIndex = (void 0 === this.fxIndex ? -1 : this.fxIndex) + 1), + animations[this.fxIndex] || (this.fxIndex = 0), + Animations[animations[this.fxIndex]].apply(this, arguments) + ) + } + }) + var shuffle = function (arr) { + for (var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x); + return arr + } + return UI.slideshow.animations + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-sortable', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + var draggingPlaceholder, + currentlyDraggingElement, + currentlyDraggingTarget, + moving, + delayIdle, + touchedlists, + moved, + overElement, + supportsTouch = 'ontouchstart' in window || (window.DocumentTouch && document instanceof DocumentTouch) + return ( + UI.component('sortable', { + defaults: { + animation: 150, + threshold: 10, + childClass: 'uk-sortable-item', + placeholderClass: 'uk-sortable-placeholder', + overClass: 'uk-sortable-over', + draggingClass: 'uk-sortable-dragged', + dragMovingClass: 'uk-sortable-moving', + baseClass: 'uk-sortable', + noDragClass: 'uk-sortable-nodrag', + emptyClass: 'uk-sortable-empty', + dragCustomClass: '', + handleClass: !1, + group: !1, + stop: function () {}, + start: function () {}, + change: function () {} + }, + boot: function () { + UI.ready(function (context) { + UI.$('[data-uk-sortable]', context).each(function () { + var ele = UI.$(this) + ele.data('sortable') || UI.sortable(ele, UI.Utils.options(ele.attr('data-uk-sortable'))) + }) + }), + UI.$html.on('mousemove touchmove', function (e) { + if (delayIdle) { + var src = e.originalEvent.targetTouches ? e.originalEvent.targetTouches[0] : e + ;(Math.abs(src.pageX - delayIdle.pos.x) > delayIdle.threshold || + Math.abs(src.pageY - delayIdle.pos.y) > delayIdle.threshold) && + delayIdle.apply(src) + } + if (draggingPlaceholder) { + moving || + ((moving = !0), + draggingPlaceholder.show(), + draggingPlaceholder.$current.addClass(draggingPlaceholder.$sortable.options.placeholderClass), + draggingPlaceholder.$sortable.element + .children() + .addClass(draggingPlaceholder.$sortable.options.childClass), + UI.$html.addClass(draggingPlaceholder.$sortable.options.dragMovingClass)) + var offset = draggingPlaceholder.data('mouse-offset'), + left = parseInt(e.originalEvent.pageX, 10) + offset.left, + top = parseInt(e.originalEvent.pageY, 10) + offset.top + if ( + (draggingPlaceholder.css({ left: left, top: top }), + top + draggingPlaceholder.height() / 3 > document.body.offsetHeight) + ) + return + top < UI.$win.scrollTop() + ? UI.$win.scrollTop(UI.$win.scrollTop() - Math.ceil(draggingPlaceholder.height() / 3)) + : top + draggingPlaceholder.height() / 3 > window.innerHeight + UI.$win.scrollTop() && + UI.$win.scrollTop(UI.$win.scrollTop() + Math.ceil(draggingPlaceholder.height() / 3)) + } + }), + UI.$html.on('mouseup touchend', function (e) { + if (((delayIdle = !1), currentlyDraggingElement && draggingPlaceholder)) { + var sortable = (function (ele) { + ele = UI.$(ele) + do { + if (ele.data('sortable')) return ele + ele = UI.$(ele).parent() + } while (ele.length) + return ele + })(currentlyDraggingElement), + component = draggingPlaceholder.$sortable, + ev = { type: e.type } + sortable[0] && component.dragDrop(ev, component.element), component.dragEnd(ev, component.element) + } else currentlyDraggingElement = draggingPlaceholder = null + }) + }, + init: function () { + var $this = this, + element = this.element[0] + ;(touchedlists = []), + this.checkEmptyList(), + this.element.data( + 'sortable-group', + this.options.group ? this.options.group : UI.Utils.uid('sortable-group') + ) + var handleDragStart = delegate(function (e) { + if (!e.data || !e.data.sortable) { + var $target = UI.$(e.target), + $link = $target.is('a[href]') ? $target : $target.parents('a[href]') + if (!$target.is(':input')) + return ( + e.preventDefault(), + !supportsTouch && + $link.length && + $link + .one('click', function (e) { + e.preventDefault() + }) + .one('mouseup', function () { + moved || $link.trigger('click') + }), + (e.data = e.data || {}), + (e.data.sortable = element), + $this.dragStart(e, this) + ) + } + }), + handleDragEnter = delegate( + UI.Utils.debounce(function (e) { + return $this.dragEnter(e, this) + }) + ), + handleDragLeave = delegate(function (e) { + var previousCounter = $this.dragenterData(this) + $this.dragenterData(this, previousCounter - 1), + $this.dragenterData(this) || + (UI.$(this).removeClass($this.options.overClass), $this.dragenterData(this, !1)) + }), + handleTouchMove = delegate(function (e) { + return ( + !currentlyDraggingElement || + currentlyDraggingElement === this || + currentlyDraggingTarget === this || + ($this.element.children().removeClass($this.options.overClass), + (currentlyDraggingTarget = this), + $this.moveElementNextTo(currentlyDraggingElement, this), + (function (e) { + e.stopPropagation && e.stopPropagation() + e.preventDefault && e.preventDefault() + e.returnValue = !1 + })(e)) + ) + }) + function delegate (fn) { + return function (e) { + var target, context + e && + ((target = ((supportsTouch && e.touches && e.touches[0]) || {}).target || e.target), + supportsTouch && + document.elementFromPoint && + (target = document.elementFromPoint( + e.pageX - document.body.scrollLeft, + e.pageY - document.body.scrollTop + )), + (overElement = UI.$(target))), + UI.$(target).hasClass($this.options.childClass) + ? fn.apply(target, [e]) + : target !== element && + (context = (function (parent, child) { + var cur = child + if (cur == parent) return null + for (; cur; ) { + if (cur.parentNode === parent) return cur + if (!(cur = cur.parentNode) || !cur.ownerDocument || 11 === cur.nodeType) break + } + return null + })(element, target)) && + fn.apply(context, [e]) + } + } + ;(this.addDragHandlers = function () { + supportsTouch + ? element.addEventListener('touchmove', handleTouchMove, !1) + : (element.addEventListener('mouseover', handleDragEnter, !1), + element.addEventListener('mouseout', handleDragLeave, !1)) + }), + (this.removeDragHandlers = function () { + supportsTouch + ? element.removeEventListener('touchmove', handleTouchMove, !1) + : (element.removeEventListener('mouseover', handleDragEnter, !1), + element.removeEventListener('mouseout', handleDragLeave, !1)) + }), + window.addEventListener( + supportsTouch ? 'touchmove' : 'mousemove', + function (e) { + currentlyDraggingElement && $this.dragMove(e, $this) + }, + !1 + ), + element.addEventListener(supportsTouch ? 'touchstart' : 'mousedown', handleDragStart, !1) + }, + dragStart: function (e, elem) { + moving = moved = !1 + var $this = this, + target = UI.$(e.target) + if (supportsTouch || 2 != e.button) { + if ($this.options.handleClass) + if ( + !(target.hasClass($this.options.handleClass) + ? target + : target.closest('.' + $this.options.handleClass, $this.element) + ).length + ) + return + if ( + !target.is('.' + $this.options.noDragClass) && + !target.closest('.' + $this.options.noDragClass).length && + !target.is(':input') + ) { + ;(currentlyDraggingElement = elem), draggingPlaceholder && draggingPlaceholder.remove() + var $current = UI.$(currentlyDraggingElement), + offset = $current.offset() + delayIdle = { + pos: { x: e.pageX, y: e.pageY }, + threshold: $this.options.threshold, + apply: function (evt) { + ;((draggingPlaceholder = UI.$( + '
                ' + ) + .css({ + display: 'none', + top: offset.top, + left: offset.left, + width: $current.width(), + height: $current.height(), + padding: $current.css('padding') + }) + .data({ + 'mouse-offset': { + left: offset.left - parseInt(evt.pageX, 10), + top: offset.top - parseInt(evt.pageY, 10) + }, + origin: $this.element, + index: $current.index() + }) + .append($current.html()) + .appendTo('body')).$current = $current), + (draggingPlaceholder.$sortable = $this), + $current.data({ + 'start-list': $current.parent(), + 'start-index': $current.index(), + 'sortable-group': $this.options.group + }), + $this.addDragHandlers(), + $this.options.start(this, currentlyDraggingElement), + $this.trigger('start.uk.sortable', [$this, currentlyDraggingElement]), + (delayIdle = !(moved = !0)) + } + } + } + } + }, + dragMove: function (e, elem) { + var overChild, + overRoot = (overElement = UI.$( + document.elementFromPoint( + e.pageX - (document.body.scrollLeft || document.scrollLeft || 0), + e.pageY - (document.body.scrollTop || document.documentElement.scrollTop || 0) + ) + )).closest('.' + this.options.baseClass), + groupOver = overRoot.data('sortable-group'), + $current = UI.$(currentlyDraggingElement), + currentRoot = $current.parent(), + groupCurrent = $current.data('sortable-group') + overRoot[0] !== currentRoot[0] && + void 0 !== groupCurrent && + groupOver === groupCurrent && + (overRoot.data('sortable').addDragHandlers(), + touchedlists.push(overRoot), + overRoot.children().addClass(this.options.childClass), + 0 < overRoot.children().length + ? (overChild = overElement.closest('.' + this.options.childClass)).length + ? overChild.before($current) + : overRoot.append($current) + : overElement.append($current), + UIkit.$doc.trigger('mouseover')), + this.checkEmptyList(), + this.checkEmptyList(currentRoot) + }, + dragEnter: function (e, elem) { + if (!currentlyDraggingElement || currentlyDraggingElement === elem) return !0 + var previousCounter = this.dragenterData(elem) + if ((this.dragenterData(elem, previousCounter + 1), 0 === previousCounter)) { + var currentlist = UI.$(elem).parent(), + startlist = UI.$(currentlyDraggingElement).data('start-list') + if (currentlist[0] !== startlist[0]) { + var groupOver = currentlist.data('sortable-group'), + groupCurrent = UI.$(currentlyDraggingElement).data('sortable-group') + if ((groupOver || groupCurrent) && groupOver != groupCurrent) return !1 + } + UI.$(elem).addClass(this.options.overClass), this.moveElementNextTo(currentlyDraggingElement, elem) + } + return !1 + }, + dragEnd: function (e, elem) { + var $this = this + currentlyDraggingElement && (this.options.stop(elem), this.trigger('stop.uk.sortable', [this])), + (currentlyDraggingTarget = currentlyDraggingElement = null), + touchedlists.push(this.element), + touchedlists.forEach(function (el, i) { + UI.$(el) + .children() + .each(function () { + 1 === this.nodeType && + (UI.$(this) + .removeClass($this.options.overClass) + .removeClass($this.options.placeholderClass) + .removeClass($this.options.childClass), + $this.dragenterData(this, !1)) + }) + }), + (touchedlists = []), + UI.$html.removeClass(this.options.dragMovingClass), + this.removeDragHandlers(), + draggingPlaceholder && (draggingPlaceholder.remove(), (draggingPlaceholder = null)) + }, + dragDrop: function (e, elem) { + 'drop' === e.type && (e.stopPropagation && e.stopPropagation(), e.preventDefault && e.preventDefault()), + this.triggerChangeEvents() + }, + triggerChangeEvents: function () { + if (currentlyDraggingElement) { + var $current = UI.$(currentlyDraggingElement), + oldRoot = draggingPlaceholder.data('origin'), + newRoot = $current.closest('.' + this.options.baseClass), + triggers = [], + el = UI.$(currentlyDraggingElement) + oldRoot[0] === newRoot[0] && draggingPlaceholder.data('index') != $current.index() + ? triggers.push({ sortable: this, mode: 'moved' }) + : oldRoot[0] != newRoot[0] && + triggers.push( + { sortable: UI.$(newRoot).data('sortable'), mode: 'added' }, + { sortable: UI.$(oldRoot).data('sortable'), mode: 'removed' } + ), + triggers.forEach(function (trigger, i) { + trigger.sortable && + trigger.sortable.element.trigger('change.uk.sortable', [trigger.sortable, el, trigger.mode]) + }) + } + }, + dragenterData: function (element, val) { + if (((element = UI.$(element)), 1 == arguments.length)) + return parseInt(element.data('child-dragenter'), 10) || 0 + val ? element.data('child-dragenter', Math.max(0, val)) : element.removeData('child-dragenter') + }, + moveElementNextTo: function (element, elementToMoveNextTo) { + !0 + var $this = this, + list = UI.$(element) + .parent() + .css('min-height', ''), + next = (function (el1, el2) { + var parent = el1.parentNode + if (el2.parentNode != parent) return !1 + var cur = el1.previousSibling + for (; cur && 9 !== cur.nodeType; ) { + if (cur === el2) return !0 + cur = cur.previousSibling + } + return !1 + })(element, elementToMoveNextTo) + ? elementToMoveNextTo + : elementToMoveNextTo.nextSibling, + children = list.children(), + count = children.length + if (!$this.options.animation) + return ( + elementToMoveNextTo.parentNode.insertBefore(element, next), + void UI.Utils.checkDisplay($this.element.parent()) + ) + list.css('min-height', list.height()), + children.stop().each(function () { + var ele = UI.$(this), + offset = ele.position() + ;(offset.width = ele.width()), ele.data('offset-before', offset) + }), + elementToMoveNextTo.parentNode.insertBefore(element, next), + UI.Utils.checkDisplay($this.element.parent()), + (children = list + .children() + .each(function () { + var ele = UI.$(this) + ele.data('offset-after', ele.position()) + }) + .each(function () { + var ele = UI.$(this), + before = ele.data('offset-before') + ele.css({ position: 'absolute', top: before.top, left: before.left, 'min-width': before.width }) + })).each(function () { + var ele = UI.$(this), + offset = (ele.data('offset-before'), ele.data('offset-after')) + ele.css('pointer-events', 'none').width(), + setTimeout(function () { + ele.animate({ top: offset.top, left: offset.left }, $this.options.animation, function () { + ele + .css({ position: '', top: '', left: '', 'min-width': '', 'pointer-events': '' }) + .removeClass($this.options.overClass) + .removeData('child-dragenter'), + --count || (list.css('min-height', ''), UI.Utils.checkDisplay($this.element.parent())) + }) + }, 0) + }) + }, + serialize: function () { + var item, + attribute, + data = [] + return ( + this.element.children().each(function (j, child) { + item = {} + for (var i = 0; i < child.attributes.length; i++) + 0 === (attribute = child.attributes[i]).name.indexOf('data-') && + (item[attribute.name.substr(5)] = UI.Utils.str2json(attribute.value)) + data.push(item) + }), + data + ) + }, + checkEmptyList: function (list) { + ;(list = list ? UI.$(list) : this.element), + this.options.emptyClass && + list[list.children().length ? 'removeClass' : 'addClass'](this.options.emptyClass) + } + }), + UI.sortable + ) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-sticky', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + var $win = UI.$win, + $doc = UI.$doc, + sticked = [], + direction = 1 + function checkscrollposition (direction) { + var stickies = arguments.length ? arguments : sticked + if (stickies.length && !($win.scrollTop() < 0)) + for ( + var newTop, + containerBottom, + stickyHeight, + sticky, + scrollTop = $win.scrollTop(), + documentHeight = $doc.height(), + dwh = documentHeight - $win.height(), + extra = dwh < scrollTop ? dwh - scrollTop : 0, + i = 0; + i < stickies.length; + i++ + ) + if ((sticky = stickies[i]).element.is(':visible') && !sticky.animate) { + if (sticky.check()) { + if ( + ((newTop = + sticky.top < 0 + ? 0 + : (newTop = + documentHeight - + (stickyHeight = sticky.element.outerHeight()) - + sticky.top - + sticky.options.bottom - + scrollTop - + extra) < 0 + ? newTop + sticky.top + : sticky.top), + sticky.boundary && sticky.boundary.length) + ) { + var bTop = sticky.boundary.offset().top + ;(containerBottom = sticky.boundtoparent + ? documentHeight - + (bTop + sticky.boundary.outerHeight()) + + parseInt(sticky.boundary.css('padding-bottom')) + : documentHeight - bTop - parseInt(sticky.boundary.css('margin-top'))), + (newTop = + scrollTop + stickyHeight > documentHeight - containerBottom - (sticky.top < 0 ? 0 : sticky.top) + ? documentHeight - containerBottom - (scrollTop + stickyHeight) + : newTop) + } + if (sticky.currentTop != newTop) { + if ( + (sticky.element.css({ + position: 'fixed', + top: newTop, + width: sticky.getWidthFrom.length ? sticky.getWidthFrom.width() : sticky.element.width() + }), + !sticky.init && + (sticky.element.addClass(sticky.options.clsinit), + location.hash && 0 < scrollTop && sticky.options.target)) + ) { + var $target = UI.$(location.hash) + $target.length && + setTimeout( + (function ($target, sticky) { + return function () { + sticky.element.width() + var offset = $target.offset(), + maxoffset = offset.top + $target.outerHeight(), + stickyOffset = sticky.element.offset(), + stickyHeight = sticky.element.outerHeight(), + stickyMaxOffset = stickyOffset.top + stickyHeight + stickyOffset.top < maxoffset && + offset.top < stickyMaxOffset && + ((scrollTop = offset.top - stickyHeight - sticky.options.target), + window.scrollTo(0, scrollTop)) + } + })($target, sticky), + 0 + ) + } + sticky.element.addClass(sticky.options.clsactive).removeClass(sticky.options.clsinactive), + sticky.element.trigger('active.uk.sticky'), + sticky.element.css('margin', ''), + sticky.options.animation && + sticky.init && + !UI.Utils.isInView(sticky.wrapper) && + sticky.element.addClass(sticky.options.animation), + (sticky.currentTop = newTop) + } + } else null !== sticky.currentTop && sticky.reset() + sticky.init = !0 + } + } + return ( + UI.component('sticky', { + defaults: { + top: 0, + bottom: 0, + animation: '', + clsinit: 'uk-sticky-init', + clsactive: 'uk-active', + clsinactive: '', + getWidthFrom: '', + showup: !1, + boundary: !1, + media: !1, + target: !1, + disabled: !1 + }, + boot: function () { + UI.$doc.on('scrolling.uk.document', function (e, data) { + data && data.dir && ((direction = data.dir.y), checkscrollposition()) + }), + UI.$win.on( + 'resize orientationchange', + UI.Utils.debounce(function () { + if (sticked.length) { + for (var i = 0; i < sticked.length; i++) sticked[i].reset(!0) + checkscrollposition() + } + }, 100) + ), + UI.ready(function (context) { + setTimeout(function () { + UI.$('[data-uk-sticky]', context).each(function () { + var $ele = UI.$(this) + $ele.data('sticky') || UI.sticky($ele, UI.Utils.options($ele.attr('data-uk-sticky'))) + }), + checkscrollposition() + }, 0) + }) + }, + init: function () { + var boundtoparent, + boundary = this.options.boundary + ;(this.wrapper = this.element.wrap('
                ').parent()), + this.computeWrapper(), + this.element.css('margin', 0), + boundary && + (!0 === boundary || '!' === boundary[0] + ? ((boundary = !0 === boundary ? this.wrapper.parent() : this.wrapper.closest(boundary.substr(1))), + (boundtoparent = !0)) + : 'string' == typeof boundary && (boundary = UI.$(boundary))), + (this.sticky = { + self: this, + options: this.options, + element: this.element, + currentTop: null, + wrapper: this.wrapper, + init: !1, + getWidthFrom: UI.$(this.options.getWidthFrom || this.wrapper), + boundary: boundary, + boundtoparent: boundtoparent, + top: 0, + calcTop: function () { + var top = this.options.top + if (this.options.top && 'string' == typeof this.options.top) + if (this.options.top.match(/^(-|)(\d+)vh$/)) + top = (window.innerHeight * parseInt(this.options.top, 10)) / 100 + else { + var topElement = UI.$(this.options.top).first() + topElement.length && + topElement.is(':visible') && + (top = -1 * (topElement.offset().top + topElement.outerHeight() - this.wrapper.offset().top)) + } + this.top = top + }, + reset: function (force) { + this.calcTop() + var finalize = function () { + this.element.css({ position: '', top: '', width: '', left: '', margin: '0' }), + this.element.removeClass( + [this.options.animation, 'uk-animation-reverse', this.options.clsactive].join(' ') + ), + this.element.addClass(this.options.clsinactive), + this.element.trigger('inactive.uk.sticky'), + (this.currentTop = null), + (this.animate = !1) + }.bind(this) + !force && this.options.animation && UI.support.animation && !UI.Utils.isInView(this.wrapper) + ? ((this.animate = !0), + this.element + .removeClass(this.options.animation) + .one(UI.support.animation.end, function () { + finalize() + }) + .width(), + this.element.addClass(this.options.animation + ' uk-animation-reverse')) + : finalize() + }, + check: function () { + if (this.options.disabled) return !1 + if (this.options.media) + switch (typeof this.options.media) { + case 'number': + if (window.innerWidth < this.options.media) return !1 + break + case 'string': + if (window.matchMedia && !window.matchMedia(this.options.media).matches) return !1 + } + var scrollTop = $win.scrollTop(), + dwh = $doc.height() - window.innerHeight, + extra = dwh < scrollTop ? dwh - scrollTop : 0, + active = this.wrapper.offset().top - this.top - extra <= scrollTop + return ( + active && + this.options.showup && + (1 == direction && (active = !1), + -1 == direction && + !this.element.hasClass(this.options.clsactive) && + UI.Utils.isInView(this.wrapper) && + (active = !1)), + active + ) + } + }), + this.sticky.calcTop(), + sticked.push(this.sticky) + }, + update: function () { + checkscrollposition(this.sticky) + }, + enable: function () { + ;(this.options.disabled = !1), this.update() + }, + disable: function (force) { + ;(this.options.disabled = !0), this.sticky.reset(force) + }, + computeWrapper: function () { + this.wrapper.css({ + height: -1 == ['absolute', 'fixed'].indexOf(this.element.css('position')) ? this.element.outerHeight() : '', + float: 'none' != this.element.css('float') ? this.element.css('float') : '', + margin: this.element.css('margin') + }), + 'fixed' == this.element.css('position') && + this.element.css({ + width: this.sticky.getWidthFrom.length ? this.sticky.getWidthFrom.width() : this.element.width() + }) + } + }), + UI.sticky + ) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-timepicker', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + UI.component('timepicker', { + defaults: { format: '24h', delay: 0, start: 0, end: 24 }, + boot: function () { + UI.$html.on('focus.timepicker.uikit', '[data-uk-timepicker]', function (e) { + var ele = UI.$(this) + if (!ele.data('timepicker')) { + var obj = UI.timepicker(ele, UI.Utils.options(ele.attr('data-uk-timepicker'))) + setTimeout(function () { + obj.autocomplete.input.focus() + }, 40) + } + }) + }, + init: function () { + var container, + $this = this, + times = (function (start, end) { + end = end || 24 + var i, + h, + times = { '12h': [], '24h': [] } + for (i = start = start || 0, h = ''; i < end; i++) + (h = '' + i), + i < 10 && (h = '0' + h), + times['24h'].push({ value: h + ':00' }), + times['24h'].push({ value: h + ':30' }), + 0 === i && + ((h = 12), times['12h'].push({ value: h + ':00 AM' }), times['12h'].push({ value: h + ':30 AM' })), + 0 < i && + i < 13 && + 12 !== i && + (times['12h'].push({ value: h + ':00 AM' }), times['12h'].push({ value: h + ':30 AM' })), + 12 <= i && + (0 === (h -= 12) && (h = 12), + h < 10 && (h = '0' + String(h)), + times['12h'].push({ value: h + ':00 PM' }), + times['12h'].push({ value: h + ':30 PM' })) + return times + })(this.options.start, this.options.end) + ;(this.options.minLength = 0), + (this.options.template = + ''), + (this.options.source = function (release) { + release(times[$this.options.format] || times['12h']) + }), + (container = this.element.is('input') + ? (this.element.wrap('
                '), this.element.parent()) + : this.element.addClass('uk-autocomplete')), + (this.autocomplete = UI.autocomplete(container, this.options)), + this.autocomplete.dropdown.addClass('uk-dropdown-small uk-dropdown-scrollable'), + this.autocomplete.on('show.uk.autocomplete', function () { + var selected = $this.autocomplete.dropdown.find('[data-value="' + $this.autocomplete.input.val() + '"]') + setTimeout(function () { + $this.autocomplete.pick(selected, !0) + }, 10) + }), + this.autocomplete.input + .on('focus', function () { + ;($this.autocomplete.value = Math.random()), $this.autocomplete.triggercomplete() + }) + .on( + 'blur', + UI.Utils.debounce(function () { + $this.checkTime() + }, 100) + ), + this.element.data('timepicker', this) + }, + checkTime: function () { + var arr, + timeArray, + hour, + minute, + meridian = 'AM', + time = this.autocomplete.input.val() + '12h' == this.options.format + ? ((timeArray = (arr = time.split(' '))[0].split(':')), (meridian = arr[1])) + : (timeArray = time.split(':')), + (hour = parseInt(timeArray[0], 10)), + (minute = parseInt(timeArray[1], 10)), + isNaN(hour) && (hour = 0), + isNaN(minute) && (minute = 0), + '12h' == this.options.format + ? (12 < hour ? (hour = 12) : hour < 0 && (hour = 12), + 'am' === meridian || 'a' === meridian + ? (meridian = 'AM') + : ('pm' !== meridian && 'p' !== meridian) || (meridian = 'PM'), + 'AM' !== meridian && 'PM' !== meridian && (meridian = 'AM')) + : 24 <= hour + ? (hour = 23) + : hour < 0 && (hour = 0), + minute < 0 ? (minute = 0) : 60 <= minute && (minute = 0), + this.autocomplete.input.val(this.formatTime(hour, minute, meridian)).trigger('change') + }, + formatTime: function (hour, minute, meridian) { + return ( + (hour = hour < 10 ? '0' + hour : hour) + + ':' + + (minute = minute < 10 ? '0' + minute : minute) + + ('12h' == this.options.format ? ' ' + meridian : '') + ) + } + }) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-tooltip', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + var $tooltip, tooltipdelay, checkdelay + return ( + UI.component('tooltip', { + defaults: { + offset: 5, + pos: 'top', + animation: !1, + delay: 0, + cls: '', + activeClass: 'uk-active', + src: function (ele) { + var title = ele.attr('title') + return void 0 !== title && ele.data('cached-title', title).removeAttr('title'), ele.data('cached-title') + } + }, + tip: '', + boot: function () { + UI.$html.on('mouseenter.tooltip.uikit focus.tooltip.uikit', '[data-uk-tooltip]', function (e) { + var ele = UI.$(this) + ele.data('tooltip') || + (UI.tooltip(ele, UI.Utils.options(ele.attr('data-uk-tooltip'))), ele.trigger('mouseenter')) + }) + }, + init: function () { + var $this = this + $tooltip || ($tooltip = UI.$('
                ').appendTo('body')), + this.on({ + focus: function (e) { + $this.show() + }, + blur: function (e) { + $this.hide() + }, + mouseenter: function (e) { + $this.show() + }, + mouseleave: function (e) { + $this.hide() + } + }) + }, + show: function () { + if ( + ((this.tip = 'function' == typeof this.options.src ? this.options.src(this.element) : this.options.src), + tooltipdelay && clearTimeout(tooltipdelay), + checkdelay && clearTimeout(checkdelay), + 'string' == typeof this.tip && this.tip.length) + ) { + $tooltip + .stop() + .css({ top: -2e3, visibility: 'hidden' }) + .removeClass(this.options.activeClass) + .show(), + $tooltip.html('
                ' + this.tip + '
                ') + var $this = this, + pos = UI.$.extend({}, this.element.offset(), { + width: this.element[0].offsetWidth, + height: this.element[0].offsetHeight + }), + width = $tooltip[0].offsetWidth, + height = $tooltip[0].offsetHeight, + offset = + 'function' == typeof this.options.offset ? this.options.offset.call(this.element) : this.options.offset, + position = 'function' == typeof this.options.pos ? this.options.pos.call(this.element) : this.options.pos, + tmppos = position.split('-'), + tcss = { display: 'none', visibility: 'visible', top: pos.top + pos.height + height, left: pos.left } + if ('fixed' == UI.$html.css('position') || 'fixed' == UI.$body.css('position')) { + var bodyoffset = UI.$('body').offset(), + htmloffset = UI.$('html').offset(), + docoffset_top = htmloffset.top + bodyoffset.top, + docoffset_left = htmloffset.left + bodyoffset.left + ;(pos.left -= docoffset_left), (pos.top -= docoffset_top) + } + ;('left' != tmppos[0] && 'right' != tmppos[0]) || + 'right' != UI.langdirection || + (tmppos[0] = 'left' == tmppos[0] ? 'right' : 'left') + var variants = { + bottom: { top: pos.top + pos.height + offset, left: pos.left + pos.width / 2 - width / 2 }, + top: { top: pos.top - height - offset, left: pos.left + pos.width / 2 - width / 2 }, + left: { top: pos.top + pos.height / 2 - height / 2, left: pos.left - width - offset }, + right: { top: pos.top + pos.height / 2 - height / 2, left: pos.left + pos.width + offset } + } + UI.$.extend(tcss, variants[tmppos[0]]), + 2 == tmppos.length && (tcss.left = 'left' == tmppos[1] ? pos.left : pos.left + pos.width - width) + var boundary = this.checkBoundary(tcss.left, tcss.top, width, height) + if (boundary) { + switch (boundary) { + case 'x': + position = + 2 == tmppos.length + ? tmppos[0] + '-' + (tcss.left < 0 ? 'left' : 'right') + : tcss.left < 0 + ? 'right' + : 'left' + break + case 'y': + position = + 2 == tmppos.length + ? (tcss.top < 0 ? 'bottom' : 'top') + '-' + tmppos[1] + : tcss.top < 0 + ? 'bottom' + : 'top' + break + case 'xy': + position = + 2 == tmppos.length + ? (tcss.top < 0 ? 'bottom' : 'top') + '-' + (tcss.left < 0 ? 'left' : 'right') + : tcss.left < 0 + ? 'right' + : 'left' + } + ;(tmppos = position.split('-')), + UI.$.extend(tcss, variants[tmppos[0]]), + 2 == tmppos.length && (tcss.left = 'left' == tmppos[1] ? pos.left : pos.left + pos.width - width) + } + ;(tcss.left -= UI.$body.position().left), + (tooltipdelay = setTimeout(function () { + $tooltip.css(tcss).attr('class', ['uk-tooltip', 'uk-tooltip-' + position, $this.options.cls].join(' ')), + $this.options.animation + ? $tooltip + .css({ opacity: 0, display: 'block' }) + .addClass($this.options.activeClass) + .animate({ opacity: 1 }, parseInt($this.options.animation, 10) || 400) + : $tooltip.show().addClass($this.options.activeClass), + (tooltipdelay = !1), + (checkdelay = setInterval(function () { + $this.element.is(':visible') || $this.hide() + }, 150)) + }, parseInt(this.options.delay, 10) || 0)) + } + }, + hide: function () { + if (!this.element.is('input') || this.element[0] !== document.activeElement) + if ( + (tooltipdelay && clearTimeout(tooltipdelay), + checkdelay && clearTimeout(checkdelay), + $tooltip.stop(), + this.options.animation) + ) { + var $this = this + $tooltip.fadeOut(parseInt(this.options.animation, 10) || 400, function () { + $tooltip.removeClass($this.options.activeClass) + }) + } else $tooltip.hide().removeClass(this.options.activeClass) + }, + content: function () { + return this.tip + }, + checkBoundary: function (left, top, width, height) { + var axis = '' + return ( + (left < 0 || left - UI.$win.scrollLeft() + width > window.innerWidth) && (axis += 'x'), + (top < 0 || top - UI.$win.scrollTop() + height > window.innerHeight) && (axis += 'y'), + axis + ) + } + }), + UI.tooltip + ) + }), + (function (addon) { + var component + window.UIkit && (component = addon(UIkit)), + 'function' == typeof define && + define.amd && + define('uikit-upload', ['uikit'], function () { + return component || addon(UIkit) + }) + })(function (UI) { + 'use strict' + var xhr, fi + function xhrupload (files, settings) { + if (!UI.support.ajaxupload) return this + if (((settings = UI.$.extend({}, xhrupload.defaults, settings)), files.length)) { + if ('*.*' !== settings.allow) + for (var file, i = 0; (file = files[i]); i++) + if (!matchName(settings.allow, file.name)) + return void ('string' == typeof settings.notallowed + ? alert(settings.notallowed) + : settings.notallowed(file, settings)) + var complete = settings.complete + if (settings.single) { + var count = files.length, + uploaded = 0, + allow = !0 + settings.beforeAll(files), + (settings.complete = function (response, xhr) { + ;(uploaded += 1), + complete(response, xhr), + settings.filelimit && uploaded >= settings.filelimit && (allow = !1), + allow && uploaded < count ? upload([files[uploaded]], settings) : settings.allcomplete(response, xhr) + }), + upload([files[0]], settings) + } else + (settings.complete = function (response, xhr) { + complete(response, xhr), settings.allcomplete(response, xhr) + }), + upload(files, settings) + } + function upload (files, settings) { + var formData = new FormData(), + xhr = new XMLHttpRequest() + if (!1 !== settings.before(settings, files)) { + for (var f, i = 0; (f = files[i]); i++) formData.append(settings.param, f) + for (var p in settings.params) formData.append(p, settings.params[p]) + xhr.upload.addEventListener( + 'progress', + function (e) { + var percent = (e.loaded / e.total) * 100 + settings.progress(percent, e) + }, + !1 + ), + xhr.addEventListener( + 'loadstart', + function (e) { + settings.loadstart(e) + }, + !1 + ), + xhr.addEventListener( + 'load', + function (e) { + settings.load(e) + }, + !1 + ), + xhr.addEventListener( + 'loadend', + function (e) { + settings.loadend(e) + }, + !1 + ), + xhr.addEventListener( + 'error', + function (e) { + settings.error(e) + }, + !1 + ), + xhr.addEventListener( + 'abort', + function (e) { + settings.abort(e) + }, + !1 + ), + xhr.open(settings.method, settings.action, !0), + 'json' == settings.type && xhr.setRequestHeader('Accept', 'application/json'), + (xhr.onreadystatechange = function () { + if ((settings.readystatechange(xhr), 4 == xhr.readyState)) { + var response = xhr.responseText + if ('json' == settings.type) + try { + response = UI.$.parseJSON(response) + } catch (e) { + response = !1 + } + settings.complete(response, xhr) + } + }), + settings.beforeSend(xhr), + xhr.send(formData) + } + } + } + function matchName (pattern, path) { + var parsedPattern = + '^' + + pattern + .replace(/\//g, '\\/') + .replace(/\*\*/g, '(\\/[^\\/]+)*') + .replace(/\*/g, '[^\\/]+') + .replace(/((?!\\))\?/g, '$1.') + + '$' + return (parsedPattern = '^' + parsedPattern + '$'), null !== path.match(new RegExp(parsedPattern, 'i')) + } + return ( + UI.component('uploadSelect', { + init: function () { + var $this = this + this.on('change', function () { + xhrupload($this.element[0].files, $this.options) + var twin = $this.element.clone(!0).data('uploadSelect', $this) + $this.element.replaceWith(twin), ($this.element = twin) + }) + } + }), + UI.component('uploadDrop', { + defaults: { dragoverClass: 'uk-dragover' }, + init: function () { + var $this = this, + hasdragCls = !1 + this.on('drop', function (e) { + e.dataTransfer && + e.dataTransfer.files && + (e.stopPropagation(), + e.preventDefault(), + $this.element.removeClass($this.options.dragoverClass), + $this.element.trigger('dropped.uk.upload', [e.dataTransfer.files]), + xhrupload(e.dataTransfer.files, $this.options)) + }) + .on('dragenter', function (e) { + e.stopPropagation(), e.preventDefault() + }) + .on('dragover', function (e) { + e.stopPropagation(), + e.preventDefault(), + hasdragCls || ($this.element.addClass($this.options.dragoverClass), (hasdragCls = !0)) + }) + .on('dragleave', function (e) { + e.stopPropagation(), + e.preventDefault(), + $this.element.removeClass($this.options.dragoverClass), + (hasdragCls = !1) + }) + } + }), + (UI.support.ajaxupload = (((fi = document.createElement('INPUT')).type = 'file'), + 'files' in fi && + !!((xhr = new XMLHttpRequest()) && 'upload' in xhr && 'onprogress' in xhr.upload) && + !!window.FormData)), + UI.support.ajaxupload && UI.$.event.props.push('dataTransfer'), + (xhrupload.defaults = { + action: '', + single: !0, + method: 'POST', + param: 'files[]', + params: {}, + allow: '*.*', + type: 'text', + filelimit: !1, + before: function (o) {}, + beforeSend: function (xhr) {}, + beforeAll: function () {}, + loadstart: function () {}, + load: function () {}, + loadend: function () {}, + error: function () {}, + abort: function () {}, + progress: function () {}, + complete: function () {}, + allcomplete: function () {}, + readystatechange: function () {}, + notallowed: function (file, settings) { + alert('Only the following file types are allowed: ' + settings.allow) + } + }), + (UI.Utils.xhrupload = xhrupload) + ) + }) +var easing_swiftOut = [0.4, 0, 0.2, 1] +'undefined' != typeof UIkit && + UIkit.on('beforeready.uk.dom', function () { + var old_hide_function, old_show_function + if ( + (void 0 !== UIkit.components.accordion && + $.extend(UIkit.components.accordion.prototype.defaults, { easing: easing_swiftOut, duration: 200 }), + void 0 !== UIkit.components.datepicker && $.extend(UIkit.components.datepicker.prototype.defaults, {}), + void 0 !== UIkit.components.dropdown.prototype && + ($.extend(UIkit.components.dropdown.prototype.defaults, { remaintime: 150, delay: 50 }), + (old_show_function = UIkit.components.dropdown.prototype.show), + (UIkit.components.dropdown.prototype.show = function () { + return ( + this.dropdown + .css({ 'min-width': this.dropdown.outerWidth() }) + .addClass('uk-dropdown-active uk-dropdown-shown'), + old_show_function.apply(this, arguments) + ) + }), + (old_hide_function = UIkit.components.dropdown.prototype.hide), + (UIkit.components.dropdown.prototype.hide = function () { + var this_dropdown = this.dropdown + return ( + this_dropdown.removeClass('uk-dropdown-shown'), + setTimeout(function () { + this_dropdown.removeClass('uk-dropdown-active') + }, 280), + old_hide_function.apply(this, arguments) + ) + })), + void 0 !== UIkit.components.modal) + ) { + $.extend(UIkit.components.modal.prototype.defaults, { center: !0 }) + var $body = $('body') + ;(UIkit.modal.dialog.template = + '
                '), + $body.on('show.uk.modal', '.uk-modal-dialog-replace', function () { + setTimeout(function () { + var dialogReplace = $('.uk-modal-dialog-replace') + if (dialogReplace.find('.uk-button-primary').length) { + var actionBtn = dialogReplace + .find('.uk-button-primary') + .toggleClass('uk-button-primary md-btn-flat-primary') + actionBtn.next('button') && actionBtn.next('button').after(actionBtn) + } + dialogReplace.find('.uk-button').length && + dialogReplace.find('.uk-button').toggleClass('uk-button md-btn md-btn-flat'), + dialogReplace.find('.uk-margin-small-top').length && + dialogReplace.find('.uk-margin-small-top').toggleClass('uk-margin-small-top uk-margin-top'), + dialogReplace.find('input.uk-width-1-1').length && + dialogReplace.find('input.uk-width-1-1').toggleClass('uk-width-1-1 md-input'), + dialogReplace.find('.uk-form').length && dialogReplace.find('.uk-form').removeClass('uk-form') + }, 50) + }) + } + void 0 !== UIkit.components.tooltip && + $.extend(UIkit.components.tooltip.prototype.defaults, { animation: 280, offset: 8 }), + void 0 !== UIkit.components.sortable && + Modernizr.touch && + $('[data-uk-sortable]') + .children() + .addClass('needsclick') + }) diff --git a/src/routes/index.js b/src/routes/index.js index 4ca9a04ae..1deafc312 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -10,15 +10,10 @@ **/ var express = require('express') - var router = express.Router() - var controllers = require('../controllers/index.js') - var path = require('path') - var winston = require('winston') - var packagejson = require('../../package.json') function mainRoutes (router, middleware, controllers) { @@ -271,6 +266,12 @@ function mainRoutes (router, middleware, controllers) { router.post('/settings/general/uploadlogo', middleware.redirectToLogin, controllers.main.uploadLogo) router.post('/settings/general/uploadpagelogo', middleware.redirectToLogin, controllers.main.uploadPageLogo) router.post('/settings/general/uploadfavicon', middleware.redirectToLogin, controllers.main.uploadFavicon) + router.get( + '/settings/permissions', + middleware.redirectToLogin, + middleware.loadCommonData, + controllers.settings.permissionsSettings + ) router.get( '/settings/tickets', middleware.redirectToLogin, @@ -315,144 +316,8 @@ function mainRoutes (router, middleware, controllers) { router.get('/plugins', middleware.redirectToLogin, middleware.loadCommonData, controllers.plugins.get) // API - router.get('/api', controllers.api.index) - router.get('/api/v1/version', function (req, res) { - return res.json({ version: packagejson.version }) - }) - router.post('/api/v1/login', controllers.api.login) - router.get('/api/v1/login', middleware.api, controllers.api.getLoggedInUser) - router.get('/api/v1/logout', middleware.api, controllers.api.logout) - - router.get('/api/v1/tickets', middleware.api, controllers.api.tickets.get) - router.get('/api/v1/tickets/search', middleware.api, controllers.api.tickets.search) - router.post('/api/v1/tickets/create', middleware.api, controllers.api.tickets.create) - router.get('/api/v1/tickets/type/:id', middleware.api, controllers.api.tickets.getType) - router.post('/api/v1/tickets/type/:id/removepriority', middleware.api, controllers.api.tickets.typeRemovePriority) - router.post('/api/v1/tickets/type/:id/addpriority', middleware.api, controllers.api.tickets.typeAddPriority) - router.get('/api/v1/tickets/types', middleware.api, controllers.api.tickets.getTypes) - router.post('/api/v1/tickets/types/create', middleware.api, controllers.api.tickets.createType) - router.put('/api/v1/tickets/types/:id', middleware.api, controllers.api.tickets.updateType) - router.delete('/api/v1/tickets/types/:id', middleware.api, controllers.api.tickets.deleteType) - router.post('/api/v1/tickets/priority/create', middleware.api, controllers.api.tickets.createPriority) - router.post('/api/v1/tickets/priority/:id/delete', middleware.api, controllers.api.tickets.deletePriority) - router.get('/api/v1/tickets/priorities', middleware.api, controllers.api.tickets.getPriorities) - router.put('/api/v1/tickets/priority/:id', middleware.api, controllers.api.tickets.updatePriority) - - router.get('/api/v1/tickets/overdue', middleware.api, controllers.api.tickets.getOverdue) - router.post('/api/v1/tickets/addcomment', middleware.api, controllers.api.tickets.postComment) - router.post('/api/v1/tickets/addnote', middleware.api, controllers.api.tickets.postInternalNote) - router.get('/api/v1/tickets/tags', middleware.api, controllers.api.tickets.getTags) - router.get('/api/v1/tickets/count/tags', middleware.api, controllers.api.tickets.getTagCount) - router.get('/api/v1/tickets/count/tags/:timespan', middleware.api, controllers.api.tickets.getTagCount) - router.get('/api/v1/tickets/count/days', middleware.api, controllers.api.tickets.getTicketStats) - router.get('/api/v1/tickets/count/days/:timespan', middleware.api, controllers.api.tickets.getTicketStats) - router.get('/api/v1/tickets/count/topgroups', middleware.api, controllers.api.tickets.getTopTicketGroups) - router.get('/api/v1/tickets/count/topgroups/:top', middleware.api, controllers.api.tickets.getTopTicketGroups) - router.get( - '/api/v1/tickets/count/topgroups/:timespan/:top', - middleware.api, - controllers.api.tickets.getTopTicketGroups - ) - router.get('/api/v1/tickets/stats', middleware.api, controllers.api.tickets.getTicketStats) - router.get('/api/v1/tickets/stats/group/:group', middleware.api, controllers.api.tickets.getTicketStatsForGroup) - router.get('/api/v1/tickets/stats/user/:user', middleware.api, controllers.api.tickets.getTicketStatsForUser) - router.get('/api/v1/tickets/stats/:timespan', middleware.api, controllers.api.tickets.getTicketStats) - router.get('/api/v1/tickets/deleted', middleware.api, middleware.isAdmin, controllers.api.tickets.getDeletedTickets) - router.post( - '/api/v1/tickets/deleted/restore', - middleware.api, - middleware.isAdmin, - controllers.api.tickets.restoreDeleted - ) - router.get('/api/v1/tickets/:uid', middleware.api, controllers.api.tickets.single) - router.put('/api/v1/tickets/:id', middleware.api, controllers.api.tickets.update) - router.delete('/api/v1/tickets/:id', middleware.api, controllers.api.tickets.delete) - router.put('/api/v1/tickets/:id/subscribe', middleware.api, controllers.api.tickets.subscribe) - router.delete( - '/api/v1/tickets/:tid/attachments/remove/:aid', - middleware.api, - controllers.api.tickets.removeAttachment - ) - - router.post('/api/v1/tags/create', middleware.api, controllers.api.tags.createTag) - router.get('/api/v1/tags/limit', middleware.api, controllers.api.tags.getTagsWithLimit) - router.put('/api/v1/tags/:id', middleware.api, controllers.api.tags.updateTag) - router.delete('/api/v1/tags/:id', middleware.api, controllers.api.tags.deleteTag) - - router.get('/api/v1/groups', middleware.api, controllers.api.groups.get) - router.get('/api/v1/groups/all', middleware.api, controllers.api.groups.getAll) - router.post('/api/v1/groups/create', middleware.api, controllers.api.groups.create) - router.get('/api/v1/groups/:id', middleware.api, controllers.api.groups.getSingleGroup) - router.delete('/api/v1/groups/:id', middleware.api, controllers.api.groups.deleteGroup) - router.put('/api/v1/groups/:id', middleware.api, controllers.api.groups.updateGroup) - - router.get('/api/v1/users', middleware.api, controllers.api.users.getWithLimit) - router.post('/api/v1/users/create', middleware.api, controllers.api.users.create) - router.get('/api/v1/users/notificationCount', middleware.api, controllers.api.users.notificationCount) - router.get('/api/v1/users/getassignees', middleware.api, controllers.api.users.getAssingees) - router.get('/api/v1/users/:username', middleware.api, controllers.api.users.single) - router.put('/api/v1/users/:username', middleware.api, controllers.api.users.update) - router.post('/api/v1/users/:username/uploadprofilepic', controllers.api.users.uploadProfilePic) - router.put('/api/v1/users/:username/updatepreferences', middleware.api, controllers.api.users.updatePreferences) - router.get('/api/v1/users/:username/enable', middleware.api, controllers.api.users.enableUser) - router.delete('/api/v1/users/:username', middleware.api, controllers.api.users.deleteUser) - router.post('/api/v1/users/:id/generateapikey', middleware.api, controllers.api.users.generateApiKey) - router.post('/api/v1/users/:id/removeapikey', middleware.api, controllers.api.users.removeApiKey) - router.post('/api/v1/users/:id/generatel2auth', middleware.api, controllers.api.users.generateL2Auth) - router.post('/api/v1/users/:id/removel2auth', middleware.api, controllers.api.users.removeL2Auth) - - router.get('/api/v1/roles', middleware.api, controllers.api.roles.get) - - router.get('/api/v1/messages', middleware.api, controllers.api.messages.get) - router.post('/api/v1/messages/conversation/start', middleware.api, controllers.api.messages.startConversation) - router.get('/api/v1/messages/conversation/:id', middleware.api, controllers.api.messages.getMessagesForConversation) - router.delete('/api/v1/messages/conversation/:id', middleware.api, controllers.api.messages.deleteConversation) - router.get('/api/v1/messages/conversations', middleware.api, controllers.api.messages.getConversations) - router.get('/api/v1/messages/conversations/recent', middleware.api, controllers.api.messages.getRecentConversations) - router.post('/api/v1/messages/send', middleware.api, controllers.api.messages.send) - - router.post('/api/v1/notices/create', middleware.api, controllers.api.notices.create) - router.get('/api/v1/notices/clearactive', middleware.api, controllers.api.notices.clearActive) - router.put('/api/v1/notices/:id', middleware.api, controllers.api.notices.updateNotice) - router.delete('/api/v1/notices/:id', middleware.api, controllers.api.notices.deleteNotice) - - // Reports Generator - router.post( - '/api/v1/reports/generate/tickets_by_group', - middleware.api, - controllers.api.reports.generate.ticketsByGroup - ) - router.post( - '/api/v1/reports/generate/tickets_by_status', - middleware.api, - controllers.api.reports.generate.ticketsByStatus - ) - router.post( - '/api/v1/reports/generate/tickets_by_priority', - middleware.api, - controllers.api.reports.generate.ticketsByPriority - ) - router.post( - '/api/v1/reports/generate/tickets_by_tags', - middleware.api, - controllers.api.reports.generate.ticketsByTags - ) - router.post( - '/api/v1/reports/generate/tickets_by_type', - middleware.api, - controllers.api.reports.generate.ticketsByType - ) - router.post( - '/api/v1/reports/generate/tickets_by_user', - middleware.api, - controllers.api.reports.generate.ticketsByUser - ) - - router.get('/api/v1/settings', middleware.api, controllers.api.settings.getSettings) - router.put('/api/v1/settings', middleware.api, controllers.api.settings.updateSetting) - router.post('/api/v1/settings/testmailer', middleware.api, controllers.api.settings.testMailer) - router.put('/api/v1/settings/mailer/template/:id', middleware.api, controllers.api.settings.updateTemplateSubject) - router.get('/api/v1/settings/buildsass', middleware.api, controllers.api.settings.buildsass) + // v1 + require('../controllers/api/v1/routes')(middleware, router, controllers) router.get('/api/v1/plugins/list/installed', middleware.api, function (req, res) { return res.json({ success: true, loadedPlugins: global.plugins }) @@ -470,54 +335,24 @@ function mainRoutes (router, middleware, controllers) { controllers.api.plugins.removePlugin ) - router.post( - '/api/v1/public/users/checkemail', - middleware.checkCaptcha, - middleware.checkOrigin, - controllers.api.users.checkEmail - ) - router.post( - '/api/v1/public/tickets/create', - middleware.checkCaptcha, - middleware.checkOrigin, - controllers.api.tickets.createPublicTicket - ) - router.post( - '/api/v1/public/account/create', - middleware.checkCaptcha, - middleware.checkOrigin, - controllers.api.users.createPublicAccount - ) - - router.get('/api/v1/backups', middleware.api, middleware.isAdmin, controllers.backuprestore.getBackups) - router.post('/api/v1/backup', middleware.api, middleware.isAdmin, controllers.backuprestore.runBackup) - router.delete('/api/v1/backup/:backup', middleware.api, middleware.isAdmin, controllers.backuprestore.deleteBackup) - router.post('/api/v1/backup/restore', middleware.api, middleware.isAdmin, controllers.backuprestore.restoreBackup) - router.post('/api/v1/backup/upload', middleware.api, middleware.isAdmin, controllers.backuprestore.uploadBackup) - router.get('/api/v1/backup/hastools', middleware.api, middleware.isAdmin, controllers.backuprestore.hasBackupTools) - router.get('/api/v1/admin/restart', middleware.api, middleware.isAdmin, function (req, res) { - if (req.user.role === 'admin') { - var pm2 = require('pm2') - pm2.connect(function (err) { + var pm2 = require('pm2') + pm2.connect(function (err) { + if (err) { + winston.error(err) + res.status(400).send(err) + return + } + pm2.restart('trudesk', function (err) { if (err) { - winston.error(err) res.status(400).send(err) - return + return winston.error(err) } - pm2.restart('trudesk', function (err) { - if (err) { - res.status(400).send(err) - return winston.error(err) - } - pm2.disconnect() - res.json({ success: true }) - }) + pm2.disconnect() + res.json({ success: true }) }) - } else { - return res.status(401).json({ success: false, error: 'Unauthorized!' }) - } + }) }) if (global.env === 'development') { diff --git a/src/sass/_settings.sass b/src/sass/_settings.sass index f6e685568..5202df8a4 100644 --- a/src/sass/_settings.sass +++ b/src/sass/_settings.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + @import "mixins" @import "functions" @@ -28,6 +42,8 @@ $accent_success: #29b955 !default // Highlight color for actions and Errors $accent_danger: #d32f2f !default +$accent_warn: #feca57 !default + // ------------------------------------------------------------------------ $rowWidth: 100% diff --git a/src/sass/_settings_theme_dark.sass b/src/sass/_settings_theme_dark.sass index b5d104e3a..0f8989e31 100644 --- a/src/sass/_settings_theme_dark.sass +++ b/src/sass/_settings_theme_dark.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + $rowWidth: 100% $fontFamily: "Roboto", "Open Sans", sans-serif $accent_color: #E74C3C diff --git a/src/sass/app.sass b/src/sass/app.sass index 1ae1f0eae..e5164e629 100644 --- a/src/sass/app.sass +++ b/src/sass/app.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 4:46 PM + / Copyright (c) 2014-2019. All rights reserved. + / + @import "mixins" @import "functions" @import "_settings" @@ -154,6 +168,10 @@ input[type="file"], input[type="checkbox"], input[type="radio"], select @import "partials/contextmenu" @import "partials/topnav" @import "partials/sidebar" +@import "partials/sidebarBottomPanel" +//@import "../client/components/Nav/Sidebar/style" +//@import "../client/components/Nav/SidebarItem/style" +//@import "../client/components/Nav/Submenu/style" @import "partials/offcanvas" @import "partials/messages" @import "partials/settings" diff --git a/src/sass/buildsass.js b/src/sass/buildsass.js index 573fed0de..83a0775d7 100644 --- a/src/sass/buildsass.js +++ b/src/sass/buildsass.js @@ -1,15 +1,15 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 11/7/2018 - Author: Chris Brame - + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. */ var _ = require('lodash') diff --git a/src/sass/functions.sass b/src/sass/functions.sass index 7bf382487..8ef90ece3 100644 --- a/src/sass/functions.sass +++ b/src/sass/functions.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + //Functions @function automatic-text-color($bgColor, $component:'') @if (lightness($bgColor) > 50) diff --git a/src/sass/mixins.sass b/src/sass/mixins.sass index d51c07712..7a9db6cf5 100644 --- a/src/sass/mixins.sass +++ b/src/sass/mixins.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + @mixin borderRadius($radius) border-radius: $radius diff --git a/src/sass/partials/barchart.sass b/src/sass/partials/barchart.sass index 01b5c0dbe..de84c75a8 100644 --- a/src/sass/partials/barchart.sass +++ b/src/sass/partials/barchart.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .bar-chart-wrapper position: relative //padding-left: 40px diff --git a/src/sass/partials/c3.sass b/src/sass/partials/c3.sass index 1e74ee466..7e605c56a 100644 --- a/src/sass/partials/c3.sass +++ b/src/sass/partials/c3.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .c3-chart-arc text font-size: 10px !important diff --git a/src/sass/partials/calendar.sass b/src/sass/partials/calendar.sass index 281e143da..21963c9f7 100644 --- a/src/sass/partials/calendar.sass +++ b/src/sass/partials/calendar.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .fc font-family: "open sans", sans-serif padding: 0 15px 0 30px diff --git a/src/sass/partials/chat.sass b/src/sass/partials/chat.sass index ea982ea81..6a341d90f 100644 --- a/src/sass/partials/chat.sass +++ b/src/sass/partials/chat.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .chat-bar position: fixed bottom: 0 diff --git a/src/sass/partials/chosen.sass b/src/sass/partials/chosen.sass index f40be20c1..19027b96f 100644 --- a/src/sass/partials/chosen.sass +++ b/src/sass/partials/chosen.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .search-container max-height: 300px height: auto diff --git a/src/sass/partials/common.sass b/src/sass/partials/common.sass index 3cf3d8992..cc04bb77b 100644 --- a/src/sass/partials/common.sass +++ b/src/sass/partials/common.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .site-logo width: 140px !important .site-logo-login @@ -5,6 +19,8 @@ .accent-text color: $accent_color !important +.success-text + color: $accent_success !important .right max-width: 100% @@ -41,11 +57,14 @@ .bl border-left: 1px solid rgba(0,0,0,0.15) !important -.noborder +.noborder, +.nb border: none !important -.no-border-top +.no-border-top, +.nbt border-top: 0 !important -.no-border-bottom +.no-border-bottom, +.nbb border-bottom: none !important .nomargin, @@ -89,6 +108,8 @@ .pr-10 padding-right: 10px !important +.pl-0 + padding-left: 0 !important .padding-left-right-15 padding-left: 15px !important @@ -138,12 +159,20 @@ .text-white color: #fff !important +.text-dark + color: rgba(25,25,25, 0.7) !important .bg-white background: #fff !important .bg-accent background: $accent_color !important .bg-accent-noimportant background: $accent_color +.bg-success + background: $accent_success !important +.bg-danger + background: $accent_danger !important +.bg-warn + background: $accent_warn !important .font-weight-300, .font-light, @@ -346,6 +375,13 @@ a.button box-shadow: 0 10px 20px rgba(0,0,0,.19),0 6px 6px rgba(0,0,0,.23) .panel-body padding: 15px + .panel-footer + display: block + border-top: 1px solid darken($trupanel_bg, 15%) + padding: 15px + +.panel-bg + background: $trupanel_bg !important .tru-card-content padding: 16px diff --git a/src/sass/partials/contextmenu.sass b/src/sass/partials/contextmenu.sass index 1a4781a18..8eb925dcd 100644 --- a/src/sass/partials/contextmenu.sass +++ b/src/sass/partials/contextmenu.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .context-menu box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23) background: #fff diff --git a/src/sass/partials/dashboard.sass b/src/sass/partials/dashboard.sass index 743110602..5c307f20b 100644 --- a/src/sass/partials/dashboard.sass +++ b/src/sass/partials/dashboard.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .circle-chart-wrapper margin-bottom: 15px diff --git a/src/sass/partials/datatables.sass b/src/sass/partials/datatables.sass index 4fe8a0f3b..bf42b81a5 100644 --- a/src/sass/partials/datatables.sass +++ b/src/sass/partials/datatables.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .dt-borderTop border-top: $datatables_head_border_top .dt-borderBottom diff --git a/src/sass/partials/donutchart.sass b/src/sass/partials/donutchart.sass index 716a5c495..75957f5a5 100644 --- a/src/sass/partials/donutchart.sass +++ b/src/sass/partials/donutchart.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + /* DonutChart */ .donutchart-wrapper position: relative diff --git a/src/sass/partials/fab.sass b/src/sass/partials/fab.sass index 1b1f0f8af..6043a6b81 100644 --- a/src/sass/partials/fab.sass +++ b/src/sass/partials/fab.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .md-fab box-sizing: border-box width: 64px diff --git a/src/sass/partials/flottooltip.sass b/src/sass/partials/flottooltip.sass index b0c121fdb..49004b97b 100644 --- a/src/sass/partials/flottooltip.sass +++ b/src/sass/partials/flottooltip.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + #flotTip width: 150px max-width: 150px diff --git a/src/sass/partials/loader.sass b/src/sass/partials/loader.sass index e500331bc..1478e975e 100644 --- a/src/sass/partials/loader.sass +++ b/src/sass/partials/loader.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .showbox position: absolute top: 0 diff --git a/src/sass/partials/materialize.scss b/src/sass/partials/materialize.scss index d563f554a..5ff79262b 100644 --- a/src/sass/partials/materialize.scss +++ b/src/sass/partials/materialize.scss @@ -1,3 +1,17 @@ +/*! + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 5:31 AM + * Copyright (c) 2014-2019. All rights reserved. + */ + @import "../materialize/components/color"; $primary-color: color("materialize-red", "lighten-2") !default; $primary-color-light: lighten($primary-color, 15%) !default; diff --git a/src/sass/partials/messages.sass b/src/sass/partials/messages.sass index 75f3f43e9..481244492 100644 --- a/src/sass/partials/messages.sass +++ b/src/sass/partials/messages.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .message-list padding: 0 !important @media only screen and (min-width: 40.063em) and (max-width: 64em) diff --git a/src/sass/partials/mg.sass b/src/sass/partials/mg.sass index b28120339..90779ad5f 100644 --- a/src/sass/partials/mg.sass +++ b/src/sass/partials/mg.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .mGraph .mg-histogram .axis text, .mGraph .mg-x-axis text, .mGraph .mg-y-axis text diff --git a/src/sass/partials/modal.sass b/src/sass/partials/modal.sass index b86fbb0ff..02ad8fc65 100644 --- a/src/sass/partials/modal.sass +++ b/src/sass/partials/modal.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + /* dialog modals .uk-modal diff --git a/src/sass/partials/notifications.sass b/src/sass/partials/notifications.sass index 5909e74e8..532c24cd3 100644 --- a/src/sass/partials/notifications.sass +++ b/src/sass/partials/notifications.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + table.notificationsTable table-layout: fixed width: 99% diff --git a/src/sass/partials/offcanvas.sass b/src/sass/partials/offcanvas.sass index 170bd54d0..76cb86faf 100644 --- a/src/sass/partials/offcanvas.sass +++ b/src/sass/partials/offcanvas.sass @@ -1,10 +1,42 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .uk-offcanvas background: rgba(0,0,0,0.3) + line-height: normal .uk-offcanvas-bar background: $sidebar_bg //border-left: $sidebar_border_right -.online-list-sidebar +.uk-offcanvas + .uk-offcanvas-title + height: 40px + width: 100% + background: $sidebar_item_active + margin-bottom: 8px + h3 + font-family: "Source Sans Pro", sans-serif + font-size: 14px + text-align: center + width: 100% + display: block + color: automatic-text-color($topbar_bg) + margin: 0 + line-height: 40px + +.online-list-sidebar, +.uk-offcanvas h5 font-family: "Source Sans Pro", sans-serif font-size: 12px diff --git a/src/sass/partials/onoffswitch.sass b/src/sass/partials/onoffswitch.sass index 3c9da9956..56c5797e0 100644 --- a/src/sass/partials/onoffswitch.sass +++ b/src/sass/partials/onoffswitch.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .onoffswitch position: relative width: 85px !important diff --git a/src/sass/partials/pace.sass b/src/sass/partials/pace.sass index de0932893..b73630c87 100644 --- a/src/sass/partials/pace.sass +++ b/src/sass/partials/pace.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .pace -webkit-pointer-events: none pointer-events: none diff --git a/src/sass/partials/searchbox.scss b/src/sass/partials/searchbox.scss index 7f0423115..e231d071b 100644 --- a/src/sass/partials/searchbox.scss +++ b/src/sass/partials/searchbox.scss @@ -1,3 +1,17 @@ +/*! + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 5:31 AM + * Copyright (c) 2014-2019. All rights reserved. + */ + $color: $accent_color; diff --git a/src/sass/partials/selectize.sass b/src/sass/partials/selectize.sass index 2e0388597..efcda9129 100644 --- a/src/sass/partials/selectize.sass +++ b/src/sass/partials/selectize.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + @charset "UTF-8" /* selectize /** diff --git a/src/sass/partials/servers.sass b/src/sass/partials/servers.sass index 7c5a874ee..a2cd33bb6 100644 --- a/src/sass/partials/servers.sass +++ b/src/sass/partials/servers.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .server-row margin: 25px 0 0 0 !important diff --git a/src/sass/partials/settings.sass b/src/sass/partials/settings.sass index 0db839cd5..6a977d5ca 100644 --- a/src/sass/partials/settings.sass +++ b/src/sass/partials/settings.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .settings-wrap padding: 20px 25px margin-bottom: 25px @@ -36,5 +50,6 @@ font-size: 16px font-weight: normal -.ticket-type-categories +.ticket-type-categories, +.permission-roles background: darken($page_content_bg, 1%) \ No newline at end of file diff --git a/src/sass/partials/sidebar.sass b/src/sass/partials/sidebar.sass index 9cfd56952..93f7be0a8 100644 --- a/src/sass/partials/sidebar.sass +++ b/src/sass/partials/sidebar.sass @@ -1,3 +1,19 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 4:46 PM + / Copyright (c) 2014-2019. All rights reserved. + / + +@import "../_settings.sass" + //Hack to not show popout menu on reposition body > .side-nav-sub.tether-element display: none !important @@ -64,76 +80,6 @@ body > .side-nav-sub.tether-element padding: 0 0 0 60px !important font-size: 100% - -.side-nav-bottom-panel - //width: 100% - background: $sidebar_bg - display: block - margin: 0 - padding: 0 - width: 57px - transition: all .2s ease - +boxShadow(inset -1px 0 0 0 rgba(0,0,0,0.1)) - a - transition: all .2s ease - //padding: 0 0.875rem !important - padding: 0 !important - font-size: 0 - color: $sidebar_text !important - //border-left: 2px solid $sidebar_bg - position: relative - //padding-left: 60px !important - line-height: 48px - height: 48px - - &:after - background: $accent_color - bottom: 0 - content: '' - position: absolute - right: 100% - top: 0 - width: 5px - -webkit-transition: -webkit-transform 0.2s ease-in-out - transition: -webkit-transform 0.2s ease-in-out - transition: transform 0.2s ease-in-out - transition: transform 0.2s ease-in-out, -webkit-transform 0.2s ease-in-out - - &:hover - &:after - transform: translateX(5px) - - &:not(.button) - display: block - margin: 0 - - span - padding-bottom: 5px - - &:hover - //border-left: 2px solid $accent_color - background: $sidebar_item_hover !important - - i,svg - color: $sidebar_text_hover - fill: $sidebar_text_hover - &.icon-accounts - background-position: 0 -24px - &.icon-groups - background-position: 0 -22px - &.icon-invoices - background-position: 0 -20px - - i,svg - line-height: 26px - margin-right: 15px - color: $sidebar_text - margin-top: 5px - position: absolute - top: 5px - left: 15px - fill: $sidebar_text - ul.side-nav list-style: none outside none line-height: 1.6 @@ -185,6 +131,7 @@ ul.side-nav color: #fff &.active > a + padding-left: 55px !important font-family: "Roboto", sans-serif !important background: $sidebar_item_active !important color: $sidebar_item_active_text !important diff --git a/src/sass/partials/sidebarBottomPanel.sass b/src/sass/partials/sidebarBottomPanel.sass new file mode 100644 index 000000000..a9fa57ead --- /dev/null +++ b/src/sass/partials/sidebarBottomPanel.sass @@ -0,0 +1,84 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 4:46 PM + / Copyright (c) 2014-2019. All rights reserved. + / + +@import "../_settings" + +.side-nav-bottom-panel + //width: 100% + background: $sidebar_bg + display: block + margin: 0 + padding: 0 + width: 57px + transition: all .2s ease + +boxShadow(inset -1px 0 0 0 rgba(0,0,0,0.1)) + a + transition: all .2s ease + //padding: 0 0.875rem !important + padding: 0 !important + font-size: 0 + color: $sidebar_text !important + //border-left: 2px solid $sidebar_bg + position: relative + //padding-left: 60px !important + line-height: 48px + height: 48px + + &:after + background: $accent_color + bottom: 0 + content: '' + position: absolute + right: 100% + top: 0 + width: 5px + -webkit-transition: -webkit-transform 0.2s ease-in-out + transition: -webkit-transform 0.2s ease-in-out + transition: transform 0.2s ease-in-out + transition: transform 0.2s ease-in-out, -webkit-transform 0.2s ease-in-out + + &:hover + &:after + transform: translateX(5px) + + &:not(.button) + display: block + margin: 0 + + span + padding-bottom: 5px + + &:hover + //border-left: 2px solid $accent_color + background: $sidebar_item_hover !important + + i,svg + color: $sidebar_text_hover + fill: $sidebar_text_hover + &.icon-accounts + background-position: 0 -24px + &.icon-groups + background-position: 0 -22px + &.icon-invoices + background-position: 0 -20px + + i,svg + line-height: 26px + margin-right: 15px + color: $sidebar_text + margin-top: 5px + position: absolute + top: 5px + left: 15px + fill: $sidebar_text \ No newline at end of file diff --git a/src/sass/partials/svgcheck.sass b/src/sass/partials/svgcheck.sass index 0e5ea2ee3..942af4644 100644 --- a/src/sass/partials/svgcheck.sass +++ b/src/sass/partials/svgcheck.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .svgcheck cursor: pointer position: relative diff --git a/src/sass/partials/tLoader.sass b/src/sass/partials/tLoader.sass index 9fffe6fc0..96d9dd3dc 100644 --- a/src/sass/partials/tLoader.sass +++ b/src/sass/partials/tLoader.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + #loader-wrapper, #dot-loader background: $page_content_bg diff --git a/src/sass/partials/tickets.sass b/src/sass/partials/tickets.sass index 0600a5ee4..31d0bc7ed 100644 --- a/src/sass/partials/tickets.sass +++ b/src/sass/partials/tickets.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 4:46 PM + / Copyright (c) 2014-2019. All rights reserved. + / + .ticketContent @media only screen and (min-width: 40.063em) and (max-width: 64em) padding: 0 0 0 55px !important diff --git a/src/sass/partials/topnav.sass b/src/sass/partials/topnav.sass index 21f4cd382..4e2d2ada1 100644 --- a/src/sass/partials/topnav.sass +++ b/src/sass/partials/topnav.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .top-nav, .top-bar background: $topbar_bg @@ -144,14 +158,12 @@ +borderRadius(50%) -.notifications - width: 300px !important - height: auto !important - .p-dropdown visibility: hidden opacity: 0 z-index: 99999 + width: 300px !important + height: auto !important background: lighten($page_content_right_bg, 10%) border: 1px solid rgba(0,0,0,0.2) //padding: 10px @@ -200,7 +212,6 @@ padding: 0 font-size: 12px -.notifications .actions width: 100% height: auto @@ -217,9 +228,6 @@ margin-left: 8px //Message Notification -#mail-notifications, -#notifications, -#online-Users, .p-dropdown max-height: 400px position: absolute @@ -227,7 +235,8 @@ .mail-Messages, .notifications-Messages, - .online-Users-List + .online-Users-List, + .items float: left width: 100% max-height: 320px @@ -249,7 +258,8 @@ &:last-child border-bottom: none - .messageNotification + .messageNotification, + .item display: block width: 100% height: 71px @@ -261,6 +271,7 @@ position: relative &:hover + color: $text_color !important background: transparent !important .messageUnread diff --git a/src/sass/partials/trucard.sass b/src/sass/partials/trucard.sass index 04cbe3914..6a6ecf223 100644 --- a/src/sass/partials/trucard.sass +++ b/src/sass/partials/trucard.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .tru-card background: $trupanel_bg position: relative diff --git a/src/sass/partials/trutab.sass b/src/sass/partials/trutab.sass index b04a02f9c..414017414 100644 --- a/src/sass/partials/trutab.sass +++ b/src/sass/partials/trutab.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + $size: 16px .tru-tabs diff --git a/src/sass/partials/typingbubble.sass b/src/sass/partials/typingbubble.sass index b108323aa..5646c6c51 100644 --- a/src/sass/partials/typingbubble.sass +++ b/src/sass/partials/typingbubble.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + =trf($trf) $value: '' @each $tr in $trf diff --git a/src/sass/partials/ui.sass b/src/sass/partials/ui.sass index 668cc7b4e..cce439654 100644 --- a/src/sass/partials/ui.sass +++ b/src/sass/partials/ui.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .tru-card-intro transform: scale(0) opacity: 0.02 @@ -339,6 +353,7 @@ label.md-label background: #e53935 &.uk-badge-grey background: darken($page_content_right_bg, 5%) + color: automatic-text-color(darken($page_content_right_bg, 5%), 'muted') &.uk-badge-small font-size: 10px padding: 2px 4px @@ -650,7 +665,7 @@ textarea.review-list &:first-of-type, &:only-of-type border-top: none - p + p,.p font-size: 13px line-height: 1.5 color: $text_color diff --git a/src/sass/partials/waves.sass b/src/sass/partials/waves.sass index 32750d1db..1989837a4 100644 --- a/src/sass/partials/waves.sass +++ b/src/sass/partials/waves.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + /*! ** Waves v0.7.4 ** http://fian.my.id/Waves diff --git a/src/sass/partials/wizard.scss b/src/sass/partials/wizard.scss index 2e078bc5c..d9a656cb1 100644 --- a/src/sass/partials/wizard.scss +++ b/src/sass/partials/wizard.scss @@ -1,3 +1,17 @@ +/*! + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 5:31 AM + * Copyright (c) 2014-2019. All rights reserved. + */ + .wizard, .tabcontrol { display: block; width: 100%; diff --git a/src/settings/defaults.js b/src/settings/defaults.js index 146aca349..cea4e5446 100644 --- a/src/settings/defaults.js +++ b/src/settings/defaults.js @@ -24,6 +24,148 @@ var PrioritySchema = require('../models/ticketpriority') var settingsDefaults = {} +settingsDefaults.userGrants = ['tickets:create view update', 'comments:create view update'] +settingsDefaults.supportGrants = [ + 'tickets:*', + 'agent:*', + 'accounts:create update view import', + 'comments:create view update create delete', + 'reports:view create', + 'notices:*' +] +settingsDefaults.adminGrants = [ + 'admin:*', + 'agent:*', + 'chat:*', + 'tickets:*', + 'accounts:*', + 'groups:*', + 'teams:*', + 'departments:*', + 'comments:*', + 'reports:*', + 'notices:*', + 'settings:*', + 'api:*' +] + +function teamsDefault (callback) { + var teamSchema = require('../models/team') + var roleSchmea = require('../models/role') + var userSchema = require('../models/user') + + async.series( + [ + function (next) { + // Create default Support Team + } + ], + callback + ) + + teamSchema.create( + { + name: 'Support' + }, + function (err, team) { + if (err) console.log(err) + + teamSchema.getTeams(function (err, teams) { + if (err) return callback(err) + + console.log(teams) + + return callback() + }) + } + ) +} + +function rolesDefault (callback) { + var roleSchema = require('../models/role') + + async.series( + [ + function (done) { + roleSchema.getRoleByName('User', function (err, role) { + if (err) return done(err) + if (role) return done() + + roleSchema.create( + { + name: 'User', + description: 'Default role for users', + grants: settingsDefaults.userGrants + }, + done + ) + }) + }, + function (done) { + roleSchema.getRoleByName('Support', function (err, role) { + if (err) return done(err) + if (role) { + return done() + // role.updateGrants(supportGrants, done); + } else + roleSchema.create( + { + name: 'Support', + description: 'Default role for agents', + grants: settingsDefaults.supportGrants + }, + done + ) + }) + }, + function (done) { + roleSchema.getRoleByName('Admin', function (err, role) { + if (err) return done(err) + if (role) return done() + // role.updateGrants(adminGrants, done); + else { + roleSchema.create( + { + name: 'Admin', + description: 'Default role for admins', + grants: settingsDefaults.adminGrants + }, + done + ) + } + }) + }, + function (done) { + var roleOrderSchema = require('../models/roleorder') + roleOrderSchema.getOrder(function (err, roleOrder) { + if (err) return done(err) + if (roleOrder) return done() + + roleSchema.getRoles(function (err, roles) { + if (err) return done(err) + + var roleOrder = [] + roleOrder.push(_.find(roles, { name: 'Admin' })._id) + roleOrder.push(_.find(roles, { name: 'Support' })._id) + roleOrder.push(_.find(roles, { name: 'User' })._id) + + roleOrderSchema.create( + { + order: roleOrder + }, + done + ) + }) + }) + } + ], + function (err) { + if (err) throw err + return callback() + } + ) +} + function createDirectories (callback) { async.parallel( [ @@ -447,7 +589,10 @@ settingsDefaults.init = function (callback) { return createDirectories(done) }, function (done) { - downloadWin32MongoDBTools(done) + return downloadWin32MongoDBTools(done) + }, + function (done) { + return rolesDefault(done) }, function (done) { return timezoneDefault(done) @@ -475,9 +620,7 @@ settingsDefaults.init = function (callback) { } ], function () { - if (_.isFunction(callback)) { - return callback() - } + if (_.isFunction(callback)) return callback() } ) } diff --git a/src/settings/settingsUtil.js b/src/settings/settingsUtil.js index e37319b29..0c095dedd 100644 --- a/src/settings/settingsUtil.js +++ b/src/settings/settingsUtil.js @@ -17,6 +17,8 @@ var async = require('async') var jsStringEscape = require('js-string-escape') var settingSchema = require('../models/setting') var ticketTypeSchema = require('../models/tickettype') +var roleSchema = require('../models/role') +var roleOrderSchema = require('../models/roleorder') var util = {} @@ -107,8 +109,6 @@ util.getSettings = function (callback) { s.privacyPolicy = parseSetting(settings, 'legal:privacypolicy', '') s.privacyPolicy.value = jsStringEscape(s.privacyPolicy.value) - content.data.settings = s - async.parallel( [ function (done) { @@ -156,10 +156,28 @@ util.getSettings = function (callback) { return done() }) + }, + function (done) { + roleSchema.getRoles(function (err, roles) { + if (err) return done(err) + roleOrderSchema.getOrder(function (err, roleOrder) { + if (err) return done(err) + roleOrder = roleOrder.order + + if (_.size(roleOrder) > 0) { + content.data.roles = _.map(roleOrder, function (roID) { + return _.find(roles, { _id: roID }) + }) + } else content.data.roles = roles + + return done() + }) + }) } ], function (err) { if (err) return callback(err) + content.data.settings = s return callback(null, content) } diff --git a/src/socketio/chatSocket.js b/src/socketio/chatSocket.js index 19c2ff310..928486a93 100644 --- a/src/socketio/chatSocket.js +++ b/src/socketio/chatSocket.js @@ -25,6 +25,7 @@ var events = {} function register (socket) { events.onSetUserIdle(socket) events.onSetUserActive(socket) + events.onUpdateUsers(socket) events.updateOnlineBubbles(socket) events.updateConversationsNotifications(socket) events.spawnChatWindow(socket) @@ -46,6 +47,10 @@ function eventLoop () { updateConversationsNotifications() } +events.onUpdateUsers = function (socket) { + socket.on('updateUsers', updateUsers) +} + events.onSetUserIdle = function (socket) { socket.on('$trudesk:setUserIdle', function () { var user = socket.request.user diff --git a/src/socketio/ticketSocket.js b/src/socketio/ticketSocket.js index 479c18b34..dfd77bf0b 100644 --- a/src/socketio/ticketSocket.js +++ b/src/socketio/ticketSocket.js @@ -20,6 +20,7 @@ var emitter = require('../emitter') var ticketSchema = require('../models/ticket') var prioritySchema = require('../models/ticketpriority') var userSchema = require('../models/user') +var roleSchema = require('../models/role') var permissions = require('../permissions') var events = {} @@ -91,10 +92,15 @@ events.onUpdateComments = function (socket) { events.onUpdateAssigneeList = function (socket) { socket.on('updateAssigneeList', function () { - userSchema.getAssigneeUsers(function (err, users) { + roleSchema.getAgentRoles(function (err, roles) { if (err) return true + userSchema.find({ role: { $in: roles } }, function (err, users) { + if (err) return true + + var sortedUser = _.sortBy(users, 'fullname') - utils.sendToSelf(socket, 'updateAssigneeList', users) + utils.sendToSelf(socket, 'updateAssigneeList', sortedUser) + }) }) }) } @@ -404,7 +410,7 @@ events.onRefreshTicketAttachments = function (socket) { var user = socket.request.user if (_.isUndefined(user)) return true - var canRemoveAttachments = permissions.canThis(user.role, 'ticket:removeAttachment') + var canRemoveAttachments = permissions.canThis(user.role, 'tickets:removeAttachment') var data = { ticket: ticket, diff --git a/src/socketserver.js b/src/socketserver.js index 03754feeb..e3d3a974d 100644 --- a/src/socketserver.js +++ b/src/socketserver.js @@ -1,17 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Updated: 01/09/2019 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var winston = require('winston') var async = require('async') diff --git a/src/views/accounts.hbs b/src/views/accounts.hbs index 309dc85af..4e9af6d49 100644 --- a/src/views/accounts.hbs +++ b/src/views/accounts.hbs @@ -4,23 +4,25 @@

                Accounts

                -
                -
                - person -
                - - person_add - Create - - {{#canUser data.common.loggedInAccount 'accounts:import'}} - - cloud_upload - Import + {{#canUser data.common.loggedInAccount 'accounts:create'}} +
                +
                + person +
                + + person_add + Create - {{/canUser}} + {{#canUser data.common.loggedInAccount 'accounts:import'}} + + cloud_upload + Import + + {{/canUser}} +
                -
                + {{/canUser}} @@ -47,18 +49,18 @@
                - + + + + + + + + + + + +
                @@ -80,9 +82,9 @@