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