fixed seed for users
[motion2.git] / snippet / 1.0.4 / scripts / app.js
1 ! function() {
2     "use strict";
3     angular.module("motion", ["ngAnimate", "ngAria", "ngMessages", "ngMaterial", "ngResource", "ngSanitize", "ngCsv", "ngEmbed", "ui.router", "LocalStorageModule", "ngRateIt", "flow"]).constant("STORAGE_PREFIX", "motion_chat").constant("STORAGE_VISITOR", "visitor").constant("STORAGE_LAYOUT", "layout").directive("ngEnter", function() {
4         return function(e, n, t) {
5             n.bind("keydown keypress", function(n) {
6                 13 === n.which && (e.$apply(function() {
7                     e.$eval(t.ngEnter)
8                 }), n.preventDefault())
9             })
10         }
11     })
12 }(),
13 function() {
14     "use strict";
15
16     function e(e, n, t, i, o, r, a, s, l, c, d) {
17         function m() {
18             n.settings.online ? r.go("app.online") : r.go("app.offline")
19         }
20
21         function p() {
22             n.visitor && n.visitor.interaction && n.visitor.interaction.id && l.chatInteraction.get({
23                 id: n.visitor.interaction.id
24             }).$promise.then(function(e) {
25                 delete k.errors.getInteraction, e.closed && (n.visitor.interaction.closed = !0, s.set(c, n.visitor), "unmanaged" === e.disposition ? r.go("app.unmanaged") : r.go("app.closing"))
26             }).catch(function(e) {
27                 switch (e.status) {
28                     case 403:
29                         r.go("app.closing");
30                         break;
31                     case 404:
32                         s.remove(c), m();
33                         break;
34                     case 405:
35                         r.go("app.unmanaged");
36                         break;
37                     default:
38                         console.error(e)
39                 }
40             })
41         }
42
43         function g(e) {
44             return function(n) {
45                 k.errors[e] = n.data, x()
46             }
47         }
48
49         function u(e) {
50             var t = b[0].emojioneArea.getText();
51             e && 13 === e.keyCode && e.shiftKey || e && 13 !== e.keyCode || "" !== t && f(_.merge({
52                 body: t
53             }, n.visitor))
54         }
55
56         function f(e) {
57             l.chatWebsite.notify(e).$promise.then(function(e) {
58                 delete k.errors.chatMessageError, _.isNil(n.visitor.interaction) && (n.visitor.interaction = {
59                     id: e.interaction.id
60                 }, s.set(c, n.visitor)), b[0].emojioneArea.setText(""), x()
61             }).catch(g("chatMessageError"))
62         }
63
64         function v() {
65             n.visitor && n.visitor.interaction && n.visitor.interaction.id && l.chatInteraction.getMessages({
66                 intid: n.visitor.interaction.id,
67                 id: T || void 0
68             }).$promise.then(function(e) {
69                 if (delete k.errors.interaction, e.count) {
70                     T = e.rows[e.count - 1].id;
71                     for (var n = 0; n < e.rows.length; n++) k.messages.push(e.rows[n]), "out" !== e.rows[n].direction || e.rows[n].read || h(e.rows[n].id);
72                     x()
73                 }
74             }).catch(function(e) {
75                 switch (e.status) {
76                     case 403:
77                         r.go("app.closing");
78                         break;
79                     case 405:
80                         r.go("app.unmanaged");
81                         break;
82                     default:
83                         console.error(e)
84                 }
85             })
86         }
87
88         function h(e) {
89             return l.chatMessage.update({
90                 id: e,
91                 read: !0
92             }).$promise.catch(function(e) {
93                 console.error(e)
94             })
95         }
96
97         function x() {
98             t(function() {
99                 var e = o[0].getElementsByClassName("chat-messages")[0];
100                 e && (e.scrollTop = e.scrollHeight)
101             })
102         }
103         var b, y, w, T, k = this;
104         k.errors = {}, k.messages = [], k.emojiOptions = {
105             watchEmbedData: !1,
106             fontSmiley: !1,
107             emoji: !0,
108             link: !0,
109             linkTarget: "_blank"
110         }, k.$onInit = function() {
111             n.loading = !1, n.settings.showMenu = !0, n.visitor = s.get(c) || {}, n.layout = s.get(d) || {}, k.replyMessage = "", n.visitor.interaction && n.visitor.interaction.closed ? (s.remove(c), m()) : (p(), y = i(v, 2e3), w = i(p, 3e3)), b = $("#emojionearea").emojioneArea({
112                 placeholder: n.settings.placeholderMessage || "Type a message",
113                 events: {
114                     keyup: function(e, n) {
115                         u(n)
116                     }
117                 }
118             })
119         }, k.reply = u, k.fileAdded = function(e) {
120             var t = new FormData;
121             t.append("file", e.file), a.post(n.settings.remote + "/api/chat/interactions/" + n.visitor.interaction.id + "/attachment_upload?token=" + n.settings.token, t, {
122                 transformRequest: angular.identity,
123                 headers: {
124                     "Content-Type": void 0
125                 }
126             }).then(function(e) {
127                 (e = e.data).id ? (delete k.errors.sendAttachment, f(_.merge({
128                     body: '<a href="' + n.settings.remote + "/api/chat/interactions/" + n.visitor.interaction.id + "/attachment_download?attachId=" + e.id + "&token=" + n.settings.token + '" target="_blank">' + e.name + "</a>",
129                     AttachmentId: e.id
130                 }, n.visitor))) : g("sendAttachment")
131             }, g("sendAttachment"))
132         }, e.$on("$destroy", function() {
133             i.cancel(y), i.cancel(w), y = null, w = null
134         }), n.$on("$download", function(e, n) {
135             n && n(_.values(k.messages))
136         })
137     }
138     e.$inject = ["$scope", "$rootScope", "$timeout", "$interval", "$document", "$state", "$http", "localStorageService", "api", "STORAGE_VISITOR", "STORAGE_LAYOUT"], angular.module("motion").controller("ChatController", e)
139 }(),
140 function() {
141     "use strict";
142
143     function e(e, n, t, i, o, r) {
144         function a() {
145             n.settings.online ? t.go("app.online") : t.go("app.offline")
146         }
147
148         function s() {
149             d.form = {}, d.upColor = null, d.downColor = null, d.userForm.$setPristine(), d.userForm.$setUntouched(), i.remove(r), n.enableDownload = !1
150         }
151
152         function l(e) {
153             return function(n) {
154                 d.errors[e] = n.data
155             }
156         }
157
158         function c() {
159             n.loading = !1
160         }
161         var d = this;
162         d.$onInit = function() {
163             d.visitor = i.get(r) || {}, i.remove(r), n.loading = !1, delete n.visitor.interaction
164         }, d.submit = function() {
165             n.loading = !0, d.visitor.interaction && d.visitor.interaction.id ? o.chatInteraction.close(_.merge({
166                 id: d.visitor.interaction.id,
167                 ratingType: n.settings.ratingType
168             }, d.form)).$promise.then(function(e) {
169                 delete d.errors.submit
170             }).then(s).then(a).catch(l("submit")).finally(c) : (c(), l("submit"))
171         }, d.skip = function() {
172             s(), a()
173         }, d.form = {}, d.errors = {}
174     }
175     e.$inject = ["$scope", "$rootScope", "$state", "localStorageService", "api", "STORAGE_VISITOR"], angular.module("motion").controller("ClosingController", e)
176 }(),
177 function() {
178     "use strict";
179
180     function e(e, n, t, i, o, r, a, s, l, c, d) {
181         function m() {
182             o.go(n.settings.online ? "app.online" : "app.offline")
183         }
184
185         function p(e) {
186             t.parent.postMessage({
187                 cmd: e
188             }, "*")
189         }
190
191         function g(e) {
192             n.layout.up = e, s.set(c, n.layout), p(e ? "show" : "hide")
193         }
194         var u = this;
195         u.$onInit = function() {
196             n.visitor = s.get(d) || {}, n.layout = s.get(c) || {
197                 up: !1
198             }, g(!!n.layout.up), m()
199         }, u.close = function() {
200             var e = s.get(d).interaction;
201             if (e && e.id) {
202                 var t = r.confirm().parent(angular.element(document.querySelector("#chat-app"))).clickOutsideToClose(!0).title(n.settings.closingQuestion || "Do you want to close the interaction?").ok("Ok").cancel("Cancel");
203                 r.show(t).then(function() {
204                     return l.chatInteraction.update({
205                         id: e.id,
206                         closed: !0,
207                         closedAt: moment().format("YYYY-MM-DD HH:mm:ss")
208                     }).$promise
209                 }).then(function() {
210                     o.go("app.closing")
211                 }).catch(function(e) {
212                     console.error("keep open", e)
213                 })
214             }
215         }, u.toggle = g, u.download = function(e) {
216             var n = a.defer(),
217                 t = s.get(d).interaction;
218             return t && t.id && l.chatInteraction.getMessages({
219                 intid: t.id
220             }).$promise.then(function(e) {
221                 n.resolve(_.map(e.rows, function(e) {
222                     return {
223                         sender: "in" === e.direction ? "Visitor" + e.ContactId : e.UserId ? "Agent" + e.UserId : "System",
224                         message: e.body,
225                         createdAt: moment(e.createdAt).format("MM/DD/YYYY HH:mm:ss")
226                     }
227                 }))
228             }).catch(function(e) {
229                 console.error(e)
230             }), n.promise
231         }, u.getHeaderShape = function() {
232             return "rounded" === n.settings.header_shape ? "15px" : "0px"
233         }, window.addEventListener("message", function(e) {
234             g("show" === e.data.evt)
235         }, !1)
236     }
237     e.$inject = ["$scope", "$rootScope", "$window", "$http", "$state", "$mdDialog", "$q", "localStorageService", "api", "STORAGE_LAYOUT", "STORAGE_VISITOR"], angular.module("motion").controller("IndexController", e)
238 }(),
239 function() {
240     "use strict";
241
242     function e(e, n) {
243         var t = {
244                 baseUrl: e.settings.remote + "/api/"
245             },
246             i = {
247                 id: "@id",
248                 token: e.settings.token
249             };
250         return t.chatWebsite = n(t.baseUrl + "chat/websites/:id", i, {
251             notify: {
252                 method: "POST",
253                 url: t.baseUrl + "chat/websites/:id/notify"
254             },
255             offline: {
256                 method: "POST",
257                 url: t.baseUrl + "chat/websites/:id/offline"
258             },
259             getFields: {
260                 method: "GET",
261                 url: t.baseUrl + "chat/websites/:id/fields"
262             }
263         }), t.chatInteraction = n(t.baseUrl + "chat/interactions/:id", i, {
264             update: {
265                 method: "PUT",
266                 url: t.baseUrl + "chat/interactions/:id"
267             },
268             close: {
269                 method: "PUT",
270                 url: t.baseUrl + "chat/interactions/:id/close"
271             },
272             getMessages: {
273                 method: "GET",
274                 url: t.baseUrl + "chat/interactions/:intid/my_messages"
275             },
276             uploadAttachment: {
277                 method: "POST",
278                 url: t.baseUrl + "chat/interactions/:id/attachment_upload",
279                 headers: {
280                     "Content-Type": void 0
281                 },
282                 transformRequest: angular.identity
283             },
284             downloadAttachment: {
285                 method: "GET",
286                 url: t.baseUrl + "chat/interactions/:id/attachment_download"
287             }
288         }), t.chatMessage = n(t.baseUrl + "chat/messages/:id", i, {
289             update: {
290                 method: "PUT",
291                 url: t.baseUrl + "chat/messages/:id"
292             }
293         }), t
294     }
295     e.$inject = ["$rootScope", "$resource"], angular.module("motion").factory("api", e)
296 }(),
297 function() {
298     "use strict";
299
300     function e(e, n) {
301         var t = n.search();
302         e.settings = {
303             cursor: "pointer",
304             hide: !0
305         }, _.forIn(t, function(n, t) {
306             "" === n || _.isNil(n) || ("true" === n && (n = !0), "false" === n && (n = !1), e.settings[t] = n)
307         })
308     }
309
310     function n(e, n, t, i, o, r) {
311         t.html5Mode(!0), i.defaults.headers.get || (i.defaults.headers.get = {}), i.defaults.headers.get["If-Modified-Since"] = "Mon, 26 Jul 1997 05:00:00 GMT", i.defaults.headers.get["Cache-Control"] = "no-cache", i.defaults.headers.get.Pragma = "no-cache", o.setPrefix(r), e.state("app", {
312             url: "/app",
313             abstract: !0
314         }).state("app.waiting", {
315             url: "/waiting",
316             templateUrl: "app/waiting/index.html",
317             controller: "WaitingController as vm"
318         }).state("app.online", {
319             url: "/online",
320             templateUrl: "app/online/index.html",
321             controller: "OnlineController as vm"
322         }).state("app.offline", {
323             url: "/offline",
324             templateUrl: "app/offline/index.html",
325             controller: "OfflineController as vm"
326         }).state("app.chat", {
327             url: "/chat",
328             templateUrl: "app/chat/index.html",
329             controller: "ChatController as vm"
330         }).state("app.unmanaged", {
331             url: "/unmanaged",
332             templateUrl: "app/unmanaged/index.html",
333             controller: "UnmanagedController as vm"
334         }).state("app.closing", {
335             url: "/closing",
336             templateUrl: "app/closing/index.html",
337             controller: "ClosingController as vm"
338         })
339     }
340     e.$inject = ["$rootScope", "$location"], n.$inject = ["$stateProvider", "$urlRouterProvider", "$locationProvider", "$httpProvider", "localStorageServiceProvider", "STORAGE_PREFIX"], angular.module("motion").config(n).run(e)
341 }(),
342 function() {
343     "use strict";
344
345     function e(e, n, t) {
346         function i(n) {
347             return function(i) {
348                 var o = t.simple().textContent(e.settings.formSubmitFailureMessage || "Form submission error").toastClass("md-failure-toast").position("top");
349                 t.show(o), a.errors[n] = i.data
350             }
351         }
352
353         function o() {
354             console.log("stopLoading"), e.loading = !1
355         }
356
357         function r() {
358             return "Anonymous" + _.random(1, 1e6)
359         }
360         var a = this,
361             s = null;
362         a.$onInit = function() {
363             console.log(e.settings), a.visitor = {
364                 id: e.settings.id,
365                 mapKeyOffline: "firstName",
366                 from: r()
367             }, e.settings.showMenu = !1, e.loading = !1, n.chatWebsite.getFields({
368                 id: e.settings.id,
369                 online: !1
370             }).$promise.then(function(e) {
371                 e.count && (s = e.fromKey, a.fields = e.rows)
372             }).catch(function(e) {
373                 console.error(e)
374             })
375         }, a.submit = function() {
376             e.loading = !0;
377             for (var r = 0; r < a.fields.length; r++) {
378                 var l = a.fields[r];
379                 l.props && a.form.hasOwnProperty(l.props.title) && (_.isNil(l.cmField) || (a.visitor[l.cmField] = _.isArray(a.form[l.props.title]) ? a.form[l.props.title].join() : a.form[l.props.title]), r === s && (_.isNil(e.settings.mapKeyOffline) || (a.visitor.mapKeyOffline = e.settings.mapKeyOffline, a.visitor.from = _.isArray(a.form[l.props.title]) ? a.form[l.props.title].join() : a.form[l.props.title])))
380             }
381             n.chatWebsite.offline(_.merge({
382                 body: a.form
383             }, a.visitor)).$promise.then(function(n) {
384                 delete a.errors.submit, e.$emit("hide"), a.form = {}, a.userForm.$setPristine(), a.userForm.$setUntouched();
385                 var i = t.simple().textContent(e.settings.formSubmitSuccessMessage || "Form properly submitted").toastClass("md-success-toast").position("top");
386                 t.show(i)
387             }).catch(i("submit")).finally(o)
388         }, a.toggle = function(e, n) {
389             a.form[e] || (a.form[e] = []);
390             var t = a.form[e].indexOf(n);
391             t > -1 ? a.form[e].splice(t, 1) : a.form[e].push(n)
392         }, a.exists = function(e, n) {
393             return a.form[e] || (a.form[e] = []), a.form[e].indexOf(n) > -1
394         }, a.form = {}, a.errors = {}, a.userForm = {}
395     }
396     e.$inject = ["$rootScope", "api", "$mdToast"], angular.module("motion").controller("OfflineController", e)
397 }(),
398 function() {
399     "use strict";
400
401     function e(e, n, t, i, o, r) {
402         function a() {
403             e.settings.enableCustomerWriting ? n.go("app.chat") : n.go("app.waiting")
404         }
405
406         function s(e) {
407             c.disableItem = !0, i.chatWebsite.notify(e).$promise.then(function(e) {
408                 delete c.errors.chatMessageError, c.visitor.message = {
409                     id: e.message.id
410                 }, c.visitor.interaction = {
411                     id: e.interaction.id
412                 }, t.set(r, c.visitor), c.disableItem = !1, a()
413             }).catch(function(e) {
414                 c.disableItem = !1, console.error(e)
415             })
416         }
417
418         function l() {
419             return "Anonymous" + _.random(1, 1e6)
420         }
421         var c = this,
422             d = null;
423         c.$onInit = function() {
424             t.get(r) && (c.visitor = t.get(r)), c.visitor && c.visitor.interaction ? c.visitor.interaction.UserId ? n.go("app.chat") : n.go("app.waiting") : (c.visitor = {
425                 id: e.settings.id,
426                 mapKey: "firstName",
427                 from: l()
428             }, e.settings.showMenu = !1, t.set(r, c.visitor), i.chatWebsite.getFields({
429                 id: e.settings.id,
430                 online: !0
431             }).$promise.then(function(e) {
432                 e.count && (d = e.fromKey, c.fields = e.rows)
433             }).catch(function(e) {
434                 console.error(e)
435             }))
436         }, c.submit = function() {
437             for (var n = "", t = 0; t < c.fields.length; t++) {
438                 var i = c.fields[t];
439                 i.props && c.form.hasOwnProperty(i.props.title) && (_.isNil(i.variable) || (c.visitor[i.variable] = _.isArray(c.form[i.props.title]) ? c.form[i.props.title].join() : c.form[i.props.title]), _.isNil(i.cmField) || (c.visitor[i.cmField] = _.isArray(c.form[i.props.title]) ? c.form[i.props.title].join() : c.form[i.props.title]), t === d && (_.isNil(e.settings.mapKey) || (c.visitor.mapKey = e.settings.mapKey, c.visitor.from = _.isArray(c.form[i.props.title]) ? c.form[i.props.title].join() : c.form[i.props.title])), n += i.props.title + ": " + c.form[i.props.title] + "\n")
440             }
441             s(_.merge({
442                 body: n,
443                 referer: e.settings.referer,
444                 customerIp: e.settings.customerIp
445             }, c.visitor))
446         }, c.toggle = function(e, n) {
447             c.form[e] || (c.form[e] = []);
448             var t = c.form[e].indexOf(n);
449             t > -1 ? c.form[e].splice(t, 1) : c.form[e].push(n)
450         }, c.exists = function(e, n) {
451             return c.form[e] || (c.form[e] = []), c.form[e].indexOf(n) > -1
452         }, c.form = {}, c.errors = {}, c.userForm = {}, c.disableItem = !1
453     }
454     e.$inject = ["$rootScope", "$state", "localStorageService", "api", "STORAGE_PREFIX", "STORAGE_VISITOR"], angular.module("motion").controller("OnlineController", e)
455 }(),
456 function() {
457     "use strict";
458
459     function e(e, n, t, i, o, r) {
460         function a() {
461             n.settings.online ? t.go("app.online") : t.go("app.offline")
462         }
463
464         function s() {
465             d.form = {}, d.upColor = null, d.downColor = null, d.userForm.$setPristine(), d.userForm.$setUntouched(), i.remove(r), n.enableDownload = !1, n.$emit("hide")
466         }
467
468         function l(e) {
469             return function(n) {
470                 d.errors[e] = n.data
471             }
472         }
473
474         function c() {
475             n.loading = !1
476         }
477         var d = this;
478         d.form = {}, d.errors = {}, d.$onInit = function() {
479             d.visitor = i.get(r) || {}, i.remove(r), n.loading = !1
480         }, d.submit = function() {
481             n.loading = !0, d.visitor.interaction && d.visitor.interaction.id ? o.chatInteraction.update({
482                 id: d.visitor.interaction.id,
483                 note: d.form.note
484             }).$promise.then(function(e) {
485                 delete d.errors.submit
486             }).then(s).then(a).catch(l("submit")).finally(c) : (c(), l("submit"))
487         }, d.skip = function() {
488             s(), a()
489         }
490     }
491     e.$inject = ["$scope", "$rootScope", "$state", "localStorageService", "api", "STORAGE_VISITOR"], angular.module("motion").controller("UnmanagedController", e)
492 }(),
493 function() {
494     "use strict";
495
496     function e(e, n, t, i, o, r, a, s, l, c) {
497         function d() {
498             l.chatInteraction.get({
499                 id: g.visitor.interaction.id
500             }).$promise.then(function(e) {
501                 e.closed && (g.visitor.interaction.closed = !0, s.set(c, g.visitor), "unmanaged" === e.disposition && i.go("app.unmanaged")), e.UserId && (g.visitor.interaction.UserId = e.UserId, s.set(c, g.visitor), i.go("app.chat"))
502             }).catch(function(e) {
503                 switch (e.status) {
504                     case 403:
505                         i.go("app.closing");
506                         break;
507                     case 405:
508                         i.go("app.unmanaged");
509                         break;
510                     default:
511                         console.error(e)
512                 }
513             })
514         }
515
516         function m() {
517             if (g.visitor && g.visitor.interaction && g.visitor.interaction.id && !u) {
518                 u = !0;
519                 var n = new XMLHttpRequest;
520                 n.open("PUT", e.settings.remote + "/api/chat/interactions/" + g.visitor.interaction.id + "/abandon?token=" + e.settings.token, !1), n.setRequestHeader("Content-type", "application/json; charset=utf-8"), n.send(JSON.stringify({
521                     channel: "chat",
522                     interaction: {
523                         id: g.visitor.interaction.id
524                     },
525                     message: {
526                         id: g.visitor.message.id
527                     },
528                     disposition: "abandoned",
529                     closed: !0,
530                     closedAt: moment().format("YYYY-MM-DD HH:mm:ss")
531                 })), 4 === n.readyState && 200 === n.status && s.remove(c)
532             }
533         }
534         var p, g = this,
535             u = !1;
536         g.$onInit = function() {
537             g.visitor && g.visitor.interaction && g.visitor.interaction.id && (p = t(d, 3e3))
538         }, g.visitor = s.get(c) || {}, n.$on("$destroy", function() {
539             a.removeEventListener("beforeunload", m), a.removeEventListener("unload", m), t.cancel(p)
540         }), a.addEventListener("beforeunload", m), a.addEventListener("unload", m)
541     }
542     e.$inject = ["$rootScope", "$scope", "$interval", "$state", "$transitions", "$q", "$window", "localStorageService", "api", "STORAGE_VISITOR"], angular.module("motion").controller("WaitingController", e)
543 }(), angular.module("motion").run(["$templateCache", function(e) {
544     "use strict";
545     e.put("app/chat/index.html", '\x3c!-- CHAT CONTENT --\x3e\n<md-content class="chat-messages">\n  <div layout="row" ng-if="!$first" ng-repeat="(key, message) in vm.messages track by message.id" class="md-padding message-row" ng-class="{\'in\': message.direction === \'in\', \'out\': message.direction === \'out\' && message.UserId, \'auto\': message.direction === \'out\' && !message.UserId}">\n    <img ng-if="message.direction ===\'out\' && !message.UserId" src="assets/images/avatars/robot0.png" class="avatar" alt="system" />\n    <img ng-if="message.direction ===\'out\' && message.UserId" ng-src="{{settings.remote}}/api/{{settings.showAgentAvatar ? \'users/\' + visitor.interaction.UserId + \'/avatar\' : \'chat/websites/\' + settings.id + \'/avatar\'}}?token={{settings.token}}" class="avatar" alt="agent" />\n    <img ng-if="message.direction ===\'in\'" src="assets/images/avatars/customer0.png" class="avatar" alt="customer" />\n\n    <div class="bubble">\n      <div class="time secondary-text">\n        <span>\n          {{message.direction === \'out\' ? (message.UserId ? (settings.agentAlias || \'Agent\') + message.UserId : \'System\') : (vm.visitor.from || \'Visitor\' + message.ContactId)}} - {{message.createdAt | date : \'h:mm\'}}\n        </span>\n      </div>\n      <div ng-class="{\'in\': message.direction === \'in\', \'out\': message.direction ===\'out\' && message.UserId, \'auto\': message.direction ===\'out\' && !message.UserId}">\n        <div ng-if="message.AttachmentId" ng-bind-html="message.body" class="message"></div>\n        <div ng-if="!message.AttachmentId" ng-bind-html="message.body | embed:vm.emojiOptions" class="message"></div>\n      </div>\n    </div>\n\n  </div>\n\n  \x3c!-- CHAT ERROR --\x3e\n  <div class="chat-error" ng-repeat="error in vm.errors" layout="row" layout-align="center end" layout-margin>\n      <i class="mdi mdi-alert mdi-24px mdi-light"></i>\n      <md-tooltip md-direction="top">{{error.message || \'Service temporarily unavailable.\'}}</md-tooltip>\n      <span class="chat-error-message">{{error.message || \'Service temporarily unavailable.\'}}</span>\n  </div>\n  \x3c!-- CHAT ERROR --\x3e\n<md-content>\n\x3c!-- / CHAT CONTENT --\x3e\n\n\x3c!-- CHAT FOOTER --\x3e\n<div class="chat-footer" layout="row" layout-align="center center">\n  <input type="text" id="emojionearea"/>\n\n  <div layout="row" layout-align="end center">\n    <md-button ng-if="settings.enableCustomerAttachment" class="md-fab md-mini md-warn" type="button" flow-init flow-btn flow-file-added="vm.fileAdded($file, $event, $flow)">\n      <i class="mdi mdi-attachment mdi-24px mdi-light"></i>\n    </md-button>\n  </div>\n</div>\n\x3c!-- / CHAT FOOTER--\x3e\n'), e.put("app/closing/index.html", '\x3c!-- CHAT CONTENT --\x3e\n<md-content class="chat-online">\n  \x3c!-- CHAT ERROR --\x3e\n  <div class="chat-error" ng-repeat="error in vm.errors" layout="row" layout-margin>\n    <i class="mdi mdi-alert mdi-24px mdi-light"></i>\n    <md-tooltip md-direction="top">{{error.message || \'Service temporarily unavailable.\'}}</md-tooltip>\n    <span class="chat-error-message">{{error.message || \'Service temporarily unavailable.\'}}</span>\n  </div>\n  \x3c!-- CHAT ERROR --\x3e\n\n  <md-content layout="row" layout-align="center end">\n    <span>{{ settings.closingMessage }}</span>\n  </md-content>\n\n  <form name="vm.userForm" layout="column" novalidate>\n    <md-input-container ng-if="settings.enableRating" ng-switch="settings.ratingType" class="md-block" style="margin: 0px; padding: 10px 0px 5px 0px;" md-no-float>\n      \x3c!-- START thumb rating --\x3e\n      <md-radio-group name="ratingValue" ng-switch-when="thumb" ng-model="vm.form.ratingValue" ng-change="vm.upColor = vm.form.ratingValue ? \'green\' : null; vm.downColor = !vm.form.ratingValue ? \'red\' : null;" layout="row" layout-align="center center">\n        <md-radio-button ng-value="1" class="thumb">\n          <div class="{{vm.upColor}}">\n            <i class="mdi mdi-48px mdi-thumb-up-outline"></i>\n          </div>\n        </md-radio-button>\n        <md-radio-button ng-value="0" class="thumb">\n          <div class="{{vm.downColor}}">\n            <i class="mdi mdi-48px mdi-thumb-down-outline"></i>\n          </div>\n        </md-radio-button>\n      </md-radio-group>\n      \x3c!-- END thumb rating --\x3e\n\n      \x3c!-- START star rating --\x3e\n      <div ng-switch-when="star" layout="row" layout-align="center center">\n        <ng-rate-it name="ratingValue" ng-model="vm.form.ratingValue" min="0" max="settings.ratingStarsNumber" step="1" star-width="32" star-height="32" class="bigstar rate" resetable="false"></ng-rate-it>\n      </div>\n      \x3c!-- END star rating --\x3e\n    </md-input-container>\n\n    <md-input-container ng-if="settings.enableFeedback" class="md-block" style="margin: 0px; padding: 0px 0px 10px 0px;" md-no-float>\n      \x3c!-- START textarea --\x3e\n      <span style="padding: 5px 0px 5px 0px;">Feedback</span>\n      <textarea name="message" ng-model="vm.form.ratingMessage" md-maxlength="150" rows="3"></textarea>\n      \x3c!-- END textarea --\x3e\n    </md-input-container>\n\n    <md-input-container ng-if="settings.forwardTranscript" class="md-block" style="margin: 0px; padding: 0px 0px 10px 0px;" md-no-float>\n      <span ng-if="settings.forwardTranscriptMessage" style="padding: 5px 0px 5px 0px;">{{settings.forwardTranscriptMessage}}</span>\n      <span ng-if="!settings.forwardTranscriptMessage" style="padding: 5px 0px 5px 0px;">Email</span>\n      \x3c!-- START email --\x3e\n      <input type="email" name="mailTranscript" ng-model="vm.form.mailTranscript" placeholder="email">\n      <div ng-messages="vm.userForm[\'mailTranscript\'].$error" ng-show="vm.userForm[\'mailTranscript\'].$touched" role="alert">\n        <div ng-message="email">\n            <span>Email must be a valid e-mail address</span>\n        </div>\n      </div>\n      \x3c!-- END email --\x3e\n    </md-input-container>\n\n    <div layout="row" layout-align="center center">\n      <md-button class="md-raised" ng-if="settings.enableRating || settings.enableFeedback || settings.forwardTranscript" ng-click="vm.submit()" ng-disabled="vm.userForm.$invalid || loading" ng-style="{\'background-color\': \'{{settings.color_button}}\'}">\n        {{settings.closingMessageButton}}\n      </md-button>\n      <md-button class="md-raised" ng-style="{\'background-color\': \'{{settings.color_button}}\'}" ng-click="vm.skip()">\n        {{settings.skipMessageButton}}\n      </md-button>\n    </div>\n  </form>\n\n  <md-content layout="row" layout-align="center end">\n    <span>{{ (settings.custom && !settings.defaultWhiteLabel) ? settings.whiteLabel : \'Powered By XCALLY\' }}</span>\n  </md-content>\n\n</md-content>\n\x3c!-- / CHAT CONTENT --\x3e\n'), e.put("app/offline/index.html", '\x3c!-- CHAT CONTENT --\x3e\n<md-content class="chat-online">\n  \n  <div id="toaster"></div>\n\n  <form ng-if="vm.fields.length" name="vm.userForm" layout="column" novalidate>\n    <div ng-repeat="field in ::vm.fields | orderBy:\'index\'" layout="column">\n      <span>{{field.props.title + (field.config.required ? \'*\' : \'\')}}</span>\n\n      <span style="font-size: 13px; line-height: 14px; color: grey; padding: 5px 0px 5px 0px;">\n        <div ng-bind-html="field.props.helpText | embed:{linkTarget:\'_blank\'}"></div>\n      </span>\n\n      \x3c!-- CHAT ERROR --\x3e\n      <div class="chat-error" ng-repeat="error in vm.errors" layout="row" layout-margin>\n        <i class="mdi mdi-alert mdi-24px mdi-light"></i>\n        <md-tooltip md-direction="top">{{error.message || \'Service temporarily unavailable.\'}}</md-tooltip>\n        <span class="chat-error-message">{{error.message || \'Service temporarily unavailable.\'}}</span>\n      </div>\n      \x3c!-- CHAT ERROR --\x3e\n\n      <md-input-container md-no-float ng-switch="field.type" style="margin: 0px; padding: 0px 0px 10px 0px;">\n        \x3c!-- START label --\x3e\n        <div ng-switch-when="label">\n          <md-content flex layout-padding layout="row" layout-align="center center">\n            <span>{{field.value}}</span>\n          </md-content>\n        </div>\n        \x3c!-- END label --\x3e\n\n        \x3c!-- START textinput --\x3e\n        <div ng-switch-when="input">\n          <input name="{{field.props.title}}" ng-model="vm.form[field.props.title]" type="{{field.config.type}}" ng-required="field.config.required">\n        </div>\n        \x3c!-- END textinput --\x3e\n\n        \x3c!-- START textarea --\x3e\n        <div ng-switch-when="textarea">\n          <textarea name="{{field.props.title}}" ng-model="vm.form[field.props.title]" md-maxlength="150" rows="3"></textarea>\n        </div>\n        \x3c!-- END textarea --\x3e\n\n        \x3c!-- START select --\x3e\n        <div ng-switch-when="chooseFromList">\n          <md-select name="{{field.props.title}}" ng-model="vm.form[field.props.title]" ng-required="field.config.required">\n            <md-option ng-repeat="option in ::field.options" ng-value="option.value">{{option.value}}</md-option>\n          </md-select>\n        </div>\n        \x3c!-- END select --\x3e\n\n        \x3c!-- START radio --\x3e\n        <div ng-switch-when="multipleChoices" layout="{{field.config.direction === \'vertical\' ? \'row\' : \'column\'}}">\n          <md-radio-group name="{{field.props.title}}" ng-model="vm.form[field.props.title]" ng-required="field.config.required" layout="{{field.config.direction === \'vertical\' ? \'row\' : \'column\'}}">\n            <md-radio-button ng-repeat="option in ::field.options" value="{{option.value}}" class="md-primary">{{option.value}}</md-radio-button>\n          </md-radio-group>\n        </div>\n        \x3c!-- END radio --\x3e\n\n        \x3c!-- START checkbox --\x3e\n        <div ng-switch-when="checkboxes">\n          <div layout="{{field.config.direction === \'vertical\' ? \'row\' : \'column\'}}">\n            <md-checkbox\n            md-no-ink\n            aria-label="{{field.props.title}}"\n            ng-repeat="option in ::field.options"\n            ng-checked="vm.exists(field.props.title, option.value)"\n            ng-disabled="!vm.exists(field.props.title, option.value) && field.config.maxSelections === vm.form[field.props.title].length"\n            ng-click="vm.toggle(field.props.title, option.value)"\n            flex>\n              {{option.value}}\n            </md-checkbox>\n          </div>\n        </div>\n        \x3c!-- END checkbox --\x3e\n\n        \x3c!-- START agreement --\x3e\n        <div ng-switch-when="agreement" layout="column">\n            <md-checkbox md-no-ink ng-model="vm.form[field.props.title]" aria-label="{{field.props.title}}" ng-required="field.config.required">\n              {{field.options[0].value}}\n            </md-checkbox>\n        </div>\n        \x3c!-- END agreement --\x3e\n\n        <div ng-messages="vm.userForm[field.props.title].$error" ng-show="vm.userForm[field.props.title].$touched" role="alert">\n            <div ng-message="required">\n                <span>Required Field</span>\n            </div>\n        </div>\n      </md-input-container>\n    </div>\n\n    <md-button ng-click="vm.submit()" class="md-raised" ng-disabled="vm.userForm.$invalid || vm.userForm.$pristine || loading" ng-style="{\'background-color\': \'{{settings.color_button}}\'}">{{settings.offline_chat_button}}</md-button>\n  </form>\n\n  <md-content layout="row" layout-align="center end">\n    <span>{{ (settings.custom && !settings.defaultWhiteLabel) ? settings.whiteLabel : \'Powered By XCALLY\' }}</span>\n  </md-content>\n</md-content>\n\x3c!-- / CHAT CONTENT --\x3e\n'), e.put("app/online/index.html", '\x3c!-- CHAT CONTENT --\x3e\n<md-content class="chat-online">\n  <form ng-if="vm.fields.length" name="vm.userForm" layout="column" novalidate>\n    <div ng-repeat="field in ::vm.fields | orderBy:\'index\'" layout="column">\n      <span>{{field.props.title + (field.config.required ? \'*\' : \'\')}}</span>\n\n      <span style="font-size: 13px; line-height: 14px; color: grey; padding: 5px 0px 5px 0px;">\n        <div ng-bind-html="field.props.helpText | embed:{linkTarget:\'_blank\'}"></div>\n      </span>\n\n      \x3c!-- CHAT ERROR --\x3e\n      <div class="chat-error" ng-repeat="error in vm.errors" layout="row" layout-margin>\n        <i class="mdi mdi-alert mdi-24px mdi-light"></i>\n        <md-tooltip md-direction="top">{{error.message || \'Service temporarily unavailable.\'}}</md-tooltip>\n        <span class="chat-error-message">{{error.message || \'Service temporarily unavailable.\'}}</span>\n      </div>\n      \x3c!-- CHAT ERROR --\x3e\n\n      <md-input-container md-no-float ng-switch="field.type" style="margin: 0px; padding: 0px 0px 10px 0px;">\n        \x3c!-- START label --\x3e\n        <div ng-switch-when="label">\n          <md-content flex layout-padding layout="row" layout-align="center center">\n            <span>{{field.value}}</span>\n          </md-content>\n        </div>\n        \x3c!-- END label --\x3e\n\n        \x3c!-- START textinput --\x3e\n        <div ng-switch-when="input">\n          <input name="{{field.props.title}}" ng-model="vm.form[field.props.title]" placeholder="{{field.config.placeholder}}" type="text" ng-required="field.config.required">\n        </div>\n        \x3c!-- END textinput --\x3e\n\n        \x3c!-- START textarea --\x3e\n        <div ng-switch-when="textarea">\n          <textarea name="{{field.props.title}}" ng-model="vm.form[field.props.title]" md-maxlength="150" rows="3"></textarea>\n        </div>\n        \x3c!-- END textarea --\x3e\n\n        \x3c!-- START select --\x3e\n        <div ng-switch-when="chooseFromList">\n          <md-select name="{{field.props.title}}" ng-model="vm.form[field.props.title]" placeholder="{{field.config.placeholder}}" ng-required="field.config.required">\n            <md-option ng-repeat="option in ::field.options" ng-value="option.value">{{option.value}}</md-option>\n          </md-select>\n        </div>\n        \x3c!-- END select --\x3e\n\n        \x3c!-- START radio --\x3e\n        <div ng-switch-when="multipleChoices">\n          <md-radio-group md-no-ink name="{{field.props.title}}" ng-model="vm.form[field.props.title]" ng-required="field.config.required" layout="{{field.config.direction === \'vertical\' ? \'row\' : \'column\'}}">\n            <md-radio-button ng-repeat="option in ::field.options" ng-value="option.value" class="md-primary">{{option.value}}</md-radio-button>\n          </md-radio-group>\n        </div>\n        \x3c!-- END radio --\x3e\n\n        \x3c!-- START checkbox --\x3e\n        <div ng-switch-when="checkboxes" layout="{{field.config.direction === \'vertical\' ? \'row\' : \'column\'}}">\n            <md-checkbox\n            md-no-ink\n            aria-label="{{field.props.title}}"\n            ng-repeat="option in ::field.options"\n            ng-checked="vm.exists(field.props.title, option.value)"\n            ng-disabled="!vm.exists(field.props.title, option.value) && field.config.maxSelections === vm.form[field.props.title].length"\n            ng-required="vm.getSelected()"\n            ng-click="vm.toggle(field.props.title, option.value)">\n              {{option.value}}\n            </md-checkbox>\n        </div>\n        \x3c!-- END checkbox --\x3e\n\n        \x3c!-- START agreement --\x3e\n        <div ng-switch-when="agreement" layout="{{field.config.direction === \'vertical\' ? \'row\' : \'column\'}}">\n            <md-checkbox md-no-ink ng-model="vm.form[field.props.title]" aria-label="{{field.props.title}}" ng-required="field.config.required">\n              {{field.options[0].value}}\n            </md-checkbox>\n        </div>\n        \x3c!-- END agreement --\x3e\n\n        <div ng-messages="vm.userForm[field.props.title].$error" ng-show="vm.userForm[field.props.title].$touched" role="alert">\n            <div ng-message="required">\n                <span>Required Field</span>\n            </div>\n        </div>\n      </md-input-container>\n    </div>\n\n    <md-button class="md-raised" ng-click="vm.submit()" ng-disabled="vm.userForm.$invalid || vm.userForm.$pristine || vm.disableItem" ng-style="{\'background-color\': \'{{settings.color_button}}\'}">\n      {{settings.start_chat_button}}\n    </md-button>\n  </form>\n\n  <md-content layout="row" layout-align="center end">\n    <span>{{ (settings.custom && !settings.defaultWhiteLabel) ? settings.whiteLabel : \'Powered By XCALLY\' }}</span>\n  </md-content>\n</md-content>\n\x3c!-- / CHAT CONTENT --\x3e\n'), e.put("app/unmanaged/index.html", '\x3c!-- CHAT CONTENT --\x3e\n<md-content class="chat-unmanaged">\n  \x3c!-- CHAT ERROR --\x3e\n  <div class="chat-error" ng-repeat="error in vm.errors" layout="row" layout-margin>\n    <i class="mdi mdi-alert mdi-24px mdi-light"></i>\n    <md-tooltip md-direction="top">{{error.message || \'Service temporarily unavailable.\'}}</md-tooltip>\n    <span class="chat-error-message">{{error.message || \'Service temporarily unavailable.\'}}</span>\n  </div>\n  \x3c!-- CHAT ERROR --\x3e\n\n  <md-content layout="row" layout-margin>\n    <span>{{ settings.unmanagedMessage }}</span>\n  </md-content>\n\n  <form name="vm.userForm" layout="column" layout-margin novalidate>\n    <span>{{ settings.noteTitle || \'Note\' }}</span>\n\n    <md-input-container ng-if="settings.enableUnmanagedNote" class="md-block" style="margin: 0px; padding: 0px 0px 10px 0px;" md-no-float>\n      \x3c!-- START textarea --\x3e\n      <textarea name="note" ng-model="vm.form.note" md-maxlength="150" rows="3"></textarea>\n      \x3c!-- END textarea --\x3e\n    </md-input-container>\n\n    <div layout="row" layout-align="center center">\n      <md-button ng-if="settings.enableUnmanagedNote" ng-click="vm.submit()" class="md-raised" ng-disabled="vm.userForm.$invalid || loading" ng-style="{\'background-color\': \'{{settings.color_button}}\'}">\n        {{settings.sendUnmanaged}}\n      </md-button>\n      <md-button class="md-raised" ng-style="{\'background-color\': \'{{settings.color_button}}\'}" ng-click="vm.skip()">\n        {{settings.skipUnmanaged}}\n      </md-button>\n    </div>\n  </form>\n\n  <md-content layout="row" layout-align="center end">\n    <span>{{ (settings.custom && !settings.defaultWhiteLabel) ? settings.whiteLabel : \'Powered By XCALLY\' }}</span>\n  </md-content>\n</md-content>\n\x3c!-- / CHAT CONTENT --\x3e\n'), e.put("app/waiting/index.html", '\x3c!-- WAITING CONTENT --\x3e\n<md-content id="waiting" layout="column" layout-align="center center">\n  <div layout="row" layout-align="center center" class="sk-fading-circle" flex="10">\n    <div class="sk-circle1 sk-circle"></div>\n    <div class="sk-circle2 sk-circle"></div>\n    <div class="sk-circle3 sk-circle"></div>\n    <div class="sk-circle4 sk-circle"></div>\n    <div class="sk-circle5 sk-circle"></div>\n    <div class="sk-circle6 sk-circle"></div>\n    <div class="sk-circle7 sk-circle"></div>\n    <div class="sk-circle8 sk-circle"></div>\n    <div class="sk-circle9 sk-circle"></div>\n    <div class="sk-circle10 sk-circle"></div>\n    <div class="sk-circle11 sk-circle"></div>\n    <div class="sk-circle12 sk-circle"></div>\n  </div>\n  <div layout="row" layout-align="center end" class="title" flex>\n    <span>{{settings.waitingTitle}}</span>\n  </div>\n  <div layout="row" layout-align="center start" class="subtitle" flex>\n    <span>{{settings.waitingMessage}}</span>\n  </div>\n</md-content>\n\x3c!-- / WAITING CONTENT --\x3e\n')
546 }]);