Built motion from commit b4f7ded2.|2.0.69
[motion2.git] / snippet / 1.0.10 / 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, t, n) {
5             t.bind("keydown keypress", function(t) {
6                 13 === t.which && (e.$apply(function() {
7                     e.$eval(n.ngEnter)
8                 }), t.preventDefault())
9             })
10         }
11     }).directive("ngPrint", function() {
12         function e(e, t) {
13             for (var n, i = document.createElement("div"), o = t.visitor, s = t.settings, a = 0; a < t.messages.length; a++) {
14                 var r = t.messages[a],
15                     l = "Sender: ",
16                     c = "Message: " + r.body,
17                     d = "Sent At: " + moment(r.createdAt).format("YYYY-MM-DD HH:mm:ss");
18                 if (0 !== a) {
19                     switch (t.settings.agentIdentifier) {
20                         case "website_alias":
21                             l += "out" === r.direction ? r.UserId ? s.agentAlias + r.UserId : "System" : s.customerAlias || o.from || "Visitor" + r.ContactId;
22                             break;
23                         case "agent_alias":
24                             l += "out" === r.direction ? r.UserId ? r.User.alias || r.User.fullname : "System" : s.customerAlias || o.from || "Visitor" + r.ContactId;
25                             break;
26                         case "agent_fullname":
27                             l += "out" === r.direction ? r.UserId ? r.User.fullname : "System" : s.customerAlias || o.from || "Visitor" + r.ContactId;
28                             break;
29                         default:
30                             l += "out" === r.direction ? r.UserId ? (s.agentAlias || "Agent") + r.UserId : "System" : s.customerAlias || o.from || "Visitor" + r.ContactId
31                     }
32                     i.appendChild(document.createTextNode(l)), i.appendChild(document.createElement("br")), i.appendChild(document.createTextNode(c)), i.appendChild(document.createElement("br")), i.appendChild(document.createTextNode(d)), i.appendChild(document.createElement("br")), i.appendChild(document.createElement("br"))
33                 } else n = r.createdAt
34             }
35             var m = window.open("", "Chat");
36             m.document.write("<html><head><title>" + document.title + "</title>"), m.document.write("</head><body >"), m.document.write("<h3> Website: " + s.referer + "</h3>"), m.document.write("<h3> Start Time: " + moment(n).format("YYYY-MM-DD HH:mm:ss") + "</h3>"), m.document.write("<h3> Print Time: " + moment().format("YYYY-MM-DD HH:mm:ss") + "</h3>"), m.document.write(i.innerHTML), m.document.write("</body></html>"), m.document.close(), m.focus(), m.print(), m.close()
37         }
38         return {
39             link: function(t, n, i) {
40                 n.on("click", function() {
41                     var n = document.getElementById("chatContent1");
42                     n && e(0, t)
43                 })
44             },
45             restrict: "A"
46         }
47     })
48 }(),
49 function() {
50     "use strict";
51
52     function e(e, t, n, i, o, s, a, r, l, c) {
53         function d() {
54             t.settings.online ? s.go("app.online") : s.go("app.offline")
55         }
56
57         function m() {
58             t.visitor && t.visitor.interaction && t.visitor.interaction.id && r.chatInteraction.get({
59                 id: t.visitor.interaction.id
60             }).$promise.then(function(e) {
61                 delete T.errors.getInteraction, e.closed && (t.visitor.interaction.closed = !0, t.updateStorage(l, t.visitor), "unmanaged" === e.disposition ? s.go("app.unmanaged") : s.go("app.closing"))
62             }).catch(function(e) {
63                 switch (e.status) {
64                     case 403:
65                         s.go("app.closing");
66                         break;
67                     case 404:
68                         t.updateStorage(l, null, !0), t.updateStorage(c, null, !0), d();
69                         break;
70                     case 405:
71                         s.go("app.unmanaged");
72                         break;
73                     default:
74                         console.error(e)
75                 }
76             })
77         }
78
79         function g(e) {
80             return function(t) {
81                 T.errors[e] = t.data, h()
82             }
83         }
84
85         function u(e) {
86             var n = x[0].emojioneArea.getText();
87             e && 13 === e.keyCode && e.shiftKey || e && 13 !== e.keyCode || "" !== n && p(_.merge({
88                 body: n
89             }, t.visitor))
90         }
91
92         function p(e) {
93             r.chatWebsite.notify(e).$promise.then(function(e) {
94                 delete T.errors.chatMessageError, _.isNil(t.visitor.interaction) && (t.visitor.interaction = {
95                     id: e.interaction.id
96                 }, t.updateStorage(l, t.visitor)), x[0].emojioneArea.setText(""), h()
97             }).catch(g("chatMessageError"))
98         }
99
100         function f() {
101             t.visitor && t.visitor.interaction && t.visitor.interaction.id && r.chatInteraction.getMessages({
102                 intid: t.visitor.interaction.id,
103                 includeAgent: !0,
104                 id: w || void 0
105             }).$promise.then(function(e) {
106                 if (delete T.errors.interaction, e.count) {
107                     w = e.rows[e.count - 1].id;
108                     for (var n = 0; n < e.rows.length; n++) t.messages.push(e.rows[n]), "out" !== e.rows[n].direction || e.rows[n].read || v(e.rows[n].id);
109                     h()
110                 }
111             }).catch(function(e) {
112                 switch (e.status) {
113                     case 403:
114                         s.go("app.closing");
115                         break;
116                     case 405:
117                         s.go("app.unmanaged");
118                         break;
119                     default:
120                         console.error(e)
121                 }
122             })
123         }
124
125         function v(e) {
126             return r.chatMessage.update({
127                 id: e,
128                 read: !0
129             }).$promise.catch(function(e) {
130                 console.error(e)
131             })
132         }
133
134         function h() {
135             n(function() {
136                 var e = o[0].getElementsByClassName("chat-messages")[0];
137                 e && (e.scrollTop = e.scrollHeight)
138             })
139         }
140         var x, b, y, w, T = this;
141         T.errors = {}, t.messages = [], T.emojiOptions = {
142             watchEmbedData: !1,
143             fontSmiley: !1,
144             emoji: !0,
145             link: !0,
146             linkTarget: "_blank"
147         }, T.$onInit = function() {
148             t.loading = !1, t.settings.showMenu = !0, T.replyMessage = "", t.visitor.interaction && t.visitor.interaction.closed ? (t.updateStorage(l, null, !0), t.updateStorage(c, null, !0), d()) : (m(), b = i(f, 2e3), y = i(m, 3e3)), x = $("#emojionearea").emojioneArea({
149                 placeholder: t.settings.placeholderMessage || "Type a message",
150                 events: {
151                     keyup: function(e, t) {
152                         u(t)
153                     }
154                 }
155             })
156         }, T.reply = u, T.fileAdded = function(e) {
157             var n = new FormData;
158             n.append("file", e.file), a.post(t.settings.remote + "/api/chat/interactions/" + t.visitor.interaction.id + "/attachment_upload?token=" + t.settings.token, n, {
159                 transformRequest: angular.identity,
160                 headers: {
161                     "Content-Type": void 0
162                 }
163             }).then(function(e) {
164                 (e = e.data).id ? (delete T.errors.sendAttachment, p(_.merge({
165                     body: '<a href="' + t.settings.remote + "/api/chat/interactions/" + t.visitor.interaction.id + "/attachment_download?attachId=" + e.id + "&token=" + t.settings.token + '" target="_blank">' + e.name + "</a>",
166                     AttachmentId: e.id
167                 }, t.visitor))) : g("sendAttachment")
168             }, g("sendAttachment"))
169         }, e.$on("$destroy", function() {
170             i.cancel(b), i.cancel(y), b = null, y = null
171         }), t.$on("$download", function(e, n) {
172             n && n(_.values(t.messages))
173         })
174     }
175     e.$inject = ["$scope", "$rootScope", "$timeout", "$interval", "$document", "$state", "$http", "api", "STORAGE_VISITOR", "STORAGE_LAYOUT"], angular.module("motion").controller("ChatController", e)
176 }(),
177 function() {
178     "use strict";
179
180     function e(e, t, n, i, o, s) {
181         function a() {
182             e.settings.online ? t.go("app.online") : t.go("app.offline")
183         }
184
185         function r() {
186             d.form = {}, d.upColor = null, d.downColor = null, d.userForm.$setPristine(), d.userForm.$setUntouched(), delete e.visitor.interaction, e.enableDownload = !1
187         }
188
189         function l(t) {
190             return function(i) {
191                 d.errors[t] = i.data;
192                 var o = n.simple().textContent(e.settings.formSubmitFailureMessage || "Form submission error").toastClass("md-failure-toast").position("top");
193                 n.show(o)
194             }
195         }
196
197         function c() {
198             e.loading = !1
199         }
200         var d = this;
201         d.$onInit = function() {
202             e.updateStorage(o, null, !0), e.updateStorage(s, null, !0), e.loading = !1
203         }, d.submit = function() {
204             e.loading = !0, e.visitor.interaction && e.visitor.interaction.id ? i.chatInteraction.close(_.merge({
205                 id: e.visitor.interaction.id,
206                 ratingType: e.settings.ratingType,
207                 customer: e.settings.customerAlias || e.visitor.from
208             }, d.form)).$promise.then(function() {
209                 delete d.errors.submit;
210                 var t = n.simple().textContent(e.settings.formSubmitSuccessMessage || "Form properly submitted").toastClass("md-success-toast").parent(angular.element(document.querySelector("#chat-toolbar")));
211                 n.show(t)
212             }).then(r).then(a).catch(l("submit")).finally(c) : (c(), l("submit"))
213         }, d.skip = function() {
214             r(), a()
215         }, d.form = {}, d.errors = {}
216     }
217     e.$inject = ["$rootScope", "$state", "$mdToast", "api", "STORAGE_VISITOR", "STORAGE_LAYOUT"], angular.module("motion").controller("ClosingController", e)
218 }(),
219 function() {
220     "use strict";
221
222     function e(e, t, n, i, o, s, a, r, l) {
223         function c() {
224             n.go(e.settings.online ? "app.online" : "app.offline")
225         }
226
227         function d(e) {
228             t.parent.postMessage({
229                 cmd: e
230             }, "*")
231         }
232
233         function m(t, n, i) {
234             var o = s.get(t) || {};
235             i ? delete o[e.location] : o[e.location] = n, s.set(t, o)
236         }
237
238         function g(t) {
239             e.layout.up = t, m(r, e.layout), d(t ? "show" : "hide")
240         }
241         var u = this;
242         e.location = e.settings.location, u.$onInit = function() {
243             var t = !1,
244                 n = s.get(l) || {},
245                 i = s.get(r) || {};
246             e.visitor = n[e.location] ? n[e.location] : {}, e.layout = i[e.location] ? i[e.location] : {}, e.visitor.interaction && e.layout.up ? t = !0 : e.layout.up = !1, g(t), c()
247         }, u.close = function() {
248             var t = e.visitor.interaction;
249             if (t && t.id) {
250                 var o = i.confirm().parent(angular.element(document.querySelector("#chat-app"))).clickOutsideToClose(!0).title(e.settings.closingQuestion || "Do you want to close the interaction?").ok("Ok").cancel("Cancel");
251                 i.show(o).then(function() {
252                     return a.chatInteraction.customUpdate({
253                         id: t.id,
254                         closed: !0,
255                         closeReason: "contact",
256                         closedAt: moment().format("YYYY-MM-DD HH:mm:ss")
257                     }).$promise
258                 }).then(function() {
259                     n.go("app.closing")
260                 }).catch(function(e) {
261                     console.error("keep open", e)
262                 })
263             }
264         }, u.toggle = g, u.download = function(t) {
265             var n = o.defer(),
266                 i = e.visitor.interaction;
267             return i && i.id && a.chatInteraction.getMessages({
268                 intid: i.id,
269                 includeAll: !0
270             }).$promise.then(function(t) {
271                 n.resolve(_.map(t.rows.slice(1), function(t) {
272                     var n;
273                     if ("in" === t.direction && (n = e.settings.customerAlias || e.visitor.from || "Visitor" + t.ContactId), "out" === t.direction) switch (e.settings.agentIdentifier) {
274                         case "website_alias":
275                             n = t.UserId ? e.settings.agentAlias + t.UserId : "System";
276                             break;
277                         case "agent_alias":
278                             n = t.UserId ? t.User.alias || t.User.fullname : "System";
279                             break;
280                         case "agent_fullname":
281                             n = t.UserId ? t.User.fullname : "System";
282                             break;
283                         default:
284                             n = t.UserId ? e.settings.agentAlias + t.UserId : "System"
285                     }
286                     return {
287                         sender: n,
288                         message: t.body,
289                         createdAt: moment(t.createdAt).format("MM/DD/YYYY HH:mm:ss")
290                     }
291                 }))
292             }).catch(function(e) {
293                 console.error(e)
294             }), n.promise
295         }, u.getHeaderShape = function() {
296             return "rounded" === e.settings.header_shape ? "15px" : "0px"
297         }, e.updateStorage = m, window.addEventListener("message", function(e) {
298             g("show" === e.data.evt)
299         }, !1)
300     }
301     e.$inject = ["$rootScope", "$window", "$state", "$mdDialog", "$q", "localStorageService", "api", "STORAGE_LAYOUT", "STORAGE_VISITOR"], angular.module("motion").controller("IndexController", e)
302 }(),
303 function() {
304     "use strict";
305
306     function e(e, t) {
307         var n = {
308                 baseUrl: e.settings.remote + "/api/"
309             },
310             i = {
311                 id: "@id",
312                 token: e.settings.token
313             };
314         return n.chatWebsite = t(n.baseUrl + "chat/websites/:id", i, {
315             notify: {
316                 method: "POST",
317                 url: n.baseUrl + "chat/websites/:id/notify"
318             },
319             offline: {
320                 method: "POST",
321                 url: n.baseUrl + "chat/websites/:id/offline"
322             },
323             getFields: {
324                 method: "GET",
325                 url: n.baseUrl + "chat/websites/:id/fields"
326             }
327         }), n.chatInteraction = t(n.baseUrl + "chat/interactions/:id", i, {
328             update: {
329                 method: "PUT",
330                 url: n.baseUrl + "chat/interactions/:id"
331             },
332             customUpdate: {
333                 method: "PUT",
334                 url: n.baseUrl + "chat/interactions/:id/custom_update"
335             },
336             close: {
337                 method: "PUT",
338                 url: n.baseUrl + "chat/interactions/:id/close"
339             },
340             getMessages: {
341                 method: "GET",
342                 url: n.baseUrl + "chat/interactions/:intid/my_messages"
343             },
344             uploadAttachment: {
345                 method: "POST",
346                 url: n.baseUrl + "chat/interactions/:id/attachment_upload",
347                 headers: {
348                     "Content-Type": void 0
349                 },
350                 transformRequest: angular.identity
351             },
352             downloadAttachment: {
353                 method: "GET",
354                 url: n.baseUrl + "chat/interactions/:id/attachment_download"
355             }
356         }), n.chatMessage = t(n.baseUrl + "chat/messages/:id", i, {
357             update: {
358                 method: "PUT",
359                 url: n.baseUrl + "chat/messages/:id"
360             }
361         }), n
362     }
363     e.$inject = ["$rootScope", "$resource"], angular.module("motion").factory("api", e)
364 }(),
365 function() {
366     "use strict";
367
368     function e(e, t) {
369         var n = t.search();
370         e.settings = {
371             cursor: "pointer",
372             hide: !0
373         }, _.forIn(n, function(t, n) {
374             "" === t || _.isNil(t) || ("true" === t && (t = !0), "false" === t && (t = !1), e.settings[n] = t)
375         })
376     }
377
378     function t(e, t, n, i, o, s) {
379         n.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(s), e.state("app", {
380             url: "/app",
381             abstract: !0
382         }).state("app.waiting", {
383             url: "/waiting",
384             templateUrl: "app/waiting/index.html",
385             controller: "WaitingController as vm"
386         }).state("app.online", {
387             url: "/online",
388             templateUrl: "app/online/index.html",
389             controller: "OnlineController as vm"
390         }).state("app.offline", {
391             url: "/offline",
392             templateUrl: "app/offline/index.html",
393             controller: "OfflineController as vm"
394         }).state("app.chat", {
395             url: "/chat",
396             templateUrl: "app/chat/index.html",
397             controller: "ChatController as vm"
398         }).state("app.unmanaged", {
399             url: "/unmanaged",
400             templateUrl: "app/unmanaged/index.html",
401             controller: "UnmanagedController as vm"
402         }).state("app.closing", {
403             url: "/closing",
404             templateUrl: "app/closing/index.html",
405             controller: "ClosingController as vm"
406         })
407     }
408     e.$inject = ["$rootScope", "$location"], t.$inject = ["$stateProvider", "$urlRouterProvider", "$locationProvider", "$httpProvider", "localStorageServiceProvider", "STORAGE_PREFIX"], angular.module("motion").config(t).run(e)
409 }(),
410 function() {
411     "use strict";
412
413     function e(e, t, n) {
414         function i(t) {
415             return function(i) {
416                 var o = n.simple().textContent(e.settings.formSubmitFailureMessage || "Form submission error").toastClass("md-failure-toast").parent(angular.element(document.querySelector("#chat-toolbar")));
417                 n.show(o), a.errors[t] = i.data
418             }
419         }
420
421         function o() {
422             e.loading = !1
423         }
424
425         function s() {
426             return "Anonymous" + _.random(1, 1e6)
427         }
428         var a = this,
429             r = null;
430         a.$onInit = function() {
431             a.visitor = {
432                 id: e.settings.id,
433                 mapKeyOffline: "firstName",
434                 from: s()
435             }, e.settings.showMenu = !1, e.loading = !1, t.chatWebsite.getFields({
436                 id: e.settings.id,
437                 online: !1
438             }).$promise.then(function(e) {
439                 e.count && (r = e.fromKey, a.fields = e.rows)
440             }).catch(function(e) {
441                 console.error(e)
442             })
443         }, a.submit = function() {
444             e.loading = !0;
445             for (var s = 0; s < a.fields.length; s++) {
446                 var l = a.fields[s];
447                 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]), s === r && (_.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])))
448             }
449             t.chatWebsite.offline(_.merge({
450                 body: a.form
451             }, a.visitor)).$promise.then(function() {
452                 delete a.errors.submit, e.$emit("hide"), a.form = {}, a.userForm.$setPristine(), a.userForm.$setUntouched();
453                 var t = n.simple().textContent(e.settings.formSubmitSuccessMessage || "Form properly submitted").toastClass("md-success-toast").parent(angular.element(document.querySelector("#chat-toolbar")));
454                 n.show(t)
455             }).catch(i("submit")).finally(o)
456         }, a.toggle = function(e, t) {
457             a.form[e] || (a.form[e] = []);
458             var n = a.form[e].indexOf(t);
459             n > -1 ? a.form[e].splice(n, 1) : a.form[e].push(t)
460         }, a.exists = function(e, t) {
461             return a.form[e] || (a.form[e] = []), a.form[e].indexOf(t) > -1
462         }, a.form = {}, a.errors = {}, a.userForm = {}
463     }
464     e.$inject = ["$rootScope", "api", "$mdToast"], angular.module("motion").controller("OfflineController", e)
465 }(),
466 function() {
467     "use strict";
468
469     function e(e, t, n, i) {
470         function o() {
471             e.settings.enableCustomerWriting ? t.go("app.chat") : t.go("app.waiting")
472         }
473
474         function s(t) {
475             r.disableItem = !0, n.chatWebsite.notify(t).$promise.then(function(t) {
476                 delete r.errors.chatMessageError, e.visitor.message = {
477                     id: t.message.id
478                 }, e.visitor.interaction = {
479                     id: t.interaction.id
480                 }, e.updateStorage(i, e.visitor), r.disableItem = !1, o()
481             }).catch(function(e) {
482                 r.disableItem = !1, console.error(e)
483             })
484         }
485
486         function a() {
487             return "Anonymous" + _.random(1, 1e6)
488         }
489         var r = this,
490             l = null;
491         r.$onInit = function() {
492             e.visitor && e.visitor.interaction ? e.visitor.interaction.UserId ? t.go("app.chat") : t.go("app.waiting") : (e.visitor = {
493                 id: e.settings.id,
494                 mapKey: "firstName",
495                 from: a()
496             }, e.settings.showMenu = !1, e.updateStorage(i, e.visitor), n.chatWebsite.getFields({
497                 id: e.settings.id,
498                 online: !0
499             }).$promise.then(function(e) {
500                 e.count && (l = e.fromKey, r.fields = e.rows)
501             }).catch(function(e) {
502                 console.error(e)
503             }))
504         }, r.submit = function() {
505             for (var t = "", n = 0; n < r.fields.length; n++) {
506                 var i = r.fields[n];
507                 i.props && r.form.hasOwnProperty(i.props.title) && (_.isNil(i.variable) || (e.visitor[i.variable] = _.isArray(r.form[i.props.title]) ? r.form[i.props.title].join() : r.form[i.props.title]), _.isNil(i.cmField) || (e.visitor[i.cmField] = _.isArray(r.form[i.props.title]) ? r.form[i.props.title].join() : r.form[i.props.title]), n === l && (_.isNil(e.settings.mapKey) || (e.visitor.mapKey = e.settings.mapKey, e.visitor.from = _.isArray(r.form[i.props.title]) ? r.form[i.props.title].join() : r.form[i.props.title])), t += i.props.title + ": " + r.form[i.props.title] + "\n")
508             }
509             s(_.merge({
510                 body: t,
511                 referer: e.settings.referer,
512                 customerIp: e.settings.customerIp
513             }, e.visitor))
514         }, r.toggle = function(e, t) {
515             r.form[e] || (r.form[e] = []);
516             var n = r.form[e].indexOf(t);
517             n > -1 ? r.form[e].splice(n, 1) : r.form[e].push(t)
518         }, r.exists = function(e, t) {
519             return r.form[e] || (r.form[e] = []), r.form[e].indexOf(t) > -1
520         }, r.form = {}, r.errors = {}, r.userForm = {}, r.disableItem = !1
521     }
522     e.$inject = ["$rootScope", "$state", "api", "STORAGE_VISITOR"], angular.module("motion").controller("OnlineController", e)
523 }(),
524 function() {
525     "use strict";
526
527     function e(e, t, n, i, o, s) {
528         function a() {
529             e.settings.online ? t.go("app.online") : t.go("app.offline")
530         }
531
532         function r() {
533             d.form = {}, d.upColor = null, d.downColor = null, d.userForm.$setPristine(), d.userForm.$setUntouched(), e.visitor = {}, e.enableDownload = !1, e.$emit("hide")
534         }
535
536         function l(t) {
537             return function(i) {
538                 d.errors[t] = i.data;
539                 var o = n.simple().textContent(e.settings.formSubmitFailureMessage || "Form submission error").toastClass("md-failure-toast").parent(angular.element(document.querySelector("#chat-toolbar")));
540                 n.show(o)
541             }
542         }
543
544         function c() {
545             e.loading = !1
546         }
547         var d = this;
548         d.form = {}, d.errors = {}, d.$onInit = function() {
549             e.updateStorage(o, null, !0), e.updateStorage(s, null, !0), e.loading = !1
550         }, d.submit = function() {
551             e.loading = !0, e.visitor.interaction && e.visitor.interaction.id ? i.chatInteraction.customUpdate({
552                 id: e.visitor.interaction.id,
553                 note: d.form.note
554             }).$promise.then(function() {
555                 delete d.errors.submit;
556                 var t = n.simple().textContent(e.settings.formSubmitSuccessMessage || "Form properly submitted").toastClass("md-success-toast").parent(angular.element(document.querySelector("#chat-toolbar")));
557                 n.show(t)
558             }).then(r).then(a).catch(l("submit")).finally(c) : (c(), l("submit"))
559         }, d.skip = function() {
560             r(), a()
561         }
562     }
563     e.$inject = ["$rootScope", "$state", "$mdToast", "api", "STORAGE_VISITOR", "STORAGE_LAYOUT"], angular.module("motion").controller("UnmanagedController", e)
564 }(),
565 function() {
566     "use strict";
567
568     function e(e, t, n, i, o, s, a, r) {
569         function l() {
570             s.chatInteraction.get({
571                 id: e.visitor.interaction.id
572             }).$promise.then(function(t) {
573                 t.closed && (e.visitor.interaction.closed = !0, e.updateStorage(a, e.visitor), "unmanaged" === t.disposition && i.go("app.unmanaged")), t.UserId && (e.visitor.interaction.UserId = t.UserId, e.updateStorage(a, e.visitor), i.go("app.chat"))
574             }).catch(function(e) {
575                 switch (e.status) {
576                     case 403:
577                         i.go("app.closing");
578                         break;
579                     case 405:
580                         i.go("app.unmanaged");
581                         break;
582                     default:
583                         console.error(e)
584                 }
585             })
586         }
587
588         function c() {
589             if (e.visitor && e.visitor.interaction && e.visitor.interaction.id && !m) {
590                 m = !0;
591                 var t = new XMLHttpRequest;
592                 t.open("PUT", e.settings.remote + "/api/chat/interactions/" + e.visitor.interaction.id + "/abandon?token=" + e.settings.token, !1), t.setRequestHeader("Content-type", "application/json; charset=utf-8"), t.send(JSON.stringify({
593                     channel: "chat",
594                     interaction: {
595                         id: e.visitor.interaction.id
596                     },
597                     message: {
598                         id: e.visitor.message.id
599                     },
600                     disposition: "abandoned",
601                     closed: !0,
602                     closeReason: "contact",
603                     closedAt: moment().format("YYYY-MM-DD HH:mm:ss")
604                 })), 4 === t.readyState && 200 === t.status && (e.updateStorage(a, null, !0), e.updateStorage(r, null, !0))
605             }
606         }
607         var d, m = !1;
608         this.$onInit = function() {
609             e.visitor && e.visitor.interaction && e.visitor.interaction.id && (d = n(l, 3e3))
610         }, t.$on("$destroy", function() {
611             o.removeEventListener("beforeunload", c), o.removeEventListener("unload", c), n.cancel(d)
612         }), o.addEventListener("beforeunload", c), o.addEventListener("unload", c)
613     }
614     e.$inject = ["$rootScope", "$scope", "$interval", "$state", "$window", "api", "STORAGE_VISITOR", "STORAGE_LAYOUT"], angular.module("motion").controller("WaitingController", e)
615 }(), angular.module("motion").run(["$templateCache", function(e) {
616     "use strict";
617     e.put("app/chat/index.html", "\x3c!-- CHAT CONTENT --\x3e\n<md-content id=\"chatContent1\" class=\"chat-messages\" ng-style=\"{'background-color': '{{settings.backgroundColor}}'}\">\n  <div layout=\"row\" ng-if=\"!$first\" ng-repeat=\"(key, message) in messages track by $index\" class=\"md-padding message-row\" ng-style=\"{'font-size': '{{settings.messageFontSize}}px'}\" ng-class=\"{'in':( message.direction === 'in' && settings.messagesAlignment === 'alternate'), 'in2': ( message.direction === 'in' && settings.messagesAlignment === 'centered'), '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'\" ng-src=\"{{settings.remote}}/api/chat/websites/{{settings.id}}/customer_avatar?token={{settings.token}}\" class=\"avatar\" alt=\"customer\" />\n\n    <div class=\"bubble\">\n      <div class=\"time secondary-text\" ng-switch=\"settings.agentIdentifier\">\n        <span ng-switch-when=\"website_alias\">\n          {{message.direction === 'out' ? (message.UserId ? (settings.agentAlias + message.UserId) : 'System') : (settings.customerAlias || visitor.from || 'Visitor' + message.ContactId)}} - {{message.createdAt | date : 'h:mm'}}\n        </span>\n        <span ng-switch-when=\"agent_alias\">\n          {{message.direction === 'out' ? (message.UserId ? (message.User.alias || message.User.fullname) : 'System') : (settings.customerAlias || visitor.from || 'Visitor' + message.ContactId)}} - {{message.createdAt | date : 'h:mm'}}\n        </span>\n        <span ng-switch-when=\"agent_fullname\">\n          {{message.direction === 'out' ? (message.UserId ? message.User.fullname : 'System') : (settings.customerAlias || visitor.from || 'Visitor' + message.ContactId)}} - {{message.createdAt | date : 'h:mm'}}\n        </span>\n        <span ng-switch-default>\n          {{message.direction === 'out' ? (message.UserId ? ((settings.agentAlias || 'Agent') + message.UserId) : 'System') : (settings.customerAlias || 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  </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 layout="row" layout-align="center center" class="chat-footer md-padding">\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\n  <input id="emojionearea"></input>\n</div>\n\x3c!-- / CHAT FOOTER --\x3e'), 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 ng-style="{\'font-size\': \'{{settings.fontSize}}px\'}">{{ settings.closingMessage }}</span>\n  </md-content>\n\n  <form name="vm.userForm" layout="column" ng-style="{\'font-size\': \'{{settings.fontSize}}px\'}" 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" 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 title="{{settings.closingMessageButton}}" 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}}\', \'color\': \'{{settings.textColor}}\'}">\n        {{settings.closingMessageButton}}\n      </md-button>\n      <md-button title="{{settings.skipMessageButton}}"class="md-raised" ng-style="{\'background-color\': \'{{settings.color_button}}\', \'color\': \'{{settings.textColor}}\'}" 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 ng-style=\"{'font-size': '{{settings.fontSize}}px'}\">{{ (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" ng-style="{\'font-size\': \'{{settings.fontSize}}px\'}" 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="{{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]" placeholder="{{field.config.placeholder}}" 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" 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 ng-message="email">\n                <span>Wrong type field</span>\n            </div>\n        </div>\n      </md-input-container>\n    </div>\n\n    <md-button title="{{settings.offline_chat_button}}" ng-click="vm.submit()" class="md-raised" ng-disabled="vm.userForm.$invalid || vm.userForm.$pristine || loading" ng-style="{\'background-color\': \'{{settings.color_button}}\', \'color\': \'{{settings.textColor}}\'}">\n      {{settings.offline_chat_button}}\n    </md-button>\n  </form>\n\n  <md-content layout="row" layout-align="center end">\n' + "    <span ng-style=\"{'font-size': '{{settings.fontSize}}px'}\">{{ (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" ng-style="{\'font-size\': \'{{settings.fontSize}}px\'}" 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="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="{{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]" placeholder="{{field.config.placeholder}}" 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 ng-message="email">\n                <span>Wrong type field</span>\n            </div>\n        </div>\n      </md-input-container>\n    </div>\n\n    <md-button title="{{settings.start_chat_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}}\', \'color\': \'{{settings.textColor}}\'}">\n      {{settings.start_chat_button}}\n    </md-button>\n  </form>\n\n  <md-content layout="row" layout-align="center end">\n' + "    <span ng-style=\"{'font-size': '{{settings.fontSize}}px'}\">{{ (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 ng-style="{\'font-size\': \'{{settings.fontSize}}px\'}">{{ settings.unmanagedMessage }}</span>\n  </md-content>\n\n  <form name="vm.userForm" layout="column" layout-margin ng-style="{\'font-size\': \'{{settings.fontSize}}px\'}" 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 title="{{settings.sendUnmanaged}}" ng-if="settings.enableUnmanagedNote" ng-click="vm.submit()" class="md-raised" ng-disabled="vm.userForm.$invalid || loading" ng-style="{\'background-color\': \'{{settings.color_button}}\', \'color\': \'{{settings.textColor}}\'}">\n        {{settings.sendUnmanaged}}\n      </md-button>\n      <md-button title="{{settings.skipUnmanaged}}" class="md-raised" ng-style="{\'background-color\': \'{{settings.color_button}}\', \'color\': \'{{settings.textColor}}\'}" 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 ng-style=\"{'font-size': '{{settings.fontSize}}px'}\">{{ (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" flex>\n    <span ng-style="{\'font-size\': \'{{settings.fontSize}}px\'}">{{settings.waitingTitle}}</span>\n  </div>\n  <div layout="row" layout-align="center start" class="subtitle" flex>\n    <span ng-style="{\'font-size\': \'{{settings.fontSize}}px\'}">{{settings.waitingMessage}}</span>\n  </div>\n</md-content>\n\x3c!-- / WAITING CONTENT --\x3e\n')
618 }]);