PageSourceSearch

https://ringuettemontreal.com/bundle/js/public-v2/app?v=pYFtw_tro0zJf92JL8s31iUtEbKUeqa-x8uMFNbVYM81

js ringuettemontreal.com collected 2026-09-28 17:56:12 UTC 1,560,979 bytes, 36,044 lines download raw bytes

1/* Minification failed. Returning unminified contents.
2(32826,13-23): run-time error JS1292: Strict-mode does not allow duplicate property names: transclude
3(11929,111-116): run-time error JS1292: Strict-mode does not allow duplicate property names: label
4 */
5(function () {
6    'use strict';
7
8    angular.module('kreezee-sports', [
9        'app.core',
10
11        'app.directives',
12
13        'app.filters',
14
15        'app.layout',
16
17        'app.services'
18    ]);
19
20})();    ;
21(function () {
22    'use strict';
23
24    angular
25        .module('kreezee-sports')
26        .config(configuration);
27
28    configuration.$inject = ['$translateProvider', '$httpProvider', '$localStorageProvider', '$locationProvider'];
29
30    function configuration($translateProvider, $httpProvider, $localStorageProvider, $locationProvider) {
31        window.bugsnag = { notify: function (e) { console.error(e) } }
32        //bugsnag({
33        //     apiKey: '59a5dd569be2225eea13d77e96cd4780',
34        //     releaseStage: __environment__
35        // });
36        // Follow up on task 7069 && 7096 the bugsnag library seems to be removed when we use adblockers.
37        // When using an adblocker, bugsnag => undefined.
38
39        var defaultLanguage = _.find(website.languages, function (lang) {
40            return lang.isDefault;
41        });
42
43        const wantedLanguage = _.find(website.languages, function (lang) {
44            return lang.culture === language;
45        });
46
47        $httpProvider.interceptors.push(['$q', function ($q) {
48            return {
49                'request': function (request) {
50                    if (request.url.substr(-5) == '.html' || request.url.substr(-5) == '.json') {
51                        request.params = {
52                            v: __version__
53                        }
54                    }
55                    return $q.resolve(request);
56                }
57            }
58        }]);
59
60
61        //if has lang= in url and language is supported
62        if (window.location.href.includes('lang=') && wantedLanguage) {
63            $localStorageProvider.set('currentLanguage', wantedLanguage); //set language
64        //else if has not a culture in local storage or the culture in local storage is not supported
65        } else if (!$localStorageProvider.get('currentLanguage') || !_.find(website.languages, function (lang) {
66            return lang.culture === $localStorageProvider.get('currentLanguage').culture;
67        })) {
68            $localStorageProvider.set('currentLanguage', defaultLanguage);//set default language
69        }
70
71        $translateProvider
72            .useLoader('$translatePartialLoader', {
73                urlTemplate: __environment__ !== 'local'
74                    ? `public/v2/{part}/i18n/{lang}.json?v=${__version__}`
75                    : 'public/v2/{part}/i18n/{lang}.json'
76            })
77            .useSanitizeValueStrategy('escape')
78            .preferredLanguage($localStorageProvider.get('currentLanguage').culture);
79
80        $locationProvider.html5Mode({
81            enabled: true,
82            rewriteLinks: false
83        });
84
85        String.prototype.replaceAll = function (search, replacement) {
86            var target = this;
87            return target.replace(new RegExp(search, 'g'), replacement);
88        }
89    }
90
91    angular.isUndefinedOrNull = function (value) {
92        return angular.isUndefined(value) || value === null
93    }
94
95    angular.isJson = function (value) {
96        try {
97            angular.fromJson(value.replace(/\'/g, '"'));
98        } catch (exception) {
99            return false;
100        }
101        return true;
102    }
103
104    angular.parseQueryString = function (queryString) {
105        var query = {};
106        var pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&');
107        for (var i = 0; i < pairs.length; i++) {
108            var pair = pairs[i].split('=');
109            query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');
110        }
111        return query;
112    }
113
114    angular.xml2json = function (xml, tab) {
115        var X = {
116            toObj: function (xml) {
117                var o = {};
118                if (xml.nodeType == 1) {   // element node ..
119                    if (xml.attributes.length)   // element with attributes  ..
120                        for (var i = 0; i < xml.attributes.length; i++)
121                            o['@' + xml.attributes[i].nodeName] = (xml.attributes[i].nodeValue || '').toString();
122                    if (xml.firstChild) { // element has child nodes ..
123                        var textChild = 0, cdataChild = 0, hasElementChild = false;
124                        for (var n = xml.firstChild; n; n = n.nextSibling) {
125                            if (n.nodeType == 1) hasElementChild = true;
126                            else if (n.nodeType == 3 && n.nodeValue.match(/[^ \f\n\r\t\v]/)) textChild++; // non-whitespace text
127                            else if (n.nodeType == 4) cdataChild++; // cdata section node
128                        }
129                        if (hasElementChild) {
130                            if (textChild < 2 && cdataChild < 2) { // structured element with evtl. a single text or/and cdata node ..
131                                X.removeWhite(xml);
132                                for (var n = xml.firstChild; n; n = n.nextSibling) {
133                                    if (n.nodeType == 3)  // text node
134                                        o['#text'] = X.escape(n.nodeValue);
135                                    else if (n.nodeType == 4)  // cdata node
136                                        o['#cdata'] = X.escape(n.nodeValue);
137                                    else if (o[n.nodeName]) {  // multiple occurence of element ..
138                                        if (o[n.nodeName] instanceof Array)
139                                            o[n.nodeName][o[n.nodeName].length] = X.toObj(n);
140                                        else
141                                            o[n.nodeName] = [o[n.nodeName], X.toObj(n)];
142                                    }
143                                    else  // first occurence of element..
144                                        o[n.nodeName] = X.toObj(n);
145                                }
146                            }
147                            else { // mixed content
148                                if (!xml.attributes.length)
149                                    o = X.escape(X.innerXml(xml));
150                                else
151                                    o['#text'] = X.escape(X.innerXml(xml));
152                            }
153                        }
154                        else if (textChild) { // pure text
155                            if (!xml.attributes.length)
156                                o = X.escape(X.innerXml(xml));
157                            else
158                                o['#text'] = X.escape(X.innerXml(xml));
159                        }
160                        else if (cdataChild) { // cdata
161                            if (cdataChild > 1)
162                                o = X.escape(X.innerXml(xml));
163                            else
164                                for (var n = xml.firstChild; n; n = n.nextSibling)
165                                    o['#cdata'] = X.escape(n.nodeValue);
166                        }
167                    }
168                    if (!xml.attributes.length && !xml.firstChild) o = null;
169                }
170                else if (xml.nodeType == 9) { // document.node
171                    o = X.toObj(xml.documentElement);
172                }
173                else
174                    alert('unhandled node type: ' + xml.nodeType);
175                return o;
176            },
177            toJson: function (o, name, ind) {
178                var json = name ? ('\'' + name + '\'') : '';
179                if (o instanceof Array) {
180                    for (var i = 0, n = o.length; i < n; i++)
181                        o[i] = X.toJson(o[i], '', ind + '\t');
182                    json += (name ? ':[' : '[') + (o.length > 1 ? ('\n' + ind + '\t' + o.join(',\n' + ind + '\t') + '\n' + ind) : o.join('')) + ']';
183                }
184                else if (o == null)
185                    json += (name && ':') + 'null';
186                else if (typeof (o) == 'object') {
187                    var arr = [];
188                    for (var m in o)
189                        arr[arr.length] = X.toJson(o[m], m, ind + '\t');
190                    json += (name ? ':{' : '{') + (arr.length > 1 ? ('\n' + ind + '\t' + arr.join(',\n' + ind + '\t') + '\n' + ind) : arr.join('')) + '}';
191                }
192                else if (typeof (o) == 'string')
193                    json += (name && ':') + '\'' + o.toString() + '\'';
194                else
195                    json += (name && ':') + o.toString();
196                return json;
197            },
198            innerXml: function (node) {
199                var s = ''
200                if ('innerHTML' in node)
201                    s = node.innerHTML;
202                else {
203                    var asXml = function (n) {
204                        var s = '';
205                        if (n.nodeType == 1) {
206                            s += '<' + n.nodeName;
207                            for (var i = 0; i < n.attributes.length; i++)
208                                s += ' ' + n.attributes[i].nodeName + '=\'' + (n.attributes[i].nodeValue || '').toString() + '\'';
209                            if (n.firstChild) {
210                                s += '>';
211                                for (var c = n.firstChild; c; c = c.nextSibling)
212                                    s += asXml(c);
213                                s += '</' + n.nodeName + '>';
214                            }
215                            else
216                                s += '/>';
217                        }
218                        else if (n.nodeType == 3)
219                            s += n.nodeValue;
220                        else if (n.nodeType == 4)
221                            s += '<![CDATA[' + n.nodeValue + ']]>';
222                        return s;
223                    };
224                    for (var c = node.firstChild; c; c = c.nextSibling)
225                        s += asXml(c);
226                }
227                return s;
228            },
229            escape: function (txt) {
230                return txt.replace(/[\\]/g, '\\\\')
231                    .replace(/[\"]/g, '\\"')
232                    .replace(/[\n]/g, '\\n')
233                    .replace(/[\r]/g, '\\r');
234            },
235            removeWhite: function (e) {
236                e.normalize();
237                for (var n = e.firstChild; n;) {
238                    if (n.nodeType == 3) {  // text node
239                        if (!n.nodeValue.match(/[^ \f\n\r\t\v]/)) { // pure whitespace text node
240                            var nxt = n.nextSibling;
241                            e.removeChild(n);
242                            n = nxt;
243                        }
244                        else
245                            n = n.nextSibling;
246                    }
247                    else if (n.nodeType == 1) {  // element node
248                        X.removeWhite(n);
249                        n = n.nextSibling;
250                    }
251                    else                      // any other node
252                        n = n.nextSibling;
253                }
254                return e;
255            }
256        };
257        if (xml.nodeType == 9) // document node
258            xml = xml.documentElement;
259        var json = X.toJson(X.toObj(X.removeWhite(xml)), xml.nodeName, '\t');
260        return '{\n' + tab + (tab ? json.replace(/\t/g, tab) : json.replace(/\t|\n/g, '')) + '\n}';
261    }
262
263    // TODO move into app.run.js    
264    angular
265        .module('kreezee-sports')
266        .run(run)
267
268    run.$inject = ['amMoment'];
269
270    function run(amMoment) {
271        amMoment.changeLocale('fr');
272    }
273
274})();;
275(function () {
276    'use strict';
277
278    angular
279        .module('app.core', [
280            /* ngMessages */
281            'ngMessages',
282
283            /* ngSanitize */
284            'ngSanitize',
285
286            /* ngStorage */
287            'ngStorage',
288
289            /* Angular Filter */
290            'angular.filter',
291
292            /* Angular Moment */
293            'angularMoment',
294
295            /* angular-translate */
296            'pascalprecht.translate',
297
298            /* Angular Color Picker */
299            'colorpicker',
300
301            /* angular-drag-and-drop-lists */
302            'dndLists',
303
304            /* ngTweet */
305            'ngtweet',
306
307            /* DateTimeInput */
308            'ui.bootstrap.datetimepicker'
309        ]);
310})();;
311(function () {
312    'use strict';
313    angular
314        .module('kreezee-sports')
315        .run(run);
316    run.$inject = ['$localStorage', '$sessionStorage', '$q', 'amMoment', 'ConfigurationService', 'SolutionService', 'SeasonService'];
317    function run($localStorage, $sessionStorage, $q, amMoment, configurationService, solutionService, seasonService) {
318        amMoment.changeLocale($localStorage.currentLanguage.culture.substring(0, 2));
319
320        var config = $sessionStorage.configurations;
321
322        // Load environment configurations.
323        if (angular.isUndefinedOrNull($sessionStorage.configurations)
324            || angular.isUndefinedOrNull($sessionStorage.configurations.stripeApiKey)
325            || angular.isUndefinedOrNull($sessionStorage.configurations.servers)) {
326            config = configurationService.getConfiguration()
327                .then(function (response) {
328                    $sessionStorage.configurations = response.data;
329                })
330                .catch(function (error) {
331                    bugsnag.notify(error);
332                });
333        }
334
335        // TODO Check if it exist.
336        // Load solution information.
337        $q.when(config).then(function () {
338            solutionService.getSolutionById(__solutionId__)
339                .then(function (response) {
340                    // TODO Store solution by id, add expiration timestamp.
341                    $localStorage.solution = response.data;
342                    seasonService.getSeasonParametersBySeasonId(__solutionId__, $localStorage.solution.defaultSeasonId)
343                        .then(function (response) {
344                            $localStorage.season = {
345                                parameters: response.data // All season parameters.
346                            };
347                        })
348                        .catch(function (error) {
349                            bugsnag.notify(error);
350                        });
351                })
352                .catch(function (error) {
353                    bugsnag.notify(error);
354                });
355        });
356
357        // When modal hide: body should still have the class modal-open if there is another modal.
358        $(document).on('hidden.bs.modal', '.modal', function () {
359            if ($('.modal:visible').length > 0) {
360                $('body').addClass('modal-open');
361            }
362        });
363
364        $(document).on('show.bs.modal', '.modal', function () {
365            if (!$(this).hasClass('show')) {
366                var zIndex = 1040 + (10 * $('.modal:visible').length);
367                $(this).css('z-index', zIndex);
368                setTimeout(function () {
369                    $('.modal-backdrop').not('.modal-stack').css('z-index', zIndex - 1).addClass('modal-stack');
370                }, 0);
371            }
372        })
373    }
374})();;
375"use strict";var colorPicker=angular.module("colorpicker",[]).factory("ColorHelper",function(){return{hsla2hsva:function(e){var t=Math.min(e.h,1),o=Math.min(e.s,1),r=Math.min(e.l,1),e=Math.min(e.a,1);return 0===r?{h:t,s:0,v:0,a:e}:{h:t,s:2*((t=r+o*(1-Math.abs(2*r-1))/2)-r)/t,v:t,a:e}},hsva2hsla:function(e){var t,o=e.h,r=e.s,a=e.v,e=e.a;return 0===a?{h:o,s:0,l:0,a:e}:0===r&&1===a?{h:o,s:1,l:1,a:e}:(t=a*(2-r)/2,{h:o,s:a*r/(1-Math.abs(2*t-1)),l:t,a:e})},rgbaToHsva:function(e){var t,o=Math.min(e.r,1),r=Math.min(e.g,1),a=Math.min(e.b,1),e=Math.min(e.a,1),n=Math.max(o,r,a),s=Math.min(o,r,a),i=n,l=n-s,c=0===n?0:l/n;if(n===s)t=0;else{switch(n){case o:t=(r-a)/l+(r<a?6:0);break;case r:t=(a-o)/l+2;break;case a:t=(o-r)/l+4}t/=6}return{h:t,s:c,v:i,a:e}},hsvaToRgba:function(e){var t,o,r,a=e.h,n=e.s,s=e.v,e=e.a,i=Math.floor(6*a),a=6*a-i,l=s*(1-n),c=s*(1-a*n),u=s*(1-(1-a)*n);switch(i%6){case 0:t=s,o=u,r=l;break;case 1:t=c,o=s,r=l;break;case 2:t=l,o=s,r=u;break;case 3:t=l,o=c,r=s;break;case 4:t=u,o=l,r=s;break;case 5:t=s,o=l,r=c}return{r:t,g:o,b:r,a:e}},stringToHsva:function(e){var t,o=[{re:/(rgb)a?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*%?,\s*(\d{1,3})\s*%?(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,parse:function(e){return["rgb",parseInt(e[2]),parseInt(e[3]),parseInt(e[4]),isNaN(parseFloat(e[5]))?1:parseFloat(e[5])]}},{re:/(hsl)a?\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,parse:function(e){return["hsl",parseInt(e[2]),parseInt(e[3]),parseInt(e[4]),isNaN(parseFloat(e[5]))?1:parseFloat(e[5])]}},{re:/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})$/,parse:function(e){return["hex",parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16),1]}},{re:/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])$/,parse:function(e){return["hex",parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16),1]}}],r=(e=e.toLowerCase(),null);for(t in o)if(o.hasOwnProperty(t)){var a=o[t],n=a.re.exec(e),a=n&&a.parse(n);if(a)return r="hex"===a[0]||"rgb"===a[0]?this.rgbaToHsva({r:a[1]/255,g:a[2]/255,b:a[3]/255,a:a[4]}):this.hsla2hsva({h:a[1]/360,s:a[2]/100,l:a[3]/100,a:a[4]})}return r}}});colorPicker.directive("colorPicker",["$document","$compile","ColorHelper",function(g,v,f){return{restrict:"A",scope:{colorPickerModel:"=",colorPickerOutputFormat:"=",colorPickerOnChange:"="},controller:["$scope",function(a){function o(e){return{r:Math.round(255*e.r),g:Math.round(255*e.g),b:Math.round(255*e.b),a:e.a}}a.show=!1,a.sAndLMax={},a.hueMax={},a.alphaMax={},a.type=0,a.hsva={h:.5,s:1,v:1,a:1},a.hueSlider={left:0},a.sAndLSlider={left:0,top:0},a.alphaSlider={left:0},a.rbgaSteps={r:1,g:1,b:1,a:.1},a.hslaSteps={h:1,s:1,l:1,a:.1},a.cancelButtonClass="",a.showCancelButton=!1,a.colorPickerPredefinedColors=[],a.extraLargeClass="","rgba"===a.colorPickerOutputFormat?a.type=1:"hsla"===a.colorPickerOutputFormat&&(a.type=2),a.setSaturation=function(e,t){var o=f.hsva2hsla(a.hsva);o.s=e/t,a.hsva=f.hsla2hsva(o)},a.setLightness=function(e,t){var o=f.hsva2hsla(a.hsva);o.l=e/t,a.hsva=f.hsla2hsva(o)},a.setHue=function(e,t){a.hsva.h=e/t},a.setAlpha=function(e,t){a.hsva.a=e/t},a.setR=function(e,t){var o=f.hsvaToRgba(a.hsva);o.r=e/t,a.hsva=f.rgbaToHsva(o)},a.setG=function(e,t){var o=f.hsvaToRgba(a.hsva);o.g=e/t,a.hsva=f.rgbaToHsva(o)},a.setB=function(e,t){var o=f.hsvaToRgba(a.hsva);o.b=e/t,a.hsva=f.rgbaToHsva(o)},a.setSaturationAndBrightness=function(e,t,o,r){a.hsva.s=e/o,a.hsva.v=t/r},a.update=function(){var e=f.hsva2hsla(a.hsva),e=(a.hslaText={h:Math.round(360*e.h),s:Math.round(100*e.s),l:Math.round(100*e.l),a:Math.round(100*e.a)/100},o(f.hsvaToRgba(a.hsva))),t=o(f.hsvaToRgba({h:a.hsva.h,s:1,v:1,a:1}));if(a.rgbaText={r:e.r,g:e.g,b:e.b,a:Math.round(100*e.a)/100},a.hexText="#"+(1<<24|parseInt(e.r,10)<<16|parseInt(e.g,10)<<8|parseInt(e.b,10)).toString(16).substr(1),a.hexText[1]===a.hexText[2]&&a.hexText[3]===a.hexText[4]&&a.hexText[5]===a.hexText[6]&&(a.hexText="#"+a.hexText[1]+a.hexText[3]+a.hexText[5]),a.alphaSliderColor="rgb("+e.r+","+e.g+","+e.b+")",a.hueSliderColor="rgb("+t.r+","+t.g+","+t.b+")",0===a.type&&a.hsva.a<1&&a.type++,a.hsva.a<1)"hsla"===a.colorPickerOutputFormat?a.outputColor="hsla("+a.hslaText.h+","+a.hslaText.s+"%,"+a.hslaText.l+"%,"+a.hslaText.a+")":a.outputColor="rgba("+e.r+","+e.g+","+e.b+","+Math.round(100*e.a)/100+")";else switch(a.colorPickerOutputFormat){case"hsla":a.outputColor="hsl("+a.hslaText.h+","+a.hslaText.s+"%,"+a.hslaText.l+"%)";break;
375case"rgba":a.outputColor=a.alphaSliderColor;break;default:a.outputColor=a.hexText}a.sAndLSlider={left:a.hsva.s*a.sAndLMax.x-8+"px",top:(1-a.hsva.v)*a.sAndLMax.y-8+"px"},a.hueSlider.left=a.hsva.h*a.hueMax.x-8+"px",a.alphaSlider.left=a.hsva.a*a.alphaMax.x-8+"px",a.alphaInvalidClass=""},a.setColorFromHex=function(e){e=f.stringToHsva(e);return null!==e&&(a.hsva=e),e},a.typePolicy=function(){return a.type=(a.type+1)%3,0===a.type&&a.hsva.a<1&&a.type++,a.type}}],link:function(t,o,r){var a,e,n="";function s(e){e=f.stringToHsva(e);null!==e&&(t.hsva=e,t.update())}function i(){setTimeout(function(){l()},5)}function l(){t.$apply(function(){r.colorPickerShowValue="true",s(o.val()),t.colorPickerModel=o.val()})}function c(e){n=t.colorPickerModel,t.$apply(function(){t.show=!0}),t.$apply(function(){t.sAndLMax={x:a[0].getElementsByClassName("saturation-lightness")[0].offsetWidth,y:a[0].getElementsByClassName("saturation-lightness")[0].offsetHeight},t.hueMax={x:a[0].getElementsByClassName("hue")[0].offsetWidth},t.alphaMax={x:a[0].getElementsByClassName("alpha")[0].offsetWidth},t.update()}),h(),g.on("mousedown",p),angular.element(window).on("resize",u)}function u(){h()}function h(){var e;"true"===r.colorPickerFixedPosition?(e=d(o[0],!1),a[0].style.position="fixed"):e=d(o[0],!0),"left"===r.colorPickerPosition?(a[0].style.top=e.top+"px",a[0].style.left=e.left-252+"px"):"top"===r.colorPickerPosition?(a[0].style.top=e.top-e.height-284+"px",a[0].style.left=e.left+"px"):"bottom"===r.colorPickerPosition?(a[0].style.top=e.top+e.height+10+"px",a[0].style.left=e.left+"px"):(a[0].style.top=e.top+"px",a[0].style.left=e.left+e.width+"px")}function p(e){e.target===o[0]||a[0]===e.target||function(e,t){var o=t.parentNode;for(;null!==o;){if(o===e)return 1;o=o.parentNode}return}(a[0],e.target)||(t.$apply(function(){t.show=!1,t.colorPickerOnChange&&t.colorPickerOnChange(t.colorPickerModel)}),g.off("mousedown",p),angular.element(window).off("resize",u))}function d(e,t){return{top:e.getBoundingClientRect().top+(t?window.pageYOffset:0),left:e.getBoundingClientRect().left+(t?window.pageXOffset:0),width:e.offsetWidth,height:e.offsetHeight}}void 0===t.colorPickerModel&&(t.colorPickerModel="#008fff",o.val("")),void 0===r.colorPickerShowValue&&(r.colorPickerShowValue="true"),void 0===r.colorPickerPosition&&(r.colorPickerPosition="right"),void 0===r.colorPickerShowInputSpinner&&(r.colorPickerShowInputSpinner="false"),void 0===r.colorPickerShowCancelButton&&(r.colorPickerShowCancelButton="false"),"true"===r.colorPickerShowCancelButton&&(t.showCancelButton=!0,t.extraLargeClass="color-picker-extra-large"),void 0!==r.colorPickerCancelButtonClass&&(t.cancelButtonClass=r.colorPickerCancelButtonClass),void 0!==r.colorPickerSpinnerRgbaSteps&&null!==r.colorPickerSpinnerRgbaSteps.match(/^\d+;\d+;\d+;[0-9]+([\.][0-9]{1,2})?$/)&&(e=r.colorPickerSpinnerRgbaSteps.split(";"),t.rbgaSteps={r:e[0],g:e[1],b:e[2],a:e[3]}),void 0!==r.colorPickerSpinnerHslaSteps&&null!==r.colorPickerSpinnerHslaSteps.match(/^\d+;\d+;\d+;[0-9]+([\.][0-9]{1,2})?$/)&&(e=r.colorPickerSpinnerHslaSteps.split(";"),t.hslaSteps={h:e[0],s:e[1],l:e[2],a:e[3]}),s(t.colorPickerModel),"true"===r.colorPickerShowValue&&o.val(t.outputColor),a=angular.element('<div ng-show="show" class="color-picker {{extraLargeClass}}">   <div class="arrow arrow-'+r.colorPickerPosition+'"></div>   <div slider rg-x=1 rg-y=1 action="setSaturationAndBrightness(s, v, rgX, rgY)" class="saturation-lightness" ng-style="{\'background-color\':hueSliderColor}">       <div class="cursor-sv" ng-style="{\'top\':sAndLSlider.top, \'left\':sAndLSlider.left}"></div>   </div>   <div slider rg-x=1 action="setHue(v, rg)" class="hue">       <div class="cursor" ng-style="{\'left\':hueSlider.left}"></div>   </div>   <div slider rg-x=1 action="setAlpha(v, rg)" class="alpha" ng-style="{\'background-color\':alphaSliderColor}">       <div class="cursor" ng-style="{\'left\':alphaSlider.left}"></div>   </div>   <div class="selected-color-background"></div>   <div class="selected-color" ng-style="{\'background-color\':outputColor}"></div>   <div ng-show="type==2" class="hsla-text">       <input text type="number" pattern="[0-9]*" min="0" max="360" step="'+t.hslaSteps.h+'" rg=360 action="setHue(v, rg)" ng-model="hslaText.h" spinner="'+r.colorPickerShowInputSpinner+'" />       <input text type="number" pattern="[0-9]*" min="0" max="100" step="'+t.hslaSteps.s+'" rg=100 action="setSaturation(v, rg)" ng-model="hslaText.s" spinner="'+r.colorPickerShowInputSpinner+'" />       <input text type="number" pattern="[0-9]*" min="0" max="100" step="'+t.hslaSteps.l+'" rg=100 action="set
375Lightness(v, rg)" ng-model="hslaText.l" spinner="'+r.colorPickerShowInputSpinner+'" />       <input text type="number" pattern="[0-9]+([.,][0-9]{1,2})?" min="0" max="1" step="'+t.hslaSteps.a+'" rg=1 action="setAlpha(v, rg)" ng-model="hslaText.a" spinner="'+r.colorPickerShowInputSpinner+'" />       <div>H</div><div>S</div><div>L</div><div>A</div>   </div>   <div ng-show="type==1" class="rgba-text">       <input text type="number" pattern="[0-9]*" min="0" max="255" step="'+t.rbgaSteps.r+'" rg=255 action="setR(v, rg)" ng-model="rgbaText.r" spinner="'+r.colorPickerShowInputSpinner+'" />       <input text type="number" pattern="[0-9]*" min="0" max="255" step="'+t.rbgaSteps.g+'" rg=255 action="setG(v, rg)" ng-model="rgbaText.g" spinner="'+r.colorPickerShowInputSpinner+'" />       <input text type="number" pattern="[0-9]*" min="0" max="255" step="'+t.rbgaSteps.b+'" rg=255 action="setB(v, rg)" ng-model="rgbaText.b" spinner="'+r.colorPickerShowInputSpinner+'" />       <input text type="number" pattern="[0-9]+([.,][0-9]{1,2})?" min="0" max="1" step="'+t.rbgaSteps.a+'" rg=1 action="setAlpha(v, rg)" ng-model="rgbaText.a" spinner="'+r.colorPickerShowInputSpinner+'" />       <div>R</div><div>G</div><div>B</div><div>A</div>   </div>   <div class="hex-text" ng-show="type==0">       <input text type="text" action="setColorFromHex(string)" ng-model="hexText"/>       <div>HEX</div>   </div>   <div class="predefined-colors" ng-show="colorPickerPredefinedColors">       Sa fie ceva frumos   </div>   <div ng-click="typePolicy()" class="type-policy"></div>   <button type="button" class="{{cancelButtonClass}}" ng-show="showCancelButton" ng-click="cancelColor()">Cancel</button></div>'),document.getElementsByTagName("body")[0].appendChild(a[0]),v(a)(t),o.on("paste",i),o.on("keyup",l),t.$on("color-changed",function(e){t.$apply(function(){t.update(),t.colorPickerModel=t.outputColor,"true"===r.colorPickerShowValue&&o.val(t.outputColor)})}),t.cancelColor=function(){t.colorPickerModel=n,t.show=!1,s(t.colorPickerModel),g.off("mousedown",p),angular.element(window).off("resize",u)},o.on("click",c),o.on("$destroy",function(){o.off("click",c),o.off("keyup",l),o.off("paste",i)})}}}
375]),colorPicker.directive("text",[function(){return{restrict:"A",scope:{action:"&"},link:function(o,r,a){function e(e){"true"===a.spinner&&r.removeClass("color-picker-input-spinner")}function t(e){r.addClass("color-picker-input-spinner")}function n(e){setTimeout(function(){s()},5)}function s(e){var t;void 0===a.rg?o.action({string:r.val()})&&o.$emit("color-changed"):(t=parseFloat(r.val()),isNaN(t)?o.$emit("alpha-invalid"):(t=Math.abs(Math.min(parseFloat(r.val()),a.rg)),o.action({v:t,rg:a.rg}),o.$emit("color-changed"),o.$emit("alpha-valid")))}r.on("paste",n),r.on("keyup",s),r.on("change",s),r.on("focus",e),r.on("blur",t),r.on("mouseover",e),r.on("mouseout",t),r.addClass("color-picker-input-spinner"),r.on("$destroy",function(){r.off("paste",n),r.off("keyup",s),r.off("change",s),r.off("focus",e),r.off("blur",t),r.off("mouseover",e),r.off("mouseout",t)})}}}]),colorPicker.directive("slider",["$document","$window",function(r,l){return{restrict:"A",scope:{action:"&"},link:function(n,s,i){function e(e){o(e),r.on("mousemove touchmove",t)}function t(e){e.preventDefault(),o(e)}function o(e){var t=s[0].offsetHeight,o=s[0].offsetWidth,r=Math.max(0,Math.min((r=e,a=s[0],(void 0!==r.pageX?r:r.touches[0]).pageX-a.getBoundingClientRect().left-l.pageXOffset),o)),a=Math.max(0,Math.min((a=e,e=s[0],(void 0!==a.pageY?a:a.touches[0]).pageY-e.getBoundingClientRect().top-l.pageYOffset),t));void 0!==i.rgX&&void 0!==i.rgY?n.action({s:r/o,v:1-a/t,rgX:i.rgX,rgY:i.rgY}):n.action({v:r/o,rg:i.rgX}),n.$emit("color-changed")}s.on("mousedown touchstart",e),r.on("mouseup touchend",function(){r.off("mousemove touchmove",t)}),s.on("$destroy",function(){s.off("mousedown touchend",e)})}}}]);;
376(function () {
377    'use strict';
378
379    angular
380        .module('app.directives', [])
381        .config(config);
382
383    config.$inject = ['$translatePartialLoaderProvider'];
384
385    function config($translatePartialLoaderProvider) {        
386        if (__environment__ !== 'local') {
387            $translatePartialLoaderProvider.addPart('app');
388
389        } else {
390            $translatePartialLoaderProvider.addPart('app/core/directives/ads/app');
391            $translatePartialLoaderProvider.addPart('app/core/directives/custom-page');
392            $translatePartialLoaderProvider.addPart('app/core/directives/filter');
393            $translatePartialLoaderProvider.addPart('app/core/directives/form-v1');
394            $translatePartialLoaderProvider.addPart('app/core/directives/pagination');
395            $translatePartialLoaderProvider.addPart('app/core/directives/search-input');
396            $translatePartialLoaderProvider.addPart('app/core/directives/share-button');
397            $translatePartialLoaderProvider.addPart('app/core/directives/stripe/elements');
398            $translatePartialLoaderProvider.addPart('app/core/directives/help-button');
399            $translatePartialLoaderProvider.addPart('app/core/directives/form-file-upload');
400            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/404');
401            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/app');
402            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/bracket/seed');
403            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/bracket/seed/matchup');
404            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/bracket/seed/matchup/action');
405            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/bracket/seed/matchup/information');
406            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/card-list');
407            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/divisions');
408            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/facility/list');
409            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/facility/widget');
410            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/form');
411            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/front-office-form');
412            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/game-broadcast');
413            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/game-details');
414            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/game-details/play-by-play');
415            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/game-details/statistics');
416            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/game-details/summary');
417            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/game-details/lineups');
418            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/game-hitters-stats');
419            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/box-score-summary');
420            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/game-pitchers-stats');
421            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/shots-on-goal');
422            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/game-players-stats');
423            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/baseball');
424            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-stats/score');
425            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-stats/lineup');
426            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-stats/history');
427            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-stats/edit-pitch-count');
428            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-lineup');
429            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-lineup/batters');
430            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-lineup/players');
431            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-stats/actions');
432            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-stats/log');
433            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-stats/pitch-count');
434            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/baseball/save');
435            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/add-player');
436            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/add-staff');
437            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/game-staff-popup');
438            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/basketball');
439            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/basketball/timing');
440            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/basketball/actions');
441            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/basketball/popup');
442            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/basketball/roster');
443            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/basketball/bonus');
444            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/basketball/note');
445            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/scoreboard/basketball/history');
446            $translatePartialLoaderProvider.addPart('app/core/directives/number-select');
447            $translatePartialLoaderProvider.addPart('app/core/directives/template-editor');
448            $translatePartialLoaderProvider.addPart('app/core/directives/widget/settings/controls/filters');
449            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/stars-of-the-game'); 
450            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/game-score');
451            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/game-note'); 
452            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/games/team-matchup');
453            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/game-status');
454            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/game-status/basketball');
455            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/game-status/generic');
456            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/field-view');
457            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/image-bar');
458            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/spacer');
459            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/login');
460            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/news/latest');
461            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/news/latest-premium');
462            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/news/carousel');
463            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/news/list');
464            //$translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/penalty-type');
465            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/photo/list');
466            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/pitcher-starter');
467            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/pitcher-result');
468            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/player/details');
469            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/player/details/all-time-statistics');
470            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/player/details/game-log');
471            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/player/list');
472            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/player/page');
473            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/result/list');
474            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/result/livegame-players');
475            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/result/list/game');
476            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/schedule');
477            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/schedule/page');
478            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/schedule/filters');
479            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/schedule/game');
480            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/schedule/event');
481            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/schedule/views');
482            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/schedule/list');
483            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/scores');
484            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/social-medias');
485            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/social-medias/icons');
486            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/social-medias-premium');
487            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/statistics');
488            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/statistics/leaders');
489            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/statistics/goaler');
490            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/statistics/pitcher');
491            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/statistics/defense');
492            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/statistics/player');
493            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/statistics/suspension');
494            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/statistics/team');
495            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/statistics/players/leaders');
496            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/statistics/teams/leaders');
497            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/leaderboard');
498            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/leaderboard/leaders');
499            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/suspension/list');
500            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/team/details');
501            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/team/details/all-time-statistics');
502            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/team/details/filters-team');
503            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/team/details/lineup');
504            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/team/details/staff');
505            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/team/head-to-head');
506            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/team/leaders');
507            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/team/list');
508            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/team/standings');
509            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/team/standings/table');
510            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/video/list');
511            $translatePartialLoaderProvider.addPart('app/core/directives/toolbox/widgets/video/widget');
512            $translatePartialLoaderProvider.addPart('app/core/directives/widget/settings');
513            $translatePartialLoaderProvider.addPart('app/core/directives/widget/container');
514            $translatePartialLoaderProvider.addPart('app/core/directives/widget/toolbar');
515            $translatePartialLoaderProvider.addPart('app/core/directives/widget/zone');
516            $translatePartialLoaderProvider.addPart('app/core/directives/widget/modal');
517            $translatePartialLoaderProvider.addPart('app/core/directives/widget/row');
518
519            // TODO Create website editor module
520            $translatePartialLoaderProvider.addPart('app/core/website-editor/file-upload');
521            $translatePartialLoaderProvider.addPart('app/core/website-editor/file-upload-editor');
522            $translatePartialLoaderProvider.addPart('app/core/website-editor/header-bar-customization');
523            $translatePartialLoaderProvider.addPart('app/core/website-editor/multiple-image-upload');
524            $translatePartialLoaderProvider.addPart('app/core/website-editor/columns-display-select');
525            $translateParti
525alLoaderProvider.addPart('app/core/website-editor/columns-display-select-list');
526            $translatePartialLoaderProvider.addPart('app/core/website-editor/simple-select');
527            $translatePartialLoaderProvider.addPart('app/core/website-editor/html-widget-editor');
528            $translatePartialLoaderProvider.addPart('app/core/website-editor/font-picker');
529            $translatePartialLoaderProvider.addPart('app/core/website-editor/side-toolbar');
530            $translatePartialLoaderProvider.addPart('app/core/website-editor/side-toolbar/panels/logo-and-background');
531            $translatePartialLoaderProvider.addPart('app/core/website-editor/side-toolbar/panels/lists');
532            $translatePartialLoaderProvider.addPart('app/core/website-editor/side-toolbar/panels/menu-and-navigation');
533            $translatePartialLoaderProvider.addPart('app/core/website-editor/side-toolbar/panels/font-and-colors');
534            $translatePartialLoaderProvider.addPart('app/core/website-editor/side-toolbar/panels/tables');
535            $translatePartialLoaderProvider.addPart('app/core/website-editor/side-toolbar/panels/page');
536            $translatePartialLoaderProvider.addPart('app/core/website-editor/side-toolbar/panels/settings');
537            $translatePartialLoaderProvider.addPart('app/core/website-editor/facebook-account');
538            $translatePartialLoaderProvider.addPart('app/core/website-editor/instagram-account');
539            $translatePartialLoaderProvider.addPart('app/core/website-editor/tiktok-account');
540            $translatePartialLoaderProvider.addPart('app/core/website-editor/faq-editor');
541            $translatePartialLoaderProvider.addPart('app/core/website-editor/icon-select');
542        }
543    }
544})();;
545(function () {
546    'use strict';
547
548    angular
549        .module('app.directives')
550        .directive('tooltip', tooltip);
551
552    tooltip.$inject = [];
553    
554    function tooltip() {
555        return {
556            restrict: 'A',
557            scope: {
558                tooltip: '=',
559                tooltipPosition: '='
560            },
561            link: function (scope, element, attr, ngModel) {                
562                element.tooltip({
563                    placement: scope.tooltipPosition,
564                    title: scope.tooltip,
565                    trigger: 'hover click'
566                });
567            }
568        };
569    }
570})();;
571(function () {
572    'use strict';
573
574    angular
575        .module('app.directives')
576        .controller('AdsAppController', AdsAppController);
577
578    AdsAppController.$inject = ['$localStorage', '$sessionStorage', 'SolutionService'];
579
580    function AdsAppController($localStorage, $sessionStorage, solutionService) {
581        var vm = this;
582        //State variables
583        Object.assign(vm, angular.fromJson(website));
584        vm.appLink = ` https://kreezee.app.link/${__solutionId__}-solution?solutionid=${__solutionId__}`; // TODO Move in url service
585        vm.closed = $sessionStorage.downloadAppClosed;
586        vm.culture = $localStorage.currentLanguage ? $localStorage.currentLanguage.culture.substring(0, 2) : 'fr';
587        vm.visible = false;
588
589        //State functions
590        vm.close = function () {
591            vm.closing = true;
592            // Keep value in session to hide the ads on other pages during user session.
593            $sessionStorage.downloadAppClosed = true;
594        };
595
596        //On component mount
597        solutionService.getSolutionById(__solutionId__)
598            .then(function (response) {                
599                var showMobileBannerConfig = _.find(response.data.configs, { code: 'SHOWMOBILEBANNER' });
600                vm.visible = showMobileBannerConfig ? showMobileBannerConfig.value === "1" : true;
601            })
602            .catch(function (error) {
603                bugsnag.notify(error);
604            });
605    }
606})();
607;
608(function () {
609    'use strict';
610
611    angular
612        .module('app.directives')
613        .directive('adsApp', adsApp);
614
615    adsApp.$inject = [];
616
617    function adsApp() {
618        return {
619            restrict: 'E',
620            scope: {               
621
622            },
623            templateUrl: 'public/v2/app/core/directives/ads/app/ads-app.tpl.html',
624            controller: 'AdsAppController',
625            controllerAs: 'adsApp'
626        };
627    }
628})();;
629(function () {
630    'use strict';
631
632    angular
633        .module('app.directives')
634        .controller('AdsBoxController', AdsBoxController);
635
636    AdsBoxController.$inject = ['$rootScope', '$scope'];
637        
638    function AdsBoxController($rootScope, $scope) {
639        var vm = this;
640
641        vm.visible = false;
642    }
643})();
644;
645(function () {
646    'use strict';
647
648    angular
649        .module('app.directives')
650        .directive('adsBox', adsBox)
651
652    adsBox.$inject = ['$timeout', '$localStorage'];
653
654    function adsBox($timeout, $localStorage) {
655        return {
656            restrict: 'E',
657            scope: {                
658                adType: "=",
659                width: "=",
660                height: "=",                
661                mediaType: "=",
662                sideMargin: "="
663            },
664            templateUrl: 'public/v2/app/core/directives/ads/box/ads-box.tpl.html',
665            controller: 'AdsBoxController',
666            controllerAs: 'adsBox',
667            link: function (scope, element, attribute, controller) {
668                var culture = $localStorage.currentLanguage ? $localStorage.currentLanguage.culture.substring(0, 2) : 'fr';           
669                var holderElement = element.find('.ads-box');
670
671                var eventMethod = (window.addEventListener ? 'addEventListener' : 'attachEvent');
672                var eventer = window[eventMethod];
673                var messageEvent = (eventMethod == 'attachEvent' ? 'onmessage' : 'message');
674                eventer(messageEvent, function (e) {
675                    if (e.data.state == 'iframe.ready') {
676                        controller.visible = true;
677
678                        $timeout(function () {
679                            resize();   
680                        }, 0);
681                    }
682                });
683
684                var solutionId = __solutionId__;
685                var adType = scope.adType;                
686                var width = scope.width;
687                var height = scope.height;
688                var mediaType = scope.mediaType;
689                var sideMargin = scope.sideMargin || 0;
690                
691                scope.$watch(function () {                       
692                    return element[0].offsetWidth;
693                }, function () {
694                    $timeout(function () {                        
695                        resize();
696                    });
697                });
698
699                $(window).on('resize', resize);
700
701                function resize() {                    
702                    var elementWidth = element.innerWidth();
703                    
704                    if (width > 0) {
705                        var ratio = height / width;
706                        var newWidth = elementWidth > width ? width : elementWidth;
707                        var newHeight = newWidth * ratio;
708                        
709                        if (elementWidth <= width + (sideMargin * 2)) {
710                            newWidth -= (sideMargin * 2);
711                        }
712
713                        var iframe = holderElement.find('iframe');
714
715                        holderElement.css('height', newHeight);
716                        iframe.css('width', newWidth);
717                        iframe.parent().css('width', newWidth);
718                        iframe.parent().css('height', newHeight);
719                        if (iframe[0]) {                            
720                            iframe[0].contentWindow.postMessage({ width: newWidth, height: newHeight }, '*');
721                        }
722
723                    }                    
724                }
725
726                if (window.ads_api) {
727                    holderElement.append(ads_api.create(null, adType, solutionId, width, height, null, true, mediaType, null, culture)); 
728                }           
729            }
730        };
731    }
732})();;
733(function () {
734    'use strict';
735
736    angular
737        .module('app.directives')
738        .controller('CustomPageController', CustomPageController);
739
740    CustomPageController.$inject = ['$scope', '$sce', 'FormService'];
741
742    function CustomPageController($scope, $sce, formService) {
743        var vm = this;
744        vm.formService = formService;
745        // Get custom page information.
746        Object.assign(vm, angular.fromJson(__customPage__
747            .replace(/[\n\r]+/g, ' ')
748            .replace(/\s{2,}/g, ' ')
749            .replace(/\t+/g, ' ')
750            .replace(/^\s+|\s+$/, '')));
751
752        // V1 -> V2
753        if (vm.name) {
754            vm.title = vm.name;
755        }
756
757        vm.trustAsHtml = function (page) {
758            return angular.isDefined(page.html)
759                ? $sce.trustAsHtml(page.html)       // v2
760                : $sce.trustAsHtml(page.content);   // v1
761        };
762    }
763})();
764;
765(function () {
766    'use strict';
767
768    angular
769        .module('app.directives')
770        .directive('customPage', customPage);
771
772    customPage.$inject = ['$compile', '$timeout'];
773
774    function customPage($compile, $timeout) {
775        return {
776            restrict: 'E',
777            scope: {
778                section: '='
779            },
780            templateUrl: 'public/v2/app/core/directives/custom-page/custom-page.tpl.html',
781            controller: 'CustomPageController',
782            controllerAs: 'customPage',
783            link: function (scope, element, attr, controller) {
784                var vm = controller;
785
786                $timeout(function () {
787                    var dataFormId = element.find('img[data-form-id]');
788
789                    // Check if data-form-id exists in the custom page.
790                    if (dataFormId.length === 0) return;
791
792                    vm.formId = atob(dataFormId.attr('data-form-id'));
793                    Object.assign(vm, angular.parseQueryString(vm.formId));
794
795                    var formToRender = '';
796                    //params.solutionId = 14655;
797                    //params.formId = 3179;
798                    vm.formService.getFormByFormId(vm.solutionId, vm.id, vm.formId)
799                        .then(function (response) {
800                            vm.form = response.data; // Get the form object.
801
802                            formToRender = $compile(`<form-v1 form="customPage.form" form-id="customPage.formId" page-id="customPage.id"></form-v1>`)(scope);
803
804                            // Replace the form placeholder with rendered form.
805                            dataFormId.replaceWith(formToRender);
806
807                        })
808                        .catch(function (error) {
809                            debugger;
810                            bugsnag.notify(error);
811                        });
812                });
813            }
814        };
815    }
816})();;
817(function () {
818    'use strict';
819
820    angular
821        .module('app.directives')
822        .controller('DataTableController', DataTableController);
823
824    DataTableController.$inject = ['$scope'];
825
826    function DataTableController($scope) {
827        var vm = this;
828        vm.pagination = $scope.pagination;
829        vm.columns = $scope.columns;
830    }
831})();
832;
833(function () {
834    'use strict';
835
836    angular
837        .module('app.directives')
838        .directive('datatable', datatable)
839
840    datatable.$inject = [];
841
842    function datatable() {
843        return {
844            restrict: 'E',
845            scope: {    
846                columns: '=',
847                pagination: '='
848            },
849            templateUrl: 'public/v2/app/core/directives/datatable/datatable.tpl.html',
850            controller: 'DataTableController',
851            controllerAs: 'dataTable',
852            link : function(scope, element) {
853                            
854            }
855        };
856    }
857})();;
858(function () {
859	'use strict';
860
861	angular.module('app.directives')
862		.controller('SandboxIframeController', SandboxIframeController);
863
864	SandboxIframeController.$inject = ['$scope', '$element', '$window', '$timeout', '$sce', 'GuidService'];
865
866	function SandboxIframeController($scope, $element, $window, $timeout, $sce, guidService) {
867		var vm = this;
868		vm.guid = guidService.getGuid();
869
870		var hostOrigin = '';
871		if ($window && $window.location) {
872			hostOrigin = $window.location.protocol + '//' + $window.location.host;
873		}
874
875		function getSrcDoc() {
876			var srcDoc = '<!DOCTYPE html>' +
877				'<html>' +
878				'<head>' +
879				'<base target="_top">' +
880				'<base href="' + (hostOrigin || '') + '">' +
881				'<meta charset="utf-8">' +
882				'<meta name="viewport" content="width=device-width,initial-scale=1">' +
883				'<link href="https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap" rel="stylesheet">' +
884				'<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">' +
885				'<style>body { font-family: "Poppins", sans-serif; margin: 0; background-color:transparent !important }</style>' +
886				'<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>' +
887				'</head>' +
888				'<body style="padding: 1px">' +
889				($scope.html || '') +
890				'</body>' +
891				'<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script>' +
892				'<script>' +
893				'const resizeObserver = new ResizeObserver((entries) => {' +
894				' console.log(entries); ' +
895				'  for (const entry of entries) {' +
896				'    const { inlineSize, blockSize } = entry.borderBoxSize[0];' +
897				'    parent.postMessage({ id: "' + (vm.guid || '') + '", height: blockSize }, "*");' +
898				'  }' +
899				'});' +
900				'resizeObserver.observe(document.body, { box: \'border-box\' });' +
901				'</script>' +
902				'</html>';
903
904			var blob = new Blob([srcDoc], { type: 'text/html' });
905			var currentObjectUrl = URL.createObjectURL(blob);
906			vm.src = $sce.trustAsResourceUrl(currentObjectUrl);
907		}
908
909		getSrcDoc();
910
911		$scope.$watch('html', function (value) {
912			getSrcDoc();
913		})
914	}
915})();
916;
917(function () {
918	'use strict';
919
920	angular.module('app.directives')
921		.directive('sandboxIframe', sandboxIframe);
922
923	function sandboxIframe() {
924		return {
925			restrict: 'E',
926			scope: {
927				html: '=',
928			},
929			templateUrl: 'public/v2/app/core/directives/sandbox-iframe/sandbox-iframe.tpl.html',
930			controller: 'SandboxIframeController',
931			controllerAs: 'sandboxIframe',
932			link: function (scope, element, attrs, controller) {				
933				var eventMethod = (window.addEventListener ? 'addEventListener' : 'attachEvent');
934				var eventer = window[eventMethod]; var messageEvent = (eventMethod == 'attachEvent' ? 'onmessage' : 'message');
935
936				eventer(messageEvent, function (e) {
937					if (e.data.id == controller.guid) {		
938						$('iframe', element).height(e.data.height);
939					}
940				});
941			}
942		};
943	}
944})();
945;
946(function () {
947    'use strict';
948
949    angular
950        .module('app.directives')
951        .controller('DateselectController', DateselectController);
952
953    DateselectController.$inject = ['$scope'];
954
955    function DateselectController($scope) {
956        var vm = this;
957        vm.formatDate = function () {
958            if ($scope.date) {
959                return $scope.date.toISOString().split('T')[0];
960            } else {
961                return '';
962            }
963        }
964    }
965})();
966;
967(function () {
968    'use strict';
969
970    angular
971        .module('app.directives')
972        .directive('dateselect', dateselect)
973    
974    dateselect.$inject = [];
975
976    function dateselect() {
977        return {
978            restrict: 'E',
979            scope: {    
980                date: '=',
981                id: '@'
982            },
983            templateUrl: 'public/v2/app/core/directives/dateselect/dateselect.tpl.html',
984            controller: 'DateselectController',
985            controllerAs: 'dateselect',
986            link : function(scope, element) {
987                            
988            }
989        };
990    }
991})();;
992(function () {
993    'use strict';
994
995    angular
996        .module('app.directives')
997        .controller('DropdownController', DropdownController);
998
999    DropdownController.$inject = ['$scope'];
1000
1001    function DropdownController($scope) {
1002        var vm = this;
1003
1004
1005        vm.getValueText = function (id) {
1006            if ($scope.items && $scope.items.length) {
1007                const value = $scope.items.find(function(val) {
1008                    return val.Id == id;
1009                });
1010                if (value) {
1011                    return value.Name;
1012                }
1013                return "";
1014            }
1015        }
1016        
1017        vm.selectItem = function(item) {
1018            if (typeof $scope.change == 'function') {                        
1019                $scope.change({ item: item });
1020            }
1021        };
1022    }
1023})();
1024;
1025(function () {
1026    'use strict';
1027
1028    angular
1029        .module('app.directives')
1030        .directive('dropdown', dropdown)
1031    
1032    dropdown.$inject = [];
1033
1034    function dropdown() {
1035        return {
1036            restrict: 'E',
1037            scope: {    
1038                change: '&',      
1039                items: '=',      
1040                title: '@',
1041                titleNoTranslation: '@',
1042                value: '='
1043            },
1044            templateUrl: 'public/v2/app/core/directives/dropdown/dropdown.tpl.html',
1045            controller: 'DropdownController',
1046            controllerAs: 'dropdown',
1047            link : function(scope, element) {
1048                            
1049            }
1050        };
1051    }
1052})();;
1053(function () {
1054    'use strict';
1055
1056    angular
1057        .module('app.directives')
1058        .directive('dropdownMenu', dropdownMenu)
1059
1060    dropdownMenu.$inject = ['$timeout', 'TranslationService'];
1061
1062    function dropdownMenu($timeout, translationService) {
1063        return {
1064            restrict: 'E',
1065            scope: {
1066                items: '=',
1067                overflow: '=',
1068                position: '='
1069            },
1070            templateUrl: 'public/v2/app/core/directives/dropdown/menu/dropdown-menu.tpl.html',
1071            link: function (scope, element) {
1072                scope.translation = translationService;
1073
1074                $timeout(function () {
1075                    // Get dropdown menu toggle DOM element.
1076                    var dropDownMenu = element.find('ul.dropdown-menu li a[data-toggle=dropdown]');
1077
1078                    // Add click event on the dropdown menu.
1079                    dropDownMenu.on('click', function (event) {
1080                        event.stopImmediatePropagation();
1081                        // TODO Clean this mess....
1082                        if (!$(this).next().children('ul.dropdown-menu').hasClass('show')) {
1083                            $(this).parents('.dropdown-menu').first().find('.show').removeClass('show');
1084                        }
1085
1086                        var $subMenu = $(this).next().children('ul.dropdown-menu');
1087                        $subMenu.toggleClass('show');
1088
1089                        $(this).parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', function (e) {
1090                            $('.dropdown-submenu .show').removeClass('show');
1091                        });
1092
1093                        return false;
1094                    });
1095
1096                }, 0);
1097
1098                scope.getPosition = function () {
1099                    return scope.overflow ? 'left' : 'right';
1100                };
1101            }
1102        };
1103    }
1104})();;
1105(function () {
1106    'use strict';
1107
1108    angular
1109        .module('app.directives')
1110        .directive('fileChange', fileChange)
1111
1112    fileChange.$inject = [];
1113
1114    function fileChange() {
1115        return {
1116            scope:{
1117                fileChange: '&'
1118            },
1119            link:function(scope, element){
1120                element.on('change',function(event){
1121                    scope.$apply(function(){
1122                        scope.fileChange({$event: event})
1123                    })
1124                })
1125                scope.$on('$destroy',function(){
1126                    element.off();
1127                });
1128            }
1129        }
1130    }
1131})();;
1132
1133(function () {
1134    'use strict';
1135
1136    angular
1137        .module('app.directives')
1138        .controller('FilterController', FilterController);
1139
1140    FilterController.$inject = ['$scope', '$translate', '$localStorage', 'SeasonService', 'DivisionService', 'ContainerService', 'TeamService', 'FacilityService', 'HashService', 'PositionService'];
1141
1142    function FilterController($scope, $translate, $localStorage, seasonService, divisionService, containerService, teamService, facilityService, hashService, positionService) {
1143        var vm = this;
1144        var teams;
1145        var componentMounting = true;
1146        var sportId = $localStorage.solution.sportId;
1147        
1148        const FILTERS_MAPPINGS = {
1149            container: $translate.instant('directives.filter.url.containerUrl'),
1150            season: $translate.instant('directives.filter.url.seasonUrl'),
1151            division: $translate.instant('directives.filter.url.divisionUrl'),
1152            team: $translate.instant('directives.filter.url.teamUrl'),
1153            facility: $translate.instant('directives.filter.url.facilityUrl'),
1154            position: $translate.instant('directives.filter.url.positionUrl'),
1155            startDate: $translate.instant('directives.filter.url.startDateUrl'),
1156            endDate: $translate.instant('directives.filter.url.endD
1156ateUrl')
1157        }
1158
1159        const FILTERS_MAPPINGS_REVERSED = _.invert(FILTERS_MAPPINGS);
1160
1161        // State variables
1162        initializeVariables();
1163        function initializeVariables() {
1164            teams = undefined;
1165            vm.filters = {
1166                container: undefined,
1167                season: $scope.seasonId || undefined,
1168                division: undefined,
1169                team: 'all',
1170                facility: 'all',
1171                position: 'all',
1172                startDate: undefined,
1173                endDate: undefined
1174            }
1175
1176            vm.containers = undefined;
1177            vm.seasons = undefined;
1178            vm.divisions = undefined;
1179            vm.teams = undefined;
1180            vm.facilities = [{ Id: 'all', Name: $translate.instant('directives.filter.labels.allfacilities') }];
1181            vm.positions = [{ Id: 'all', Name: $translate.instant('directives.filter.labels.allPositions') }];
1182
1183            if ($scope.seasonId) {
1184                getDivisions($scope.seasonId, null, null);
1185			}
1186
1187            if ($scope.categoryId) {
1188                vm.positions = [{ Id: 'all', Name: $translate.instant('directives.filter.labels.allPositions') }];
1189                vm.positions = vm.positions.concat(positionService.getPositionsByCategory(sportId, $scope.categoryId).map(function (position) {
1190                    return { Id: position.id, Name: position.text }
1191                }));                
1192            }
1193            else {
1194                vm.positions = [];
1195            }
1196
1197            vm.showMoreFiltersButton = false;
1198
1199            vm.forceCallStandings = true; // Used for team standings only
1200        }
1201
1202        // State functions
1203        vm.search = function (text) {
1204            vm.searchText = text;
1205            change();
1206        };
1207
1208        vm.toggleMoreFilters = function () {
1209            vm.showMoreFiltersButton = !vm.showMoreFiltersButton;
1210        }
1211
1212        vm.applyFilters = function () {
1213            applyFilters();
1214        }
1215
1216        vm.selectContainer = function (item) {
1217            vm.selectedDirectly = true;
1218            vm.forceCallStandings = true;
1219            vm.filters.container = item.Id;
1220            vm.filters.team = 'all';
1221            vm.filters.facility = 'all';
1222            if (!item.Id || item.Id === 0) {
1223                getSeasons($scope.allSeasons ? 'all' : undefined);
1224            } else {
1225                getSeasonsByContainerId(vm.filters.container);
1226            }
1227        };
1228
1229        vm.selectSeason = function (item) {
1230            vm.selectedDirectly = true;
1231            vm.forceCallStandings = true;
1232            vm.filters.season = item.Id;
1233            vm.filters.team = 'all';
1234            vm.filters.facility = 'all';
1235
1236            if ($scope.allSeasonsFromMasterSeason && item.Id === 'all') {
1237                vm.filters.division = 'divisions';
1238                finishFiltering();
1239            } else if (typeof vm.filters.season !== 'number') {
1240                getAllDivisions();
1241            } else {
1242                getDivisions(vm.filters.season);
1243            }
1244
1245        };
1246
1247        vm.selectDivision = function (item) {
1248            vm.selectedDirectly = true;
1249            vm.forceCallStandings = false;
1250            vm.filters.division = item.Id;
1251            vm.filters.team = 'all';
1252            vm.filters.facility = 'all';
1253            if ($scope.team) {
1254                filterTeamsFromSelectedDivision();
1255            }
1256            change();
1257            setParams();
1258        };
1259
1260        vm.selectTeam = function (item) {
1261            vm.selectedDirectly = true;
1262            vm.filters.team = item.Id;
1263            change();
1264            setParams();
1265        }
1266
1267        vm.selectFacility = function (item) {
1268            vm.selectedDirectly = true;
1269            vm.filters.facility = item.Id;
1270            change();
1271            setParams();
1272        }
1273
1274        vm.selectPosition = function (item) {
1275            vm.selectedDirectly = true;
1276            vm.filters.position = item.Id;
1277            change();
1278            setParams();
1279        }
1280
1281        // Component mount
1282        locationChange();
1283
1284        /*
1285        Trigger locationChange() when route change.
1286        NOT when mounting
1287        NOT when a tab has changed (because it will mount again)
1288        SIMULATE A MOUNT when route has no filters (i.e. backing from #team=1 to #)
1289        */
1290        $scope.$on('$locationChangeSuccess', function (event, newUrl, oldUrl) {
1291            if ($scope.divisionsPage) {
1292                if (!hashService.hasDivisionsTabsChanged(newUrl, oldUrl)) {
1293                    componentMounting = false;
1294                    locationChange();
1295                }
1296            } else {
1297                if (!componentMounting && !hashService.hasStatisticsTabsChanged(newUrl, oldUrl) && hashService.hasNoHashFilters(
1297hashService.STATISTICS_TABS)) {
1298                    componentMounting = true;
1299                    locationChange();
1300                } else if (!componentMounting && !hashService.hasStatisticsTabsChanged(newUrl, oldUrl)) {
1301                    locationChange();
1302                }
1303            }
1304        });
1305
1306        $scope.$watch(function () { return $scope.seasonId }, function () {
1307            if ($scope.seasonId) { 
1308                getDivisions($scope.seasonId, null, null);
1309            }
1310        })
1311
1312        /*
1313        Simulate a reinitialization of the component and place correct parameters
1314        NOT when user selected a filter because the call is already executed correctly.
1315        */
1316        function locationChange() {            
1317            if (!vm.selectedDirectly) {
1318                const filters_url = getParams();
1319                initializeVariables();
1320                getContainers(filters_url);
1321                getFacilities();
1322                vm.filters.facility = filters_url.facility ? filters_url.facility : 'all';
1323            }
1324            vm.selectedDirectly = false;
1325        }
1326
1327        // API calls
1328        function getContainers(filters) {
1329            if (!$scope.hideContainers) { 
1330            const { container, season, division, team } = filters;
1331            containerService.getContainersBySolutionId(__solutionId__)
1332                .then(function (response) {                    
1333                    if (response.data.containers && response.data.containers.length > 0) {
1334                        vm.containers = [{ Id: 0, Name: $translate.instant('directives.filter.labels.allyears') }]
1335                        vm.containers = vm.containers.concat(response.data.containers);
1336
1337                        if (container) {
1338                            vm.filters.container = container;
1339                        } else {
1340                            vm.filters.container = response.data.defaultcontainerid;
1341                        }
1342
1343                        if (vm.filters.container == 0 && $scope.allSeasons) {
1344                            getSeasons(season ? season : 'all', division, team);
1345                        } else if (vm.filters.container == 0 && !$scope.allSeasons) {
1346                            getSeasons(season, division, team);
1347                        } else {
1348                            getSeasonsByContainerId(vm.filters.container, season, division, team);
1349                        }
1350                    } else {
1351                        if (season) {
1352                            vm.filters.season = season;
1353                        } else if (response.data.defaultseasonid && response.data.defaultseasonid > 0) {
1354                            vm.filters.season = response.data.defaultseasonid;
1355                        } else {
1356                            vm.filters.season = null;
1357                        }
1358                        getSeasons(vm.filters.season ? vm.filters.season : 'all', division, team);
1359                    }
1360                })
1361                .catch(function (error) {
1362                    bugsnag.notify(error);
1363                });
1364            }
1365        }
1366
1367        function getSeasonsByContainerId(defaultContainerId, defaultSeasonId, defaultDivisionId, defaultTeamId) {
1368            if (!$scope.divisionsPage) {
1369                seasonService.getSeasonsByContainerId(__solutionId__, defaultContainerId, defaultSeasonId)
1370                    .then(function (response) {                        
1371                        if ($scope.allSeasonsFromMasterSeason) {
1372                            vm.seasons = [{ Id: 'all', Name: $translate.instant('directives.filter.labels.allseasons') }].concat(response.data.seasons);
1373                        } else {
1374                            vm.seasons = response.data.seasons;
1375                        }
1376
1377                        vm.seasons = filterHideInDropdowns(vm.seasons);
1378                        vm.filters.season = defaultSeasonId ? defaultSeasonId : response.data.defaultseasonid;
1379                        initializeDivisions(response.data.divisions, defaultDivisionId);
1380
1381                        if (vm.filters.season == 'all') {
1382                            getAllTeams(defaultTeamId);
1383                        }
1384                        else {
1385                            getTeams(defaultTeamId);
1386                        }        
1387                    })
1388                    .catch(function (error) {
1389                        bugsnag.notify(error);
1390                    });
1391            } else {
1392                seasonService.getSeasonsByContainerIdDivisions(__solutionId__, defaultContainerId)
1393                    .then(function (response) {
1394                        //let totale = response.data.divisions;
1395                        vm.seasons = response.data.seasons;
1396
1397                        vm.seasons = filterHideInDropdowns(vm.seasons);
1398
1399                        if (defaultSeasonId) {
1400                            vm.filters.season = defaultSeasonId;
1401                        } else if (response.data.seasons && response.data.seasons[0]) {
1402                            vm.filters.season = response.data.seasons[0].Id;
1403                        } else {
1404                            vm.filters.season = undefined;
1405                        }
1406                        initializeDivisions(response.data.divisions, defaultDivisionId);
1407
1408                        if (vm.filters.season == 'all') {
1409                            getAllTeams(defaultTeamId);
1410                        }
1411                        else {
1412                            getTeams(defaultTeamId);
1413                        }                        
1414                    })
1415                    .catch(function (error) {
1416                        bugsnag.notify(error);
1417                    });
1418            }
1419        }
1420
1421        function getSeasons(defaultSeasonId, defaultDivisionId, defaultTeamId) {
1422            if (!$scope.divisionsPage) {
1423                seasonService.getSeasonsBySolutionId(__solutionId__)
1424                    .then(function (response) {                        
1425                        var prepend = $scope.prependSeasons || [];
1426                        vm.filters.season = defaultSeasonId ? defaultSeasonId : $localStorage.solution.defaultSeasonId.toString();
1427                        if ($scope.allSeasons) {
1428                            vm.seasons = prepend.concat([{ Id: 'all', Name: $translate.instant('directives.filter.labels.allseasons') }]).concat(response.data);
1429                        } else {
1430                            vm.seasons = prepend.concat(response.data);
1431                        }
1432                        vm.seasons = filterHideInDropdowns(vm.seasons);
1433                        
1434                        if (typeof vm.filters.season !== 'number' && isNaN(parseInt(vm.filters.season))) {
1435                            getAllDivisions(defaultDivisionId, defaultTeamId)
1436                        } else {
1437                            getDivisions(vm.filters.season, defaultDivisionId, defaultTeamId);
1438                        }
1439                    })
1440                    .catch(function (error) {
1441                        bugsnag.notify(error);
1442                    });
1443            } else {
1444                seasonService.getSeasonsBySolutionIdDivisions(__solutionId__)
1445                    .then(function (response) {
1446                        if (response.data.length > 0) {
1447                            vm.filters.season = defaultSeasonId ? defaultSeasonId : response.data[0].Id;
1448                            vm.seasons = response.data;
1449                            vm.seasons = filterHideInDropdowns(vm.seasons);
1450                            getDivisions(vm.filters.season, defaultDivisionId, defaultTeamId);
1451                        }
1452                    })
1453                    .catch(function (error) {
1454                        bugsnag.notify(error);
1455                    });
1456            }
1457        }
1458
1459        function getAllDivisions(defaultDivisionId, defaultTeamId) {
1460            divisionService.getDivisionsBySolutionId(__solutionId__)
1461                .then(function (response) {
1462                    initializeDivisions(response.data, defaultDivisionId);
1463                    getAllTeams(defaultTeamId);
1464                })
1465                .catch(function (error) {
1466                    bugsnag.notify(error);
1467                });
1468        }
1469
1470        function getDivisions(defaultSeasonId, defaultDivisionId, defaultTeamId) {
1471            divisionService.getDivisionsBySeasonId(__solutionId__, defaultSeasonId)
1472                .then(function (response) {
1473                    initializeDivisions(response.data, defaultDivisionId);
1474                    getTeams(defaultTeamId);
1475                })
1476                .catch(function (error) {
1477                    bugsnag.notify(error);
1478                });
1479        }
1480
1481        function getAllTeams(defaultTeamId) {
1482            if ($scope.team) {
1483                vm.filters.team = defaultTeamId ? defaultTeamId : 'all';
1484                teamService.getTeamsBySolutionId(__solutionId__)
1485                    .then(function (response) {
1486                        vm.teams = [{ Id: 'all', Name: $translate.instant('directives.filter.labels.allteams') }];
1487                        response.data.results.forEach(function (team) {
1488                            vm.teams.push({
1489                                Id: team.id,
1490                                Name: team.name,
1491                                division: {
1492                                    id: team.divisionId,
1493                                    name: team.division
1494                                }
1495                            });
1496                        });
1497                        teams = vm.teams;
1498                        change();
1499                        if (!componentMounting) {
1500                            setParams();
1501                        }
1502                        componentMounting = false;
1503                    })
1504                    .catch(function (error) {
1505                        bugsnag.notify(error);
1506                    });
1507            } else {
1508                finishFiltering();
1509            }
1510        }
1511
1512        function getTeams(defaultTeamId) {
1513            if ($scope.team) {
1514                vm.filters.team = defaultTeamId ? defaultTeamId : vm.filters.team;
1515                teamService.getTeamsBySeasonId(__solutionId__, vm.filters.season)
1516                    .then(function (response) {
1517                        vm.teams = [{ Id: 'all', Name: $translate.instant('directives.filter.labels.allteams') }];
1518                        response.data.forEach(function (team) {
1519                            vm.teams.push({
1520                                Id: team.id,
1521                                Name: team.name,
1522                                division: {
1523                                    id: team.divisionId,
1524                                    name: team.division
1525                                }
1526                            });
1527                        });
1528                        teams = vm.teams;
1529                        change();
1530                        if (!componentMounting) {
1531                            setParams();
1532                        }
1533                        componentMounting = false;
1534                        filterTeamsFromSelectedDivision();
1535                    })
1536                    .catch(function (error) {
1537                        bugsnag.notify(error);
1538                    });
1539            } else {
1540                finishFiltering();
1541            }
1542        }
1543
1544        function finishFiltering() {
1545            change();
1546            if (!componentMounting) {
1547                setParams();
1548            }
1549            componentMounting = false;
1550        }
1551
1552        function filterHideInDropdowns(seasons) {
1553            if ($scope.useHideInDropdownsParameter) {
1554                return _.filter(seasons, function (season) {
1555                    var hideInDropdowns = _.find(season.Parameters, { Code: 'HIDEINDROPDOWNS' });
1556                    if (!hideInDropdowns)
1557                        return true;
1558
1559                    return hideInDropdowns.Value !== '1';
1560                })
1561            }
1562            else {
1563                return seasons;
1564            }
1565        }
1566
1567        function getFacilities() {
1568            if ($scope.facility) {
1569                facilityService.getFacilitiesBySolutionId(__solutionId__)
1570                    .then(function (response) {
1571                        vm.facilities = vm.facilities.concat(_.filter(response.data, 'Active'));
1572                    })
1573                    .catch(function (error) {
1574                        bugsnag.notify(error);
1575                    });
1576            }
1577        }
1578
1579        // Helper functions
1580        function initializeDivisions(result, defaultDivisionId) {
1581            if ($scope.divisionsPage) {
1582                vm.divisions = [];
1583                if (result && result.length > 0) {
1584                    Array.prototype.push.apply(vm.divisions, result);
1585                    vm.filters.division = defaultDivisionId ? defaultDivisionId : result[0].Id;
1586                }
1587            } else if (result.length === 0 && !$scope.noGeneral) {
1588                vm.divisions = [
1589                    { Id: 'general', Name: $translate.instant('directives.widgets.team.standings.labels.general') }
1590                ];
1591                vm.filters.division = defaultDivisionId ? defaultDivisionId : 'general';
1592            } else {
1593                vm.divisions = [];
1594                if (!$scope.noGeneral) {
1595                    vm.divisions = [
1596                        { Id: 'general', Name: $translate.instant('directives.widgets.team.standings.labels.general') },
1597                    ];
1598                }
1599                vm.divisions.push({ Id: 'divisions', Name: $translate.instant('directives.widgets.team.standings.labels.divisions') });
1600                Array.prototype.push.apply(vm.divisions, result);
1601                vm.filters.division = defaultDivisionId ? defaultDivisionId : 'divisions';
1602            }
1603            filterTeamsFromSelectedDivision()
1604        }
1605
1606        function filterTeamsFromSelectedDivision() {
1607            if ($scope.team && teams) {
1608                if (vm.filters.division === 'divisions') {
1609                    vm.teams = teams;
1610                } else {
1611                    // Get divisions from division list corresponding to filter selection
1612                    var divisionsFilter = _.filter(vm.divisions, function (division) { return division.Id == vm.filters.division || division.ParentId == vm.filters.division });
1613                    vm.teams = _.filter(teams, function (team) {
1614                        return team.Id === 'all' || (team.division && _.find(divisionsFilter, { Id: team.division.id }) !== undefined);
1615                    });
1616                }
1617            }
1618        }
1619
1620        function setParams() {
1621            const params = {};
1622            for (let key of Object.keys(vm.filters)) {
1623                params[FILTERS_MAPPINGS[key]] = vm.filters[key];
1624            }
1625            hashService.setParams(params);
1626        }
1627
1628        function getParams() {
1629            const params = hashService.getParams();
1630            const mapped_params = {};
1631            
1632            Object.keys(params).forEach(function (key) {
1633                if (FILTERS_MAPPINGS_REVERSED[key]) {
1634                    mapped_params[FILTERS_MAPPINGS_REVERSED[key]] = params[key];
1635                }
1636            });
1637
1638            return mapped_params;
1639        }
1640
1641        function change() {
1642            clearMoreFilters();
1643            if (typeof $scope.change == 'function') {
1644                $scope.change({
1645                    filter: {
1646                        container: vm.filters.container,
1647                        season: vm.filters.season,
1648                        seasons: vm.seasons,
1649                        division: vm.filters.division,
1650                        divisions: vm.divisions,
1651                        team: vm.filters.team,
1652                        facility: vm.filters.facility,
1653                        forceCallStandings: vm.forceCallStandings,
1654                        searchText: vm.searchText,
1655                        position: vm.filters.position
1656                    }
1657                });
1658                vm.forceCallStandings = false;
1659            }
1660        }
1661
1662        function applyFilters() {
1663            if (typeof $scope.applyfilters == 'function') {
1664                $scope.applyfilters({
1665                    filter: {
1666                        season: vm.filters.season,
1667                        seasons: vm.seasons,
1668                        division: vm.filters.division,
1669                        divisions: vm.divisions,
1670                        team: vm.filters.team,
1671                        facility: vm.filters.facility,
1672                        position: vm.filters.position,
1673                        forceCallStandings: vm.forceCallStandings,
1674                        startDate: moment(vm.filters.startDate).format('YYYY-MM-DD HH:mm:ss'),
1675                        endDate: moment(vm.filters.endDate).format('YYYY-MM-DD HH:mm:ss')
1676                    }
1677                });
1678            }
1679        }
1680
1681        function clearMoreFilters() {
1682            vm.filters.startDate = undefined;
1683            vm.filters.endDate = undefined;
1684        }
1685    }
1686})();;
1687(function () {
1688    'use strict';
1689
1690    angular
1691        .module('app.directives')
1692        .directive('filter', filter);
1693
1694    filter.$inject = [];
1695
1696    function filter() {
1697        return {
1698            restrict: 'E',
1699            replace: true,
1700            scope: {
1701                change: '&',
1702                applyfilters: '&',
1703                allSeasonsFromMasterSeason: '=',
1704                divisionsFilter: '=',
1705                facility: '=',
1706                team: '=',
1707                daterange: '=',
1708                noGeneral: '=',
1709                allSeasons: '=',
1710                search: '=',
1711                divisionsPage: '=',
1712                prependSeasons: '=',
1713                hideSeason: '=',
1714                hideContainers: '=',
1715                categoryId: '=',
1716                seasonId: '=',
1717                useHideInDropdownsParameter: '='
1718            },
1719            templateUrl: 'public/v2/app/core/directives/filter/filter.tpl.html',
1720            controller: 'FilterController',
1721            controllerAs: 'filter',
1722            compile: function(element, attrs){
1723                if (angular.isUndefined(attrs.divisionsFilter)) { 
1724                    attrs.divisionsFilter = 'true'; 
1725                }
1726            },
1727            link: function (scope) {
1728                
1729            }
1730        };
1731    }
1732})();;
1733(function () {
1734    'use strict';
1735
1736    angular
1737        .module('app.directives')
1738        .controller('FormV1WidgetController', FormV1WidgetController);
1739
1740    FormV1WidgetController.$inject = ['$scope', '$q', '$sce', '$timeout', '$translate', 'FormService'];
1741
1742    function FormV1WidgetController($scope, $q, $sce, $timeout, $translate, formService) {
1743        var vm = this;
1744        var initializing = true;
1745        var initializingOptions = true;
1746        var initializingChoices = true;
1747        vm.formService = formService;
1748        vm.fields = {};
1749        vm.choiceGroups = {};
1750        vm.stripeElements = {};
1751        vm.isSubmitted = false;
1752        vm.isSubmitting = false;
1753
1754        vm.payment = {
1755            options: []
1756        };
1757        vm.totalPrice = 0;
1758
1759        vm.paymentChoices = [];
1760        vm.files = [];
1761
1762        vm.validatePaymentOption = validatePaymentOption;
1763        vm.validatePaymentChoice = validatePaymentChoice;
1764
1765        $scope.$watch(function () {
1766            return vm.payment.options;
1767        }, function (paymentOptions) {
1768            if (angular.isDefined(paymentOptions)) {
1769                if (initializingOptions) {
1770                    $timeout(function () { initializingOptions = false; });
1771                }
1772
1773                // Recalculate total price
1774                vm.calculateTotalPrice();
1775            }
1776        }, true);
1777
1778        $scope.$watch(function () {
1779            return vm.paymentChoices;
1780        }, function (paymentChoices) {
1781            if (angular.isDefined(paymentChoices)) {
1782                if (initializingChoices) {
1783                    $timeout(function () { initializingChoices = false; });
1784                }
1785
1786                // Recalculate total price
1787                vm.calculateTotalPrice();
1788            }
1789        }, true);
1790
1791        $scope.$watch(function () {
1792            return vm.paymentProducts;
1793        }, function (products) {
1794            if (angular.isDefined(products)) {
1795                if (initializing) {
1796                    $timeout(function () { initializing = false; });
1797                }
1798
1799                _.forEach(vm.paymentProducts.groups, function (products, name) {
1800                    // Calculate total products total price when quantity change.
1801                    products.totalPrice = 0;
1802                    products.forEach((product) => {
1803                        if (product.Quantity.Value > 0) {
1804                            products.totalPrice += product.Quantity.Value * product.Price;
1805                        }
1806                    });
1807
1808                    // Validate payment products.
1809                    validatePaymentProducts(products);
1810
1811                })
1812
1813                // Recalculate total price
1814                vm.calculateTotalPrice();
1815            }
1816        }, true);
1817
1818        vm.resetQuantity = function (product) {
1819            product.Quantity.Value = 0;
1820        };
1821
1822        vm.setMinOrDefaultValue = function (product) {
1823            return product.Quantity.Min ? product.Quantity.Min : 0;
1824        };
1825
1826        vm.submit = function () {
1827            vm.form.$setSubmitted();
1828            vm.incompleteCaptcha = false;
1829            var recaptchaToken = null;
1830
1831            vm.payment.options.forEach(function (option) {
1832                validatePaymentOption(option);
1833            })
1834
1835            vm.paymentChoices.forEach(function (choice) {
1836                validatePaymentChoice(choice);
1837            })
1838
1839            _.forEach(vm.choiceGroups, function (choice) {
1840                validatePaymentChoice(choice);
1841            })
1842
1843            if (angular.isDefined(vm.paymentProducts)) {
1844                _.forEach(vm.paymentProducts.groups, function (products) {
1845                    validatePaymentProducts(products);
1846                })
1847            }
1848
1849            if (vm.recaptchaEnabled) {
1850                recaptchaToken = grecaptcha.getResponse(recaptchaId);
1851            }
1852
1853            if (vm.recaptchaEnabled && !recaptchaToken) {
1854                vm.incompleteCaptcha = true;
1855            } else if (vm.form.$valid) {
1856                if (isChoicesValid() && IsPaymentChoicesValid() && IsPaymentOptionsValid() && IsPaymentProductsValid()) {
1857                    // The form is submitted.
1858                    vm.isSubmitted = true;
1859                    vm.isSubmitting = true;
1860
1861                    // Check if online payment is selected.
1862                    if (vm.selectedPaymentMethod === 'online-payment') {
1863                        vm.stripeElements.createToken().then(function (isSuccess) {
1864                            if (isSuccess) {
1865                                submit(recaptchaToken);
1866                            }
1867                            else {
1868                                vm.isSubmitting = false;
1869                            }
1870                        });
1871                    } else {
1872                        // Submit the form.                    
1873                        submit(recaptchaToken);
1874                    }
1875                }
1876            }
1877        }
1878
1879        vm.calculateTotalPrice = function () {
1880            vm.totalPrice = 0;
1881
1882            if (angular.isDefined(vm.payment.options)) {
1883                // Calculate for payment options
1884                vm.payment.options.forEach(function (option) {
1885                    option.items.forEach(function (paymentOption) {
1886                        if ((angular.isDefined(option.checked)) &&
1887                            (option.checked.indexOf(paymentOption.Id) != -1)) {
1888                            vm.totalPrice += paymentOption.Price;
1889                        }
1890                    });
1891                });
1892            }
1893
1894            if (angular.isDefined(vm.paymentChoices)) {
1895                // Calculate for payment choices
1896                vm.paymentChoices.forEach(function (choice) {
1897                    choice.items.forEach(function (paymentChoice) {
1898                        if ((angular.isDefined(paymentChoice.checked)) && (paymentChoice.checked)) {
1899                            vm.totalPrice += paymentChoice.Price;
1900                        }
1901                    });
1902                });
1903            }
1904
1905            if (angular.isDefined(vm.paymentProducts)) {
1906                // Calculate for products.
1907                _.forEach(vm.paymentProducts.groups, function (products, name) {
1908                    products.forEach((product) => {
1909                        if (product.Quantity.Value > 0) {
1910                            vm.totalPrice += product.Quantity.Value * product.Price;
1911                        }
1912                    });
1913                });
1914            }
1915        };
1916
1917        function submit(recaptchaToken) {
1918            var filePromises = [];
1919            _.forEach(vm.fields, function (field, key) {
1920                if (field.beforeSave) {
1921                    filePromises.push(field.beforeSave().then(function (filedata) {
1922                        return {
1923                            field: key,
1924                            file: filedata
1925                        }
1926                    }));
1927                }
1928            })
1929
1930            $q.all(filePromises).then(function (uploadedFiles) {
1931                var serializedForm = vm.serializeForm();
1932                var filesDataForm = [];
1933                uploadedFiles.forEach(function (file) {
1934                    if (file.file && file.file.data) {
1935                        filesDataForm.push(file.field + '=' + file.file.data.Filename);
1936                    }
1937                })
1938
1939                if (filesDataForm.length > 0) {
1940                    serializedForm += "&" + filesDataForm.join('&');
1941                }
1942
1943                formService.submit(__solutionId__, $scope.pageId, $scope.formId, serializedForm, recaptchaToken)
1944                    .then(function (response) {
1945                        if (response.data == "limitReached") {
1946                            vm.showConfirmationModal(false, $translate.instant('directives.customPage.errors.limit'));
1947                            vm.isSubmitting = false;
1948                            vm.limitReached();
1949                        }
1950                        else {
1951                            vm.confirmationNumber = response.data.FormClientId;
1952                            vm.showConfirmationModal(true);
1953                            vm.isSubmitting = false;
1954
1955                            formService.isLimitReached($scope.formId).then(function (response) {
1956                                if (response.data) {
1957                                    vm.limitReached();
1958                                }
1959                            })
1960                        }
1961                    })
1962                    .catch(function (error) {
1963                        vm.showConfirmationModal(false, error.data);
1964                        bugsnag.notify(error);
1965                        vm.isSubmitting = false;
1966                    });
1967            })
1968
1969
1970        }
1971
1972        function isChoicesValid() {
1973
1974            var choicesIsValid = true;
1975            _.forEach(vm.choiceGroups, function (group) {
1976                if (!group.$valid) {
1977                    choicesIsValid = false;
1978                    return;
1979                }
1980            })
1981
1982            return choicesIsValid;
1983        }
1984
1985        function IsPaymentChoicesValid() {
1986            var isValid = true;
1987            if (vm.paymentChoices) {
1988                vm.paymentChoices.forEach(function (choice) {
1989                    if (!choice.$valid) {
1990                        isValid = false;
1991                        return;
1992                    }
1993                });
1994            }
1995
1996            return isValid;
1997        }
1998
1999        function IsPaymentOptionsValid() {
2000            var isValid = true;
2001            if (vm.payment.options) {
2002                vm.payment.options.forEach(function (option) {
2003                    if (!option.$valid) {
2004                        isValid = false;
2005                        return;
2006                    }
2007                });
2008            }
2009
2010            return isValid;
2011        }
2012
2013        function IsPaymentProductsValid() {
2014            var isValid = true;
2015            if (vm.paymentProducts) {
2016                _.forEach(vm.paymentProducts.groups, function (products) {
2017                    if (!products.$valid) {
2018                        isValid = false;
2019                        return;
2020                    }
2021                })
2022            }
2023
2024            return isValid;
2025        }
2026
2027        function validatePaymentChoice(choice) {
2028            if (!initializingChoices && choice.isMandatory) {
2029                choice.$error = true;
2030
2031                choice.items.forEach((item) => {
2032                    if (item.checked) {
2033                        choice.$error = false;
2034                    }
2035                });
2036
2037                choice.$valid = !choice.$error;
2038            } else {
2039                choice.$error = false;
2040                choice.$valid = !choice.$error;
2041            }
2042        }
2043
2044        function validatePaymentOption(option) {
2045            if (!initializingOptions && option.isMandatory) {
2046                option.$error = true;
2047
2048                if (option.checked) {
2049                    option.items.forEach((item) => {
2050                        if (option.checked.indexOf(item.Id) != -1) {
2051                            option.$error = false;
2052                        }
2053                    });
2054                }
2055
2056                option.$valid = !option.$error;
2057            } else {
2058                option.$error = false;
2059                option.$valid = !option.$error;
2060            }
2061        }
2062
2063        function validatePaymentProducts(products) {
2064            if (!initializing && products.isMandatory) {
2065                products.$error = true;
2066
2067                products.forEach((product) => {
2068                    if (product.Quantity.Value > 0) {
2069                        products.$error = false;
2070                    }
2071                });
2072
2073                products.$valid = !vm.paymentProducts.$error;
2074            } else {
2075                products.$error = false;
2076                products.$valid = !vm.paymentProducts.$error;
2077            }
2078        }
2079    }
2080})();
2081;
2082(function () {
2083    'use strict';
2084
2085    angular
2086        .module('app.directives')
2087        .directive('formV1', formV1)
2088
2089    formV1.$inject = ['$compile', '$timeout', '$localStorage', '$window', '$translate', 'StripeConnectService'];
2090
2091    function formV1($compile, $timeout, $localStorage, $window, $translate, stripeConnectService) {
2092        return {
2093            restrict: 'E',
2094            scope: {
2095                form: '=',
2096                formId: '=',
2097                pageId: '='
2098            },
2099            templateUrl: 'public/v2/app/core/directives/form-v1/form-v1.tpl.html',
2100            controller: 'FormV1WidgetController',
2101            controllerAs: 'formV1',
2102            link: function (scope, element, attr, controller) {
2103                var vm = controller;
2104
2105                vm.pageCulture = $localStorage.currentLanguage.culture.substr(0, 2);
2106                if (website.languages) {
2107                    var cultureWesite = _.find(website.languages, function (language) {
2108                        return language.culture == $localStorage.currentLanguage.culture;
2109                    });
2110                    if (!cultureWesite) {
2111                        vm.pageCulture = website.languages[0].culture.substr(0, 2);
2112                    }
2113                }
2114
2115                $timeout(function () {
2116                    var formDiv = element.find('.content-form');
2117                    var formToRender = '';
2118                    var form = scope.form;
2119
2120                    if (form.errors && form.errors.indexOf('limitReached') != -1) {
2121                        formToRender += '<span translate="directives.formV1.errors.limit"></span>';
2122                    } else {
2123                        vm.recaptchaEnabled = form.form.RecaptchaEnabled;
2124                        vm.hideConfirmationNumber = form.form.HideConfirmationNumber;
2125                        vm.confirmationBoxMessage = _.get(getLocalization(form.form.ConfirmationBoxMessage), 'Text');
2126                        vm.confirmationBoxTitle = _.get(getLocalization(form.form.ConfirmationBoxTitle), 'Text');
2127                        vm.confirmationUrl = _.get(getLocalization(form.form.ConfirmationUrl), 'Text');
2128
2129                        if (vm.confirmationUrl) {
2130                            element.find("#confirmationWindow").on('hide.bs.modal', function (e) { $window.open(vm.confirmationUrl, '_self'); });
2131                        }
2132
2133                        //Add recaptcha widget rendering function
2134                        if (vm.recaptchaEnabled) {
2135                            window.verifyResponse = function (response) { //Simple front-end validation
2136                                if (response) {
2137                                    vm.incompleteCaptcha = false;
2138                                }
2139                                scope.$apply();
2140                            }
2141                            formToRender += `
2142                                <script type="text/javascript">
2143                                    var recaptchaId;
2144                                    var onloadCallback = function() {
2145                                        recaptchaId = grecaptcha.render('recaptchaId', {
2146                                            'sitekey' : '6LdTPN4ZAAAAAFSUFbwAN_5mw-hpq8GgaZF1u3yh',    
2147                                            'callback': verifyResponse,                     
2148                                            'theme' : 'light'
2149                                        });
2150                                    };
2151                                </script>
2152                                `
2153                        }
2154
2155                        formToRender += `<form name="formV1.form">`; // Open <form> tag.
2156
2157                        // TODO Move into function hidden field.
2158                        // Add hidden fields.       
2159
2160                        // Add solution id.
2161                        formToRender += `<input type="hidden" name="__solutionId" value="${__solutionId__}" />`;
2162
2163                        // Concatenate actions to apply on the form.
2164                        var actions = _.map(form.form.Actions, 'Name').join('|');
2165                        formToRender += `<input type="hidden" name="__actions" value="${actions}" />`;
2166
2167                        // Add form identifier.
2168                        formToRender += `<input type="hidden" name="__formId" value="${scope.formId}" />`;
2169
2170                        // Add form email.
2171                        formToRender += `<input type="hidden" name="__email" value="${form.Email}" />`;
2172
2173                        // Add form support payment.
2174                        if (form.form.PaymentForm !== null) {
2175                            // Add hidden field to store stripe token.
2176                            formToRender += `<input type="hidden" name="__stripeToken" value="" />`;
2177                            formToRender += `<input type="hidden" name="__paymentDescription" value="${form.form.PaymentForm.Description}" />`;
2178                            formToRender += `<input type="hidden" name="__paymentCurrency" value="${form.form.PaymentForm.Currency}" />`;
2179                        }
2180
2181                        formToRender += `<div class="row mt-3"><div class="col-12">`; // Open row.
2182                        var columnSizeTotal = 0;
2183
2184                        // Loop through all fields of the form.
2185                        for (var i = 0; i < form.form.Fields.length; i++) {
2186                            var field = form.form.Fields[i];
2187
2188                            vm.fields[field.Name] = ''; // 
2189
2190                            if (field.Type == 'checkbox') {
2191                                vm.choiceGroups[field.Name] = { items: [], isMandatory: isMandatory(field) };
2192                            }
2193
2194                            // Get field localization.
2195                            var localization = getLocalization(field);
2196
2197                            // TODO if localization
2198
2199                            if (columnSizeTotal === 0) {
2200                                formToRender += `<div class="form-row">`; // Start a new row.
2201                            } else if ((columnSizeTotal + field.ColumnSize) > 12) {
2202                                formToRender += `</div><div class="form-row">`; // Close row and start a new form-row.
2203
2204                                columnSizeTotal = 0; // Reset column size count.                           
2205                            }
2206                            columnSizeTotal += field.ColumnSize;
2207
2208                            formToRender += `<div class="form-group col-md-${field.ColumnSize}">`; // Open form-group
2209
2210                            switch (field.Type) {
2211                                case 'textzone':
2212                                    formToRender += `${localization.Text}`;
2213                                    break;
2214
2215                                case 'email':
2216                                case 'text':
2217                                case 'phone':
2218                                case 'postalcode':
2219                                case 'date':
2220                                    // TODO Support mask
2221                                    // TODO Support add class
2222                                    formToRender += `${getLabel(field, localization)}${getInputText(field, localization)}`;
2223                                    formToRender += `${getValidations(field)}`;
2224                                    break;
2225
2226                                case 'textarea':
2227                                    formToRender += `${getLabel(field, localization)}${getTextArea(field, localization)}`;
2228                                    formToRender += `${getValidations(field)}`;
2229                                    break;
2230
2231                                case 'select':
2232                                    var required = isMandatory(field) ? 'required' : '';
2233                                    formToRender += `${getLabel(field, localization)}<select name="${field.Name}" id="${field.Name}" ng-model="formV1.fields['${field.Name}']" class="form-control" ${required}>`;
2234                                    formToRender += angular.isUndefinedOrNull(localization.Placeholder)
2235                                        ? `<option value="" selected></option>`
2236                                        : `<option value="" disabled selected>${localization.Placeholder}</option>`;
2237
2238                                    if (angular.isUndefinedOrNull(field.StartValue)) {
2239                                        field.Options.forEach(function (option) {
2240                                            if (!option.Hidden) {
2241                                                var optionLocalization = getLocalization(option);
2242                                                formToRender += `<option value="${option.Value}" ${option.Checked ? 'selected' : ''}>${optionLocalization.Text}</option>`;
2243                                            }
2244                                        });
2245
2246                                    } else {
2247                                        debugger;
2248                                        /*var startValue = 0;
2249                                        if (field.StartValue.Equals("DateTime.Now.Year"))
2250                                        {
2251                                            startValue = DateTime.Now.Year;
2252                                        }
2253 
2254                                        for (var i = 0; i < field.Iterations; i++)
2255                                        {
2256                                            // Add options.
2257                                            html.Append(String.Format("<option value=\"{0}\">{0}</option>", startValue));
2258 
2259                                            startValue += field.Incremental;
2260                                        }*/
2261                                    }
2262                                    formToRender += `</select>`;
2263                                    formToRender += `${getValidations(field)}`;
2264                                    break;
2265
2266                                case 'checkbox':
2267                                    formToRender += `${getLabel(field, localization)}`;
2268                                    field.Choices.forEach(function (choice) {
2269                                        vm.choiceGroups[field.Name].items.push({ checked: false });
2270
2271                                        if (!choice.Hidden) {
2272                                            var choiceLocalization = getLocalization(choice);
2273                                            formToRender += `<div class="form-check">`;
2274                                            if (angular.isUndefinedOrNull(choice.Link)) {
2275                                                formToRender += `<label class="form-check-label" id="${field.Name}">
2276                                                                            <input type="checkbox"
2277                                                                                    for="${field.Name}" 
2278                                                                                    ng-change="formV1.validatePaymentChoice(formV1.choiceGroups['${field.Name}'])"
2279                                                                                    ng-model="formV1.choiceGroups['${field.Name}'].items[${vm.choiceGroups[field.Name].items.length - 1}].checked"  
2280                                                                                    class="form-check-input" name="${field.Name}" 
2281                                                                                    value="${choice.Value}" ${choice.Selected ? 'checked' : ''} />${choiceLocalization.Text}</label>`;
2282                                            } else {
2283                                                formToRender += `<input type="checkbox" 
2284                                                                            ng-change="formV1.validatePaymentChoice(formV1.choiceGroups['${field.Name}'])"
2285                                                                            class="form-check-input"
2286                                                                            ng-model="formV1.choiceGroups['${field.Name}'].items[${vm.choiceGroups[field.Name].items.length - 1}].checked" 
2287                                                                            name="${field.Name}" value="${choice.Value}" ${choice.Selected ? 'checked' : ''} />
2288                                                                          <label class="form-check-label"><a href="${choice.Link}" target="_blank">${choiceLocalization.Text}</a></label>`;
2289                                            }
2290                                            formToRender += `</div>`;
2291                                        }
2292                                    });
2293
2294                                    formToRender += `<div>
2295                                                    <span ng-show="formV1.choiceGroups['${field.Name}'].$error"
2296                                                        class="ng-invalid error">${getValidationMessage(field, 'notEmpty')}</span>
2297                                               </div>`;
2298
2299                                    break;
2300
2301                                case 'radio':
2302                                    var required = isMandatory(field) ? 'required' : '';
2303                                    formToRender += `${getLabel(field, localization)}`;
2304                                    field.Choices.forEach(function (choice) {
2305                                        if (!choice.Hidden) {
2306                                            var choiceLocalization = getLocalization(choice);
2307                                            formToRender += `<div class="form-check">`;
2308                                            formToRender += `<label class="form-check-label" id="${field.Name}"><input ng-model="formV1.fields['${field.Name}']"  type="radio" for="${field.Name}" class="form-check-input" name="${field.Name}" value="${choice.Value}" ${required}>${choiceLocalization.Text}</label>`;
2309                                            formToRender += `</div>`;
2310                                        }
2311                                    });
2312
2313                                    formToRender += `${getValidations(field)}`;
2314                                    break;
2315
2316                                case 'file':
2317                                    formToRender += `${getLabel(field, localization)}${getFileInput(field, localization)}`;
2318                                    formToRender += `${getValidations(field)}`;
2319
2320                                    break;
2321
2322                                default:
2323                                    formToRender += `<span>${field.Type} not supported yet!</span>`;
2324                                    break;
2325                            }
2326
2327                            formToRender += `</div>`; // Close form-group
2328                        }
2329
2330                        formToRender += `</div></div></div>`; // Close last form-row & row
2331
2332                        formToRender += `<div class="payment-container mt-3 mb-3"></div>`
2333
2334                        // Add payment form.
2335                        if (form.form.PaymentForm !== null) {
2336                            stripeConnectService.getStripeConnectBySolutionId(__solutionId__)
2337                                .then(function (response) {
2338                                    var paymentFormToRender = '';
2339                                    var paymentContainer = element.find('.payment-container');
2340
2341                                    if (angular.isUndefinedOrNull(response.data)) {
2342                                        paymentFormToRender += `<div class="alert alert-warning" role="alert"><span translate="directives.formV1.labels.configurationProblem"></span></div>`;
2343                                    } else {
2344                                        paymentFormToRender += `<div class="row mt-3"><div class="col-12">`; // Open row.
2345
2346                                        // Show payment section title.
2347                                        paymentFormToRender += `<h3 translate="directives.formV1.labels.payment"></h3>`;
2348                                        paymentFormToRender += `<hr style="margin-top:5px;margin-bottom:15px;">`;
2349
2350                                        // Show descriptions & payment methods
2351                                        if (angular.isUndefinedOrNull(form.form.Version)) {
2352                                            // TODO Necessary to support legacy version?    
2353                                        } else if (parseInt(form.form.Version) >= 2) {
2354                                            vm.paymentProducts = { groups: {} };
2355                                            form.form.PaymentForm.PaymentItems.forEach(function (paymentItem) {
2356                                                switch (paymentItem.Type) {
2357                                                    case 'ItemOptions':
2358                                                        paymentFormToRender += addPaymentOptions(paymentItem);
2359                                                        break;
2360
2361                                                    case 'ItemChoices':
2362                                                        paymentFormToRender += addPaymentChoices(paymentItem)
2363                                                        break;
2364
2365                                                    case 'Products':
2366                                                        paymentFormToRender += addPaymentProducts(paymentItem)
2367                                                        break;
2368                                                }
2369                                            });
2370
2371                                        }
2372
2373                                        // Show total price.
2374                                        paymentFormToRender += addTotalPrice();
2375
2376                                        // Add payment modes
2377                                        paymentFormToRender += addPaymentModes(form.form.PaymentForm.PaymentModes);
2378
2379                                        // Add payment form
2380                                        paymentFormToRender += `<stripe-elements elements="formV1.stripeElements" submit="formV1.submit()"></stripe-elements>`;
2381
2382                                        paymentFormToRender += `</div></div>` // Close row
2383                                    }
2384
2385                                    paymentContainer.append($compile(paymentFormToRender)(scope));
2386                                })
2387                                .catch(function (error) {
2388                                    // TODO bugsnag
2389                                });
2390                        }
2391
2392                        //Add recaptcha validation
2393                        if (vm.recaptchaEnabled && form.form.Buttons && form.form.Buttons.length > 0) {
2394                            formToRender += `<div class="form-group">
2395                                    <div id="recaptchaId"></div>
2396                                    <span ng-show="formV1.incompleteCaptcha" class="ng-invalid error" translate="directives.formV1.labels.incompleteCaptcha"></span>
2397                                </div>`
2398                        }
2399
2400                        // Add button to submit form.
2401                        formToRender += `${getButtons(form.form.Buttons)}`;
2402
2403                        formToRender += `</form>`; // Close <form> tag.
2404
2405                        //Add recaptcha script
2406                        if (vm.recaptchaEnabled) {
2407                            formToRender += `
vendor: 113 bytes, line 2407
2407<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>
2407`;
2408                        }
2409                    }
2410
2411                    formToRender = $compile(formToRender)(scope);
2412
2413                    // Replace the form placeholder with rendered form.
2414                    formDiv.replaceWith(formToRender);
2415
2416
2417                });
2418
2419                vm.serializeForm = function () {
2420                    return $('input, select, textarea').not('.no-serialization').serialize();
2421                };
2422
2423                vm.showConfirmationModal = function (success, type) {
2424                    //Success
2425                    vm.isSubmittedSuccessfully = success;
2426
2427                    switch (type) {
2428                        case 'errorCaptcha':
2429                            vm.error = $translate.instant('directives.formV1.labels.errorCaptcha');
2430                            break;
2431
2432                        default:
2433                            // Detail error is given by the service
2434                            vm.error = type;
2435                            break;
2436                    }
2437
2438                    element.find('#confirmationWindow').modal('show');
2439                };
2440
2441                vm.getLocalization = function (field) {
2442                    if (field.Localizations.length > 0) {
2443                        var currentLocalization = _.find(field.Localizations, function (localization) {
2444                            return localization.Culture === vm.pageCulture;
2445                        });
2446
2447                        return angular.isDefined(currentLocalization) ? currentLocalization : field.Localizations[0];
2448                    }
2449                };
2450
2451                vm.selectPaymentMode = function (paymentMode) {
2452                    var stripeElements = angular.element.find('.stripe-elements')[0];
2453
2454                    if (paymentMode === 'online-payment') {
2455                        stripeElements.classList.add('show');
2456                    } else {
2457                        stripeElements.classList.remove('show');
2458
2459                        // Clear payment information.
2460                        vm.stripeElements.creditCardHolderName.val('');
2461                        vm.stripeElements.cardNumberElement.clear();
2462                        vm.stripeElements.cardExpiryElement.clear();
2463                        vm.stripeElements.cardCvcElement.clear();
2464                    }
2465                }
2466
2467                vm.clearOptions = function (paymentOption) {
2468                    paymentOption.checked = undefined;
2469                }
2470
2471                vm.limitReached = function () {
2472                    var limitMessage = $compile('<span translate="directives.formV1.errors.limit"></span>')(scope);
2473
2474                    angular.element('form').replaceWith(limitMessage);
2475                }
2476
2477                function getLocalization(field) {
2478                    if (field) {
2479                        if (field.Localizations.length > 0) {
2480                            var currentLocalization = _.find(field.Localizations, function (localization) {
2481                                return localization.Culture === vm.pageCulture;
2482                            });
2483
2484                            return angular.isDefined(currentLocalization) ? currentLocalization : field.Localizations[0];
2485                        }
2486                    }
2487                    return '';
2488                }
2489
2490                function getLabel(field, localization) {
2491                    try {
2492                        var mandatory = isMandatory(field);
2493
2494                        return `<label for="${field.Name}" ${mandatory ? 'class="font-weight-bold"' : ''}">${localization.Text} ${mandatory ? '*' : ''}</label>`;
2495
2496                    } catch (error) {
2497                        bugsnag.notify(error);
2498                    }
2499                }
2500
2501                function getInputText(field, localization) {
2502                    try {
2503                        // Check the type of input.
2504                        var type = isEmail(field) ? 'email' : 'text';
2505
2506                        // Check if the input is required.
2507                        var required = isMandatory(field) ? 'required' : '';
2508
2509                        // Check if the input have a max length defined.
2510                        var maxLength = getMaxLength(field);
2511                        maxLength = angular.isDefined(maxLength) ? `ng-maxlength="${maxLength.Max}"` : '';
2512
2513                        return `<input type="${type}" name="${field.Name}" ng-model="formV1.fields['${field.Name}']" id="${field.Name}" placeholder="${localization.Placeholder !== null ? localization.Placeholder : ''}" class="form-control" ${required} ${maxLength} />`;
2514
2515                    } catch (error) {
2516                        bugsnag.notify(error);
2517                    }
2518                }
2519
2520                function getTextArea(field, localization) {
2521                    try {
2522                        // Check if the input is required.
2523                        var required = isMandatory(field) ? 'required' : '';
2524
2525                        // Check if the input have a max length defined.
2526                        var maxLength = getMaxLength(field);
2527                        maxLength = angular.isDefined(maxLength) ? `ng-maxlength="${maxLength.Max}"` : '';
2528
2529                        return `<textarea name="${field.Name}" ng-model="formV1.fields['${field.Name}']" id="${field.Name}" placeholder="${localization.Placeholder !== null ? localization.Placeholder : ''}" class="form-control" ${required} ${maxLength}></textarea>`;
2530
2531                    } catch (error) {
2532                        bugsnag.notify(error);
2533                    }
2534                }
2535
2536                function getFileInput(field, localization) {
2537                    try {
2538                        // Check if the input is required.
2539                        var required = isMandatory(field);
2540                        var fileField = {
2541                            beforeSave: null,
2542                            model: null
2543                        }
2544
2545                        vm.fields[field.Name] = fileField;
2546
2547                        return `<div>
2548                            <form-file-upload before-save="formV1.fields['${field.Name}'].beforeSave" id="${field.Name}" ng-model="formV1.fields['${field.Name}'].model" is-mandatory="${required}"></form-file-upload>                            
2549                        </div>`;
2550                    } catch (error) {
2551                        bugsnag.notify(error);
2552                    }
2553                }
2554
2555                function getButtons(buttons) {
2556                    try {
2557                        var buttonsToRender = '';
2558                        buttons.forEach(function (button) {
2559                            var localization = getLocalization(button);
2560                            buttonsToRender += `<button type="button" ng-click="formV1.submit()" ng-disabled="formV1.isSubmitting || (formV1.isSubmitted && formV1.isSubmittedSuccessfully)" class="btn btn-primary">${localization.Text}</button>`;
2561                        });
2562                        return buttonsToRender;
2563                    } catch (error) {
2564                        console.log(error);
2565                        bugsnag.notify(error);
2566                    }
2567                }
2568
2569                function addPaymentModes(modes) {
2570                    vm.selectedPaymentMethod = 'online-payment';
2571                    var paymentModes = '';
2572
2573                    if (modes.length > 1) {
2574                        // TODO Restructured with the rest of data.
2575                        vm.paymentModes = modes;
2576
2577                        paymentModes += `<ul class="payment-modes">`;
2578                        paymentModes += `<li ng-repeat="paymentMode in formV1.paymentModes">`;
2579                        paymentModes += `<div class="form-check">`;
2580                        paymentModes += `<input 
2581                                            class="form-check-input" 
2582                                            type="radio" name="payment-mode" 
2583                                            id="paymentMode_{{paymentMode.Value}}" 
2584                                            value="{{paymentMode.Value}}"
2585                                            ng-model="formV1.selectedPaymentMethod"
2586                                            ng-click="formV1.selectPaymentMode(paymentMode.Value)">`;
2587                        paymentModes += `<label 
2588                                            class="form-check-label" 
2589                                            for="paymentMode_{{paymentMode.Value}}">`;
2590                        paymentModes += `{{formV1.getLocalization(paymentMode).Text}}`;
2591                        paymentModes += `</label>`;
2592                        paymentModes += `</div>`;
2593                        paymentModes += `</li>`
2594                        paymentModes += `</ul>`
2595                    }
2596
2597                    return paymentModes;
2598                }
2599
2600                function addPaymentOptions(option) {
2601                    try {
2602                        var paymentOptions = '';
2603
2604                        if ((angular.isDefined(option))
2605                            && (option.Items.length > 0)) {
2606                            // Add group title.
2607                            var groupTitle = angular.isDefined(option.Title) ? getLocalization(option.Title).Text : '';
2608                            paymentOptions += `<label class="control-label font-weight-bold">${groupTitle} ${isMandatory(option) ? '*' : ''}</label>`;
2609
2610                            // TODO Generate group name
2611                            //vm.payment.options.items = option.Items;
2612                            var paymentOption = {};
2613                            paymentOption.name = option.Name;
2614                            paymentOption.items = option.Items;
2615                            paymentOption.checked = undefined;
2616                            paymentOption.isMandatory = isMandatory(option);
2617                            vm.payment.options.push(paymentOption);
2618
2619                            if (!paymentOption.isMandatory) {
2620                                paymentOptions += `<span class="clear-options" translate="directives.formV1.labels.clear" ng-click="formV1.clearOptions(formV1.payment.options[${vm.payment.options.length - 1}])">clear</span>`;
2621                            }
2622
2623                            paymentOptions += `<ul class="payment-options">`;
2624                            paymentOptions += `<li ng-if="!paymentOption.Hidden" ng-repeat="paymentOption in formV1.payment.options[${vm.payment.options.length - 1}].items">`;
2625                            paymentOptions += `<div class="form-check">`;
2626                            paymentOptions += `<input 
2627                                                type="radio" 
2628                                                name="paymentItems_{{formV1.payment.options[${vm.payment.options.length - 1}].name}}"
2629                                                value="{{paymentOption.Id + '|' + paymentOption.Price}}"
2630                                                class="form-check-input"
2631                                                id="{{paymentOption.Id}}"
2632                                                ng-change="formV1.validatePaymentOption(formV1.payment.options[${vm.payment.options.length - 1}])"
2633                                                ng-model="formV1.payment.options[${vm.payment.options.length - 1}].checked">`;
2634                            paymentOptions += `<label 
2635                                                class="form-check-label"
2636                                                for="{{paymentOption.Id}}">
2637                                                {{formV1.getLocalization(paymentOption.Name).Text}} - <strong>{{paymentOption.Price | currency}}</strong>
2638                                               </label>`;
2639                            paymentOptions += `</div>`;
2640                            paymentOptions += `</li>`
2641                            paymentOptions += `</ul>`
2642                            paymentOptions += `<div>
2643                                                    <span ng-show="formV1.payment.options[${vm.payment.options.length - 1}].$error"
2644                                                        class="ng-invalid error">${getValidationMessage(option, 'notEmpty')}</span>
2645                                               </div>`;
2646                        }
2647
2648                        return paymentOptions;
2649                    }
2650                    catch (error) {
2651                        bugsnag.notify(error);
2652                    }
2653                }
2654
2655                function addPaymentChoices(choice) {
2656                    try {
2657                        var paymentChoices = '';
2658
2659                        if ((angular.isDefined(choice))
2660                            && (choice.Items.length > 0)) {
2661                            // Add group title.
2662                            var groupTitle = angular.isDefined(choice.Title) ? getLocalization(choice.Title).Text : '';
2663                            paymentChoices += `<label class="control-label font-weight-bold">${groupTitle} ${isMandatory(choice) ? '*' : ''}</label>`;
2664
2665                            // TODO Restructured with the rest of data.
2666                            //vm.paymentChoices = choice.Items;
2667                            var paymentChoice = {};
2668                            paymentChoice.name = choice.Name;
2669                            paymentChoice.items = choice.Items;
2670                            paymentChoice.isMandatory = isMandatory(choice);
2671                            vm.paymentChoices.push(paymentChoice);
2672
2673                            paymentChoices += `<ul class="payment-choices">`;
2674                            paymentChoices += `<li ng-if="!paymentChoice.Hidden" ng-repeat="paymentChoice in formV1.paymentChoices[${vm.paymentChoices.length - 1}].items">`;
2675                            paymentChoices += `<div class="form-check">`;
2676                            paymentChoices += `<input 
2677                                                type="checkbox" 
2678                                                name="paymentItems_{{formV1.paymentChoices[${vm.paymentChoices.length - 1}].name}}"
2679                                                value="{{paymentChoice.Id + '|' + paymentChoice.Price}}"
2680                                                class="form-check-input"
2681                                                id="{{paymentChoice.Id}}"
2682                                                ng-change="formV1.validatePaymentChoice(formV1.paymentChoices[${vm.paymentChoices.length - 1}])"
2683                                                ng-model="paymentChoice.checked">`;
2684                            paymentChoices += `<label 
2685                                                class="form-check-label"
2686                                                for="{{paymentChoice.Id}}">
2687                                                {{formV1.getLocalization(paymentChoice.Name).Text}} - <strong>{{paymentChoice.Price | currency}}</strong>
2688                                               </label>`;
2689                            paymentChoices += `</div>`;
2690                            paymentChoices += `</li>`
2691                            paymentChoices += `<div>
2692                                                    <span ng-show="formV1.paymentChoices[${vm.paymentChoices.length - 1}].$error"
2693                                                        class="ng-invalid error">${getValidationMessage(choice, 'notEmpty')}</span>
2694                                               </div>`;
2695                            paymentChoices += `</ul>`
2696                        }
2697
2698                        return paymentChoices;
2699                    }
2700                    catch (error) {
2701                        bugsnag.notify(error);
2702                    }
2703                }
2704
2705                function addPaymentProducts(product) {
2706                    try {
2707                        var paymentProducts = '';
2708
2709                        if ((angular.isDefined(product))
2710                            && (product.Items.length > 0)) {
2711                            // Get group title.
2712                            var groupTitle = angular.isDefined(product.Title) ? getLocalization(product.Title).Text : '';
2713                            console.log('Product.jambondeparme', product);
2714                            vm.paymentProducts.groups[product.Name] = product.Items;
2715                            vm.paymentProducts.groups[product.Name].isMandatory = isMandatory(product);
2716                            //vm.paymentProducts.$valid = !vm.paymentProducts.isMandatory;
2717
2718                            paymentProducts += `<div class="products-container"><table class="table datatable payment-products">`;
2719
2720                            // *** Add table header *** //
2721                            paymentProducts += `<thead>`;
2722                            paymentProducts += `<tr>`;
2723                            paymentProducts += `<th>${groupTitle} ${isMandatory(product) ? '*' : ''}</th>`;
2724                            paymentProducts += `<th class="text-center quantity">
2725                                                    <span translate="directives.formV1.labels.quantity"></span>
2726                                                </th>`;
2727                            paymentProducts += `<th class="text-center price">
2728                                                    <span translate="directives.formV1.labels.price"></span>
2729                                                </th>`;
2730                            paymentProducts += `<th class="text-center subtotal">
2731                                                    <span translate="directives.formV1.labels.subtotal"></span>
2732                                                </th>`;
2733                            paymentProducts += `</tr>`;
2734                            paymentProducts += `</thead>`;
2735
2736                            // *** Add table body *** //
2737                            paymentProducts += `<tbody>`;
2738                            paymentProducts += `<tr ng-if="!paymentProduct.Hidden" ng-repeat="paymentProduct in formV1.paymentProducts.groups['${product.Name}']">`;
2739                            paymentProducts += `<td>{{formV1.getLocalization(paymentProduct.Name).Text}}</td>`;
2740                            paymentProducts += `<td class="quantity">
2741                                                    <input 
2742                                                        type="number" 
2743                                                        class="form-control"
2744                                                        name="paymentItemQuantity_{{paymentProduct.Id}}"
2745                                                        ng-model="paymentProduct.Quantity.Value"
2746                                                        ng-class="{'error': formV1.paymentProducts.groups['${product.Name}'].$error}"
2747                                                        min="{{formV1.setMinOrDefaultValue(paymentProduct)}}"
2748                                                        max="{{paymentProduct.Quantity.Max}}" />
2749                                                    <a 
2750                                                        href 
2751                                                        ng-click="formV1.resetQuantity(paymentProduct)">
2752                                                        <span class="mdi mdi-close"></span>
2753                                                    </a>
2754                                                </td>`;
2755                            paymentProducts += `<td class="text-right">{{paymentProduct.Price | currency}}</td>`;
2756                            paymentProducts += `<td class="text-right">{{paymentProduct.Quantity.Value * paymentProduct.Price | currency}}</td>`;
2757                            paymentProducts += `</tbody>`;
2758                            paymentProducts += `<tr>`;
2759
2760                            // *** Add table footer *** //
2761                            paymentProducts += `<tfoot>`;
2762                            paymentProducts += `<tr>`;
2763                            paymentProducts += `<td>
2764                                                    <span 
2765                                                        ng-show="formV1.paymentProducts.groups['${product.Name}'].$error"
2766                                                        class="ng-invalid error">${getValidationMessage(product, 'notEmpty')}</span>
2767                                                </td>`;
2768                            paymentProducts += `<td class="text-right" colspan="2"><span>Total</span></td>`;
2769                            paymentProducts += `<td class="text-right">{{formV1.paymentProducts.groups['${product.Name}'].totalPrice | currency}}</td>`;
2770                            paymentProducts += `</tr>`;
2771                            paymentProducts += `</tfoot>`;
2772
2773                            paymentProducts += `</table></div>`;
2774                        }
2775
2776                        return paymentProducts;
2777                    }
2778                    catch (error) {
2779                        bugsnag.notify(error);
2780                    }
2781                }
2782
2783                function addTotalPrice() {
2784                    try {
2785                        return `<div class="mt-3 mb-3"><h4>Total: {{formV1.totalPrice | currency}}</h4></div>`;
2786                    }
2787                    catch (error) {
2788                        bugsnag.notify(error);
2789                    }
2790                }
2791
2792                function isEmail(field) {
2793                    if (field.Validators.length > 0) {
2794                        var validator = _.find(field.Validators, function (validator) {
2795                            return validator.Name === 'emailAddress';
2796                        });
2797
2798                        return angular.isDefined(validator);
2799                    }
2800
2801                    return false;
2802                }
2803
2804                function isDate(field) {
2805                    if (field.Validators.length > 0) {
2806                        var validator = _.find(field.Validators, function (validator) {
2807                            return validator.Name === 'date';
2808                        });
2809
2810                        return angular.isDefined(validator);
2811                    }
2812
2813                    return false;
2814                }
2815
2816                function isMandatory(field) {
2817                    if (field.Validators.length > 0) {
2818                        var validator = _.find(field.Validators, function (validator) {
2819                            return validator.Name === 'notEmpty';
2820                        });
2821
2822                        return angular.isDefined(validator);
2823                    }
2824
2825                    return false;
2826                }
2827
2828                function getMaxLength(field) {
2829                    try {
2830                        if (field.Validators.length > 0) {
2831                            var validator = _.find(field.Validators, function (validator) {
2832                                return validator.Name === 'stringLength';
2833                            });
2834
2835                            return validator;
2836                        }
2837
2838                        return undefined;
2839                    } catch (e) {
2840                        console.error(e);
2841                    }
2842                }
2843
2844                function getValidations(field) {
2845                    var validationToRender = '';
2846                    if (field.Validators.length > 0) {
2847                        validationToRender += `<div ng-show="formV1.form.$submitted || formV1.form['${field.Name}'].$touched">`;
2848                        field.Validators.forEach(function (validator) {
2849                            var localization = getLocalization(validator);
2850
2851                            switch (validator.Name) { // TODO Check possibility to change only $error.«validator»
2852                                case 'emailAddress':
2853                                    validationToRender += `<span ng-show="formV1.form['${field.Name}'].$error.email" class="ng-invalid error">${localization.Text}</span>`;
2854                                    break;
2855
2856                                case 'notEmpty':
2857                                    validationToRender += `<span ng-show="formV1.form['${field.Name}'].$error.required" class="ng-invalid error">${localization.Text}</span>`;
2858                                    break;
2859
2860                                case 'stringLength':
2861                                    validationToRender += `<span ng-show="formV1.form['${field.Name}'].$error.maxlength" class="ng-invalid error">${localization.Text}</span>`;
2862                                    break;
2863
2864                                case 'date':
2865                                    validationToRender += `<span ng-show="formV1.form['${field.Name}'].$error.pattern" class="ng-invalid error">${localization.Text}</span>`;
2866                                    break;
2867
2868                                default:
2869                                    console.log(`${validator.Name} validation is not supported yet!`);
2870                                    break;
2871                            }
2872                        });
2873                        validationToRender += `</div>`;
2874                    }
2875                    return validationToRender;
2876                }
2877
2878                function getValidationMessage(field, validatorName) {
2879                    var message = '';
2880
2881                    field.Validators.forEach(function (validator) {
2882                        if (validator.Name === validatorName) {
2883                            var localization = getLocalization(validator);
2884                            message = localization.Text;
2885                            return;
2886                        }
2887                    });
2888
2889                    return message;
2890                }
2891            }
2892        };
2893    }
2894})();;
2895(function () {
2896    'use strict';
2897
2898    angular
2899        .module('app.directives')
2900        .controller('HelpButtonWidgetController', HelpButtonWidgetController);
2901
2902    HelpButtonWidgetController.$inject = ['$scope', '$localStorage'];
2903
2904    function HelpButtonWidgetController($scope, $localStorage) {
2905        var vm = this;
2906        vm.link = $scope.en;
2907        if ($localStorage.currentLanguage && $localStorage.currentLanguage.culture && $localStorage.currentLanguage.culture === 'fr-CA') {
2908            vm.link = $scope.fr;
2909        }
2910    }
2911})();
2912;
2913(function () {
2914    'use strict';
2915
2916    angular
2917        .module('app.directives')
2918        .directive('helpButton', helpButton)
2919
2920    helpButton.$inject = [];
2921
2922    function helpButton() {
2923        return {
2924            restrict: 'E',
2925            scope: {
2926                fr: '@',
2927                en: '@'
2928            },
2929            templateUrl: 'public/v2/app/core/directives/help-button/help-button.tpl.html',
2930            controller: 'HelpButtonWidgetController',
2931            controllerAs: 'helpButton'
2932        };
2933    }
2934})();;
2935(function () {
2936    'use strict';
2937
2938    angular
2939        .module('app.directives')
2940        .controller('LanguageSelectorController', LanguageSelectorController);
2941
2942    LanguageSelectorController.$inject = ['$localStorage', '$window','$scope'];
2943
2944    function LanguageSelectorController($localStorage, $window, $scope) {
2945        var vm = this;
2946        vm.textColor = $scope.textColor;
2947        vm.selectedTextColor = $scope.selectedTextColor;
2948
2949        $scope.$watch('textColor', function (textColor) {
2950            vm.textColor = $scope.textColor;
2951        })
2952
2953        $scope.$watch('selectedTextColor', function (selectedTextColor) {
2954            vm.selectedTextColor = $scope.selectedTextColor;
2955        })
2956
2957        // Apply website values to view model object.
2958        Object.assign(vm, angular.fromJson(website));
2959
2960        // Select default or current language.
2961        vm.selectedLanguage = angular.isUndefined($localStorage.currentLanguage) 
2962                                ? __defaultLanguage__ 
2963                                : $localStorage.currentLanguage.culture;
2964
2965        vm.formatLanguageLabel = function(language) {
2966            return language.culture.substring(0, 2);
2967        };
2968
2969        vm.changeLanguage = function(language) {
2970            // Set the current language.
2971            $localStorage.currentLanguage = language;
2972
2973            // Reload the page.
2974            $window.location.href = `${$window.location.pathname}?lang=${language.culture}`;
2975
2976            // TODO Must have, reload the with the right page name.
2977            // ...
2978        };
2979    }
2980})();;
2981(function () {
2982    'use strict';
2983
2984    angular
2985        .module('app.directives')
2986        .directive('languageSelector', languageSelector)
2987
2988        languageSelector.$inject = [];
2989
2990    function languageSelector() {
2991        return {
2992            restrict: 'E',
2993            scope: {                
2994                search: '&',
2995                textColor: '=',
2996                selectedTextColor: '='
2997            },
2998            templateUrl: 'public/v2/app/core/directives/language/selector/language-selector.tpl.html',
2999            controller: 'LanguageSelectorController',
3000            controllerAs: 'languageSelector',
3001        };
3002    }
3003})();;
3004
3005(function () {
3006    'use strict';
3007
3008    angular
3009        .module('app.directives')
3010        .directive('ngRepeatDone', ngRepeatDone);
3011
3012    ngRepeatDone.$inject = [];
3013
3014    function ngRepeatDone() {
3015        return {
3016            restrict: 'A',
3017            link : function(scope, element, attrs) {
3018                if (scope.$last) {
3019                    scope.$eval(attrs.ngRepeatDone);
3020                }             
3021            }
3022        };
3023    }
3024})();;
3025(function () {
3026    'use strict';
3027
3028    angular
3029        .module('app.directives')
3030        .directive('pageIsActive', PageIsActive)
3031
3032    // TODO Rename directive to reflect that it's usable only by the menu
3033    PageIsActive.$inject = ['$timeout'];
3034
3035    function PageIsActive($timeout) {
3036        return {
3037            restrict: 'A',
3038            scope: {                
3039                url: '@'
3040            },
3041            link : function(scope, element) {
3042                // TODO Check other way than setTimeout to fix directive concurrency.
3043                $timeout(function() {
3044                    // Check if the current location is equal to the menu item url.
3045                    if ((location.pathname === `${scope.url}`) || 
3046                        (location.pathname.indexOf(`${scope.url}/`) !== -1) ||
3047                        (location.pathname === `/${element.attr('href')}`)) {
3048                        // Set active class.
3049                        element.parent().addClass('active')
3050                    }
3051
3052                    if (angular.isDefined(scope.url)) {
3053                        // Set the url of the page.
3054                        element.attr('href', `${scope.url}`);
3055                    }                    
3056                }, 100);                
3057            }
3058        };
3059    }
3060})();;
3061(function () {
3062    'use strict';
3063
3064    angular
3065        .module('app.directives')
3066        .directive('pagination', pagination);
3067
3068    pagination.$inject = ['$window'];
3069
3070    function pagination($window) {
3071        return {
3072            restrict: 'E',
3073            replace: true,
3074            scope: {
3075                currentPage: '=',
3076                pageSize: '=',
3077                totalCount: '=',
3078                clickPage: '&',
3079                clickPrevious: '&',
3080                clickNext: '&'
3081            },
3082            templateUrl: 'public/v2/app/core/directives/pagination/pagination.tpl.html',
3083            link: function (scope) {
3084                scope.Math = $window.Math;
3085                var pageIndexMax = 5;
3086                if ($(window).width() < 500) {
3087                    pageIndexMax = 3;
3088                }
3089                var pages;
3090                var startIndex;
3091                var endIndex;
3092
3093                scope.$watchGroup(['totalCount', 'pageSize'], function() {
3094                    pages = Math.ceil(scope.totalCount / scope.pageSize);                    
3095                    startIndex = scope.currentPage;
3096                    endIndex = pages <= pageIndexMax ? pages : pageIndexMax;
3097
3098                    scope.pages = []; // Create empty page list.
3099
3100                    for(var i = startIndex; i <= endIndex; i++) {
3101                        scope.pages.push({ number: i} );
3102                    }
3103                });      
3104                
3105                scope.$watch('currentPage', function() {
3106                    if (scope.currentPage === 1) {
3107                        startIndex = 1;
3108                        endIndex = pages <= pageIndexMax ? pages : scope.currentPage + (pageIndexMax - 1);
3109                    } else if (scope.currentPage === 2) {
3110                        startIndex = 1;
3111                        endIndex = pages <= pageIndexMax ? pages : scope.currentPage + (pageIndexMax - 2);
3112                    } else if (scope.currentPage === pages) {
3113                        startIndex = pages <= pageIndexMax ? pages - (pages - 1) : scope.currentPage - (pageIndexMax - 1);
3114                        endIndex = pages;
3115                    } else if (scope.currentPage === pages - 1) {
3116                        startIndex = pages <= pageIndexMax ? pages - (pages - 1) : scope.currentPage - (pageIndexMax - 2);
3117                        endIndex = scope.currentPage + 1;
3118                    } else {
3119                        if (pageIndexMax == 3) {
3120                            startIndex = scope.currentPage - 1;
3121                            endIndex = scope.currentPage + 1;
3122                        }
3123                        else {
3124                            startIndex = scope.currentPage - 2;
3125                            endIndex = scope.currentPage + 2;
3126                        }
3127                    }
3128
3129                    scope.pages = []; // Create empty page list.
3130
3131                    for(var i = startIndex; i <= endIndex; i++) {
3132                        scope.pages.push({ number: i} );
3133                    }
3134                });
3135
3136                scope.onClickPage = function(page) {
3137                    if (typeof scope.clickPage == 'function') {                        
3138                        scope.clickPage({ page: page });
3139                    }
3140                }
3141                
3142                scope.onClickPrevious = function() {
3143                    if (typeof scope.clickPrevious == 'function') {
3144                        scope.clickPrevious();
3145                    }
3146                }                
3147
3148                scope.onClickNext = function() {
3149                    if (typeof scope.clickNext == 'function') {
3150                        scope.clickNext();
3151                    }
3152                }
3153            }
3154        };
3155    }
3156})();;
3157(function () {
3158    'use strict';
3159
3160    angular
3161        .module('app.directives')
3162        .controller('SearchInputController', SearchInputController);
3163
3164    SearchInputController.$inject = ['$scope'];
3165
3166    function SearchInputController($scope) {
3167        var vm = this;    
3168
3169        $scope.$watch('searchInput.text', _.debounce(function(text) {                       
3170            if (angular.isDefined(text)) {
3171                if (typeof $scope.search == 'function') {                        
3172                    $scope.search({ text: text });
3173                }
3174            }            
3175        }, 300));
3176    }
3177})();;
3178(function () {
3179    'use strict';
3180
3181    angular
3182        .module('app.directives')
3183        .directive('searchInput', SearchInput)
3184
3185    SearchInput.$inject = [];
3186
3187    function SearchInput() {
3188        return {
3189            restrict: 'E',
3190            scope: {       
3191                title: '@',
3192                search: '&'
3193            },
3194            templateUrl: 'public/v2/app/core/directives/search-input/search-input.tpl.html',
3195            controller: 'SearchInputController',
3196            controllerAs: 'searchInput',
3197        };
3198    }
3199})();;
3200(function () {
3201    'use strict';
3202
3203    angular
3204        .module('app.directives')
3205        .controller('ShareButtonController', ShareButtonController);
3206
3207    ShareButtonController.$inject = ['$scope', '$element', '$window', '$timeout', '$location'];
3208
3209    function ShareButtonController($scope, $element, $window, $timeout, $location) {
3210        var vm = this;        
3211        vm.twitterUrl = "https://twitter.com/intent/tweet?text=@KreezeeSports&url=" + encodeURIComponent($location.absUrl());
3212        vm.facebookUrl = 'https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent($location.absUrl());
3213        vm.imageUrl = $scope.imageUrl;
3214        
3215        if ($scope.destinations) {
3216            vm.destinations = $scope.destinations;
3217        }
3218        else {
3219            vm.destinations = ["embed"];
3220        }
3221
3222        $timeout(function () {
3223            $('.copy-button', $element).tooltip({ trigger: 'none' });
3224        });
3225        
3226        vm.showModal = function () {
3227            $('.modal', $element).modal('show');
3228        }
3229
3230        vm.embedSrc = $scope.embedSrc;
3231
3232        vm.isIframe = __iframe__;
3233
3234        vm.canCopy = navigator.clipboard != null;
3235
3236        vm.copyEmbed = function () {
3237            navigator.clipboard.writeText(vm.embedSrc).then(function () {
3238                $('.copy-button', $element).tooltip('show');
3239                setTimeout(function () {
3240                    $('.copy-button', $element).tooltip('hide');
3241                }, 3000);
3242            });
3243        }
3244    }
3245})();;
3246(function () {
3247    'use strict';
3248
3249    angular
3250        .module('app.directives')
3251        .directive('shareButton', ShareButton)
3252
3253    ShareButton.$inject = [];
3254
3255    function ShareButton() {
3256        return {
3257            restrict: 'E',
3258            scope: {        
3259                embedSrc: '=',
3260                destinations: '=',
3261                imageUrl: '=',
3262                hideText: '='
3263            },
3264            templateUrl: 'public/v2/app/core/directives/share-button/share-button.tpl.html',
3265            controller: 'ShareButtonController',
3266            controllerAs: 'shareButton',
3267            link: function (scope, element) {
3268
3269            }
3270        };
3271    }
3272})();;
3273(function () {
3274    'use strict';
3275
3276    angular
3277        .module('app.directives')
3278        .directive('sectionHeader', sectionHeader)
3279
3280    sectionHeader.$inject = [];
3281
3282    function sectionHeader() {
3283        return {
3284            restrict: 'E',
3285            scope: {                
3286                title: '@',
3287                titleNoTranslation: '@',
3288                titleStyle: '=',
3289            },
3290            templateUrl: 'public/v2/app/core/directives/section/header/section-header.tpl.html'
3291        };
3292    }
3293})();;
3294(function () {
3295    'use strict';
3296
3297    angular
3298        .module('app.directives')
3299        .directive('stripeElements', stripeElements)
3300
3301    stripeElements.$inject = ['$q', '$localStorage', '$sessionStorage'];
3302
3303    function stripeElements($q, $localStorage, $sessionStorage) {
3304        return {
3305            restrict: 'E',
3306            scope: {
3307                elements: '=',
3308                submit: '&'
3309            },
3310            templateUrl: 'public/v2/app/core/directives/stripe/elements/stripe-elements.tpl.html',
3311            link: function (scope, element, attrs, controller) {
3312                var stripe = Stripe($sessionStorage.configurations.stripeApiKey, { locale: $localStorage.currentLanguage.culture });
3313                var elements = stripe.elements({
3314                    fonts: [
3315                        {
3316                            cssSrc: 'https://fonts.googleapis.com/css?family=Roboto:300,400,500,700'
3317                        }
3318                    ]
3319                });
3320
3321                var style = {
3322                    base: {
3323                        iconColor: '#8898AA',
3324                        color: '#555',
3325                        lineHeight: '20px',
3326                        fontWeight: 300,
3327                        fontFamily: 'Roboto, sans-serif',
3328                        fontSize: '14px',
3329                        padding: '8px 12px 6px 12px',
3330                        borderRadius: 0,
3331
3332                        '::placeholder': {
3333                            color: '#999',
3334                        }
3335                    }
3336                };
3337
3338                scope.elements.creditCardHolderName = element.find('#credit
3338CardHolderName');
3339
3340                scope.elements.cardNumberElement = elements.create('cardNumber', { style: style });
3341                scope.elements.cardNumberElement.mount('#card-number-element');
3342
3343                scope.elements.cardExpiryElement = elements.create('cardExpiry', { style: style });
3344                scope.elements.cardExpiryElement.mount('#card-expiry-element');
3345
3346                scope.elements.cardCvcElement = elements.create('cardCvc', { style: style });
3347                scope.elements.cardCvcElement.mount('#card-cvc-element');
3348
3349                //scope.stripeElements = scope.stripe || {};
3350                scope.elements.createToken = function () {
3351                    var extraDetails = {
3352                        name: scope.elements.creditCardHolderName.val()
3353                    };
3354
3355                    return $q(function (resolve, reject) {
3356                        stripe.createToken(scope.elements.cardNumberElement, extraDetails)
3357                            .then(function (result) {
3358                                // Handle result.error or result.token
3359                                if (result.error) {
3360                                    $('#stripe-elements-error-description').text(result.error.message);
3361                                    $('#stripe-elements-error').show();
3362                                    console.error(result.error);
3363                                    resolve(false);
3364
3365                                } else {
3366                                    // Set the create token id for the current credit card.
3367                                    $('#stripe-elements-error').hide();
3368                                    var stripeToken = angular.element.find('input[name="__stripeToken"]')[0];
3369                                    stripeToken.value = result.token.id;
3370                                    resolve(true);
3371                                }
3372                            })
3373                    });
3374                }
3375            }
3376        };
3377    }
3378
3379})();;
3380(function () {
3381    'use strict';
3382
3383    angular
3384        .module('app.directives')
3385        .controller('FormFileUploadController', FormFileUploadController);
3386
3387    FormFileUploadController.$inject = ['$scope', 'FormService'];
3388
3389    function FormFileUploadController($scope, formService) {
3390        var vm = this;
3391        vm.file = null;
3392
3393        vm.fileNameChanged = function (e) {
3394            // TODO Validate size
3395            vm.file = {
3396                fileName: e.target.files[0].name
3397            };
3398
3399            $scope.ngModel = e.target.files[0].name;
3400
3401            // Function to execute before saving
3402            $scope.beforeSave = function () {
3403                return vm.getFile().then(function (formData) {
3404                    // Upload the selected file.                
3405                    return formService.uploadFile(formData)                    
3406                })
3407            }
3408        };
3409
3410        vm.clearFile = function () {
3411            vm.file = null;
3412            $scope.beforeSave = null;
3413            $scope.ngModel = null;
3414            vm.removeFile();
3415        }
3416    }
3417})();
3418;
3419(function () {
3420    'use strict';
3421
3422    angular
3423        .module('app.directives')
3424        .directive('formFileUpload', formFileUpload);
3425
3426    formFileUpload.$inject = ['$compile', '$q'];
3427
3428    function formFileUpload($compile, $q) {
3429        return {
3430            restrict: 'E',
3431            scope: {
3432                beforeSave: '=',
3433                isMandatory: '=',
3434                ngModel: '='
3435            },
3436            templateUrl: 'public/v2/app/core/directives/form-file-upload/form-file-upload.tpl.html',
3437            controller: 'FormFileUploadController',
3438            controllerAs: 'fileUpload',
3439            link: function (scope, element, attributes, controller) {
3440                var vm = controller;
3441                
3442                vm.name = attributes.id;
3443                vm.isMandatory = scope.isMandatory || false;
3444
3445                vm.showInputFileDialog = function () {
3446                    var inputFile = element.find(`input[id=${attributes.id}]`);
3447                    inputFile.trigger('click');
3448                };
3449
3450                vm.getFile = function () {
3451                    return $q(function (resolve) {
3452                        // Initialize file & file reader.
3453                        var file = element.find(`#${attributes.id}`).prop('files')[0], fileReader = new FileReader();
3454
3455                        fileReader.onloadend = function () {
3456                            // Create form data from selected file.
3457                            var formData = new FormData();
3458                            formData.append('Filedata', file);
3459                            resolve(formData);
3460                        }
3461
3462                        fileReader.readAsBinaryString(file);
3463                    });
3464                };
3465
3466                vm.removeFile = function () {                    
3467                    element.find(`#${attributes.id}`).val('');
3468                }
3469            }
3470        };
3471    }
3472})();;
3473(function () {
3474    'use strict';
3475
3476    angular
3477        .module('app.directives')
3478        .controller('Page404WidgetController', Page404WidgetController);
3479
3480    Page404WidgetController.$inject = ['$scope'];
3481
3482    function Page404WidgetController($scope) {
3483        var vm = this;
3484        
3485        // Apply website values to view model object.
3486        vm.widget = angular.fromJson(widgets[$scope.widget]);             
3487    }
3488})();
3489;
3490(function () {
3491    'use strict';
3492
3493    angular
3494        .module('app.directives')
3495        .directive('page404', page404);
3496
3497    page404.$inject = [];
3498
3499    function page404() {
3500        return {
3501            restrict: 'E',
3502            scope: {                
3503                widget: '='
3504            },
3505            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/404/404.tpl.html',
3506            controller: 'Page404WidgetController',
3507            controllerAs: 'page404'
3508        };
3509    }
3510})();;
3511(function () {
3512    'use strict';
3513
3514    angular
3515        .module('app.directives')
3516        .controller('AppWidgetController', AppWidgetController);
3517
3518    AppWidgetController.$inject = ['$scope', '$localStorage', 'UrlService'];
3519
3520    function AppWidgetController($scope, $localStorage, urlService) {
3521        var vm = this;
3522        vm.url = urlService;
3523        vm.abbreviation = $localStorage.solution.abbreviation;
3524        vm.logo = website.favicon;
3525        vm.culture = $localStorage.currentLanguage 
3526                        ? $localStorage.currentLanguage.culture.substring(0, 2) : 'fr';
3527        
3528        // Apply website values to view model object.
3529        vm.widget = angular.fromJson(widgets[$scope.widget]);
3530    }
3531})();
3532;
3533(function () {
3534    'use strict';
3535
3536    angular
3537        .module('app.directives')
3538        .directive('app', app);
3539
3540    app.$inject = [];
3541
3542    function app() {
3543        return {
3544            restrict: 'E',
3545            scope: {                
3546                widget: '='
3547            },
3548            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/app/app.tpl.html',
3549            controller: 'AppWidgetController',
3550            controllerAs: 'app'
3551        };
3552    }
3553})();;
3554(function () {
3555    'use strict';
3556
3557    angular
3558        .module('app.directives')
3559        .controller('BracketSeedWidgetController', BracketSeedWidgetController);
3560
3561    BracketSeedWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', 'SeasonService', 'WebsiteEditorService'];
3562
3563    function BracketSeedWidgetController($rootScope, $scope, $localStorage, seasonService, websiteEditorService) {
3564        var vm = this;
3565        vm.widget = angular.fromJson(widgets[$scope.widget]);
3566        vm.viewBracket = 'horizontal';
3567        vm.embedSrc = `<iframe src="${location.origin}/?iframe=true&pageId=${location.pathname.substring(1)}" width="100%" height="800"></iframe>`;
3568
3569        //Component mount.
3570        for (var parameter in vm.widget.parameters) {
3571            switch (vm.widget.parameters[parameter].id) {
3572                case 'viewBracket':
3573                    vm.viewBracket = vm.widget.parameters[parameter].value;
3574                    break;
3575            }
3576        }
3577
3578        // Listener
3579        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
3580            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
3581                .then(function () {
3582                    for (var parameter in vm.widget.parameters) {
3583                        switch (vm.widget.parameters[parameter].id) {
3584                            case 'viewBracket':
3585                                vm.widget.parameters[parameter].value = data.viewBracket;
3586                                vm.viewBracket = data.viewBracket;
3587                                break;
3588                        }
3589                    }
3590                    widgets[$scope.widget] = angular.toJson(vm.widget);
3591                })
3592                .catch(function (error) {
3593                    bugsnag.notify(error);
3594                });
3595        });
3596
3597        $scope.$on('$destroy', listener);
3598
3599        if ($scope.noFilter) {
3600            $scope.$watch('[season, division]', function () {
3601                if ($scope.season && $scope.division) {
3602                    getBrackets($scope.season, $scope.division);
3603                }
3604                else {
3605                    getBrackets($scope.season, $scope.division)
3606                }
3607            });
3608        } else {
3609            vm.filter = function (filter) {
3610                getBrackets(filter.season, filter.division);
3611            }
3612
3613        }
3614
3615        function getBrackets(season, division) {
3616            vm.divisions = [];
3617            vm.rounds = [];
3618            vm.isEmpty = false;
3619            seasonService.getSeasonBySeasonId(__solutionId__, season)
3620                .then(function (response) {
3621                    if (response.data.Bracket != null) {
3622                        if (response.data.Bracket.divisions.length > 0) {
3623                            vm.divisions = response.data.Bracket.divisions; // Get all playoffs divisions
3624                            if (division !== 'divisions') {
3625                                const div = vm.divisions.filter(function (d) {
3626                                    return d.id == division;
3627                                })
3628                                vm.divisions = div || [];
3629                            }
3630                        }
3631                        else if (response.data.Bracket.rounds.length > 0) {
3632                            vm.rounds = response.data.Bracket.rounds; // Get all playoffs divisions
3633                            vm.roundName = response.data.Name;
3634                        }
3635                        else {
3636                            vm.isEmpty = true;
3637                        }
3638                    }
3639                    else {
3640                        vm.isEmpty = true;
3641                    }
3642
3643                    vm.isLoaded();
3644                })
3645                .catch(function (error) {
3646                    bugsnag.notify(error);
3647                });
3648        }
3649    }
3650})();
3651;
3652(function () {
3653    'use strict';
3654
3655    angular
3656        .module('app.directives')
3657        .directive('bracketSeed', bracketSeed);
3658
3659    bracketSeed.$inject = ['$window', '$document', '$timeout'];
3660
3661    function bracketSeed($window, $document, $timeout) {
3662        return {
3663            restrict: 'E',
3664            scope: {                
3665                widget: '=',
3666                noFilter: '@',
3667                season: '=',
3668                division: '='
3669            },
3670            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/bracket/seed/bracket-seed.tpl.html',
3671            controller: 'BracketSeedWidgetController',
3672            controllerAs: 'bracketSeed',
3673            link: function (scope, element, attr, controller) {
3674                var vm = controller;
3675                var roundsDOMElement = null;
3676                var indexDOMElement = 0;
3677                var marginRightValue = 12;
3678
3679                vm.isLoaded = function() {
3680                    $timeout(function() {
3681                        roundsDOMElement = element.find('ul.rounds');
3682
3683                        if (isMobile()) {                    
3684                            // Update CSS variable with the width of the list.
3685                            $document[0].documentElement.style.setProperty('--bracket-seed-round-min-width', `${roun
3685dsDOMElement.width()}px`);
3686                        }
3687                    });
3688                };
3689
3690                vm.scrollToRound = function(rounds) {
3691                    if (isMobile()) {
3692                        $timeout(function() {
3693                            if (angular.isDefined(rounds)) {
3694                                // Find active round index.
3695                                var activeRoundIndex = _.findIndex(rounds, function(round) {
3696                                    return round.active;
3697                                });
3698
3699                                // Calculate scollbar position.
3700                                roundsDOMElement[indexDOMElement].scrollLeft += (roundsDOMElement.width() + marginRightValue) * activeRoundIndex;
3701
3702                                // Increment DOM index.
3703                                indexDOMElement += 1;
3704                            }                            
3705                        }, 100);
3706                    }
3707                };
3708
3709                // TODO Move somewhere in a service...
3710                function isMobile() {
3711                    return $window.innerWidth <= 575;
3712                }
3713            }
3714        };
3715    }
3716})();;
3717(function () {
3718    'use strict';
3719
3720    angular
3721        .module('app.directives')
3722        .controller('BracketSeedGameController', BracketSeedGameController);
3723
3724    BracketSeedGameController.$inject = ['$scope'];
3725
3726    function BracketSeedGameController($scope) {
3727        var vm = this;
3728        vm.games = $scope.games; 
3729        vm.team = $scope.team; 
3730        
3731        vm.getScore = function(game) {
3732            return game.status === 1 
3733                    ? '-'
3734                    : game.hometeam.id === vm.team.id 
3735                        ? game.hometeam.score
3736                        : game.visitingteam.score;
3737        };
3738
3739        vm.isWinner = function(game) {
3740            return game.status === 3 
3741                    ? game.hometeam.id === vm.team.id 
3742                        ? game.hometeam.score > game.visitingteam.score
3743                        : game.hometeam.score < game.visitingteam.score
3744                    : false;
3745                    
3746        };
3747    }
3748})();
3749;
3750(function () {
3751    'use strict';
3752
3753    angular
3754        .module('app.directives')
3755        .directive('bracketSeedGame', bracketSeedGame);
3756
3757    bracketSeedGame.$inject = [];
3758
3759    function bracketSeedGame() {
3760        return {
3761            restrict: 'E',
3762            scope: {                
3763                games: '=',
3764                team: '='
3765            },
3766            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/bracket/seed/game/bracket-seed-game.tpl.html',
3767            controller: 'BracketSeedGameController',
3768            controllerAs: 'bracketSeedGame'
3769        };
3770    }
3771})();;
3772(function () {
3773    'use strict';
3774
3775    angular
3776        .module('app.directives')
3777        .controller('BracketSeedViewWidgetController', BracketSeedViewWidgetController);
3778
3779    BracketSeedViewWidgetController.$inject = ['$scope', '$localStorage', 'SeasonService'];
3780
3781    function BracketSeedViewWidgetController($scope, $localStorage, seasonService) {
3782        var vm = this;
3783        vm.viewBracket = $scope.viewbracket;
3784
3785
3786        if ($scope.nofilter) {
3787            $scope.$watch('[season, division]', function () {
3788                if ($scope.season && $scope.division) {
3789                    getBrackets($scope.season, $scope.division);
3790                }
3791            });
3792        } else {
3793            vm.filter = function (filter) {
3794                getBrackets(filter.season, filter.division);
3795            }
3796
3797        }
3798
3799        function getBrackets(season, division) {
3800            vm.divisions = [];
3801            vm.rounds = [];
3802            seasonService.getSeasonBySeasonId(__solutionId__, season)
3803                .then(function (response) {
3804                    if (response.data.Bracket.divisions.length > 0) {
3805                        vm.divisions = response.data.Bracket.divisions; // Get all playoffs divisions
3806                        if (division !== 'divisions') {
3807                            const div = vm.divisions.find(function (d) {
3808                                return d.id == division;
3809                            })
3810                            vm.divisions = [div];
3811                        }
3812                    } else {
3813                        vm.rounds = response.data.Bracket.rounds; // Get all playoffs rounds
3814                    }
3815
3816                    vm.isLoaded();
3817                })
3818                .catch(function (error) {
3819                    bugsnag.notify(error);
3820                });
3821        }
3822    }
3823})();
3824;
3825(function () {
3826    'use strict';
3827
3828    angular
3829        .module('app.directives')
3830        .directive('bracketSeedView', bracketSeedView);
3831
3832    bracketSeedView.$inject = [];
3833
3834    function bracketSeedView() {
3835        return {
3836            restrict: 'E',
3837            scope: {
3838                nofilter: '@',
3839                season: '=',
3840                division: '=',
3841                viewbracket: '='
3842            },
3843            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/bracket/seed/view/bracket-seed-view.tpl.html',
3844            controller: 'BracketSeedViewWidgetController',
3845            controllerAs: 'bracketSeedView',
3846        };
3847    }
3848})();;
3849(function () {
3850    'use strict';
3851
3852    angular
3853        .module('app.directives')
3854        .controller('BracketSeedMatchupController', BracketSeedMatchupController);
3855
3856    BracketSeedMatchupController.$inject = ['$scope', '$translate'];
3857
3858    function BracketSeedMatchupController($scope, $translate) {
3859        var vm = this;
3860
3861        vm.matchup = $scope.matchup;
3862        vm.maxgame = $scope.maxgame;   
3863        
3864        vm.getPlayoffStatus = function() {
3865            // Check if a game has been played.
3866            if ((vm.maxgame > 1) && (vm.matchup.status !== 1 && vm.matchup.games[0].status === 3)) {
3867                if (vm.matchup.teams[0].wincount > vm.matchup.teams[1].wincount) { 
3868                    if (vm.maxgame === vm.matchup.teams[0].wincount) {                        
3869                        return $translate.instant('directives.widgets.bracket.seed.matchup.labels.teamWinPlayoff', {
3870                            team: vm.matchup.teams[0].name,
3871                            victory: vm.matchup.teams[0].wincount,
3872                            defeat: vm.matchup.teams[1].wincount
3873                        });
3874                    } else {
3875                        return $translate.instant('directives.widgets.bracket.seed.matchup.labels.teamLeadPlayoff', {
3876                            team: vm.matchup.teams[0].name,
3877                            victory: vm.matchup.teams[0].wincount,
3878                            defeat: vm.matchup.teams[1].wincount
3879                        });
3880                    }                    
3881                } else if (vm.matchup.teams[0].wincount < vm.matchup.teams[1].wincount) {
3882                    if (vm.maxgame === vm.matchup.teams[1].wincount) {
3883                        return $translate.instant('directives.widgets.bracket.seed.matchup.labels.teamWinPlayoff', {
3884                            team: vm.matchup.teams[1].name,
3885                            victory: vm.matchup.teams[1].wincount,
3886                            defeat: vm.matchup.teams[0].wincount
3887                        });
3888                    } else {
3889                        return $translate.instant('directives.widgets.bracket.seed.matchup.labels.teamLeadPlayoff', {
3890                            team: vm.matchup.teams[1].name,
3891                            victory: vm.matchup.teams[1].wincount,
3892                            defeat: vm.matchup.teams[0].wincount
3893                        });
3894                    }                         
3895                } else if (vm.matchup.teams[0].wincount === vm.matchup.teams[1].wincount) {
3896                    return $translate.instant('directives.widgets.bracket.seed.matchup.labels.playoffTie', {
3897                        victory: vm.matchup.teams[0].wincount,
3898                        defeat:vm.matchup.teams[1].wincount
3899                    });
3900                }
3901            } else {
3902                return vm.matchup.name;
3903            }        
3904        };
3905    }
3906})();
3907;
3908(function () {
3909    'use strict';
3910
3911    angular
3912        .module('app.directives')
3913        .directive('bracketSeedMatchup', bracketSeedMatchup);
3914
3915    bracketSeedMatchup.$inject = [];
3916
3917    function bracketSeedMatchup() {
3918        return {
3919            restrict: 'E',
3920            scope: {                
3921                matchup: '=',
3922                maxgame: '='
3923            },
3924            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/bracket/seed/matchup/bracket-seed-matchup.tpl.html',
3925            controller: 'BracketSeedMatchupController',
3926            controllerAs: 'bracketSeedMatchup'
3927        };
3928    }
3929})();;
3930(function () {
3931  'use strict';
3932
3933  angular
3934    .module('app.directives')
3935    .controller('BracketSeedMatchupActionController', BracketSeedMatchupActionController);
3936
3937  BracketSeedMatchupActionController.$inject = ['$scope', '$translate', 'UrlService'];
3938
3939  function BracketSeedMatchupActionController($scope, $translate, urlService) {
3940    var vm = this;
3941    vm.currentGame = $scope.games.length === 1 ? $scope.games[0] : null;
3942
3943    vm.getGameSheetUrl = function() {
3944      return vm.currentGame !== null
3945              ? urlService.getGameSheetUrl(vm.currentGame.id)
3946              : '';
3947    }
3948
3949    vm.getGameSummaryUrl = function() {
3950      return vm.currentGame !== null
3951              ? urlService.getGameUrl(vm.currentGame.id)
3952              : '';
3953    }
3954  }
3955})();
3956;
3957(function () {
3958  'use strict';
3959
3960  angular
3961      .module('app.directives')
3962      .directive('bracketSeedMatchupAction', bracketSeedMatchupAction);
3963
3964  bracketSeedMatchupAction.$inject = [];
3965
3966  function bracketSeedMatchupAction() {
3967      return {
3968          restrict: 'E',
3969          scope: {                
3970            games: '=',
3971          },
3972          templateUrl: 'public/v2/app/core/directives/toolbox/widgets/bracket/seed/matchup/action/bracket-seed-matchup-action.tpl.html',
3973          controller: 'BracketSeedMatchupActionController',
3974          controllerAs: 'bracketSeedMatchupAction'
3975      };
3976  }
3977})();;
3978(function () {
3979  'use strict';
3980
3981  angular
3982    .module('app.directives')
3983    .controller('BracketSeedMatchupInformationController', BracketSeedMatchupInformationController);
3984
3985  BracketSeedMatchupInformationController.$inject = ['$scope', '$translate', 'UrlService'];
3986
3987  function BracketSeedMatchupInformationController($scope, $translate, urlService) {
3988    var vm = this;
3989    vm.url = urlService;
3990    vm.currentGame = $scope.matchup.games.length === 1 ? $scope.matchup.games[0] : null;
3991    vm.matchup = $scope.matchup;
3992
3993    vm.getGameNumberAndDate = function() {
3994            var returnValue = "";
3995            if (vm.currentGame !== null) {
3996                const date = moment(vm.currentGame.date).format($translate.instant('directives.widgets.bracketSeedInformation.format.date'));
3997                const time = moment(vm.currentGame.time, "hh:mm:ss").isValid() ? moment(vm.currentGame.time, "hh:mm:ss").format("hh:mm A") : "";
3998                returnValue = `#${vm.currentGame.number} - ${date} ${time}`;
3999            } else if (vm.matchup != null) {
4000                returnValue = vm.matchup.name;
4001            }
4002
4003            return returnValue;
4004        }
4005    }
4006})();
4007;
4008(function () {
4009  'use strict';
4010
4011  angular
4012      .module('app.directives')
4013      .directive('bracketSeedMatchupInformation', bracketSeedMatchupInformation);
4014
4015    bracketSeedMatchupInformation.$inject = [];
4016
4017  function bracketSeedMatchupInformation() {
4018      return {
4019          restrict: 'E',
4020          scope: {                
4021              matchup: '=',
4022          },
4023          templateUrl: 'public/v2/app/core/directives/toolbox/widgets/bracket/seed/matchup/information/bracket-seed-matchup-information.tpl.html',
4024          controller: 'BracketSeedMatchupInformationController',
4025          controllerAs: 'bracketSeedMatchupInformation'
4026      };
4027  }
4028})();;
4029(function () {
4030    'use strict';
4031
4032    angular
4033        .module('app.directives')
4034        .controller('BracketSeedRoundController', BracketSeedRoundController);
4035
4036    BracketSeedRoundController.$inject = ['$scope', '$translate'];
4037
4038    function BracketSeedRoundController($scope, $translate) {
4039        var vm = this;
4040        vm.round = $scope.round;
4041        vm.index = $scope.index;
4042        vm.maxlength = $scope.maxlength;
4043        vm.viewbracket = $scope.viewbracket;
4044        vm.division = $scope.division;
4045
4046        vm.first = (vm.maxlength == vm.index)
4047        vm.bestOfPlayoffLabel = $translate.instant('directives.widgets.bracket.seed.labels.bestOfPlayoff', { victory: vm.round.maxgame, total: (vm.round.maxgame * 2) - 1 });
4048    }
4049})();
4050;
4051(function () {
4052    'use strict';
4053
4054    angular
4055        .module('app.directives')
4056        .directive('bracketSeedRound', bracketSeedRound);
4057
4058    bracketSeedRound.$inject = [];
4059
4060    function bracketSeedRound() {
4061        return {
4062            restrict: 'E',
4063            scope: {                
4064                round: '=',
4065                index: '=',
4066                maxlength: '=',
4067                viewbracket: '=',
4068                division: '=',
4069            },
4070            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/bracket/seed/round/bracket-seed-round.tpl.html',
4071            controller: 'BracketSeedRoundController',
4072            controllerAs: 'bracketSeedRound'
4073        };
4074    }
4075})();;
4076(function () {
4077    'use strict';
4078
4079    angular
4080        .module('app.directives')
4081        .controller('BracketSeedTeamController', BracketSeedTeamController);
4082
4083    BracketSeedTeamController.$inject = ['$scope', 'UrlService'];
4084
4085    function BracketSeedTeamController($scope, urlService) {
4086        var vm = this;
4087        vm.url = urlService;          
4088        vm.team = $scope.team; 
4089        vm.games = $scope.games;
4090        vm.home = $scope.home;        
4091    }
4092})();
4093;
4094(function () {
4095    'use strict';
4096
4097    angular
4098        .module('app.directives')
4099        .directive('bracketSeedTeam', bracketSeedTeam);
4100
4101    bracketSeedTeam.$inject = [];
4102
4103    function bracketSeedTeam() {
4104        return {
4105            restrict: 'E',
4106            scope: {     
4107                games: '=',  
4108                home: '=',          
4109                team: '='
4110            },
4111            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/bracket/seed/team/bracket-seed-team.tpl.html',
4112            controller: 'BracketSeedTeamController',
4113            controllerAs: 'bracketSeedTeam'
4114        };
4115    }
4116})();;
4117(function () {
4118    'use strict';
4119
4120    angular
4121        .module('app.directives')
4122        .controller('DivisionsPageWidgetController', DivisionsPageWidgetController);
4123
4124    DivisionsPageWidgetController.$inject = ['$rootScope', '$scope', '$translate', 'HashService', 'WebsiteEditorService', 'TeamService', 'FacilityService'];
4125
4126    function DivisionsPageWidgetController($rootScope, $scope, $translate, hashService, websiteEditorService, teamService, facilityService) {
4127        var vm = this;
4128        var initialParams = hashService.getParams();
4129
4130        //State variables ----------
4131        vm.widget = angular.fromJson(widgets[$scope.widget]);
4132        vm.selectedDirectly = false;
4133        vm.divisions = undefined;
4134        vm.season = undefined;
4135        vm.division = undefined;
4136        vm.viewBracketDivision = 'horizontal';
4137        vm.embedSrc = `<iframe src="${location.origin}/?iframe=true&pageId=${location.pathname.substring(1)}" width="100%" height="800"></iframe>`;
4138
4139        vm.showGoalies = false;
4140        vm.showLeaders = false;
4141        vm.showPlayers = false;
4142        vm.showSuspensions = false;
4143        vm.showTeams = false;
4144        vm.showPitchers = false;
4145
4146        vm.tabs = hashService.DIVISIONS_TABS;
4147        vm.activeTab = vm.tabs.SCHEDULE;
4148
4149        vm.standings = {
4150            parameters: {}
4151        };
4152        vm.schedule = {
4153            parameters: {
4154                defaultView: 'week',
4155                visitorRight: false,
4156                pageSize: 20,
4157            },
4158            dateRange: undefined,
4159            view: undefined,
4160            team: 'all',
4161            facility: 'all',
4162            teams: [{ Id: 'all', Name: $translate.instant('directives.filter.labels.allteams') }],
4163            teamsTemp: [{ Id: 'all', Name: $translate.instant('directives.filter.labels.allteams') }],
4164            facilities: [{ Id: 'all', Name: $translate.instant('directives.filter.labels.allfacilities') }],
4165        }
4166        vm.players = {
4167            startDate: undefined,
4168            endDate: undefined,
4169            startDateView: undefined,
4170            endDateView: undefined
4171        }
4172        vm.brackets = {
4173            season: undefined,
4174            division: undefined
4175        }
4176
4177        if (initialParams.tab) {
4178            vm.activeTab = initialParams.tab;
4179        }
4180
4181        //State functions ----------
4182        vm.filter = function (filter) {
4183            vm.divisions = filter.divisions;
4184            vm.division = filter.division;
4185
4186            vm.brackets.season = filter.season;
4187            vm.brackets.division = filter.division;
4188
4189            vm.schedule.team = 'all';
4190            vm.schedule.facility = 'all';
4191
4192            if (filter.season !== vm.season) {
4193                vm.season = filter.season;
4194                getTeams();
4195            }
4196            filterTeamsFromSelectedDivision();
4197        }
4198
4199        vm.applyFilters = function () {
4200            vm.players.startDate = moment(vm.players.startDateView).format('YYYY-MM-DD HH:mm:ss');
4201            vm.players.endDate = moment(vm.players.endDateView).format('YYYY-MM-DD HH:mm:ss');
4202        }
4203
4204        vm.clearPlayerFilters = function () {
4205            vm.players.startDate = undefined;
4206            vm.players.endDate = undefined;
4207            vm.players.endDateView = undefined;
4208            vm.players.startDateView = undefined;
4209        }
4210
4211        vm.clickTab = function (tab) {
4212            vm.selectedDirectly = true;
4213            vm.activeTab = vm.tabs[tab];
4214            hashService.setParams({ tab: vm.tabs[tab] });
4215        }
4216
4217        vm.isActive = function (tab) {
4218            if (tab === 'STATS' && vm.activeTab.includes('stats')) {
4219                return true;
4220            }
4221            return vm.activeTab === vm.tabs[tab];
4222        }
4223
4224        vm.isActiveSubTab = function (tab) {
4225            return vm.activeTab === vm.tabs[tab];
4226        }
4227
4228
4229        //Component mount.
4230        for (var parameter in vm.widget.parameters) {
4231            switch (vm.widget.parameters[parameter].id) {
4232
4233                case 'columnsDisplaySelect':
4234                    vm.standings.parameters.columnsDisplaySelect = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
4235                    break;
4236                case 'viewBracketDivision':
4237                    vm.viewBracketDivision = vm.widget.parameters[parameter].value;
4238                    break;
4239
4240                case 'sortDirection':
4241                    vm.standings.parameters.sortOrder = vm.widget.parameters[parameter].value;
4242                    break;
4243
4244                case 'sortStat':
4245                    vm.standings.parameters.sortStatId = vm.widget.parameters[parameter].value;
4246                    break;
4247
4248                case 'defaultTeamsDisplayed':
4249                    vm.schedule.parameters.pageSize = vm.widget.parameters[parameter].value;
4250                    break;
4251
4252                case 'defaultView':
4253                    vm.schedule.parameters.defaultView = vm.widget.parameters[parameter].value;
4254                    break;
4255
4256                case 'visitorRight':
4257                    vm.schedule.parameters.visitorRight = (vm.widget.parameters[parameter].value === 'true');
4258                    break;
4259
4260                case 'showPlayers':
4261                    vm.showPlayers = (vm.widget.parameters[parameter].value === 'true');
4262                    break;
4263
4264                case 'showLeaders':
4265                    vm.showLeaders = (vm.widget.parameters[parameter].value === 'true');
4266                    break;
4267
4268                case 'showTeams':
4269                    vm.showTeams = (vm.widget.parameters[parameter].value === 'true');
4270                    break;
4271
4272                case 'showGoalies':
4273                    vm.showGoalies = (vm.widget.parameters[parameter].value === 'true');
4274                    break;
4275
4276                case 'showSuspensions':
4277                    vm.showSuspensions = (vm.widget.parameters[parameter].value === 'true');
4278                    break;
4279
4280                case 'showPitchers':
4281                    vm.showPitchers = (vm.widget.parameters[parameter].value === 'true');
4282                    break;
4283            }
4284        }
4285        getFacilities();
4286
4287        // Listener
4288        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
4289            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
4290                .then(function () {
4291                    for (var parameter in vm.widget.parameters) {
4292                        switch (vm.widget.parameters[parameter].id) {
4293
4294                            case 'columnsDisplaySelect':
4295                                vm.widget.parameters[parameter].value = data.columnsDisplaySelect;
4296                                vm.standings.parameters.columnsDisplaySelect = angular.fromJson(data.columnsDisplaySelect.replace(/\'/g, '"'));
4297                                break;
4298
4299                            case 'viewBracketDivision':
4300                                vm.widget.parameters[parameter].value = data.viewBracketDivision;
4301                                vm.viewBracketDivision = data.viewBracketDivision;
4302                                break;
4303
4304                            case 'sortDirection':
4305                                vm.widget.parameters[parameter].value = data.sortDirection;
4306                                vm.standings.parameters.sortOrder = data.sortDirection;
4307                                break;
4308
4309                            case 'sortStat':
4310                                vm.widget.parameters[parameter].value = data.sortStat;
4311                                vm.standings.parameters.sortStatId = data.sortStat;
4312                                break;
4313
4314                            case 'defaultTeamsDisplayed':
4315                                vm.widget.parameters[parameter].value = data.defaultTeamsDisplayed;
4316                                vm.schedule.parameters.pageSize = data.defaultTeamsDisplayed;
4317                                break;
4318
4319                            case 'defaultView':
4320                                vm.widget.parameters[parameter].value = data.defaultView;
4321                                vm.schedule.parameters.defaultView = data.defaultView;
4322                                break;
4323
4324                            case 'visitorRight':
4325                                vm.widget.parameters[parameter].value = data.visitorRight.toString();
4326                                vm.schedule.parameters.visitorRight = data.visitorRight;
4327                                break;
4328
4329                            case 'showPlayers':
4330                                vm.widget.parameters[parameter].value = data.showPlayers.toString();
4331                                vm.showPlayers = data.showPlayers;
4332                                break;
4333
4334                            case 'showLeaders':
4335                                vm.widget.parameters[parameter].value = data.showLeaders.toString();
4336                                vm.showLeaders = data.showLeaders;
4337                                break;
4338
4339                            case 'showTeams':
4340                                vm.widget.parameters[parameter].value = data.showTeams.toString();
4341                                vm.showTeams = data.showTeams;
4342                                break;
4343
4344                            case 'showGoalies':
4345                                vm.widget.parameters[parameter].value = data.showGoalies.toString();
4346                                vm.showGoalies = data.showGoalies;
4347                                break;
4348
4349                            case 'showSuspensions':
4350                                vm.widget.parameters[parameter].value = data.showSuspensions.toString();
4351                                vm.showSuspensions = data.showSuspensions;
4352                                break;
4353
4354                            case 'showPitchers':
4355                                vm.widget.parameters[parameter].value = data.showPitchers.toString();
4356                                vm.showPitchers = data.showPitchers;
4357                                break;
4358                        }
4359                    }
4360                    widgets[$scope.widget] = angular.toJson(vm.widget);
4361                    //location.reload();
4362                })
4363                .catch(function (error) {
4364                    bugsnag.notify(error);
4365                });
4366        });
4367
4368        $scope.$on('$destroy', listener);
4369
4370
4371        // Location change
4372        $scope.$on('$locationChangeSuccess', function (event, newUrl, oldUrl) {
4373            if (hashService.hasDivisionsTabsChanged(newUrl, oldUrl)) {
4374                locationChange();
4375            }
4376        });
4377
4378        function locationChange() {
4379            if (!vm.selectedDirectly) {
4380                const filtersUrl = hashService.getParams();
4381
4382                const activeKey = Object.keys(vm.tabs).find(function (tab) {
4383                    return vm.tabs[tab] === filtersUrl.tab;
4384                });
4385
4386                if (activeKey) {
4387                    vm.activeTab = vm.tabs[activeKey];
4388                } else {
4389                    vm.activeTab = vm.tabs.SCHEDULE;
4390                }
4391            }
4392            vm.selectedDirectly = false;
4393        }
4394
4395        // ********** SCHEDULE  *********************************************
4396        vm.selectTeam = function (item) {
4397            vm.schedule.team = item.Id;
4398        }
4399
4400        vm.selectFacility = function (item) {
4401            vm.schedule.facility = item.Id;
4402        }
4403
4404        vm.viewToday = function (dateRange) {
4405            vm.schedule.dateRange = dateRange;
4406        };
4407
4408        vm.viewChange = function (view, dateRange) {
4409            vm.schedule.view = view;
4410            vm.schedule.dateRange = dateRange;
4411        };
4412
4413        function getTeams() {
4414            vm.schedule.teams = [{ Id: 'all', Name: $translate.instant('directives.filter.labels.allteams') }];
4415            vm.schedule.team = 'all';
4416            teamService.getTeamsBySeasonId(__solutionId__, vm.season)
4417                .then(function (response) {
4418                    response.data.forEach(function (team) {
4419                        vm.schedule.teams.push({
4420                            Id: team.id,
4421                            Name: team.name,
4422                            division: {
4423                                id: team.divisionId,
4424                                name: team.division
4425                            }
4426                        });
4427                    });
4428                    vm.schedule.teamsTemp = vm.schedule.teams;
4429                    filterTeamsFromSelectedDivision();
4430                })
4431                .catch(function (error) {
4432                    bugsnag.notify(error);
4433                });
4434        }
4435
4436        function getFacilities() {
4437            facilityService.getFacilitiesBySolutionId(__solutionId__)
4438                .then(function (response) {
4439                    vm.schedule.facilities = vm.schedule.facilities.concat(response.data);
4440                })
4441                .catch(function (error) {
4442                    bugsnag.notify(error);
4443                });
4444        }
4445
4446        function filterTeamsFromSelectedDivision() {
4447                if (vm.division === 'divisions') {
4448                    vm.schedule.teams = vm.schedule.teamsTemp;
4449                } else {
4450                    // Get divisions from division list corresponding to filter selection
4451                    var divisionsFilter = _.filter(vm.divisions, function (division) { return division.Id == vm.division || division.ParentId == vm.division });
4452                    vm.schedule.teams = _.filter(vm.schedule.teamsTemp, function (team) {
4453                        return team.Id === 'all' || (team.division && _.find(divisionsFilter, { Id: team.division.id }) !== undefined);
4454                    });
4455                }
4456            
4457        }
4458    }
4459})();
4460;
4461(function () {
4462    'use strict';
4463
4464    angular
4465        .module('app.directives')
4466        .directive('divisionsPage', divisionsPage)
4467
4468    divisionsPage.$inject = [];
4469
4470    function divisionsPage() {
4471        return {
4472            restrict: 'E',
4473            scope: {
4474                widget: '='
4475            },
4476            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/divisions/divisions-page.tpl.html',
4477            controller: 'DivisionsPageWidgetController',
4478            controllerAs: 'divisionsPage'
4479        };
4480    }
4481})();;
4482(function () {
4483    'use strict';
4484
4485    angular
4486        .module('app.directives')
4487        .controller('FacilityListWidgetController', FacilityListWidgetController);
4488
4489    FacilityListWidgetController.$inject = ['$rootScope', '$scope', '$window', '$timeout', 'WebsiteEditorService', 'UrlService', 'FacilityService', 'GoogleMapService'];
4490
4491    function FacilityListWidgetController($rootScope, $scope, $window, $timeout, websiteEditorService, urlService, facilityService, googleMapService) {
4492        var vm = this;
4493        var facilities = [];
4494
4495        // State variables
4496        vm.url = urlService;
4497        vm.widget = angular.fromJson(widgets[$scope.widget]);
4498        vm.currentPage = 1;
4499        vm.pageSize = 15;
4500        vm.totalCount = 0;
4501        vm.results = [];
4502        vm.columns = [];
4503
4504        //State functions
4505        vm.clickPage = function (page) {
4506            vm.currentPage = page;
4507            facilitiesToDisplay();
4508        };
4509
4510        vm.clickPrevious = function () {
4511            vm.currentPage -= 1;
4512            facilitiesToDisplay();
4513        };
4514
4515        vm.clickNext = function () {
4516            vm.currentPage += 1;
4517            facilitiesToDisplay();
4518        };
4519
4520        vm.showStat = function (column) {
4521            if (isMobile() && column.visibleMobile) {
4522                return true;
4523            } else if (!isMobile() && column.visibleDesktop) {
4524                return true;
4525            }
4526            return false;
4527        }
4528
4529        vm.clickFacility = function (facility) {
4530            var url = googleMapService.getMapSearchUrl(facility.FacilityAddress);
4531            window.open(url, "_blank");
4532        }
4533
4534        //Component mount.
4535        for (var parameter in vm.widget.parameters) {
4536            switch (vm.widget.parameters[parameter].id) {
4537                case 'columnsDisplaySelect':
4538                    var columnsDisplaySelect = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
4539                    buildColumns(columnsDisplaySelect);
4540                    break;
4541
4542                case 'nbFacilitiesDisplayed':
4543                    vm.pageSize = parseInt(vm.widget.parameters[parameter].value);
4544                    break;
4545            }
4546        }
4547
4548        getFacilities();
4549
4550        // Listener
4551        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
4552            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
4553                .then(function () {
4554                    for (var parameter in vm.widget.parameters) {
4555                        switch (vm.widget.parameters[parameter].id) {
4556                            case 'columnsDisplaySelect':
4557                                vm.widget.parameters[parameter].value = data.columnsDisplaySelect;
4558                                var columnsDisplaySelect = angular.fromJson(data.columnsDisplaySelect.replace(/\'/g, '"'));
4559                                buildColumns(columnsDisplaySelect);
4560                                break;
4561
4562                            case 'nbFacilitiesDisplayed':
4563                                vm.widget.parameters[parameter].value = data.nbFacilitiesDisplayed;
4564                                vm.pageSize = parseInt(data.nbFacilitiesDisplayed);
4565                                break;
4566                        }
4567                    }
4568                    vm.currentPage = 1;
4569                    facilitiesToDisplay();
4570                    widgets[$scope.widget] = angular.toJson(vm.widget);
4571                })
4572                .catch(function (error) {
4573                    bugsnag.notify(error);
4574                });
4575        });
4576
4577        $scope.$on('$destroy', listener);
4578
4579        //Helpers
4580        function getFacilities() {
4581            facilityService.getFacilitiesDetailsBySolutionId(__solutionId__)
4582                .then(function (response) {
4583                    facilities = [];
4584                    facilities = response.data;
4585                    facilitiesToDisplay();
4586                    vm.totalCount = response.data.length;
4587                })
4588                .catch(function (error) {
4589                    bugsnag.notify(error);
4590                });
4591        }
4592
4593        function facilitiesToDisplay() {
4594            var index1 = (vm.currentPage - 1) * vm.pageSize;
4595            var index2 = vm.currentPage * vm.pageSize;
4596            var facilitiesToDisplay = facilities.slice(index1, index2);
4597            var facilitiyList = [];
4598            facilitiesToDisplay.forEach(function (facility) {
4599                facilitiyList.push({
4600                    Name: facility.name,
4601                    Abbreviation: facility.abbreviation,
4602                    FacilityType: facility.facilityType,
4603                    FacilityAddress: facility.facilityAddress,
4604                    City: facility.city,
4605                    FacilityState: facility.facilityState,
4606                    FacilityStatus: facility.facilityStatus,
4607                    Phone: facility.phone,
4608                    Note: facility.note
4609                });
4610            });
4611            vm.results = facilitiyList;
4612        }
4613
4614        function buildColumns(columnsToDisplay) {
4615            vm.columns = [];
4616            columnsToDisplay.forEach(function (col) {
4617                var stat = facilityService.getFacilityStatById(col.id);
4618                vm.columns.push({
4619                    id: col.id,
4620                    visibleDesktop: col.visibleDesktop,
4621                    visibleMobile: col.visibleMobile,
4622                    name: stat.name
4623                });
4624            });
4625        }
4626
4627        function isMobile() {
4628            return $window.innerWidth <= 600;
4629        }
4630    }
4631})();
4632;
4633(function () {
4634    'use strict';
4635
4636    angular
4637        .module('app.directives')
4638        .directive('facilityList', facilityList);
4639
4640    facilityList.$inject = [];
4641
4642    function facilityList() {
4643        return {
4644            restrict: 'E',
4645            scope: {                
4646                widget: '='
4647            },
4648            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/facility/list/facility-list.tpl.html',
4649            controller: 'FacilityListWidgetController',
4650            controllerAs: 'facilities'
4651        };
4652    }
4653})();;
4654(function () {
4655    'use strict';
4656
4657    angular
4658        .module('app.directives')
4659        .controller('FacilityWidgetWidgetController', FacilityWidgetWidgetController);
4660
4661    FacilityWidgetWidgetController.$inject = ['$rootScope', '$scope', '$translate', 'WebsiteEditorService', 'UrlService', 'FacilityService', 'GoogleMapService'];
4662
4663    function FacilityWidgetWidgetController($rootScope, $scope, $translate, websiteEditorService, urlService, facilityService, googleMapService) {
4664        var vm = this;
4665
4666        // State variables
4667        vm.widget = angular.fromJson(widgets[$scope.widget]);
4668        vm.title = "";
4669        vm.showTitle = false;
4670        vm.nbFacilitiesDisplayed = 15;
4671        vm.showStatus = true;
4672        vm.showNote = false;
4673        vm.facilities = [];
4674        vm.updatedat = "";
4675
4676        // State functions
4677        vm.clickFacility = function (facility) {
4678            var url = googleMapService.getMapSearchUrl(facility.FacilityAddress);
4679            window.open(url, "_blank");
4680        }
4681
4682        // Component mount
4683        for (var parameter in vm.widget.parameters) {
4684            switch (vm.widget.parameters[parameter].id) {
4685                case 'title':
4686                    vm.title = vm.widget.parameters[parameter].value;
4687                    break;
4688
4689                case 'showTitle':
4690                    vm.showTitle = vm.widget.parameters[parameter].value === 'true';
4691                    break;
4692
4693                case 'nbFacilitiesDisplayed':
4694                    vm.nbFacilitiesDisplayed = parseInt(vm.widget.parameters[parameter].value);
4695                    break;
4696
4697                case 'showStatus':
4698                    vm.showStatus = vm.widget.parameters[parameter].value === 'true';
4699                    break;
4700
4701                case 'showNote':
4702                    vm.showNote = vm.widget.parameters[parameter].value === 'true';
4703                    break;
4704            }
4705        }
4706
4707        getFacilities();
4708
4709        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
4710            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
4711                .then(function (response) {
4712                    for (var parameter in vm.widget.parameters) {
4713                        switch (vm.widget.parameters[parameter].id) {
4714                            case 'title':
4715                                vm.widget.parameters[parameter].value = data.title;
4716                                vm.title = data.title;
4717                                break;
4718
4719                            case 'showTitle':
4720                                vm.widget.parameters[parameter].value = data.showTitle.toString();
4721                                vm.showTitle = data.showTitle;
4722                                break;
4723
4724                            case 'nbFacilitiesDisplayed':
4725                                vm.widget.parameters[parameter].value = data.nbFacilitiesDisplayed;
4726                                vm.nbFacilitiesDisplayed = parseInt(data.nbFacilitiesDisplayed);
4727                                break;
4728
4729                            case 'showStatus':
4730                                vm.widget.parameters[parameter].value = data.showStatus.toString();
4731                                vm.showStatus = data.showStatus;
4732                                break;
4733
4734                            case 'showNote':
4735                                vm.widget.parameters[parameter].value = data.showNote.toString();
4736                                vm.showNote = data.showNote;
4737                                break;
4738                        }
4739                    }
4740                    getFacilities();
4741                    widgets[$scope.widget] = angular.toJson(vm.widget);
4742                })
4743                .catch(function (error) {
4744                    bugsnag.notify(error);
4745                });
4746        });
4747
4748        $scope.$on('$destroy', listener);
4749
4750        //Helpers
4751        function getFacilities() {
4752            facilityService.getFacilitiesDetailsWithUpdateDate(__solutionId__)
4753                .then(function (response) {
4754                    vm.updatedate = moment(response.data.updateDate).format($translate.instant('directives.widgets.facility.widget.format.date'));
4755                    var facilitiyList = [];
4756                    response.data.facilities.slice(0, vm.nbFacilitiesDisplayed).forEach(function (facility) {
4757                        facilitiyList.push({
4758                            Name: facility.name,
4759                            FacilityStatus: facility.facilityStatus,
4760                            Note: facility.note
4761                        });
4762                    });
4763                    vm.facilities = facilitiyList;
4764                })
4765                .catch(function (error) {
4766                    bugsnag.notify(error);
4767                });
4768        }
4769    }
4770})();
4771;
4772(function () {
4773    'use strict';
4774
4775    angular
4776        .module('app.directives')
4777        .directive('facilityWidget', facilityWidget);
4778
4779    facilityWidget.$inject = [];
4780
4781    function facilityWidget() {
4782        return {
4783            restrict: 'E',
4784            scope: {                
4785                widget: '='
4786            },
4787            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/facility/widget/facility-widget.tpl.html',
4788            controller: 'FacilityWidgetWidgetController',
4789            controllerAs: 'facilityWidget'
4790        };
4791    }
4792})();;
4793(function () {
4794    'use strict';
4795
4796    angular
4797        .module('app.directives')
4798        .controller('FieldViewWidgetController', FieldViewWidgetController);
4799
4800    FieldViewWidgetController.$inject = ['$rootScope', '$scope', 'WebsiteEditorService', 'ScoreboardBaseballService', 'PositionService', 'UrlService', 'SignalrService'];
4801
4802    function FieldViewWidgetController($rootScope, $scope, websiteEditorService, scoreboardBaseballService, positionService, urlService, signalrService) {
4803        var vm = this;
4804        vm.widget = angular.fromJson(widgets[$scope.widget])
4805        vm.opened = false
4806        vm = Object.assign(vm, angular.fromJson(__gameDetails__
4807            .replace(/[\n\r]+/g, ' ')));
4808        vm.url = urlService
4809
4810        vm.getStyle = function () {
4811            var style = {};
4812            if (!vm.widgetTransparency) {
4813                style['background-color'] = vm.backgroundColor;
4814            }
4815            return style;
4816        }
4817
4818        getScoreboardInfo();
4819
4820        $rootScope.$on('onGameStatusChange', function (event, statusId) {
4821            vm.statusId = statusId;
4822            getScoreboardInfo();
4823        })
4824
4825        var signalrConnection = signalrService.getConnection(signalrService.GROUPS.BaseballGameUpdate(vm.id));        
4826
4827        signalrConnection.on(signalrService.EVENTS.BaseballScoreboardUpdate, function (response) {
4828            var gameUpdated = angular.fromJson(response);            
4829            if (gameUpdated.gameId == vm.id) {                
4830                vm.fieldInfo = gameUpdated.field;
4831                $scope.$apply();
4832			}
4833        });
4834
4835        function getScoreboardInfo(version) {
4836            scoreboardBaseballService.getScoreboardBaseball(__solutionId__, vm.id, version)
4837                .then(function (response) {
4838                    vm.fieldInfo = response.data.field
4839                })
4840                .catch(function (error) {
4841                    bugsnag.notify(error);
4842                });
4843        }
4844
4845        for (var parameter in vm.widget.parameters) {
4846            switch (vm.widget.parameters[parameter].id) {
4847                case 'backgroundColor':
4848                    vm.backgroundColor = vm.widget.parameters[parameter].value
4849                    break;
4850                case 'widgetTransparency':
4851                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
4852                    break;
4853
4854            }
4855        }
4856
4857        vm.getPlayerCard = function () {
4858            vm.opened = !vm.opened
4859            const { id, isDefense, number, playerAvatar, playerName, teamId, playerPosition, pos, row } = arguments[0]
4860            vm.playerId = id
4861            vm.isDefense = isDefense
4862            vm.number = number
4863            vm.playerAvatar = playerAvatar
4864            vm.playerName = playerName
4865            vm.pos = pos
4866            vm.row = row
4867            vm.playerTeam = _.filter(vm.teamList, function (team) {
4868                return team.id === teamId
4869            })[0]
4870
4871            switch (playerPosition) {
4872                case "catcher":
4873                    vm.playerPosition = positionService.getPosition("baseballcatcher")
4874                    break;
4875                case "batter":
4876                    vm.playerPosition = positionService.getPosition("baseballdesignatedhitter")
4877                    break;
4878                case "thirdbase":
4879                    vm.playerPosition = positionService.getPosition("baseballthirdbase")
4880                    break;
4881                case "pitcher":
4882                    vm.playerPosition = positionService.getPosition("baseballpitcher")
4883                    break;
4884                case "firstbase":
4885                    vm.playerPosition = positionService.getPosition("baseballfirstbase")
4886                    break;
4887                case "shortstop":
4888                    vm.playerPosition = positionService.getPosition("baseballshortstop")
4889                    break;
4890                case "secondbase":
4891                    vm.playerPosition = positionService.getPosition("baseballsecondbase")
4892                    break;
4893                case "fieldleft":
4894                    vm.playerPosition = positionService.getPosition("baseballleftfield")
4895                    break;
4896                case "fieldcenter":
4897                    vm.playerPosition = positionService.getPosition("baseballcenterfield")
4898                    break;
4899                case "fieldright":
4900                    vm.playerPosition = positionService.getPosition("baseballrightfield")
4901                    break;
4902                default:
4903                    break;
4904            }
4905        }
4906
4907        vm.closeModal = function () {
4908            vm.opened = false
4909        }
4910
4911        // Triggered when parameters are changed.
4912        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
4913            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
4914                .then(function (response) {
4915                    // Save parameters   
4916                    for (var parameter in vm.widget.parameters) {
4917                        switch (vm.widget.parameters[parameter].id) {
4918                            case 'backgroundColor':
4919                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
4920                                vm.backgroundColor = data.backgroundColor;
4921                                break;
4922                            case 'widgetTransparency':
4923                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
4924                                vm.widgetTransparency = data.widgetTransparency;
4925                                break;
4926                        }
4927                    }
4928                    // Update the variable.
4929                    widgets[$scope.widget] = angular.toJson(vm.widget);
4930                })
4931                .catch(function (error) {
4932                    bugsnag.notify(error);
4933                });
4934
4935
4936        });
4937        $scope.$on('$destroy', listener);
4938    }
4939})();
4940;
4941(function () {
4942    'use strict';
4943
4944    angular
4945        .module('app.directives')
4946        .directive('fieldView', fieldView)
4947
4948    fieldView.$inject = [];
4949
4950    function fieldView() {
4951        return {
4952            restrict: 'E',
4953            scope: {
4954                widget: '='
4955            },
4956            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/field-view/field-view.tpl.html',
4957            controller: 'FieldViewWidgetController',
4958            controllerAs: 'fieldView',
4959        };
4960    }
4961})();
4962;
4963(function () {
4964    'use strict';
4965
4966    angular
4967        .module('app.directives')
4968        .controller('FormWidgetWidgetController', FormWidgetWidgetController);
4969
4970    FormWidgetWidgetController.$inject = ['$rootScope', '$scope', '$timeout', 'WebsiteEditorService', 'FormService'];
4971
4972    function FormWidgetWidgetController($rootScope, $scope, $timeout, websiteEditorService, formService) {
4973        var vm = this;
4974        vm.widget = angular.fromJson(widgets[$scope.widget]);
4975        vm.formService = formService;
4976
4977        vm.pageId = 'page';
4978        vm.title = "";
4979        vm.showTitle = false;
4980        vm.formSelected = '';
4981        vm.widgetTransparency = false;
4982        vm.backgroundColor = '#FFF';
4983        vm.border = { width: 0, color: '#FFFFFF', radius: 0 };
4984
4985        // Component mount
4986        for (var parameter in vm.widget.parameters) {
4987            switch (vm.widget.parameters[parameter].id) {
4988                case 'title':
4989                    vm.title = vm.widget.parameters[parameter].value;
4990                    break;
4991
4992                case 'showTitle':
4993                    vm.showTitle = vm.widget.parameters[parameter].value === 'true';
4994                    break;
4995
4996                case 'formSelect':
4997                    vm.formSelected = vm.widget.parameters[parameter].value;
4998
4999                case 'widgetTransparency':
5000                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
5001                    break;
5002
5003                case 'backgroundColor':
5004                    vm.backgroundColor = vm.widget.parameters[parameter].value;
5005                    break;
5006
5007                case 'border':
5008                    vm.border = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
5009                    break;
5010            }
5011        }
5012        $timeout(function() {
5013            vm.getForm();
5014        });
5015
5016        // Listener
5017        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
5018            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
5019                .then(function (response) {
5020                    for (var parameter in vm.widget.parameters) {
5021                        switch (vm.widget.parameters[parameter].id) {
5022                            // case 'title':
5023                            //     vm.widget.parameters[parameter].value = data.title;
5024                            //     vm.title = data.title;
5025                            //     break;
5026
5027                            case 'formSelect':
5028                                vm.widget.parameters[parameter].value = data.formSelect;
5029                                vm.formSelected = data.formSelect;
5030                                break;
5031
5032                            // case 'showTitle':
5033                            //     vm.widget.parameters[parameter].value = data.showTitle.toString();
5034                            //     vm.showTitle = data.showTitle;
5035                            //     break;
5036
5037                            case 'widgetTransparency':
5038                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
5039                                vm.widgetTransparency = data.widgetTransparency;
5040                                break;
5041
5042                            case 'backgroundColor':
5043                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
5044                                vm.backgroundColor = data.backgroundColor;
5045                                break;
5046
5047                            case 'border':
5048                                vm.widget.parameters[parameter].value = data.border;
5049                                vm.border = angular.fromJson(data.border.replace(/\'/g, '"'));
5050                                break;
5051                        }
5052                    }
5053                    widgets[$scope.widget] = angular.toJson(vm.widget);
5054                    $timeout(function() {
5055                        vm.getForm();
5056                    });
5057                })
5058                .catch(function (error) {
5059                    console.log(error)
5060                    bugsnag.notify(error);
5061                });
5062        });
5063
5064        $scope.$on('$destroy', listener);
5065    }
5066})();
5067;
5068(function () {
5069    'use strict';
5070
5071    angular
5072        .module('app.directives')
5073        .directive('formWidget', formWidget)
5074
5075    formWidget.$inject = ['$timeout', '$compile'];
5076
5077    function formWidget($timeout, $compile) {
5078        return {
5079            restrict: 'E',
5080            scope: {
5081                widget: '='
5082            },
5083            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/form/form-widget.tpl.html',
5084            controller: 'FormWidgetWidgetController',
5085            controllerAs: 'formWidget',
5086            link: function (scope, element, attr, controller) {
5087                controller.getForm = function() {
5088                    var formElement = element.find('.form-selected');
5089                    controller.formService.getFormByFormId(__solutionId__, controller.pageId, controller.formSelected)
5090                        .then(function (response) {
5091                            controller.form = response.data;
5092                            $timeout(function() {
5093                                var formToRender = $compile(`<form-v1 form="formWidget.form" form-id="formWidget.formSelected" page-id="formWidget.pageId"></form-v1>`)(scope);
5094                                formElement.html(formToRender);
5095                            });
5096                        })
5097                        .catch(function (error) {
5098                            bugsnag.notify(error);
5099                        });
5100                };
5101            }
5102        };
5103    }
5104})();;
5105(function () {
5106	'use strict';
5107
5108	angular
5109		.module('app.directives')
5110		.controller('FrontOfficeFormController', FrontOfficeFormController);
5111
5112	FrontOfficeFormController.$inject = ['$rootScope', '$scope', '$sce', '$localStorage', 'WebsiteEditorService'];
5113
5114	function FrontOfficeFormController($rootScope, $scope, $sce, $localStorage, websiteEditorService) {
5115		var vm = this;
5116		vm.widget = angular.fromJson(widgets[$scope.widget]);
5117		vm.invalidUrl = false
5118
5119		vm.selectedLanguage = angular.isUndefined($localStorage.currentLanguage)
5120			? __defaultLanguage__
5121			: $localStorage.currentLanguage.culture;
5122
5123
5124		// Component mount
5125		for (var parameter in vm.widget.parameters) {
5126			switch (vm.widget.parameters[parameter].id) {
5127				case 'formUrl':
5128					var url = vm.widget.parameters[parameter].value;
5129					vm.formId = null;
5130
5131					if (url) {
5132						var match = url.match(/^(https?:\/\/)?(localhost:3000|front-office(?:-(dev|unit))?\.kreezee\.com)\/registrations\/embed\/([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})\/?$/);
5133
5134						if (match) {
5135							vm.formId = match[4];
5136
5137							var eventMethod = (window.addEventListener ? 'addEventListener' : 'attachEvent');
5138							var eventer = window[eventMethod];
5139							var messageEvent = (eventMethod == 'attachEvent' ? 'onmessage' : 'message');
5140							eventer(messageEvent, function (e) {
5141								if (e.data.id == vm.formId) {
5142									document.getElementById(vm.formId).height = e.data.height;
5143								}
5144							});
5145
5146							var langQueryString = 'fr';
5147							if (_.startsWith(vm.selectedLanguage, 'fr')) {
5148								langQueryString = 'fr';
5149							}
5150							else if (_.startsWith(vm.selectedLanguage, 'en')) {
5151								langQueryString = 'en';
5152
5153							}
5154							url += '?lang=' + langQueryString;
5155							vm.formUrl = $sce.trustAsResourceUrl(url);
5156							vm.invalidUrl = false;
5157						}
5158						else {
5159							vm.formId = null;
5160							vm.invalidUrl = true;
5161						}
5162					}
5163					break;
5164			}
5165		}
5166
5167
5168		// Listener
5169		var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
5170			websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
5171				.then(function (response) {
5172					for (var parameter in vm.widget.parameters) {
5173						switch (vm.widget.parameters[parameter].id) {
5174							case 'formUrl':
5175								vm.widget.parameters[parameter].value = data.formUrl;
5176								var url = vm.widget.parameters[parameter].value;
5177								vm.formId = null;
5178
5179								if (url) {
5180									var match = url.match(/^(https?:\/\/)?(localhost:3000|front-office(?:-(dev|unit))?\.kreezee\.com)\/registrations\/embed\/([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})\/?$/);
5181
5182									if (match) {
5183										vm.formId = match[4];
5184
5185										var eventMethod = (window.addEventListener ? 'addEventListener' : 'attachEvent');
5186										var eventer = window[eventMethod];
5187										var messageEvent = (eventMethod == 'attachEvent' ? 'onmessage' : 'message');
5188										eventer(messageEvent, function (e) {
5189											if (e.data.id == vm.formId) {
5190												document.getElementById(vm.formId).height = e.data.height;
5191											}
5192										});
5193
5194										var langQueryString = 'fr';
5195										if (_.startsWith(vm.selectedLanguage, 'fr')) {
5196											langQueryString = 'fr';
5197										}
5198										else if (_.startsWith(vm.selectedLanguage, 'en')) {
5199											langQueryString = 'en';
5200
5201										}
5202										url += '?lang=' + langQueryString;
5203										vm.formUrl = $sce.trustAsResourceUrl(url);
5204										vm.invalidUrl = false;
5205									}
5206									else {
5207										vm.formId = null;
5208										vm.invalidUrl = true;
5209									}
5210								}
5211								break;
5212						}
5213					}
5214					widgets[$scope.widget] = angular.toJson(vm.widget);
5215				})
5216				.catch(function (error) {
5217					console.log(error)
5218					bugsnag.notify(error);
5219				});
5220		});
5221
5222		$scope.$on('$destroy', listener);
5223	}
5224})();
5225;
5226(function () {
5227    'use strict';
5228
5229    angular
5230        .module('app.directives')
5231        .directive('frontOfficeForm', frontOfficeForm)
5232
5233    frontOfficeForm.$inject = ['$timeout', '$compile'];
5234
5235    function frontOfficeForm($timeout, $compile) {
5236        return {
5237            restrict: 'E',
5238            scope: {
5239                widget: '='
5240            },
5241            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/front-office-form/front-office-form.tpl.html',
5242            controller: 'FrontOfficeFormController',
5243            controllerAs: 'frontOfficeForm',
5244            link: function (scope, element, attr, controller) {
5245            }
5246        };
5247    }
5248})();;
5249(function () {
5250    'use strict';
5251
5252    angular
5253        .module('app.directives')
5254        .controller('PitcherStarterWidgetController', PitcherStarterWidgetController);
5255
5256    PitcherStarterWidgetController.$inject = ['$scope','$rootScope', 'ScoreboardBaseballService', 'WebsiteEditorService', 'SignalrService'];
5257
5258    function PitcherStarterWidgetController($scope,$rootScope, scoreboardBaseballService, websiteEditorService, signalrService) {
5259        var vm = this;
5260        vm.widget = angular.fromJson(widgets[$scope.widget]);
5261        vm.gameDetails = Object.assign(vm, angular.fromJson(__gameDetails__.replace(/[\n\r]+/g, ' ')));
5262        vm.isScheduled = vm.gameDetails.statusId === 1
5263        vm.pitchers = [];
5264        getLineup();
5265
5266        var signalrConnection = signalrService.getConnection(signalrService.GROUPS.BaseballGameUpdate(vm.gameDetails.id));
5267
5268        signalrConnection.on(signalrService.EVENTS.BaseballScoreboardUpdate, function (response) {
5269            var gameUpdated = angular.fromJson(response);
5270
5271            if (gameUpdated.gameId == vm.gameDetails.id) {
5272                processResponse(gameUpdated.startingLineup)
5273                $scope.$apply();
5274            }
5275        });
5276
5277        // Set view model parameters.
5278        for (var parameter in vm.widget.parameters) {
5279            switch (vm.widget.parameters[parameter].id) {
5280                case 'backgroundColor':
5281                    vm.backgroundColor = vm.widget.parameters[parameter].value
5282                    break;
5283                case 'widgetTransparency':
5284                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
5285                    break;
5286                case 'showWhenScheduled':
5287                    vm.showWhenScheduled = vm.widget.parameters[parameter].value === 'true';
5288                    break;
5289            }
5290        }
5291        isShowed()
5292        
5293        vm.getStyle = function () {
5294            let style = {};
5295            if (!vm.widgetTransparency) {
5296                style['background-color'] = vm.backgroundColor;
5297            }else{
5298                style['background-color'] = 'transparent';
5299                style['box-shadow'] = 'none'
5300                style['border'] = 'none'
5301            }
5302            return style;
5303        }
5304        
5305        vm.getInfoStyle = function () {
5306            let style = {}
5307            if(vm.widgetTransparency){
5308                style['background-color'] = '#FFF'
5309                style['border-radius'] = '8px'
5310                style['margin'] = '4px'
5311            }
5312            return style;
5313        }
5314        
5315        function isShowed(){
5316            if(vm.showWhenScheduled && !vm.isScheduled) {
5317                vm.showWidget = false
5318                return
5319            }
5320            vm.showWidget = true
5321        }
5322
5323        function getLineup() {
5324            scoreboardBaseballService.getLineupBaseball(__solutionId__, vm.gameDetails.id)
5325                .then(function (response) {
5326                    processResponse(response.data);
5327                })
5328                .catch(function (error) { 
5329                    bugsnag.notify(error);
5330                });
5331        }
5332
5333        function processResponse(response) {
5334            vm.pitchers = [];
5335            for (var team of response.teams) {
5336                var player = _.find(team.positions, { playerPosition: "pitcher" });
5337                if (player) {
5338                    var stats = getStatsFromPlayerId(player.id);
5339                    vm.pitchers.push({
5340                        avatar: player.playerAvatar,
5341                        name: player.playerName,
5342                        number: player.playerNumber,
5343                        teamName: team.teamName,
5344                        stats1: getStatValue(stats, 96) + "-" + getStatValue(stats, 97),
5345                        stats2: getStatValue(stats, 100),
5346                        stats3: getStatValue(stats, 91)
5347                    })
5348                } else {
5349                    vm.pitchers.push({
5350                        teamName: team.teamName,
5351                    })
5352                }
5353            }
5354		}
5355
5356        function getStatValue(stats, statId) {
5357            var stat = _.find(stats, { statTypeId: statId });
5358            if (stat) {
5359                return stat.displayValue;
5360            } else {
5361                return "";
5362            }
5363        }
5364
5365        function getStatsFromPlayerId(id) {
5366            for (var team of vm.gameDetails.teamList) {
5367                var player = _.find(team.players, { id: id });
5368                if (player) {
5369                    return player.stats;
5370                }
5371            }
5372        }
5373
5374
5375        // Triggered when parameters are changed.
5376        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
5377            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
5378                .then(function (response) {
5379                    // Save parameters
5380                    for (var parameter in vm.widget.parameters) {
5381                        switch (vm.widget.parameters[parameter].id) {
5382                            case 'backgroundColor':
5383                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
5384                                vm.backgroundColor = data.backgroundColor;
5385                                break;
5386                            case 'widgetTransparency':
5387                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
5388                                vm.widgetTransparency = data.widgetTransparency;
5389                                break;
5390                            case 'showWhenScheduled':
5391                                vm.widget.parameters[parameter].value = data.showWhenScheduled.toString();
5392                                vm.showWhenScheduled = data.showWhenScheduled;
5393                                isShowed()
5394                                break;
5395                        }
5396                    }
5397                    // Update the variable.
5398                    widgets[$scope.widget] = angular.toJson(vm.widget);
5399                })
5400                .catch(function (error) {
5401                    bugsnag.notify(error);
5402                });
5403        });
5404        $scope.$on('$destroy', listener);
5405
5406    }
5407})();
5408;
5409(function () {
5410    'use strict';
5411
5412    angular
5413        .module('app.directives')
5414        .directive('pitcherStarter', pitcherStarter)
5415
5416    pitcherStarter.$inject = [];
5417
5418    function pitcherStarter() {
5419        return {
5420            restrict: 'E',
5421            scope: {
5422                widget: '='
5423            },
5424            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/pitcher-starter/pitcher-starter.tpl.html',
5425            controller: 'PitcherStarterWidgetController',
5426            controllerAs: 'pitcherStarter'
5427        };
5428    }
5429})();;
5430(function () {
5431    'use strict';
5432
5433    angular
5434        .module('app.directives')
5435        .controller('PitcherResultWidgetController', PitcherResultWidgetController);
5436
5437    PitcherResultWidgetController.$inject = ['$scope', '$rootScope', 'WebsiteEditorService'];
5438
5439    function PitcherResultWidgetController($scope, $rootScope, websiteEditorService) {
5440        var vm = this;
5441        vm.widget = angular.fromJson(widgets[$scope.widget]);
5442        vm.gameDetails = Object.assign(vm, angular.fromJson(__gameDetails__.replace(/[\n\r]+/g, ' ')));
5443        vm.isScheduled = vm.gameDetails.statusId === 1
5444        vm.pitchers = [];
5445        
5446        getPitchers();
5447
5448        // Set view model parameters.
5449        for (var parameter in vm.widget.parameters) {
5450            switch (vm.widget.parameters[parameter].id) {
5451                case 'backgroundColor':
5452                    vm.backgroundColor = vm.widget.parameters[parameter].value
5453                    break;
5454                case 'widgetTransparency':
5455                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
5456                    break;
5457            }
5458        }
5459
5460        vm.getStyle = function () {
5461            let style = {};
5462            if (!vm.widgetTransparency) {
5463                style['background-color'] = vm.backgroundColor;
5464            } else {
5465                style['background-color'] = 'transparent';
5466                style['box-shadow'] = 'none'
5467                style['border'] = 'none'
5468            }
5469            return style;
5470        }
5471
5472        vm.getInfoStyle = function () {
5473            let style = {}
5474            if (vm.widgetTransparency) {
5475                style['background-color'] = '#FFF'
5476                style['border-radius'] = '8px'
5477                style['margin'] = '4px'
5478            }
5479            return style;
5480        }
5481
5482        function getPitchers() {
5483            let winPitcher = undefined;
5484            let losePitcher = undefined;
5485            let savePitcher = undefined;
5486            for (const team of vm.teamList) {
5487                for (const player of team.players) {
5488                    const winningPitcherStat = _.find(player.stats, { statTypeId: 96 });
5489                    const losingPitcherStat = _.find(player.stats, { statTypeId: 97 });
5490                    const savePitcherStat = _.find(player.stats, { statTypeId: 98 });
5491                    if (winningPitcherStat && player.id !== 0 && winningPitcherStat.value === 1) {
5492                        winPitcher = player;
5493                        winPitcher.teamName = team.name;
5494                    }
5495                    if (losingPitcherStat && player.id !== 0 && losingPitcherStat.value === 1) {
5496                        losePitcher = player;
5497                        losePitcher.teamName = team.name;
5498                    }
5499                    if (savePitcherStat && player.id !== 0 && savePitcherStat.value === 1) {
5500                        savePitcher = player;
5501                        savePitcher.teamName = team.name;
5502                    }
5503                }
5504            }
5505            if (winPitcher) {
5506                vm.pitchers.push({
5507                    avatar: winPitcher.avatar,
5508                    name: winPitcher.name,
5509                    victory: 1,
5510                    number: winPitcher.number,
5511                    teamName: winPitcher.teamName,
5512                    stats1: getStatValue(winPitcher.stats, 96) + "-" + getStatValue(winPitcher.stats, 97),
5513                    stats2: getStatValue(winPitcher.stats, 100),
5514                    stats3: getStatValue(winPitcher.stats, 91)
5515                });
5516            }
5517            if (savePitcher) {
5518                vm.pitchers.push({
5519                    avatar: savePitcher.avatar,
5520                    name: savePitcher.name,
5521                    victory: 2,
5522                    number: savePitcher.number,
5523                    teamName: savePitcher.teamName,
5524                    stats1: getStatValue(savePitcher.stats, 96) + "-" + getStatValue(savePitcher.stats, 97),
5525                    stats2: getStatValue(savePitcher.stats, 100),
5526                    stats3: getStatValue(savePitcher.stats, 91)
5527                });
5528            }
5529            if (losePitcher) {
5530                vm.pitchers.push({
5531                    avatar: losePitcher.avatar,
5532                    name: losePitcher.name,
5533                    victory: 0,
5534                    number: losePitcher.number,
5535                    teamName: losePitcher.teamName,
5536                    stats1: getStatValue(losePitcher.stats, 96) + "-" + getStatValue(losePitcher.stats, 97),
5537                    stats2: getStatValue(losePitcher.stats, 100),
5538                    stats3: getStatValue(losePitcher.stats, 91)
5539                });
5540            }
5541        }
5542
5543        function getStatValue(stats, statId) {
5544            var stat = _.find(stats, { statTypeId: statId });
5545            if (stat) {
5546                return stat.displayValue;
5547            } else {
5548                return "";
5549            }
5550        }
5551
5552        // Triggered when parameters are changed.
5553        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
5554            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
5555                .then(function () {
5556                    // Save parameters
5557                    for (var parameter in vm.widget.parameters) {
5558                        switch (vm.widget.parameters[parameter].id) {
5559                            case 'backgroundColor':
5560                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
5561                                vm.backgroundColor = data.backgroundColor;
5562                                break;
5563                            case 'widgetTransparency':
5564                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
5565                                vm.widgetTransparency = data.widgetTransparency;
5566                                break;
5567                        }
5568                    }
5569                    // Update the variable.
5570                    widgets[$scope.widget] = angular.toJson(vm.widget);
5571                })
5572                .catch(function (error) {
5573                    bugsnag.notify(error);
5574                });
5575        });
5576        $scope.$on('$destroy', listener);
5577
5578    }
5579})();
5580;
5581(function () {
5582    'use strict';
5583
5584    angular
5585        .module('app.directives')
5586        .directive('pitcherResult', pitcherResult)
5587
5588    pitcherResult.$inject = [];
5589
5590    function pitcherResult() {
5591        return {
5592            restrict: 'E',
5593            scope: {
5594                widget: '='
5595            },
5596            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/pitcher-result/pitcher-result.tpl.html',
5597            controller: 'PitcherResultWidgetController',
5598            controllerAs: 'pitcherResult'
5599        };
5600    }
5601})();;
5602(function () {
5603    'use strict';
5604
5605    angular
5606        .module('app.directives')
5607        .controller('LivegamePlayersWidgetController', LivegamePlayersWidgetController);
5608
5609    LivegamePlayersWidgetController.$inject = ['$scope','$rootScope', 'ScoreboardBaseballService', 'WebsiteEditorService', 'SignalrService'];
5610
5611    function LivegamePlayersWidgetController($scope,$rootScope, scoreboardBaseballService, websiteEditorService, signalrService) {
5612        var vm = this;
5613        vm.widget = angular.fromJson(widgets[$scope.widget]);
5614        vm.gameDetails = Object.assign(vm, angular.fromJson(__gameDetails__.replace(/[\n\r]+/g, ' ')));
5615        vm.lineupLivegame = [];
5616        vm.isMobile = false;
5617        vm.balls = 0;
5618        vm.strikes = 0;
5619        vm.strikeouts = 0;
5620        vm.pitcherPitchCount = { pitch: 0, strike: 0, ball: 0 }
5621
5622        getLineup();
5623
5624        var signalrConnection = signalrService.getConnection(signalrService.GROUPS.BaseballGameUpdate(vm.id));
5625
5626        signalrConnection.on(signalrService.EVENTS.BaseballScoreboardUpdate, function (response) {
5627            var gameUpdated = angular.fromJson(response);
5628
5629            if (gameUpdated.gameId == vm.id) {
5630                processResponse(gameUpdated);
5631                $scope.$apply();
5632            }
5633        });
5634
5635
5636        // Set view model parameters.
5637        for (var parameter in vm.widget.parameters) {
5638            switch (vm.widget.parameters[parameter].id) {
5639                case 'backgroundColor':
5640                    vm.backgroundColor = vm.widget.parameters[parameter].value
5641                    break;
5642                case 'showTeamsLivegame':
5643                    vm.showTeamsLivegame = vm.widget.parameters[parameter].value === 'true';
5644                    break;
5645                case 'roundedCorner':
5646                    vm.roundedCorner = vm.widget.parameters[parameter].value;
5647                    break;
5648                case 'widgetTransparency':
5649                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
5650                    break;
5651                case 'showWhenScheduled':
5652                    vm.showWhenScheduled = vm.widget.parameters[parameter].value === 'true';
5653                    break;
5654            }
5655        }
5656        isShowed()
5657        
5658        vm.getStyle = function () {
5659            let style = {};
5660            if (!vm.widgetTransparency) {
5661                style['background-color'] = vm.backgroundColor;
5662            }else{
5663                style['background-color'] = 'transparent';
5664                style['box-shadow'] = 'none'
5665                style['border'] = 'none'
5666            }
5667            return style;
5668        }
5669
5670        vm.getBarProgress = function () {
5671            let percentage = (vm.period * 2 - (2 - vm.round)) * 100 / (vm.periodAmount * 2);
5672            if (percentage > 95) {
5673                percentage = 95;
5674            }
5675            return percentage;
5676        }
5677        
5678        vm.getInfoStyle = function () {
5679            let style = {}
5680
5681            if(vm.widgetTransparency){
5682                style['background-color'] = '#FFF'
5683                style['border-radius'] = '8px'
5684                style['margin'] = '4px'
5685            }
5686            return style;
5687        }
5688        vm.getRounedCornerStyle = function () {
5689            let style = {}
5690
5691
5692            style['border-radius'] = `${vm.roundedCorner}px`;
5693
5694            if (!vm.widgetTransparency) {
5695                style['background-color'] = vm.backgroundColor;
5696            } else {
5697                style['background-color'] = 'transparent';
5698                style['box-shadow'] = 'none'
5699                style['border'] = 'none'
5700            }
5701            return style;
5702        }
5703
5704
5705        $scope.$watch(function () { return websiteEditorService.isEditMode(); }, function (newVal) {
5706            if (angular.isUndefined(newVal)) return;
5707            isShowed();
5708        }, true);
5709
5710        $scope.$on('score:update-gameDetails', function (event, version) {
5711            getLineup(version);
5712        })
5713        
5714        function isShowed() {
5715            if (vm.gameDetails.statusId != 2 && websiteEditorService.isEditMode() == false) {
5716                vm.showWidget = false
5717            }
5718            else {
5719                vm.showWidget = true
5720            }
5721        }
5722
5723        function getLineup(version) {
5724            scoreboardBaseballService.getScoreboardBaseball(__solutionId__, vm.gameDetails.id, version).then(function (response) {
5725                processResponse(response.data);
5726            })
5727            .catch(function (error) {
5728                bugsnag.notify(error);
5729            });
5730        }
5731
5732        function processResponse(response) {
5733            vm.round = response.field.pos;
5734            vm.period = response.field.period;
5735            vm.periodAmount = response.score.periods.length;
5736            vm.out = response.field.out;
5737            vm.row = response.field.row;
5738            vm.lineupLivegame = [];
5739            let pitchers = response.sequence.pitchers;
5740            let hitter = response.sequence.hitter;
5741
5742            if (hitter) {
5743                var stats = getStatsFromPlayerId(hitter.id);
5744                vm.lineupLivegame.push({
5745                    position: "hitter",
5746                    avatar: hitter.playerAvatar,
5747                    name: hitter.playerName,
5748                    number: hitter.playerNumber,
5749                    teamAvatar: response.lineup.teams.find(x => x.teamId === hitter.teamId).teamAvatar,
5750                    teamResult: response.score.results.find(x => x.teamId === hitter.teamId).teamResult,
5751                    teamName: response.lineup.teams.find(x => x.teamId === hitter.teamId).teamName,
5752                    stats1: getStatValue(stats, 96) + "-" + getStatValue(stats, 97),
5753                    stats2: getStatValue(stats, 100),
5754                    stats3: getStatValue(stats, 91)
5755                })
5756            }
5757            else if (!hitter) {
5758                vm.lineupLivegame.push({
5759                    position: "hitter",
5760                    teamAvatar: response.lineup.teams.find(x => x.teamId === hitter.teamId).teamAvatar,
5761                    teamName: response.lineup.teams.find(x => x.teamId === hitter.teamId).teamName,
5762                })
5763            }
5764            if (pitchers && pitchers.length > 0) {
5765                let pitcher = pitchers[pitchers.length - 1];
5766                let stats = getStatsFromPlayerId(pitcher.id);
5767                vm.lineupLivegame.push({
5768                    position: "pitcher",
5769                    avatar: pitcher.playerAvatar,
5770                    name: pitcher.playerName,
5771                    number: pitcher.playerNumber,
5772                    teamAvatar: response.lineup.teams.find(x => x.teamId === pitcher.teamId).teamAvatar,
5773                    teamResult: response.score.results.find(x => x.teamId === pitcher.teamId).teamResult,
5774                    teamName: response.lineup.teams.find(x => x.teamId === pitcher.teamId).teamName,
5775                    stats1: getStatValue(stats, 96) + "-" + getStatValue(stats, 97),
5776                    stats2: getStatValue(stats, 100),
5777                    stats3: getStatValue(stats, 91)
5778                })
5779
5780                vm.pitcherPitchCount = response.sequence.pitchers[response.sequence.pitchers.length - 1].pitchGame || { pitch: 0, strike: 0, ball: 0 };
5781            }
5782            else {
5783                vm.pitcherPitchCount = { pitch: 0, strike: 0, ball: 0 };				
5784            }
5785
5786            vm.balls = 0;
5787            vm.strikes = 0;
5788
5789            (response.sequence.pitchs || []).forEach(function (pitch) {
5790                if (pitch.category == 'ball') {
5791                    vm.balls++;
5792                }
5793                else if (pitch.category == 'strike') {
5794                    if (pitch.type != 'foulball' || vm.strikes != 2) {
5795                        vm.strikes++;
5796                    }
5797                }
5798            })
5799        }
5800
5801        function getStatValue(stats, statId) {
5802            var stat = _.find(stats, { statTypeId: statId });
5803            if (stat) {
5804                return stat.displayValue;
5805            } else {
5806                return "";
5807            }
5808        }
5809
5810        function getStatsFromPlayerId(id) {
5811            for (var team of vm.gameDetails.teamList) {
5812                var player = _.find(team.players, { id: id });
5813                if (player) {
5814                    return player.stats;
5815                }
5816            }
5817        }
5818
5819
5820        // Triggered when parameters are changed.
5821        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
5822            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
5823                .then(function (response) {
5824                    // Save parameters
5825                    for (var parameter in vm.widget.parameters) {
5826                        switch (vm.widget.parameters[parameter].id) {
5827                            case 'backgroundColor':
5828                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
5829                                vm.backgroundColor = data.backgroundColor;
5830                                break;
5831                            case 'showTeamsLivegame':
5832                                vm.widget.parameters[parameter].value = data.showTeamsLivegame.toString();
5833                                vm.showTeamsLivegame = data.showTeamsLivegame;
5834                                break;
5835                            case 'roundedCorner':
5836                                vm.widget.parameters[parameter].value = data.roundedCorner.toString();
5837                                vm.roundedCorner = data.roundedCorner;
5838                                break;
5839                            case 'widgetTransparency':
5840                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
5841                                vm.widgetTransparency = data.widgetTransparency;
5842                                break;
5843                            case 'showWhenScheduled':
5844                                vm.widget.parameters[parameter].value = data.showWhenScheduled.toString();
5845                                vm.showWhenScheduled = data.showWhenScheduled;
5846                                isShowed()
5847                                break;
5848                        }
5849                    }
5850                    // Update the variable.
5851                    widgets[$scope.widget] = angular.toJson(vm.widget);
5852                })
5853                .catch(function (error) {
5854                    bugsnag.notify(error);
5855                });
5856        });
5857        $scope.$on('$destroy', listener);
5858
5859    }
5860})();
5861;
5862(function () {
5863    'use strict';
5864
5865    angular
5866        .module('app.directives')
5867        .directive('livegamePlayers', livegamePlayers)
5868
5869    livegamePlayers.$inject = [];
5870
5871    function livegamePlayers() {
5872        return {
5873            restrict: 'E',
5874            scope: {
5875                widget: '='
5876            },
5877            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/result/livegame-players/livegame-players.tpl.html',
5878            controller: 'LivegamePlayersWidgetController',
5879            controllerAs: 'livegamePlayers',
5880            link: function (scope, element, attribut, controller) {
5881                scope.$watch(function () {
5882                    if (element.find('.livegame-players')[0]) {
5883                        return element.find('.livegame-players')[0].clientWidth
5884                    }
5885                }, function (container) {
5886                        if (container <= 910) {
5887                        controller.isMobile = true;
5888                    }
5889                    else if (container > 910) {
5890                        controller.isMobile = false;
5891                    }
5892                });
5893            }
5894        };
5895    }
5896})();;
5897(function () {
5898    'use strict';
5899
5900    angular
5901        .module('app.directives')
5902        .controller('ScoreboardDiamondController', ScoreboardDiamondController);
5903
5904    ScoreboardDiamondController.$inject = ['$scope'];
5905
5906    function ScoreboardDiamondController($scope) {
5907        var vm = this;
5908        vm.selectedPlayer = null;
5909        vm.selectedPlayerId = null;
5910        vm.gameEnd = $scope.gameEnd;
5911        vm.gameScheduled = $scope.gameScheduled;
5912        
5913        $scope.$watch(function () { return $scope.selectedPlayerId; }, function (selectedPlayerId) {               
5914            vm.selectedPlayerId = selectedPlayerId;
5915        })
5916
5917        $scope.$watch('gameEnd', function (gameEnd) { vm.gameEnd = gameEnd });
5918        $scope.$watch('gameScheduled', function (gameScheduled) { vm.gameScheduled = gameScheduled });
5919
5920        vm.onClick = function (player) {            
5921            if ($scope.onClick) {
5922                $scope.onClick(player)
5923            }
5924        }
5925
5926        vm.onSelect = function (player) {            
5927            if (player.playerPosition != 'batter') {
5928                vm.selectedPlayer = player;
5929                
5930                if ($scope.onSelect) {
5931                    $scope.onSelect(player)
5932                }
5933            }
5934            
5935            vm.onClick(player)
5936        }
5937    }
5938})();
5939;
5940(function () {
5941    'use strict';
5942
5943    angular
5944        .module('app.directives')
5945        .directive('scoreboardDiamond', scoreboardDiamond)
5946
5947    scoreboardDiamond.$inject = [];
5948
5949    function scoreboardDiamond() {
5950        return {
5951            restrict: 'E',
5952            scope: {
5953                offense: '=',
5954                defense: '=',
5955                onSelect: '=',
5956                selectedPlayer: '=',
5957                selectedPlayerId: '=',
5958                onClick: '=',
5959                gameEnd: '=',
5960                gameScheduled: '=',
5961            },
5962            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/baseball/diamond/diamond.tpl.html',
5963            controller: 'ScoreboardDiamondController',
5964            controllerAs: 'scoreboardDiamond',
5965        };
5966    }
5967})();;
5968(function () {
5969    'use strict';
5970
5971    angular
5972        .module('app.directives')
5973        .controller('TabStatsController', TabStatsController);
5974
5975    TabStatsController.$inject = ['$q', '$rootScope', '$scope', '$localStorage', '$translate', 'ScoreboardBaseballService'];
5976
5977    function TabStatsController($q, $rootScope, $scope, $localStorage, $translate, scoreboardBaseballService) {
5978        var vm = this;
5979        var updating = false;
5980
5981        vm.gameDetails = angular.fromJson(__gameDetails__.replace(/[\n\r]+/g, ' '));
5982        vm.score = undefined;
5983        vm.field = undefined;
5984        vm.lineup = undefined;
5985        vm.sequence = undefined;
5986        vm.selectedPlayer = undefined;
5987        vm.selectedPlayerId = undefined;
5988        vm.periods = [];
5989        vm.ongoingRequestCount = 0;
5990        vm.startedGame = false;
5991        vm.shouldAllowSelectRunner = true;
5992        vm.unprocessableEntity = false
5993        vm.unkownError = false
5994        vm.gameStatus = vm.gameDetails.statusId;
5995        vm.disabledPitchCount = false;
5996        vm.showEditPitchCount = false;
5997        vm.resetKeepPitchCount = true
5998        vm.loadingSummary = false;
5999        vm.inningSummary = {
6000            team: { avatar: '' },
6001            stats: { points: 0, hits: 0, errors: 0, leftOnBases: 0 }
6002        }
6003         
6004
6005        vm.onUpdateEvent = function (sequence) {
6006            scoreboardBaseballService.putSequence(__solutionId__, vm.gameDetails.id, sequence).then(function () {                
6007                getScoreboardBaseball();
6008            });
6009        }
6010
6011        vm.skipInning = function () {
6012            // TODO OPEN POPUP HERE
6013            var event = { type: 'skipinning', seq: vm.sequence.events.length + 1, category: 'maxpoint' };
6014            vm.sequence.events.push(event);
6015            vm.sequence.status = "closed";  
6016            vm.onAction(vm.sequence);
6017        }
6018
6019        vm.showInningSummaryPopup = function (period, pos) {
6020            vm.showInningSummary();
6021            vm.loadingSummary = true;
6022            scoreboardBaseballService.getScoreboardBaseballInningSummary(__solutionId__, vm.gameDetails.id, period, pos).then(function (result) {
6023                vm.inningSummary.stats.hits = result.data.hits;
6024                vm.inningSummary.stats.errors = result.data.errors;
6025                vm.inningSummary.stats.leftOnBases = result.data.leftOnBases;
6026                vm.inningSummary.stats.points = result.data.points;                
6027                vm.inningSummary.team.avatar = result.data.teamId == vm.gameDetails.localTeamId ? vm.gameDetails.localTeamAvatar : vm.gameDetails.visitorTeamAvatar;
6028                vm.loadingSummary = false;
6029            });
6030		}
6031
6032        getScoreboardBaseball();
6033        function getScoreboardBaseball() {
6034            vm.ongoingRequestCount += 1
6035
6036            var scoreboardPromise = scoreboardBaseballService.getScoreboardBaseball(__solutionId__, vm.gameDetails.id)
6037                .then(function (response) {
6038                    if (response && response.data.field != null) {
6039                        if (vm.field) {
6040                            var newField = response.data.field;
6041
6042                            var showSummary = newField.period > vm.field.period || (vm.field.period == newField.period && newField.pos > vm.field.pos) || (response.data.sequence.status == 'pitcherrequested' && vm.sequence.status != "gamecompleted");
6043                            if (showSummary) {
6044                                vm.showInningSummaryPopup(vm.field.period, vm.field.pos)
6045                            }
6046						}
6047
6048                        vm.score = response.data.score;
6049                        vm.field = response.data.field;
6050                        vm.lineup = response.data.lineup;
6051                        vm.sequence = response.data.sequence;
6052                        vm.offenseTeam = vm.getOffenseTeam();
6053                        vm.hasDesignatedHitter = _.find(vm.offenseTeam.positions, { playerPosition: 'designatedhitter' }) != undefined;
6054                        vm.startedGame = true;
6055                    }
6056
6057                    if (vm.sequence) {
6058                        var filteredEvent = _.filter(vm.sequence.events || [], function (event) { return event.group == 'onbases' || event.group == 'out' })
6059                        if (!vm.sequence.pitchers || vm.sequence.pitchers.length == 0 || (vm.sequence.status != 'active' && vm.sequence.status != 'new') || filteredEvent.length > 0) {
6060                            vm.disabledPitchCount = true;
6061                        }
6062                        else {
6063                            vm.disabledPitchCount = false;
6064                        }
6065
6066                    }
6067
6068                    if (vm.lineup) {
6069                        _.forEach(vm.lineup.teams, function (team) {
6070
6071                            let teamArr = _.filter(team.positions, function (player) { return player.playerPosition != 'retired' })
6072
6073                            vm.rowGroup = _.groupBy(teamArr, function (pos) {
6074                                return pos.row
6075                            })
6076                            vm.posGroup = _.groupBy(teamArr, function (pos) {
6077                                return pos.pos
6078                            })
6079
6080                            _.forEach(vm.rowGroup, function (row) {
6081                                if (row.length > 1) {
6082                                    let pitcherAndDesignatedHitter = 0;
6083                                    _.forEach(row, function (rowPlayer) {
6084                                        if (row.length === 2 && row[0].playerPosition === "pitcher" && row[1].playerPosition === "designatedhitter" || row.length === 2 && row[1].playerPosition === "pitcher" && row[0].playerPosition === "designatedhitter") {
6085                                            return;
6086                                        }
6087                                        let player = _.find(team.positions, function (position) {
6088                                            return position == rowPlayer
6089                                        })
6090                                        if (pitcherAndDesignatedHitter < 2) {
6091                                            Object.assign(player, { bg: 'conflicted', conflictRow: true })
6092                                        }
6093                                        pitcherAndDesignatedHitter = 0;
6094                                    })
6095                                }
6096                            })
6097                            _.forEach(vm.posGroup, function (pos) {
6098                                if (pos.length > 1) {
6099                                    _.forEach(pos, function (posPlayer) {
6100                                        let player = _.find(team.positions, function (position) {
6101                                            return position == posPlayer
6102                                        })
6103                                        Object.assign(player, { bg: 'conflicted', conflictPos: true })
6104                                    })
6105                                }
6106                            })
6107                        })
6108                    }
6109
6110                    var statusId;
6111
6112                    if (response && response.data.score) {
6113                        vm.startedGame = true;
6114
6115                        if (response.data.score.end) {
6116                            statusId = 3;
6117                        }
6118                        else {
6119                            statusId = 2;
6120                        }
6121
6122                    }
6123                    else {
6124                        vm.startedGame = false;
6125                        statusId = 1;
6126                    }
6127
6128                    if (statusId != vm.gameStatus) {
6129                        vm.gameStatus = statusId;
6130                        $scope.$emit('onGameStatusChange', statusId);
6131                    }
6132
6133                    updating = false;
6134                })
6135                .catch(function (error) {
6136                    bugsnag.notify(error);
6137                })
6138                .finally(function () {
6139                    vm.ongoingRequestCount--;
6140                });
6141
6142            var inningPromise = scoreboardBaseballService.getScoreboardBaseballStatsHistory(__solutionId__, vm.gameDetails.id)
6143                .then(function (response) {
6144                    vm.periods = response.data;
6145                })
6146                .catch(function (error) {
6147                    bugsnag.notify(error);
6148                });
6149        }
6150
6151
6152
6153        vm.getOffenseTeam = function () {            
6154            var defenseTeamId = vm.field.defense[0].teamId;            
6155            var offenseTeam = _.find(vm.lineup.teams, function (team) { return team.teamId != defenseTeamId });
6156
6157            return offenseTeam;
6158        }
6159
6160        vm.startGame = function () {
6161            scoreboardBaseballService.startGame(__solutionId__, vm.gameDetails.id).then(function (response) {
6162                vm.score = response.data.score;
6163                vm.field = response.data.field;
6164                vm.lineup = response.data.lineup;
6165                vm.sequence = response.data.sequence;
6166                vm.startedGame = true;
6167
6168                vm.gameStatus = 2;
6169                $scope.$emit(`onGameStatusChange`, 2);
6170            }).catch(function (e) {
6171                if (e.status === 422) {
6172                    vm.unprocessableEntity = true
6173                } else {
6174                    vm.unkownError = true
6175                }
6176                $('.toast').toast('show')
6177            })
6178        }
6179
6180        vm.onAction = function (sequence) {
6181            updating = true;
6182            vm.selectedPlayer = undefined;
6183            vm.selectedPlayerId = undefined;
6184            vm.ongoingRequestCount += 1;
6185
6186            return scoreboardBaseballService.updateSequence(__solutionId__, sequence).then(function (result) {
6187                getScoreboardBaseball();
6188                vm.ongoingRequestCount--;
6189            }).catch(function (result) {
6190                var sequence = result.data;
6191                if (sequence.status = 'error') {
6192                    getScoreboardBaseball();
6193                    vm.ongoingRequestCount--;
6194                    vm.showError();
6195                }
6196            })
6197        }
6198
6199        vm.showCloseGame = function () {
6200            vm.showConfirmClose();
6201        }
6202
6203        vm.openEditPitchCount = function () {
6204            if (!vm.disabledPitchCount) {
6205                vm.showEditPitchCount = true;
6206            }
6207        }
6208
6209        vm.onCloseGame = function () {
6210            vm.ongoingRequestCount += 1;
6211            scoreboardBaseballService.closeGame(__solutionId__, vm.gameDetails.id).then(function () {
6212                getScoreboardBaseball();
6213            }).finally(function (response) {
6214                vm.ongoingRequestCount--;
6215            })
6216        }
6217
6218        vm.onPitch = function (pitch, category) {
6219            vm.ongoingRequestCount += 1;
6220
6221            scoreboardBaseballService.addPitch(__solutionId__, vm.gameDetails.id, vm.sequence.id, pitch).then(function (result) {                
6222                if (category) {
6223                    var event = {};
6224                    var generatedEvents = [];
6225                    var seq = vm.sequence.events.length + 1;
6226                    var updateSequence = true;
6227
6228                    if (pitch.category == "ball") {
6229                        event = { type: 'baseonball', seq: seq++, category: category };
6230
6231                        var generatedEvents = [];
6232                        var baseNames = { 3: "b1", 4: "b2", 5: "b3", 6: "b4" };
6233
6234
6235                        var thirdBasePlayer = _.findIndex(vm.field.offense, { playerPosition: 'thirdbase' }) != -1;
6236                        var askEarnedRun = false;
6237                        if (thirdBasePlayer) {
6238                            var playerCount = 0;
6239                            for (var i = 4; i > 2; i--) {
6240                                if (_.find(vm.field.offense, { pos: i })) {
6241                                    playerCount++;
6242                                }
6243                            }
6244
6245                            askEarnedRun = playerCount == 2;
6246                        }
6247
6248                        if (!askEarnedRun) {
6249                            vm.field.offense.forEach(function (offensePlayer) {
6250                                if (baseNames[offensePlayer.pos]) {
6251                                    var shouldMove = offensePlayer.pos == 3;
6252
6253                                    if (offensePlayer.pos > 3) {
6254                                        var playerCount = 0;
6255                                        for (var i = offensePlayer.pos - 1; i > 2; i--) {
6256                                            if (_.find(vm.field.offense, { pos: i })) {
6257                                                playerCount++;
6258                                            }
6259                                        }
6260
6261                                        shouldMove = playerCount == offensePlayer.pos - 3;
6262                                    }
6263
6264                                    var runnerEvent = {
6265                                        seq: seq++,
6266                                        type: shouldMove ? "advance" : "none",
6267                                        category: null,
6268                                        playersproperties: [{
6269                                            seq: 1,
6270                                            name: baseNames[offensePlayer.pos + (shouldMove * 1)],
6271                                            id: offensePlayer.id,
6272                                            pos: offensePlayer.pos,
6273                                            row: offensePlayer.row,
6274                                            number: offensePlayer.playerNumber,
6275                                            teamid: offensePlayer.teamId
6276                                        }]
6277                                    }
6278
6279                                    generatedEvents.push(runnerEvent);
6280                                }
6281                            })
6282                        }
6283
6284                    }
6285                    else if (pitch.category == "strike") {
6286                        event = { type: 'strikeout', group: 'out', seq: seq++, category: category }
6287
6288                        var property = {};
6289                        var player = _.find(vm.field.defense, { pos: 2 });
6290
6291                        property.seq = 1;
6292                        property.name = 'receiver';
6293                        property.number = player.number;
6294                        property.id = player.id;
6295                        property.pos = player.pos;
6296                        property.row = player.row;
6297                        property.teamId = player.teamId;
6298
6299                        event.playersproperties = [property];
6300
6301                        var baseNames = { 3: "b1", 4: "b2", 5: "b3" };
6302                        vm.field.offense.forEach(function (offensePlayer) {
6303                            if (baseNames[offensePlayer.pos]) {
6304                                var runnerEvent = {
6305                                    seq: seq++,
6306                                    type: "none",
6307                                    category: null,
6308                                    playersproperties: [{
6309                                        seq: 1,
6310                                        name: baseNames[offensePlayer.pos],
6311                                        id: offensePlayer.id,
6312                                        pos: offensePlayer.pos,
6313                                        row: offensePlayer.row,
6314                                        number: offensePlayer.playerNumber,
6315                                        teamid: offensePlayer.teamId
6316                                    }
6317                                    ]
6318
6319                                }
6320
6321                                generatedEvents.push(runnerEvent);
6322                            }
6323                        });
6324                    }
6325
6326                    vm.sequence.events.push(event);
6327                    vm.sequence.events = vm.sequence.events.concat(generatedEvents);
6328                    vm.sequence.status = result.data.status;
6329                    vm.sequence.pitchs = result.data.pitchs;
6330                    vm.onAction(vm.sequence);
6331                    
6332                }
6333                else {
6334                    getScoreboardBaseball();
6335                }
6336
6337            }).finally(function (response) {
6338                vm.ongoingRequestCount--;
6339            })
6340        }
6341
6342        vm.onReset = function () {
6343            vm.ongoingRequestCount += 1;
6344
6345            scoreboardBaseballService.resetGame(__solutionId__, vm.gameDetails.id, vm.resetKeepPitchCount).then(function (response) {
6346                getScoreboardBaseball();
6347                vm.ongoingRequestCount--;
6348                vm.hideConfirm();
6349            });
6350        }
6351
6352        vm.hideConfirmReset = function () {
6353            vm.hideConfirm();
6354        }
6355
6356        vm.switchDesignatedHitter = function (sequence) {
6357            vm.ongoingRequestCount += 1;
6358            scoreboardBaseballService.switchDesignatedHitter(__solutionId__, sequence).then(function () {
6359                getScoreboardBaseball();
6360                vm.ongoingRequestCount--;
6361            })
6362        }
6363
6364        vm.onSelect = function (runner, type) {
6365            if (vm.shouldAllowSelectRunner) {
6366                vm.selectedPlayer = runner;
6367                vm.selectedPlayerId = runner.id;
6368            }
6369        }
6370
6371        vm.setSelectedPlayerId = function (playerId) {
6372            vm.selectedPlayerId = playerId;
6373            vm.selectedPlayer = undefined;
6374        }
6375
6376        vm.onSubstitutePlayer = function (playerOut, playerIn) {
6377            var substitution = {};
6378            substitution.in = playerIn;
6379            substitution.in.row = playerOut.row;
6380            substitution.out = playerOut;
6381            substitution.period = vm.sequence.period;
6382            substitution.pos = vm.sequence.pos;
6383            substitution.seq = vm.sequence.seq;
6384
6385            vm.ongoingRequestCount += 1;
6386            scoreboardBaseballService.substitutePlayer(__solutionId__, vm.gameDetails.id, substitution).then(function () {
6387                getScoreboardBaseball();
6388                vm.ongoingRequestCount--;
6389            })
6390        }
6391
6392        vm.onRollback = function () {            
6393            scoreboardBaseballService.rollbackSequence(__solutionId__, vm.sequence).then(function () {
6394                getScoreboardBaseball();
6395            })
6396        }
6397    }
6398})();
6399;
6400(function () {
6401    'use strict';
6402
6403    angular
6404        .module('app.directives')
6405        .directive('tabStats', tabStats)
6406
6407    tabStats.$inject = ['ModalService'];
6408
6409    function tabStats(modalService) {
6410        return {
6411            restrict: 'E',
6412            scope: {                
6413            },
6414            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-stats/tab-stats.tpl.html',
6415            controller: 'TabStatsController',
6416            controllerAs: 'tabStats',
6417            link: function (scope, element, attribute, controller) {
6418                var resetModal = modalService.init($('#confirm-reset-game', element));                
6419                var inningSummaryModal = modalService.init($('#inning-summary', element));
6420                var confirmCloseModal = modalService.init($("#confirm-close-game", element));                
6421
6422                controller.showError = function () {
6423                    $('.toast.error', element).toast('show');
6424                }
6425
6426                controller.hideConfirm = function () {
6427                    resetModal.hide();                    
6428                }
6429
6430                controller.showConfirm = function () {                    
6431                    controller.resetKeepPitchCount = true;
6432                    resetModal.show();                 
6433                }
6434
6435                $(document).on('click', '#tabStats-closegame', function () {
6436                    scope.$apply(controller.hideConfirmClose());
6437                });
6438
6439                element.on('$destroy', function () {
6440                    $(document).off('click');
6441                })
6442
6443                controller.showConfirmClose = confirmCloseModal.show;
6444                controller.hideConfirmClose = confirmCloseModal.hide;
6445
6446                controller.showInningSummary = inningSummaryModal.show;
6447                controller.hideInningSummary = inningSummaryModal.hide;
6448            }
6449        };
6450    }
6451})();;
6452(function () {
6453    'use strict';
6454
6455    angular
6456        .module('app.directives')
6457        .value('scoreboardBaseballSteps', {
6458            out: {
6459                title: 'directives.scoreboard.baseball.tabStats.out',
6460                type: 'type',
6461                template: 'choice',
6462                onConfirm: function (selectedStep) {
6463                    if (mode_self.selectedPlayerProperties() != null) {
6464                        playerToData(selectedStep.type, mode_self.selectedPlayerProperties());
6465                    }
6466
6467                    mode_self.createEvent();
6468                },
6469                options: [
6470                    {
6471                        id: 'outhitter',
6472                        name: 'directives.scoreboard.baseball.tabStats.outsTypes.outhitter.name',
6473                        step: {
6474                            type: 'category',
6475                            template: 'choice',
6476                            options: [
6477                                {
6478                                    id: 'ground',
6479                                    name: 'directives.scoreboard.baseball.tabStats.outsSubtypes.ground.name',
6480                                    other: [function (player, diamond) {
6481                                        var other = { type: 'playersproperties' };
6482
6483                                        other.name = 'b1';
6484                                        other.player = _.find(diamond.offense, { playerPosition: 'batter' })
6485
6486                                        return other;
6487                                    }],
6488                                    step: {
6489                                        type: 'playersproperties',
6490                                        template: 'properties',
6491                                        options: [],
6492                                        properties: [
6493                                            {
6494                                                name: 'assist',
6495                                                label: 'directives.scoreboard.baseball.tabStats.assists',
6496                                                multiple: {
6497                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
6498                                                    getName: function (number) {
6499                                                        return `assist${number + 1}`;
6500                                                    },
6501                                                    max: 9
6502                                                },
6503                                                required: false
6504                                            },
6505                                            { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
6506                                        ],
6507                                    }
6508                                },
6509                                {
6510                                    id: 'fly',
6511                                    name: 'directives.scoreboard.baseball.tabStats.outsSubtypes.fly.name',
6512                                    autoGenerateRunners: function (outline, seq) {
6513                                        var events = [];
6514                                        var baseNames = { 3: "b1", 4: "b2", 5: "b3" };
6515                                        outline.forEach(function (outlineStep) {                                            
6516                                            if (outlineStep.id == "runner") {
6517                                                var runnerEvent = {
6518                                                    seq: seq++,
6519                                                    type: "none",
6520                                                    category: null,
6521                                                    playersproperties: [{
6522                                                        seq: 1,
6523                                                        name: baseNames[outlineStep.data.pos],
6524                                                        id: outlineStep.data.id,
6525                                                        pos: outlineStep.data.pos,
6526                                                        row: outlineStep.data.row,
6527                                                        number: outlineStep.data.playerNumber,
6528                                                        teamid: outlineStep.data.teamId
6529                                                    }
6530                                                    ]
6531
6532                                                }
6533                                                events.push(runnerEvent);
6534                                            }
6535                                        })
6536
6537                                        return events;
6538                                    },
6539                                    step: {
6540                                        type: 'playersproperties',
6541                                        template: 'properties',
6542                                        options: [],
6543                                        properties: [
6544                                            {
6545                                                name: 'assist',
6546                                                label: 'directives.scoreboard.baseball.tabStats.assists',
6547                                                multiple: {
6548                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
6549                                                    getName: function (number) {
6550                                                        return `assist${number + 1}`;
6551                                                    },
6552                                                    max: 9
6553                                                },
6554                                                required: false
6555                                            },
6556                                            { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
6557                                        ]
6558                                    }
6559                                },
6560                                {
6561                                    id: 'linedrive',
6562                                    name: 'directives.scoreboard.baseball.tabStats.outsSubtypes.linedrive.name',
6563                                    autoGenerateRunners: function (outline, seq) {
6564                                        var events = [];
6565                                        var baseNames = { 3: "b1", 4: "b2", 5: "b3" };
6566                                        outline.forEach(function (outlineStep) {                                            
6567                                            if (outlineStep.id == "runner") {
6568                                                var runnerEvent = {
6569                                                    seq: seq++,
6570                                                    type: "none",
6571                                                    category: null,
6572                                                    playersproperties: [{
6573                                                        seq: 1,
6574                                                        name: baseNames[outlineStep.data.pos],
6575                                                        id: outlineStep.data.id,
6576                                                        pos: outlineStep.data.pos,
6577                                                        row: outlineStep.data.row,
6578                                                        number: outlineStep.data.playerNumber,
6579                                                        teamid: outlineStep.data.teamId
6580                                                    }
6581                                                    ]
6582
6583                                                }
6584                                                events.push(runnerEvent);
6585                                            }
6586                                        })
6587
6588                                        return events;
6589                                    },
6590                                    step: {
6591                                        type: 'playersproperties',
6592                                        template: 'properties',
6593                                        options: [],
6594                                        properties: [
6595                                            { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
6596                                        ]
6597                                    }
6598                                },
6599                                {
6600                                    id: 'interference',
6601                                    name: 'directives.scoreboard.baseball.tabStats.outsSubtypes.interference.name'
6602                                },
6603                            ]
6604                        }
6605                    },
6606                    {
6607                        id: 'sacrifice',
6608                        name: 'directives.scoreboard.baseball.tabStats.outsTypes.sacrifice.name',
6609                        visible: function (diamond) {
6610                            var hasRunner = false;
6611                            var runner_pos = [5, 4, 3];
6612
6613                            for (var i = 0; i < diamond.offense.length && !hasRunner; i++) {
6614                                hasRunner = _.indexOf(runner_pos, diamond.offense[i].pos) != -1;
6615                            }
6616
6617                            return hasRunner;
6618                        },
6619                        step: {
6620                            type: 'category',
6621                            template: 'choice',
6622                            options: [
6623                                {
6624                                    id: 'fly',
6625                                    name: 'directives.scoreboard.baseball.tabStats.outsSubtypes.fly.name',
6626                                    step: {
6627                                        type: 'playersproperties',
6628                                        template: 'properties',
6629                                        options: [],
6630                                        properties: [
6631                                            { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
6632                                        ]
6633                                    }
6634                                },
6635                                {
6636                                    id: 'bunt',
6637                                    name: 'directives.scoreboard.baseball.tabStats.outsSubtypes.bunt.name',
6638                                    step: {
6639                                        type: 'playersproperties',
6640                                        template: 'properties',
6641                                        options: [],
6642                                        properties: [
6643                                            {
6644                                                name: 'assist',
6645                                                label: 'directives.scoreboard.baseball.tabStats.assists',
6646                                                multiple: {
6647                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
6648                                                    getName: function (number) {
6649                                                        return `assist${number + 1}`;
6650                                                    },
6651                                                    max: 9
6652                                                },
6653                                                required: false
6654                                            },
6655                                            { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
6656                                        ]
6657                                    }
6658                                }
6659                            ]
6660                        }
6661                    },
6662                    {
6663                        id: 'strikeout',
6664                        name: 'directives.scoreboard.baseball.tabStats.outsTypes.strikeout.name',
6665                        autoGenerateRunners: function (outline, seq) {
6666                            var events = [];
6667                            var baseNames = { 3: "b1", 4: "b2", 5: "b3" };
6668                            outline.forEach(function (outlineStep) {                                
6669                                if (outlineStep.id == "runner") {
6670                                    var runnerEvent = {
6671                                        seq: seq++,
6672                                        type: "none",
6673                                        category: null,
6674                                        playersproperties: [{
6675                                            seq: 1,
6676                                            name: baseNames[outlineStep.data.pos],
6677                                            id: outlineStep.data.id,
6678                                            pos: outlineStep.data.pos,
6679                                            row: outlineStep.data.row,
6680                                            number: outlineStep.data.playerNumber,
6681                                            teamid: outlineStep.data.teamId
6682                                        }
6683                                        ]
6684
6685                                    }
6686                                    events.push(runnerEvent);
6687                                }
6688                            })
6689
6690                            return events;
6691                        },
6692                        step: {
6693                            type: 'category',
6694                            template: 'choice',
6695                            options: [
6696                                {
6697                                    id: 'swing',
6698                                    name: 'directives.scoreboard.baseball.tabStats.outsSubtypes.swing.name',
6699                                    other: [function (player, diamond) {
6700                                        var other = { type: 'playersproperties' };
6701
6702                                        other.name = 'receiver';
6703                                        other.player = _.find(diamond.defense, { pos: 2 });
6704
6705                                        return other;
6706
6707                                    }],
6708                                },
6709                                {
6710                                    id: 'decision',
6711                                    name: 'directives.scoreboard.baseball.tabStats.outsSubtypes.decision.name',
6712                                    other: [function (player, diamond) {
6713                                        var other = { type: 'playersproperties' };
6714
6715                                        other.name = 'receiver';
6716                                        other.player = _.find(diamond.defense, { pos: 2 });
6717
6718                                        return other;
6719
6720                                    }],
6721                                },
6722                                {
6723                                    id: 'uncaughtthirdstrike',
6724                                    name: 'directives.scoreboard.baseball.tabStats.outsSubtypes.uncaughtthirdstrike.name',
6725                                    step: {
6726                                        type: 'playersproperties',
6727                                        template: 'choice',
6728                                        options: [
6729                                            {
6730                                                id: 'out',
6731                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.runnerout.name',
6732                                                step: {
6733                                                    type: 'playersproperties',
6734                                                    template: 'properties',
6735                                                    options: [],
6736                                                    properties: [
6737                                                        {
6738                                                            name: 'assist',
6739                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
6740                                                            multiple: {
6741                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
6742                                                                getName: function (number) {
6743                                                                    return `assist${number + 1}`;
6744                                                                },
6745                                                                max: 9
6746                                                            },
6747                                                            required: false
6748                                                        },
6749                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
6750                                                    ]
6751                                                }
6752                                            },
6753                                            {
6754                                                id: 'advance',
6755                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advance.name',
6756                                                step: {
6757                                                    template: 'choice',
6758                                                    options: [
6759                                                        {
6760                                                            id: 'badpitch',
6761                                                            name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.badpitch.name',
6762                                                            other: [function (player, diamond) {
6763                                                                var other = { type: 'playersproperties' };
6764
6765                                                                other.name = 'pitcher';
6766                                                                other.player = _.find(diamond.defense, { pos: 1 });
6767
6768                                                                return other;
6769
6770                                                            }],
6771                                                        },
6772                                                        {
6773                                                            id: 'passedball',
6774                                                            name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.passedball.name',
6775                                                            other: [function (player, diamond) {
6776                                                                var other = { type: 'playersproperties' };
6777
6778                                                                other.name = 're
6778ceiver';
6779                                                                other.player = _.find(diamond.defense, { pos: 2 });
6780
6781                                                                return other;
6782
6783                                                            }],
6784                                                        }
6785                                                    ]
6786                                                }
6787                                            },
6788                                            {
6789                                                id: 'error',
6790                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.error.name',
6791                                                step: {
6792                                                    type: 'playersproperties',
6793                                                    template: 'properties',
6794                                                    options: [],
6795                                                    properties: [
6796                                                        { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
6797                                                    ]
6798                                                }
6799                                            }
6800                                        ],
6801                                    }
6802                                }
6803                            ]
6804                        }
6805                    },
6806                ],
6807            },
6808            onbases: {
6809                title: 'directives.scoreboard.baseball.tabStats.onBases',
6810                type: 'type',
6811                template: 'choice',
6812                onConfirm: function (selectedStep) {
6813                    if (mode_self.selectedPlayerProperties() != null) {
6814                        playerToData(selectedStep.type, mode_self.selectedPlayerProperties());
6815                    }
6816
6817                    mode_self.createEvent();
6818                },
6819                options: [
6820                    {
6821                        id: 'hit',
6822                        name: 'directives.scoreboard.baseball.tabStats.onBasesTypes.hit.name',
6823                        step: {
6824                            type: 'category',
6825                            template: 'choice',
6826                            options: [
6827                                {
6828                                    id: 'single',
6829                                    name: 'directives.scoreboard.baseball.tabStats.onBasesSubtypes.single.name',
6830                                },
6831                                {
6832                                    id: 'double',
6833                                    name: 'directives.scoreboard.baseball.tabStats.onBasesSubtypes.double.name',
6834                                },
6835                                {
6836                                    id: 'triple',
6837                                    name: 'directives.scoreboard.baseball.tabStats.onBasesSubtypes.triple.name',
6838                                },
6839                                {
6840                                    id: 'homerun',
6841                                    name: 'directives.scoreboard.baseball.tabStats.onBasesSubtypes.homerun.name',
6842                                    step: {
6843                                        type: 'playersproperties',
6844                                        template: 'properties',
6845                                        options: [],
6846                                        properties: [
6847                                            { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
6848                                            {
6849                                                name: 'pitcher',
6850                                                required: true,
6851                                                mode: 'number',
6852                                                getName: function (properties) {
6853                                                    if (properties.earnedpoint.value === true) {
6854                                                        return properties.earnedpoint.trueValue;
6855                                                    }
6856
6857                                                    return properties.earnedpoint.falseValue;
6858                                                },
6859                                                defaultValue: function (selectedTeam) {
6860                                                    return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
6861                                                },
6862                                                label: 'directives.scoreboard.baseball.tabStats.pitcher',
6863                                                list: function (selectedTeam) {
6864                                                    var list = []
6865
6866                                                    var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
6867                                                    if (pitcher) {
6868                                                        list.push({ label: pitcher.number, data: pitcher });
6869                                                    }
6870
6871                                                    selectedTeam.positions.forEach(function (position) {
6872                                                        position.substitutions.forEach(function (substitution) {
6873                                                            if (substitution.out.playerPosition == 'pitcher') {
6874                                                                if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
6875                                                                    list.push({ label: substitution.out.number, data: substitution.out });
6876                                                                }
6877                                                            }
6878                                                        })
6879                                                    })
6880
6881                                                    return list;
6882                                                }
6883                                            },
6884                                            {
6885                                                name: 'rbi',
6886                                                getPlayer: function (value, sequence) {
6887                                                    if (value) {
6888                                                        return sequence.hitter
6889                                                    }
6890
6891                                                    return null;
6892                                                },
6893                                                required: true,
6894                                                defaultValue: true,
6895                                                type: 'checkbox',
6896                                                label: 'directives.scoreboard.baseball.tabStats.runBattedIn'
6897                                            },
6898                                        ]
6899                                    }
6900                                },
6901                            ]
6902                        }
6903                    },
6904                    {
6905                        id: 'baseonball',
6906                        name: 'directives.scoreboard.baseball.tabStats.onBasesTypes.baseonball.name',
6907                        autoGenerateRunners: function (outline, seq, diamond, sequence) {
6908                            var events = [];
6909                            var baseNames = { 3: "b1", 4: "b2", 5: "b3", 6: "b4" };
6910                            
6911                            outline.forEach(function (outlineStep) {                                
6912                                if (outlineStep.id == "runner") {
6913                                    var shouldMove = outlineStep.data.pos == 3;
6914
6915                                    if (outlineStep.data.pos > 3) {                                        
6916                                        var playerCount = 0;
6917                                        for (var i = outlineStep.data.pos - 1; i > 2; i--) {
6918                                            if (_.find(diamond.offense, { pos: i })) {
6919                                                playerCount++;
6920											}
6921                                        }
6922
6923                                        shouldMove = playerCount == outlineStep.data.pos - 3;
6924                                    }
6925
6926                                    var runnerEvent = {
6927                                        seq: seq++,
6928                                        type: shouldMove ? "advance" : "none",
6929                                        category: null,
6930                                        playersproperties: [{
6931                                            seq: 1,
6932                                            name: baseNames[outlineStep.data.pos + (shouldMove * 1)],
6933                                            id: outlineStep.data.id,
6934                                            pos: outlineStep.data.pos,
6935                                            row: outlineStep.data.row,
6936                                            number: outlineStep.data.playerNumber,
6937                                            teamid: outlineStep.data.teamId
6938                                        }]
6939                                    }
6940
6941                                    if (shouldMove && outlineStep.data.pos === 5) {
6942                                        var baseonballEvent = _.find(sequence, { type: 'baseonball' });
6943                                        runnerEvent.playersproperties = runnerEvent.playersproperties.concat(baseonballEvent.playersproperties);
6944                                        baseonballEvent.playersproperties = [];
6945                                    }
6946
6947                                    events.push(runnerEvent);
6948                                }
6949                            })
6950
6951                            return events;
6952                        },
6953                        step: {
6954                            type: 'category',
6955                            template: 'choice',
6956                            options: [
6957                                {
6958                                    id: 'intentional',
6959                                    name: 'directives.scoreboard.baseball.tabStats.onBasesSubtypes.intentional.name',
6960                                    step: {
6961                                        type: 'playersproperties',
6962                                        template: 'properties',
6963                                        options: [],
6964                                        condition: function (diamond) {
6965                                            var thirdBasePlayer = _.findIndex(diamond.offense, { playerPosition: 'thirdbase' }) != -1;
6966                                            var shouldMove = false;
6967                                            if (thirdBasePlayer) {
6968                                                var playerCount = 0;
6969                                                for (var i = 4; i > 2; i--) {
6970                                                    if (_.find(diamond.offense, { pos: i })) {
6971                                                        playerCount++;
6972                                                    }
6973                                                }
6974
6975                                                shouldMove = playerCount == 2;
6976                                            }
6977                                            return shouldMove;
6978                                        },
6979                                        properties: [
6980                                            { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
6981                                            {
6982                                                name: 'pitcher',
6983                                                required: true,
6984                                                mode: 'number',
6985                                                getName: function (properties) {
6986                                                    if (properties.earnedpoint.value === true) {
6987                                                        return properties.earnedpoint.trueValue;
6988                                                    }
6989
6990                                                    return properties.earnedpoint.falseValue;
6991                                                },
6992                                                defaultValue: function (selectedTeam) {
6993                                                    return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
6994                                                },
6995                                                label: 'directives.scoreboard.baseball.tabStats.pitcher',
6996                                                list: function (selectedTeam) {
6997                                                    var list = []
6998
6999                                                    var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
7000                                                    if (pitcher) {
7001                                                        list.push({ label: pitcher.number, data: pitcher });
7002                                                    }
7003
7004                                                    selectedTeam.positions.forEach(function (position) {
7005                                                        position.substitutions.forEach(function (substitution) {
7006                                                            if (substitution.out.playerPosition == 'pitcher') {
7007                                                                if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
7008                                                                    list.push({ label: substitution.out.number, data: substitution.out });
7009                                                                }
7010                                                            }
7011                                                        })
7012                                                    })
7013
7014                                                    return list;
7015                                                }
7016                                            }
7017                                        ]
7018                                    }
7019                                },
7020                                {
7021                                    id: 'standard',
7022                                    name: 'directives.scoreboard.baseball.tabStats.onBasesSubtypes.standard.name',
7023                                    step: {
7024                                        type: 'playersproperties',
7025                                        template: 'properties',
7026                                        options: [],
7027                                        condition: function (diamond) {
7028                                            var thirdBasePlayer = _.findIndex(diamond.offense, { playerPosition: 'thirdbase' }) != -1;
7029                                            var shouldMove = false;
7030                                            if (thirdBasePlayer) {
7031                                                var playerCount = 0;
7032                                                for (var i = 4; i > 2; i--) {
7033                                                    if (_.find(diamond.offense, { pos: i })) {
7034                                                        playerCount++;
7035                                                    }
7036                                                }
7037
7038                                                shouldMove = playerCount == 2;
7039                                            }
7040                                            return shouldMove;
7041                                        },
7042                                        properties: [
7043                                            { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
7044                                            {
7045                                                name: 'pitcher',
7046                                                required: true,
7047                                                mode: 'number',
7048                                                getName: function (properties) {
7049                                                    if (properties.earnedpoint.value === true) {
7050                                                        return properties.earnedpoint.trueValue;
7051                                                    }
7052
7053                                                    return properties.earnedpoint.falseValue;
7054                                                },
7055                                                defaultValue: function (selectedTeam) {
7056                                                    return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
7057                                                },
7058                                                label: 'directives.scoreboard.baseball.tabStats.pitcher',
7059                                                list: function (selectedTeam) {
7060                                                    var list = []
7061
7062                                                    var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
7063                                                    if (pitcher) {
7064                                                        list.push({ label: pitcher.number, data: pitcher });
7065                                                    }
7066
7067                                                    selectedTeam.positions.forEach(function (position) {
7068                                                        position.substitutions.forEach(function (substitution) {
7069                                                            if (substitution.out.playerPosition == 'pitcher') {
7070                                                                if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
7071                                                                    list.push({ label: substitution.out.number, data: substitution.out });
7072                                                                }
7073                                                            }
7074                                                        })
7075                                                    })
7076
7077                                                    return list;
7078                                                }
7079                                            }
7080                                        ]
7081                                    }
7082                                },
7083                            ]
7084                        }
7085                    },
7086                    {
7087                        id: 'hitbypitch',
7088                        name: 'directives.scoreboard.baseball.tabStats.onBasesTypes.hitbypitch.name',
7089                        autoGenerateRunners: function (outline, seq, diamond, sequence) {
7090                            var events = [];
7091                            var baseNames = { 3: "b1", 4: "b2", 5: "b3", 6: "b4" };
7092
7093                            outline.forEach(function (outlineStep) {
7094                                if (outlineStep.id == "runner") {
7095                                    var shouldMove = outlineStep.data.pos == 3;
7096
7097                                    if (outlineStep.data.pos > 3) {
7098                                        var playerCount = 0;
7099                                        for (var i = outlineStep.data.pos - 1; i > 2; i--) {
7100                                            if (_.find(diamond.offense, { pos: i })) {
7101                                                playerCount++;
7102                                            }
7103                                        }
7104
7105                                        shouldMove = playerCount == outlineStep.data.pos - 3;
7106                                    }
7107
7108                                    var runnerEvent = {
7109                                        seq: seq++,
7110                                        type: shouldMove ? "advance" : "none",
7111                                        category: null,
7112                                        playersproperties: [{
7113                                            seq: 1,
7114                                            name: baseNames[outlineStep.data.pos + (shouldMove * 1)],
7115                                            id: outlineStep.data.id,
7116                                            pos: outlineStep.data.pos,
7117                                            row: outlineStep.data.row,
7118                                            number: outlineStep.data.playerNumber,
7119                                            teamid: outlineStep.data.teamId
7120                                        }]
7121                                    }
7122
7123                                    if (shouldMove && outlineStep.data.pos === 5) {
7124                                        var hitByPitchEvent = _.find(sequence, { type: 'hitbypitch' });
7125                                        runnerEvent.playersproperties = runnerEvent.playersproperties.concat(hitByPitchEvent.playersproperties);
7126                                        hitByPitchEvent.playersproperties = [];
7127                                    }
7128
7129                                    events.push(runnerEvent);
7130                                }
7131                            })
7132
7133                            return events;
7134                        },
7135                        step: {
7136                            type: 'playersproperties',
7137                            template: 'properties',
7138                            options: [],
7139                            condition: function (diamond) {
7140                                var thirdBasePlayer = _.findIndex(diamond.offense, { playerPosition: 'thirdbase' }) != -1;
7141                                var shouldMove = false;
7142                                if (thirdBasePlayer) {
7143                                    var playerCount = 0;
7144                                    for (var i = 4; i > 2; i--) {
7145                                        if (_.find(diamond.offense, { pos: i })) {
7146                                            playerCount++;
7147                                        }
7148                                    }
7149
7150                                    shouldMove = playerCount == 2;
7151                                }
7152                                return shouldMove;
7153                            },
7154                            properties: [
7155                                { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
7156                                {
7157                                    name: 'pitcher',
7158                                    required: true,
7159                                    mode: 'number',
7160                                    getName: function (properties) {
7161                                        if (properties.earnedpoint.value === true) {
7162                                            return properties.earnedpoint.trueValue;
7163                                        }
7164
7165                                        return properties.earnedpoint.falseValue;
7166                                    },
7167                                    defaultValue: function (selectedTeam) {
7168                                        return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
7169                                    },
7170                                    label: 'directives.scoreboard.baseball.tabStats.pitcher',
7171                                    list: function (selectedTeam) {
7172                                        var list = []
7173
7174                                        var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
7175                                        if (pitcher) {
7176                                            list.push({ label: pitcher.number, data: pitcher });
7177                                        }
7178
7179                                        selectedTeam.positions.forEach(function (position) {
7180                                            position.substitutions.forEach(function (substitution) {
7181                                                if (substitution.out.playerPosition == 'pitcher') {
7182                                                    if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
7183                                                        list.push({ label: substitution.out.number, data: substitution.out });
7184                                                    }
7185                                                }
7186                                            })
7187                                        })
7188
7189                                        return list;
7190                                    }
7191                                }
7192                            ]
7193                        }
7194                    },
7195                    {
7196                        id: 'interferencereceiver',
7197                        other: [function (player, diamond) {
7198                            var other = { type: 'playersproperties' };
7199
7200                            other.name = 'receiver';
7201                            other.player = _.find(diamond.defense, { pos: 2 });
7202
7203                            return other;
7204                        }],
7205                        name: 'directives.scoreboard.baseball.tabStats.onBasesTypes.interference.name',
7206                    },
7207                    {
7208                        id: 'hitterdefenseerror',
7209                        name: 'directives.scoreboard.baseball.tabStats.onBasesTypes.defenseerror.name',
7210                        step: {
7211                            type: 'playersproperties',
7212                            template: 'choice',
7213                            getData: function (diamond) {
7214                                return _.find(diamond.offense, { pos: 2 });
7215                            },
7216                            options: [
7217                                {
7218                                    id: 'b1',
7219                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b1.name',
7220                                    step: {
7221                                        type: 'playersproperties',
7222                                        template: 'properties',
7223                                        options: [],
7224                                        properties: [
7225                                            { name: 'defenseerror', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' },
7226                                            {
7227                                                name: 'assist',
7228                                                label: 'directives.scoreboard.baseball.tabStats.assists',
7229                                                multiple: {
7230                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
7231                                                    getName: function (number) {
7232                                                        return `assist${number + 1}`;
7233                                                    },
7234                                                    max: 9
7235                                                },
7236                                                required: false
7237                                            },
7238                                        ]
7239                                    }
7240                                },
7241                                {
7242                                    id: 'b2',
7243                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
7244                                    step: {
7245                                        type: 'playersproperties',
7246                                        template: 'properties',
7247                                        options: [],
7248                                        properties: [
7249                                            { name: 'defenseerror', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' },
7250                                            {
7251                                                name: 'assist',
7252                                                label: 'directives.scoreboard.baseball.tabStats.assists',
7253                                                multiple: {
7254                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
7255                                                    getName: function (number) {
7256                                                        return `assist${number + 1}`;
7257                                                    },
7258                                                    max: 9
7259                                                },
7260                                                required: false
7261                                            },
7262                                        ]
7263                                    }
7264                                },
7265                                {
7266                                    id: 'b3',
7267                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
7268                                    step: {
7269                                        type: 'playersproperties',
7270                                        template: 'properties',
7271                                        options: [],
7272                                        properties: [
7273                                            { name: 'defenseerror', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' },
7274                                            {
7275                                                name: 'assist',
7276                                                label: 'directives.scoreboard.baseball.tabStats.assists',
7277                                                multiple: {
7278                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
7279                                                    getName: function (number) {
7280                                                        return `assist${number + 1}`;
7281                                                    },
7282                                                    max: 9
7283                                                },
7284                                                required: false
7285                                            },
7286                                        ]
7287                                    }
7288                                },
7289                                {
7290                                    id: 'b4',
7291                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
7292                                    step: {
7293                                        type: 'playersproperties',
7294                                        template: 'properties',
7295                                        options: [],
7296                                        properties: [
7297                                            { name: 'defenseerror', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' },                                            
7298                                            { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
7299                                            {
7300                                                name: 'pitcher',
7301                                                required: true,
7302                                                mode: 'number',
7303                                                getName: function (properties) {
7304                                                    if (properties.earnedpoint.value === true) {
7305                                                        return properties.earnedpoint.trueValue;
7306                                                    }
7307
7308                                                    return properties.earnedpoint.falseValue;
7309                                                },
7310                                                defaultValue: function (selectedTeam) {
7311                                                    return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
7312                                                },
7313                                                label: 'directives.scoreboard.baseball.tabStats.pitcher',
7314                                                list: function (selectedTeam) {
7315                                                    var list = []
7316
7317                                                    var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
7318                                                    if (pitcher) {
7319                                                        list.push({ label: pitcher.number, data: pitcher });
7320                                                    }
7321
7322                                                    selectedTeam.positions.forEach(function (position) {
7323                                                        position.substitutions.forEach(function (substitution) {
7324                                                            if (substitution.out.playerPosition == 'pitcher') {
7325                                                                if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
7326                                                                    list.push({ label: substitution.out.number, data: substitution.out });
7327                                                                }
7328                                                            }
7329                                                        })
7330                                                    })
7331
7332                                                    return list;
7333                                                }
7334                                            },
7335                                            {
7336                                                name: 'assist',
7337                                                label: 'directives.scoreboard.baseball.tabStats.assists',
7338                                                multiple: {
7339                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
7340                                                    getName: function (number) {
7341                                                        return `assist${number + 1}`;
7342                                                    },
7343                                                    max: 9
7344                                                },
7345                                                required: false
7346                                            }
7347                                        ]
7348                                    }
7349                                }
7350                            ]
7351                        }
7352                    },
7353                    {
7354                        id: 'fielderchoice',
7355                        name: 'directives.scoreboard.baseball.tabStats.onBasesTypes.fielderchoice.name',
7356                        visible: function (diamond) {
7357                            var hasRunner = false;
7358                            var runner_pos = [5, 4, 3];
7359
7360                            for (var i = 0; i < diamond.offense.length && !hasRunner; i++) {
7361                                hasRunner = _.indexOf(runner_pos, diamond.offense[i].pos) != -1;
7362                            }
7363
7364                            return hasRunner;
7365                        }
7366                    },
7367                    {
7368                        id: 'sacerror',
7369                        name: 'directives.scoreboard.baseball.tabStats.onBasesTypes.sacerror.name',
7370                        step: {
7371                            type: 'playersproperties',
7372                            template: 'choice',
7373                            getData: function (diamond) {
7374                                return _.find(diamond.offense, { pos: 2 });
7375                            },
7376                            options: [
7377                                {
7378                                    id: 'b1',
7379                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b1.name',
7380                                    step: {
7381                                        type: 'playersproperties',
7382                                        template: 'properties',
7383                                        options: [],
7384                                        properties: [
7385                                            { name: 'defenseerror', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' },
7386                                            {
7387                                                name: 'assist',
7388                                                label: 'directives.scoreboard.baseball.tabStats.assists',
7389                                                multiple: {
7390                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
7391                                                    getName: function (number) {
7392                                                        return `assist${number + 1}`;
7393                                                    },
7394                                                    max: 9
7395                                                },
7396                                                required: false
7397                                            },
7398                                        ]
7399                                    }
7400                                },
7401                                {
7402                                    id: 'b2',
7403                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
7404                                    step: {
7405                                        type: 'playersproperties',
7406                                        template: 'properties',
7407                                        options: [],
7408                                        properties: [
7409                                            { name: 'defenseerror', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' },
7410                                            {
7411                                                name: 'assist',
7412                                                label: 'directives.scoreboard.baseball.tabStats.assists',
7413                                                multiple: {
7414                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
7415                                                    getName: function (number) {
7416                                                        return `assist${number + 1}`;
7417                                                    },
7418                                                    max: 9
7419                                                },
7420                                                required: false
7421                                            },
7422                                        ]
7423                                    }
7424                                },
7425                                {
7426                                    id: 'b3',
7427                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
7428                                    step: {
7429                                        type: 'playersproperties',
7430                                        template: 'properties',
7431                                        options: [],
7432                                        properties: [
7433                                            { name: 'defenseerror', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' },
7434                                            {
7435                                                name: 'assist',
7436                                                label: 'directives.scoreboard.baseball.tabStats.assists',
7437                                                multiple: {
7438                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
7439                                                    getName: function (number) {
7440                                                        return `assist${number + 1}`;
7441                                                    },
7442                                                    max: 9
7443                                                },
7444                                                required: false
7445                                            },
7446                                        ]
7447                                    }
7448                                },
7449                                {
7450                                    id: 'b4',
7451                                    name: 'directives.scoreboard.baseball.tabStats.base
7451runnerTypes.b4.name',
7452                                    step: {
7453                                        type: 'playersproperties',
7454                                        template: 'properties',
7455                                        options: [],
7456                                        properties: [
7457                                            { name: 'defenseerror', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' },
7458                                            { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
7459                                            {
7460                                                name: 'pitcher',
7461                                                required: true,
7462                                                mode: 'number',
7463                                                getName: function (properties) {
7464                                                    if (properties.earnedpoint.value === true) {
7465                                                        return properties.earnedpoint.trueValue;
7466                                                    }
7467
7468                                                    return properties.earnedpoint.falseValue;
7469                                                },
7470                                                defaultValue: function (selectedTeam) {
7471                                                    return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
7472                                                },
7473                                                label: 'directives.scoreboard.baseball.tabStats.pitcher',
7474                                                list: function (selectedTeam) {
7475                                                    var list = []
7476
7477                                                    var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
7478                                                    if (pitcher) {
7479                                                        list.push({ label: pitcher.number, data: pitcher });
7480                                                    }
7481
7482                                                    selectedTeam.positions.forEach(function (position) {
7483                                                        position.substitutions.forEach(function (substitution) {
7484                                                            if (substitution.out.playerPosition == 'pitcher') {
7485                                                                if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
7486                                                                    list.push({ label: substitution.out.number, data: substitution.out });
7487                                                                }
7488                                                            }
7489                                                        })
7490                                                    })
7491
7492                                                    return list;
7493                                                }
7494                                            },
7495                                            {
7496                                                name: 'assist',
7497                                                label: 'directives.scoreboard.baseball.tabStats.assists',
7498                                                multiple: {
7499                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
7500                                                    getName: function (number) {
7501                                                        return `assist${number + 1}`;
7502                                                    },
7503                                                    max: 9
7504                                                },
7505                                                required: false
7506                                            }
7507                                        ]
7508                                    }
7509                                }
7510                            ]
7511                        }
7512                    }
7513                ]
7514            },
7515            misc: {                   
7516                template: 'choice',
7517                options: [{                    
7518                    id: 'error',
7519                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.error.
7519name',     
7520                    other: [{ name: 'type', id: 'error' }, function (player) {
7521                        var other = { type: 'playersproperties' };
7522
7523                        other.name = 'error';
7524                        other.player = player;
7525
7526                        return other;
7527                    }],
7528                },
7529               ],
7530            },
7531            baserunners: {
7532                title: 'directives.scoreboard.baseball.tabStats.baserunner',
7533                type: 'type',
7534                template: 'choice',
7535                onConfirm: function (selectedStep) {
7536                    if (mode_self.selectedPlayerProperties() != null) {
7537                        playerToData(selectedStep.type, mode_self.selectedPlayerProperties());
7538                    }
7539
7540                    mode_self.createEvent();
7541                },
7542                options: [
7543                    {
7544                        id: 'advance',
7545                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advance.name',
7546                        step: {
7547                            type: 'playersproperties',
7548                            template: 'choice',
7549                            options: [
7550                                {
7551                                    id: 'b2',
7552                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
7553                                    visible: function (diamond, player) {
7554                                        return player.pos < 4;
7555                                    },
7556                                },
7557                                {
7558                                    id: 'b3',
7559                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
7560                                    visible: function (diamond, player) {
7561                                        return player.pos < 5;
7562                                    },
7563                                },
7564                                {
7565                                    id: 'b4',
7566                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
7567                                    step: {
7568                                        type: 'playersproperties',
7569                                        template: 'properties',
7570                                        options: [],
7571                                        properties: [
7572                                            { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
7573                                            {
7574                                                name: 'pitcher',
7575                                                required: true,
7576                                                mode: 'number',
7577                                                getName: function (properties) {
7578                                                    if (properties.earnedpoint.value === true) {
7579                                                        return properties.earnedpoint.trueValue;
7580                                                    }
7581
7582                                                    return properties.earnedpoint.falseValue;
7583                                                },
7584                                                defaultValue: function (selectedTeam) {
7585                                                    return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
7586                                                },
7587                                                label: 'directives.scoreboard.baseball.tabStats.pitcher',
7588                                                list: function (selectedTeam) {
7589                                                    var list = []
7590
7591                                                    var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
7592                                                    if (pitcher) {
7593                                                        list.push({ label: pitcher.number, data: pitcher });
7594                                                    }
7595
7596                                                    selectedTeam.positions.forEach(function (position) {
7597                                                        position.substitutions.forEach(function (substitution) {
7598                                                            if (substitution.out.playerPosition == 'pitcher') {
7599                                                                if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
7600                                                                    list.push({ label: substitution.out.number, data: substitution.out });
7601                                                                }
7602                                                            }
7603                                                        })
7604                                                    })
7605
7606                                                    return list;
7607                                                }
7608                                            }
7609                                        ]
7610                                    }
7611                                }
7612                            ]
7613                        }
7614                    },
7615                    {
7616                        id: 'runnerout',
7617                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.runnerout.name',
7618                        step: {
7619                            type: 'playersproperties',
7620                            template: 'choice',
7621                            options: [
7622                                {
7623                                    id: 'b1',
7624                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b1.name',
7625                                    step: {
7626                                        type: 'playersproperties',
7627                                        template: 'properties',
7628                                        options: [],
7629                                        properties: [
7630                                            {
7631                                                name: 'assist',
7632                                                label: 'directives.scoreboard.baseball.tabStats.assists',
7633                                                multiple: {
7634                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
7635                                                    getName: function (number) {
7636                                                        return `assist${number + 1}`;
7637                                                    },
7638                                                    max: 9
7639                                                },
7640                                                required: false
7641                                            },
7642                                            { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
7643                                        ]
7644                                    },
7645                                    visible: function (diamond, player) {
7646                                        return player.pos <= 3;
7647                                    },
7648                                },
7649                                {
7650                                    id: 'b2',
7651                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
7652                                    step: {
7653                                        type: 'playersproperties',
7654                                        template: 'properties',
7655                                        options: [],
7656                                        properties: [
7657                                            {
7658                                                name: 'assist',
7659                                                label: 'directives.scoreboard.baseball.tabStats.assists',
7660                                                multiple: {
7661                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
7662                                                    getName: function (number) {
7663                                                        return `assist${number + 1}`;
7664                                                    },
7665                                                    max: 9
7666                                                },
7667                                                required: false
7668                                            },
7669                                            { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
7670                                        ]
7671                                    },
7672                                    visible: function (diamond, player) {
7673                                        return player.pos <= 4;
7674                                    },
7675                                },
7676                                {
7677                                    id: 'b3',
7678                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
7679                                    step: {
7680                                        type: 'playersproperties',
7681                                        template: 'properties',
7682                                        options: [],
7683                                        properties: [
7684                                            {
7685                                                name: 'assist',
7686                                                label: 'directives.scoreboard.baseball.tabStats.assists',
7687                                                multiple: {
7688                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
7689                                                    getName: function (number) {
7690                                                        return `assist${number + 1}`;
7691                                                    },
7692                                                    max: 9
7693                                                },
7694                                                required: false
7695                                            },
7696                                            { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
7697                                        ]
7698                                    },
7699                                    visible: function (diamond, player) {
7700                                        return player.pos <= 5;
7701                                    },
7702                                },
7703                                {
7704                                    id: 'b4',
7705                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
7706                                    step: {
7707                                        type: 'playersproperties',
7708                                        template: 'properties',
7709                                        options: [],
7710                                        properties: [
7711                                            {
7712                                                name: 'assist',
7713                                                label: 'directives.scoreboard.baseball.tabStats.assists',
7714                                                multiple: {
7715                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
7716                                                    getName: function (number) {
7717                                                        return `assist${number + 1}`;
7718                                                    },
7719                                                    max: 9
7720                                                },
7721                                                required: false
7722                                            },
7723                                            { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
7724                                        ]
7725                                    }
7726                                }
7727                            ]
7728                        }
7729                    },
7730                    {
7731                        id: 'stealbase',
7732                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.stealbase.name',
7733                        step: {
7734                            type: 'category',
7735                            template: 'choice',
7736                            options: [
7737                                {
7738                                    id: '',
7739                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advance.name',
7740                                    step: {
7741                                        type: 'playersproperties',
7742                                        template: 'choice',
7743                                        options: [
7744                                            {
7745                                                id: 'b1',
7746                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b1.name',
7747                                                visible: function (diamond, player) {
7748                                                    return player.pos < 3;
7749                                                },
7750                                            },
7751                                            {
7752                                                id: 'b2',
7753                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
7754                                                visible: function (diamond, player) {
7755                                                    return player.pos < 4;
7756                                                },
7757                                            },
7758                                            {
7759                                                id: 'b3',
7760                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
7761                                                visible: function (diamond, player) {
7762                                                    return player.pos < 5;
7763                                                },
7764                                            },
7765                                            {
7766                                                id: 'b4',
7767                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
7768                                                step: {
7769                                                    type: 'playersproperties',
7770                                                    template: 'properties',
7771                                                    options: [],
7772                                                    properties: [
7773                                                        { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
7774                                                        {
7775                                                            name: 'pitcher',
7776                                                            required: true,
7777                                                            mode: 'number',
7778                                                            getName: function (properties) {
7779            
7779                                                    if (properties.earnedpoint.value === true) {
7780                                                                    return properties.earnedpoint.trueValue;
7781                                                                }
7782
7783                                                                return properties.earnedpoint.falseValue;
7784                                                            },
7785                                                            defaultValue: function (selectedTeam) {
7786                                                                return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
7787                                                            },
7788                                                            label: 'directives.scoreboard.baseball.tabStats.pitcher',
7789                                                            list: function (selectedTeam) {
7790                                                                var list = []
7791
7792                                                                var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
7793                                                                if (pitcher) {
7794                                                                    list.push({ label: pitcher.number, data: pitcher });
7795                                                                }
7796
7797                                                                selectedTeam.positions.forEach(function (position) {
7798                                                                    position.substitutions.forEach(function (substitution) {
7799                                                                        if (substitution.out.playerPosition == 'pitcher') {
7800                                                                            if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
7801                                                                                list.push({ label: substitution.out.number, data: substitution.out });
7802                                                                            }
7803                                                                        }
7804                                                                    })
7805                                                                })
7806
7807                                                                return list;
7808                                                            }
7809                                                        }
7810                                                    ]
7811                                                }
7812                                            }
7813                                        ]
7814                                    }
7815                                },
7816                                {
7817                                    id: 'error',
7818                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advancewitherror.name',
7819                                    step: {
7820                                        type: 'playersproperties',
7821                                        template: 'choice',
7822                                        options: [
7823                                            {
7824                                                id: 'b1',
7825                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b1.name',
7826                                                step: {
7827                                                    type: 'playersproperties',
7828                                                    template: 'properties',
7829                                                    options: [],
7830                                                    properties: [
7831                                                        { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' },
7832                                                        {
7833                                                            name: 'assist',
7834                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
7835                                                            multiple: {
7836                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
7837                                                                getName: function (number) {
7838                                                                    return `assist${number + 1}`;
7839                                                                },
7840                                                                max: 9
7841                                                            },
7842                                                            required: false
7843                                                        }
7844                                                    ]
7845                                                },
7846                                                visible: function (diamond, player) {
7847                                                    return player.pos <= 3;
7848                                                },
7849                                            },
7850                                            {
7851                                                id: 'b2',
7852                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
7853                                                step: {
7854                                                    type: 'playersproperties',
7855                                                    template: 'properties',
7856                                                    options: [],
7857                                                    properties: [
7858                                                        { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' },
7859                                                        {
7860                                                            name: 'assist',
7861                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
7862                                                            multiple: {
7863                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
7864                                                                getName: function (number) {
7865                                                                    return `assist${number + 1}`;
7866                                                                },
7867                                                                max: 9
7868                                                            },
7869                                                            required: false
7870                                                        }
7871                                                    ]
7872                                                },
7873                                                visible: function (diamond, player) {
7874                                                    return player.pos <= 4;
7875                                                },
7876                                            },
7877                                            {
7878                                                id: 'b3',
7879                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
7880                                                step: {
7881                                                    type: 'playersproperties',
7882                                                    template: 'properties',
7883                                                    options: [],
7884                                                    properties: [
7885                                                        { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' },
7886                                                        {
7887                                                            name: 'assist',
7888                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
7889                                                            multiple: {
7890                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
7891                                                                getName: function (number) {
7892                                                                    return `assist${number + 1}`;
7893                                                                },
7894                                                                max: 9
7895                                                            },
7896                                                            required: false
7897                                                        }
7898                                                    ]
7899                                                },
7900                                                visible: function (diamond, player) {
7901                                                    return player.pos <= 5;
7902                                                },
7903                                            },
7904                                            {
7905                                                id: 'b4',
7906                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
7907                                                step: {
7908                                                    type: 'playersproperties',
7909                                                    template: 'properties',
7910                                                    options: [],
7911                                                    properties: [
7912                                                        { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
7913                                                        {
7914                                                            name: 'pitcher',
7915                                                            required: true,
7916                                                            mode: 'number',
7917                                                            getName: function (properties) {
7918                                                                if (properties.earnedpoint.value === true) {
7919                                                                    return properties.earnedpoint.trueValue;
7920                                                                }
7921
7922                                                                return properties.earnedpoint.falseValue;
7923                                                            },
7924                                                            defaultValue: function (selectedTeam) {
7925                                                                return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
7926                                                            },
7927                                                            label: 'directives.scoreboard.baseball.tabStats.pitcher',
7928                                                            list: function (selectedTeam) {
7929                                                                var list = []
7930
7931                                                                var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
7932                                                                if (pitcher) {
7933                                                                    list.push({ label: pitcher.number, data: pitcher });
7934                                                                }
7935
7936                                                                selectedTeam.positions.forEach(function (position) {
7937                                                                    position.substitutions.forEach(function (substitution) {
7938                                                                        if (substitution.out.playerPosition == 'pitcher') {
7939                                                                            if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
7940                                                                                list.push({ label: substitution.out.number, data: substitution.out });
7941                                                                            }
7942                                                                        }
7943                                                                    })
7944                                                                })
7945
7946                                                                return list;
7947                                                            }
7948                                                        },
7949                                                        { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' },
7950                                                        {
7951                                                            name: 'assist',
7952                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
7953                                                            multiple: {
7954                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
7955                                                                getName: function (number) {
7956                                                                    return `assist${number + 1}`;
7957                                                                },
7958                                                                max: 9
7959                                                            },
7960                                                            required: false
7961                                                        },
7962                                                    ]
7963                                                }
7964                                            }
7965                                        ]
7966                                    }
7967                                },
7968                                {
7969                                    id: 'out',
7970                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.runnerout.name',
7971                                    step: {
7972                                        type: 'playersproperties',
7973                                        template: 'choice',
7974                                        options: [
7975                                            {
7976                                                id: 'b1',
7977                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b1.name',
7978                                                step: {
7979                                                    type: 'playersproperties',
7980                                                    template: 'properties',
7981                                                    options: [],
7982                                                    properties: [
7983                                                        {
7984                                                            name: 'assist',
7985                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
7986                                                            multiple: {
7987                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
7988            
7988                                                    getName: function (number) {
7989                                                                    return `assist${number + 1}`;
7990                                                                },
7991                                                                max: 9
7992                                                            },
7993                                                            required: false
7994                                                        },
7995                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
7996                                                    ]
7997                                                },
7998                                                visible: function (diamond, player) {
7999                                                    return player.pos <= 3;
8000                                                },
8001                                            },
8002                                            {
8003                                                id: 'b2',
8004                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
8005                                                step: {
8006                                                    type: 'playersproperties',
8007                                                    template: 'properties',
8008                                                    options: [],
8009                                                    properties: [
8010                                                        {
8011                                                            name: 'assist',
8012                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
8013                                                            multiple: {
8014                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
8015                                                                getName: function (number) {
8016                                                                    return `assist${number + 1}`;
8017                                                                },
8018                                                                max: 9
8019                                                            },
8020                                                            required: false
8021                                                        },
8022                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
8023                                                    ]
8024                                                },
8025                                                visible: function (diamond, player) {
8026                                                    return player.pos <= 4;
8027                                                },
8028                                            },
8029                                            {
8030                                                id: 'b3',
8031                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
8032                                                step: {
8033                                                    type: 'playersproperties',
8034                                                    template: 'properties',
8035                                                    options: [],
8036                                                    properties: [
8037                                                        {
8038                                                            name: 'assist',
8039                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
8040                                                            multiple: {
8041                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
8042                                                                getName: function (number) {
8043                                                                    return `assist${number + 1}`;
8044                                                                },
8045                                                                max: 9
8046                                                            },
8047                                                            required: false
8048                                                        },
8049                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
8050                                                    ]
8051                                                },
8052                                                visible: function (diamond, player) {
8053                                                    return player.pos <= 5;
8054                                                },
8055                                            },
8056                                            {
8057                                                id: 'b4',
8058                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
8059                                                step: {
8060                                                    type: 'playersproperties',
8061                                                    template: 'properties',
8062                                                    options: [],
8063                                                    properties: [
8064                                                        {
8065                                                            name: 'assist',
8066                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
8067                                                            multiple: {
8068                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
8069                                                                getName: function (number) {
8070                                                                    return `assist${number + 1}`;
8071                                                                },
8072                                                                max: 9
8073                                                            },
8074                                                            required: false
8075                                                        },
8076                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
8077                                                    ]
8078                                                }
8079                                            }
8080                                        ]
8081                                    }
8082                                },
8083                            ]
8084                        }
8085                    },
8086                    {
8087                        id: 'advance',
8088                        other: [{ name: 'category', id: 'relay' }],
8089                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.relay.name',
8090                        step: {
8091                            type: 'playersproperties',
8092                            template: 'choice',
8093                            options: [
8094                                {
8095                                    id: 'b2',
8096                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
8097                                    visible: function (diamond, player) {
8098                                        return player.pos < 4;
8099                                    },
8100                                },
8101                                {
8102                                    id: 'b3',
8103                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
8104                                    visible: function (diamond, player) {
8105                                        return player.pos < 5;
8106                                    },
8107                                },
8108                                {
8109                                    id: 'b4',
8110                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
8111                                    step: {
8112                                        type: 'playersproperties',
8113                                        template: 'properties',
8114                                        options: [],
8115                                        properties: [
8116                                            { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
8117                                            {
8118                                                name: 'pitcher',
8119                                                required: true,
8120                                                mode: 'number',
8121                                                getName: function (properties) {
8122                                                    if (properties.earnedpoint.value === true) {
8123                                                        return properties.earnedpoint.trueValue;
8124                                                    }
8125
8126                                                    return properties.earnedpoint.falseValue;
8127                                                },
8128                                                defaultValue: function (selectedTeam) {
8129                                                    return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
8130                                                },
8131                                                label: 'directives.scoreboard.baseball.tabStats.pitcher',
8132                                                list: function (selectedTeam) {
8133                                                    var list = []
8134
8135                                                    var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
8136                                                    if (pitcher) {
8137                                                        list.push({ label: pitcher.number, data: pitcher });
8138                                                    }
8139
8140                                                    selectedTeam.positions.forEach(function (position) {
8141                                                        position.substitutions.forEach(function (substitution) {
8142                                                            if (substitution.out.playerPosition == 'pitcher') {
8143                                                                if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
8144                                                                    list.push({ label: substitution.out.number, data: substitution.out });
8145                                                                }
8146                                                            }
8147                                                        })
8148                                                    })
8149
8150                                                    return list;
8151                                                }
8152                                            }
8153                                        ]
8154                                    }
8155                                }
8156                            ]
8157                        }
8158                    },
8159                    {
8160                        id: 'defenseerror',
8161                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.defenseerror.name',
8162                        step: {
8163                            type: 'category',
8164                            template: 'choice',
8165                            options: [
8166                                {
8167                                    id: '',
8168                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advance.name',
8169                                    step: {
8170                                        type: 'playersproperties',
8171                                        template: 'choice',
8172                                        options: [
8173                                            {
8174                                                id: 'b2',
8175                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
8176                                                step: {
8177                                                    type: 'playersproperties',
8178                                                    template: 'properties',
8179                                                    options: [],
8180                                                    properties: [
8181                                                        { name: 'defenseerror', required: true, label: 'directives.scoreboard.baseball.tabStats.defenseErrorNumber' }
8182                                                    ]
8183                                                },
8184                                                visible: function (diamond, player) {
8185                                                    return player.pos < 4;
8186                                                },
8187                                            },
8188                                            {
8189                                                id: 'b3',
8190                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
8191                                                step: {
8192                                                    type: 'playersproperties',
8193                                                    template: 'properties',
8194                                                    options: [],
8195                                                    properties: [
8196                                                        { name: 'defenseerror', required: true, label: 'directives.scoreboard.baseball.tabStats.defenseErrorNumber' }
8197                                                    ]
8198                                                },
8199                                                visible: function (diamond, player) {
8200                                                    return player.pos < 5;
8201                                                },
8202                                            },
8203                                            {
8204                                                id: 'b4',
8205                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
8206                                                step: {
8207                                                    type: 'playersproperties',
8208                                                    template: 'properties',
8209                                                    options: [],
8210                                                    properties: [
8211                                                        { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
8212                                                        {
8213                                                            name: 'pitcher',
8214                                                            required: true,
8215                                                            mode: 'number',
8216                                                            getName: function (properties) {
8217                                                                if (properties.earnedpoint.va
8217lue === true) {
8218                                                                    return properties.earnedpoint.trueValue;
8219                                                                }
8220
8221                                                                return properties.earnedpoint.falseValue;
8222                                                            },
8223                                                            defaultValue: function (selectedTeam) {
8224                                                                return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
8225                                                            },
8226                                                            label: 'directives.scoreboard.baseball.tabStats.pitcher',
8227                                                            list: function (selectedTeam) {
8228                                                                var list = []
8229
8230                                                                var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
8231                                                                if (pitcher) {
8232                                                                    list.push({ label: pitcher.number, data: pitcher });
8233                                                                }
8234
8235                                                                selectedTeam.positions.forEach(function (position) {
8236                                                                    position.substitutions.forEach(function (substitution) {
8237                                                                        if (substitution.out.playerPosition == 'pitcher') {
8238                                                                            if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
8239                                                                                list.push({ label: substitution.out.number, data: substitution.out });
8240                                                                            }
8241                                                                        }
8242                                                                    })
8243                                                                })
8244
8245                                                                return list;
8246                                                            }
8247                                                        },
8248                                                        { name: 'defenseerror', required: true, label: 'directives.scoreboard.baseball.tabStats.defenseErrorNumber' }
8249                                                    ]
8250                                                }
8251                                            }
8252                                        ]
8253                                    }
8254                                },
8255                                {
8256                                    id: 'error',
8257                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advancewitherror.name',
8258                                    step: {
8259                                        type: 'playersproperties',
8260                                        template: 'choice',
8261                                        options: [
8262                                            {
8263                                                id: 'b2',
8264                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
8265                                                step: {
8266                                                    type: 'playersproperties',
8267                                                    template: 'properties',
8268                                                    options: [],
8269                                                    properties: [
8270                                                        { name: 'defenseerror', required: true, label: 'directives.scoreboard.baseball.tabStats.defenseErrorNumber' },
8271                                                        { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
8272                                                    ]
8273                                                },
8274                                                visible: function (diamond, player) {
8275                                                    return player.pos < 4;
8276                                                },
8277                                            },
8278                                            {
8279                                                id: 'b3',
8280                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
8281                                                step: {
8282                                                    type: 'playersproperties',
8283                                                    template: 'properties',
8284                                                    options: [],
8285                                                    properties: [
8286                                                        { name: 'defenseerror', required: true, label: 'directives.scoreboard.baseball.tabStats.defenseErrorNumber' },
8287                                                        { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
8288                                                    ]
8289                                                },
8290                                                visible: function (diamond, player) {
8291                                                    return player.pos < 5;
8292                                                },
8293                                            },
8294                                            {
8295                                                id: 'b4',
8296                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
8297                                                step: {
8298                                                    type: 'playersproperties',
8299                                                    template: 'properties',
8300                                                    options: [],
8301                                                    properties: [
8302                                                        { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
8303                                                        {
8304                                                            name: 'pitcher',
8305                                                            required: true,
8306                                                            mode: 'number',
8307                                                            getName: function (properties) {
8308                                                                if (properties.earnedpoint.value === true) {
8309                                                                    return properties.earnedpoint.trueValue;
8310                                                                }
8311
8312                                                                return properties.earnedpoint.falseValue;
8313                                                            },
8314                                                            defaultValue: function (selectedTeam) {
8315                                                                return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
8316                                                            },
8317                                                            label: 'directives.scoreboard.baseball.tabStats.pitcher',
8318                                                            list: function (selectedTeam) {
8319                                                                var list = []
8320
8321                                                                var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
8322                                                                if (pitcher) {
8323                                                                    list.push({ label: pitcher.number, data: pitcher });
8324                                                                }
8325
8326                                                                selectedTeam.positions.forEach(function (position) {
8327                                                                    position.substitutions.forEach(function (substitution) {
8328                                                                        if (substitution.out.playerPosition == 'pitcher') {
8329                                                                            if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
8330                                                                                list.push({ label: substitution.out.number, data: substitution.out });
8331                                                                            }
8332                                                                        }
8333                                                                    })
8334                                                                })
8335
8336                                                                return list;
8337                                                            }
8338                                                        },
8339                                                        { name: 'defenseerror', required: true, label: 'directives.scoreboard.baseball.tabStats.defenseErrorNumber' },
8340                                                        { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
8341                                                    ]
8342                                                }
8343                                            }
8344                                        ]
8345                                    }
8346                                },
8347                                {
8348                                    id: 'out',
8349                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.runnerout.name',
8350                                    step: {
8351                                        type: 'playersproperties',
8352                                        template: 'choice',
8353                                        options: [
8354                                            {
8355                                                id: 'b2',
8356                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
8357                                                step: {
8358                                                    type: 'playersproperties',
8359                                                    template: 'properties',
8360                                                    options: [],
8361                                                    properties: [
8362                                                        {
8363                                                            name: 'assist',
8364                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
8365                                                            multiple: {
8366                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
8367                                                                getName: function (number) {
8368                                                                    return `assist${number + 1}`;
8369                                                                },
8370                                                                max: 9
8371                                                            },
8372                                                            required: false
8373                                                        },
8374                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
8375                                                        { name: 'defenseerror', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' },
8376                                                    ]
8377                                                },
8378                                                visible: function (diamond, player) {
8379                                                    return player.pos < 4;
8380                                                },
8381                                            },
8382                                            {
8383                                                id: 'b3',
8384                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
8385                                                step: {
8386                                                    type: 'playersproperties',
8387                                                    template: 'properties',
8388                                                    options: [],
8389                                                    properties: [
8390                                                        {
8391                                                            name: 'assist',
8392                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
8393                                                            multiple: {
8394                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
8395                                                                getName: function (number) {
8396                                                                    return `assist${number + 1}`;
8397                                                                },
8398                                                                max: 9
8399                                                            },
8400                                                            required: false
8401                                                        },
8402                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
8403                                                        { name: 'defenseerror', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' },
8404                                                    ]
8405                                                },
8406                                                visible: function (diamond, player) {
8407                                                    return player.pos < 5;
8408                                                },
8409                                            },
8410                                            {
8411                                                id: 'b4',
8412                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
8413                                                step: {
8414                                                    type: 'playersproperties',
8415                                                    template: 'properties',
8416                                                    options: [],
8417                                                    properties: [
8418                                                        {
8419                                                            name: 'assist',
8420                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
8421                                                            multiple: {
8422                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumb
8422erN',
8423                                                                getName: function (number) {
8424                                                                    return `assist${number + 1}`;
8425                                                                },
8426                                                                max: 9
8427                                                            },
8428                                                            required: false
8429                                                        },
8430                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
8431                                                        { name: 'defenseerror', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' },
8432                                                    ]
8433                                                }
8434                                            }
8435                                        ]
8436                                    }
8437                                },
8438                            ]
8439                        }
8440                    },
8441                    {
8442                        id: 'interference',
8443                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.interference.name',
8444                        step: {
8445                            type: 'category',
8446                            template: 'choice',
8447                            options: [
8448                                {
8449                                    id: '',
8450                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advance.name',
8451                                    step: {
8452                                        type: 'playersproperties',
8453                                        template: 'choice',
8454                                        options: [
8455                                            {
8456                                                id: 'b2',
8457                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
8458                                                visible: function (diamond, player) {
8459                                                    return player.pos < 4;
8460                                                },
8461                                            },
8462                                            {
8463                                                id: 'b3',
8464                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
8465                                                visible: function (diamond, player) {
8466                                                    return player.pos < 5
8467                                                },
8468                                            },
8469                                            {
8470                                                id: 'b4',
8471                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
8472                                                step: {
8473                                                    type: 'playersproperties',
8474                                                    template: 'properties',
8475                                                    options: [],
8476                                                    properties: [
8477                                                        { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
8478                                                        {
8479                                                            name: 'pitcher',
8480                                                            required: true,
8481                                                            mode: 'number',
8482                                                            getName: function (properties) {
8483                                                                if (properties.earnedpoint.value === true) {
8484                                                                    return properties.earnedpoint.trueValue;
8485                                                                }
8486
8487                                                                return properties.earnedpoint.falseValue;
8488                                                            },
8489                                                            defaultValue: function (selectedTeam) {
8490                                                                return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
8491                                                            },
8492                                                            label: 'directives.scoreboard.baseball.tabStats.pitcher',
8493                                                            list: function (selectedTeam) {
8494                                                                var list = []
8495
8496                                                                var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
8497                                                                if (pitcher) {
8498                                                                    list.push({ label: pitcher.number, data: pitcher });
8499                                                                }
8500
8501                                                                selectedTeam.positions.forEach(function (position) {
8502                                                                    position.substitutions.forEach(function (substitution) {
8503                                                                        if (substitution.out.playerPosition == 'pitcher') {
8504                                                                            if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
8505                                                                                list.push({ label: substitution.out.number, data: substitution.out });
8506                                                                            }
8507                                                                        }
8508                                                                    })
8509                                                                })
8510
8511                                                                return list;
8512                                                            }
8513                                                        }
8514                                                    ]
8515                                                }
8516                                            }
8517                                        ]
8518                                    }
8519                                },
8520                                {
8521                                    id: 'error',
8522                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advancewitherror.name',
8523                                    step: {
8524                                        type: 'playersproperties',
8525                                        template: 'choice',
8526                                        options: [
8527                                            {
8528                                                id: 'b2',
8529                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
8530                                                step: {
8531                                                    type: 'playersproperties',
8532                                                    template: 'properties',
8533                                                    options: [],
8534                                                    properties: [
8535                                                        { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
8536                                                    ]
8537                                                },
8538                                                visible: function (diamond, player) {
8539                                                    return player.pos < 4;
8540                                                },
8541                                            },
8542                                            {
8543                                                id: 'b3',
8544                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
8545                                                step: {
8546                                                    type: 'playersproperties',
8547                                                    template: 'properties',
8548                                                    options: [],
8549                                                    properties: [
8550                                                        { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
8551                                                    ]
8552                                                },
8553                                                visible: function (diamond, player) {
8554                                                    return player.pos < 5;
8555                                                },
8556                                            },
8557                                            {
8558                                                id: 'b4',
8559                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
8560                                                step: {
8561                                                    type: 'playersproperties',
8562                                                    template: 'properties',
8563                                                    options: [],
8564                                                    properties: [
8565                                                        { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
8566                                                    ]
8567                                                }
8568                                            }
8569                                        ]
8570                                    }
8571                                },
8572                                {
8573                                    id: 'out',
8574                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.runnerout.name',
8575                                    step: {
8576                                        type: 'playersproperties',
8577                                        template: 'choice',
8578                                        options: [
8579                                            {
8580                                                id: 'b2',
8581                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
8582                                                step: {
8583                                                    type: 'playersproperties',
8584                                                    template: 'properties',
8585                                                    options: [],
8586                                                    properties: [
8587                                                        {
8588                                                            name: 'assist',
8589                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
8590                                                            multiple: {
8591                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
8592                                                                getName: function (number) {
8593                                                                    return `assist${number + 1}`;
8594                                                                },
8595                                                                max: 9
8596                                                            },
8597                                                            required: false
8598                                                        },
8599                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
8600                                                    ]
8601                                                },
8602                                                visible: function (diamond, player) {
8603                                                    return player.pos < 4;
8604                                                },
8605                                            },
8606                                            {
8607                                                id: 'b3',
8608                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
8609                                                step: {
8610                                                    type: 'playersproperties',
8611                                                    template: 'properties',
8612                                                    options: [],
8613                                                    properties: [
8614                                                        {
8615                                                            name: 'assist',
8616                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
8617                                                            multiple: {
8618                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
8619                                                                getName: function (number) {
8620                                                                    return `assist${number + 1}`;
8621                                                                },
8622                                                                max: 9
8623                                                            },
8624                                                            required: false
8625                                                        },
8626                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
8627                                                    ]
8628                                                },
8629                                                visible: function (diamond, player) {
8630                                                    return player.pos < 5;
8631                                                },
8632                                            },
8633                                            {
8634                                                id: 'b4',
8635                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
8636                                                step: {
8637                                                    type: 'playersproperties',
8638                                                    template: 'properties',
8639                                                    options: [],
8640                                                    properties: [
8641                                                        {
8642                                                            name: 'assist',
8643                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
8644                                                            multiple: {
8645                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
8646                             
8646                                   getName: function (number) {
8647                                                                    return `assist${number + 1}`;
8648                                                                },
8649                                                                max: 9
8650                                                            },
8651                                                            required: false
8652                                                        },
8653                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
8654                                                    ]
8655                                                }
8656                                            }
8657                                        ]
8658                                    }
8659                                },
8660                            ]
8661                        }
8662                    },
8663                    {
8664                        id: 'obstruction',
8665                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.obstruction.name',
8666                        step: {
8667                            type: 'category',
8668                            template: 'choice',
8669                            options: [
8670                                {
8671                                    id: '',
8672                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advance.name',
8673                                    step: {
8674                                        type: 'playersproperties',
8675                                        template: 'choice',
8676                                        options: [
8677                                            {
8678                                                id: 'b2',
8679                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
8680                                                visible: function (diamond, player) {
8681                                                    return player.pos < 4;
8682                                                },
8683                                            },
8684                                            {
8685                                                id: 'b3',
8686                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
8687                                                visible: function (diamond, player) {
8688                                                    return player.pos < 5;
8689                                                },
8690                                            },
8691                                            {
8692                                                id: 'b4',
8693                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name'
8694                                            }
8695                                        ]
8696                                    }
8697                                },
8698                                {
8699                                    id: 'error',
8700                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advancewitherror.name',
8701                                    step: {
8702                                        type: 'playersproperties',
8703                                        template: 'choice',
8704                                        options: [
8705                                            {
8706                                                id: 'b2',
8707                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
8708                                                step: {
8709                                                    type: 'playersproperties',
8710                                                    template: 'properties',
8711                                                    options: [],
8712                                                    properties: [
8713                                                        { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
8714                                                    ]
8715                                                },
8716                                                visible: function (diamond, player) {
8717                                                    return player.pos < 4;
8718                                                },
8719                                            },
8720                                            {
8721                                                id: 'b3',
8722                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
8723                                                step: {
8724                                                    type: 'playersproperties',
8725                                                    template: 'properties',
8726                                                    options: [],
8727                                                    properties: [
8728                                                        { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
8729                                                    ]
8730                                                },
8731                                                visible: function (diamond, player) {
8732                                                    return player.pos < 5;
8733                                                },
8734                                            },
8735                                            {
8736                                                id: 'b4',
8737                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
8738                                                step: {
8739                                                    type: 'playersproperties',
8740                                                    template: 'properties',
8741                                                    options: [],
8742                                                    properties: [
8743                                                        { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
8744                                                    ]
8745                                                }
8746                                            }
8747                                        ]
8748                                    }
8749                                },
8750                                {
8751                                    id: 'out',
8752                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.runnerout.name',
8753                                    step: {
8754                                        type: 'playersproperties',
8755                                        template: 'choice',
8756                                        options: [
8757                                            {
8758                                                id: 'b2',
8759                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
8760                                                step: {
8761                                                    type: 'playersproperties',
8762                                                    template: 'properties',
8763                                                    options: [],
8764                                                    properties: [
8765                                                        {
8766                                                            name: 'assist',
8767                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
8768                                                            multiple: {
8769                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
8770                                                                getName: function (number) {
8771                                                                    return `assist${number + 1}`;
8772                                                                },
8773                                                                max: 9
8774                                                            },
8775                                                            required: false
8776                                                        },
8777                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
8778                                                    ]
8779                                                },
8780                                                visible: function (diamond, player) {
8781                                                    return player.pos < 4;
8782                                                },
8783                                            },
8784                                            {
8785                                                id: 'b3',
8786                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
8787                                                step: {
8788                                                    type: 'playersproperties',
8789                                                    template: 'properties',
8790                                                    options: [],
8791                                                    properties: [
8792                                                        {
8793                                                            name: 'assist',
8794                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
8795                                                            multiple: {
8796                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
8797                                                                getName: function (number) {
8798                                                                    return `assist${number + 1}`;
8799                                                                },
8800                                                                max: 9
8801                                                            },
8802                                                            required: false
8803                                                        },
8804                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
8805                                                    ]
8806                                                },
8807                                                visible: function (diamond, player) {
8808                                                    return player.pos < 5;
8809                                                },
8810                                            },
8811                                            {
8812                                                id: 'b4',
8813                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
8814                                                step: {
8815                                                    type: 'playersproperties',
8816                                                    template: 'properties',
8817                                                    options: [],
8818                                                    properties: [
8819                                                        {
8820                                                            name: 'assist',
8821                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
8822                                                            multiple: {
8823                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
8824                                                                getName: function (number) {
8825                                                                    return `assist${number + 1}`;
8826                                                                },
8827                                                                max: 9
8828                                                            },
8829                                                            required: false
8830                                                        },
8831                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
8832                                                    ]
8833                                                }
8834                                            }
8835                                        ]
8836                                    }
8837                                },
8838                            ]
8839                        }
8840                    },
8841                    {
8842                        id: 'balk',
8843                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.balk.name',
8844                        other: [function (player, diamond) {
8845                            var b4Player = _.find(diamond.offense, { pos: 5 });
8846
8847                            if (b4Player) {
8848                                var other = { type: 'playersproperties' };
8849
8850                                other.name = 'b4';
8851                                other.player = b4Player;
8852                                
8853                                return other;
8854                            }
8855
8856                            return null;
8857                        }],
8858                        step: {
8859                            type: 'playersproperties',
8860                            template: 'properties',
8861                            options: [],
8862                            condition: function (diamond) {
8863                                return _.findIndex(diamond.offense, { playerPosition: 'thirdbase' }) != -1;
8864                            },
8865                            properties: [
8866                                { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
8867                                {
8868                                    name: 'pitcher',
8869                                    required: true,
8870                                    mode: 'number',
8871                                    getName: function (properties) {
8872                                        if (properties.earnedpoint.value === true) {
8873                                            return properties.earnedpoint.trueValue;
8874                                        }
8875
8876                                        return properties.earnedpoint.falseValue;
8877                                    },
8878                                    defaultValue: function (selectedTeam) {
8879                                        return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
8880                                    },
8881                                    label: 'directives.scoreboard.baseball.tabStats.pitcher',
8882                                    list: function (selectedTeam) {
8883                                        var list = []
8884
8885                                        var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
8886                                        if (pitcher) {
8887                                            list.push({ label: pitcher.number, data: pitcher });
8888                                        }
8889
8890                                        selectedTeam.positions.forEach(function (position) {
8891                                            position.substitutions.forEach(functio
8891n (substitution) {
8892                                                if (substitution.out.playerPosition == 'pitcher') {
8893                                                    if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
8894                                                        list.push({ label: substitution.out.number, data: substitution.out });
8895                                                    }
8896                                                }
8897                                            })
8898                                        })
8899
8900                                        return list;
8901                                    }
8902                                }
8903                            ]
8904                        }
8905                    },
8906                    {
8907                        id: 'badpitch',
8908                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.badpitch.name',
8909                        step: {
8910                            type: 'category',
8911                            template: 'choice',
8912                            options: [
8913                                {
8914                                    id: '',
8915                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advance.name',
8916                                    step: {
8917                                        type: 'playersproperties',
8918                                        template: 'choice',
8919                                        options: [
8920                                            {
8921                                                id: 'b2',
8922                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
8923                                                visible: function (diamond, player) {
8924                                                    return player.pos < 4;
8925                                                },
8926                                            },
8927                                            {
8928                                                id: 'b3',
8929                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
8930                                                visible: function (diamond, player) {
8931                                                    return player.pos < 5;
8932                                                },
8933                                            },
8934                                            {
8935                                                id: 'b4',
8936                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
8937                                                step: {
8938                                                    type: 'playersproperties',
8939                                                    template: 'properties',
8940                                                    options: [],
8941                                                    properties: [
8942                                                        { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
8943                                                        {
8944                                                            name: 'pitcher',
8945                                                            required: true,
8946                                                            mode: 'number',
8947                                                            getName: function (properties) {
8948                                                                if (properties.earnedpoint.value === true) {
8949                                                                    return properties.earnedpoint.trueValue;
8950                                                                }
8951
8952                                                                return properties.earnedpoint.falseValue;
8953                                                            },
8954                                                            defaultValue: function (selectedTeam) {
8955                                                                return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
8956                                                            },
8957                                                            label: 'directives.scoreboard.baseball.tabStats.pitcher',
8958                                                            list: function (selectedTeam) {
8959                                                                var list = []
8960
8961                                                                var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
8962                                                                if (pitcher) {
8963                                                                    list.push({ label: pitcher.number, data: pitcher });
8964                                                                }
8965
8966                                                                selectedTeam.positions.forEach(function (position) {
8967                                                                    position.substitutions.forEach(function (substitution) {
8968                                                                        if (substitution.out.playerPosition == 'pitcher') {
8969                                                                            if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
8970                                                                                list.push({ label: substitution.out.number, data: substitution.out });
8971                                                                            }
8972                                                                        }
8973                                                                    })
8974                                                                })
8975
8976                                                                return list;
8977                                                            }
8978                                                        }
8979                                                    ]
8980                                                }
8981                                            }
8982                                        ]
8983                                    }
8984                                },
8985                                {
8986                                    id: 'error',
8987                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advancewitherror.name',
8988                                    step: {
8989                                        type: 'playersproperties',
8990                                        template: 'choice',
8991                                        options: [
8992                                            {
8993                                                id: 'b2',
8994                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
8995                                                step: {
8996                                                    type: 'playersproperties',
8997                                                    template: 'properties',
8998                                                    options: [],
8999                                                    properties: [
9000                                                        { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
9001                                                    ]
9002                                                },
9003                                                visible: function (diamond, player) {
9004                                                    return player.pos < 4;
9005                                                },
9006                                            },
9007                                            {
9008                                                id: 'b3',
9009                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
9010                                                step: {
9011                                                    type: 'playersproperties',
9012                                                    template: 'properties',
9013                                                    options: [],
9014                                                    properties: [
9015                                                        { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
9016                                                    ]
9017                                                },
9018                                                visible: function (diamond, player) {
9019                                                    return player.pos < 5;
9020                                                },
9021                                            },
9022                                            {
9023                                                id: 'b4',
9024                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
9025                                                step: {
9026                                                    type: 'playersproperties',
9027                                                    template: 'properties',
9028                                                    options: [],
9029                                                    properties: [
9030                                                        { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
9031                                                        {
9032                                                            name: 'pitcher',
9033                                                            required: true,
9034                                                            mode: 'number',
9035                                                            getName: function (properties) {
9036                                                                if (properties.earnedpoint.value === true) {
9037                                                                    return properties.earnedpoint.trueValue;
9038                                                                }
9039
9040                                                                return properties.earnedpoint.falseValue;
9041                                                            },
9042                                                            defaultValue: function (selectedTeam) {
9043                                                                return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
9044                                                            },
9045                                                            label: 'directives.scoreboard.baseball.tabStats.pitcher',
9046                                                            list: function (selectedTeam) {
9047                                                                var list = []
9048
9049                                                                var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
9050                                                                if (pitcher) {
9051                                                                    list.push({ label: pitcher.number, data: pitcher });
9052                                                                }
9053
9054                                                                selectedTeam.positions.forEach(function (position) {
9055                                                                    position.substitutions.forEach(function (substitution) {
9056                                                                        if (substitution.out.playerPosition == 'pitcher') {
9057                                                                            if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
9058                                                                                list.push({ label: substitution.out.number, data: substitution.out });
9059                                                                            }
9060                                                                        }
9061                                                                    })
9062                                                                })
9063
9064                                                                return list;
9065                                                            }
9066                                                        },
9067                                                        { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
9068                                                    ]
9069                                                }
9070                                            }
9071                                        ]
9072                                    }
9073                                },
9074                                {
9075                                    id: 'out',
9076                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.runnerout.name',
9077                                    step: {
9078                                        type: 'playersproperties',
9079                                        template: 'choice',
9080                                        options: [
9081                                            {
9082                                                id: 'b2',
9083                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
9084                                                step: {
9085                                                    type: 'playersproperties',
9086                                                    template: 'properties',
9087                                                    options: [],
9088                                                    properties: [
9089                                                        {
9090                                                            name: 'assist',
9091                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
9092                                                            multiple: {
9093                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
9094                                                                getName: function (number) {
9095                                                                    return `assist${number + 1}`;
9096                                                                },
9097                                                                max: 9
9098                                                            },
9099                                                            required: false
9100                                                        },
9101                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
9102                                                    ]
9103                                                },
9104                                                visible: function (diamond, player) {
9105                                                    return player.pos < 4;
9106                                                },
9107                                            },
9108                                            {
9109                                                id: 'b3',
9110                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
9111                                   
9111             step: {
9112                                                    type: 'playersproperties',
9113                                                    template: 'properties',
9114                                                    options: [],
9115                                                    properties: [
9116                                                        {
9117                                                            name: 'assist',
9118                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
9119                                                            multiple: {
9120                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
9121                                                                getName: function (number) {
9122                                                                    return `assist${number + 1}`;
9123                                                                },
9124                                                                max: 9
9125                                                            },
9126                                                            required: false
9127                                                        },
9128                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
9129                                                    ]
9130                                                },
9131                                                visible: function (diamond, player) {
9132                                                    return player.pos < 5;
9133                                                },
9134                                            },
9135                                            {
9136                                                id: 'b4',
9137                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
9138                                                step: {
9139                                                    type: 'playersproperties',
9140                                                    template: 'properties',
9141                                                    options: [],
9142                                                    properties: [
9143                                                        {
9144                                                            name: 'assist',
9145                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
9146                                                            multiple: {
9147                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
9148                                                                getName: function (number) {
9149                                                                    return `assist${number + 1}`;
9150                                                                },
9151                                                                max: 9
9152                                                            },
9153                                                            required: false
9154                                                        },
9155                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
9156                                                    ]
9157                                                }
9158                                            }
9159                                        ]
9160                                    }
9161                                },
9162                            ]
9163                        }
9164                    },
9165                    {
9166                        id: 'runnerpassedball',
9167                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.passedball.name',
9168                        other: [function (player, diamond) {
9169                            var other = { type: 'playersproperties' };
9170
9171                            other.name = 'receiver';
9172                            other.player = _.find(diamond.defense, { pos: 2 });
9173
9174                            return other;
9175                        }],
9176                        step: {
9177                            type: 'category',
9178                            template: 'choice',
9179                            options: [
9180                                {
9181                                    id: '',
9182                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advance.name',
9183                                    step: {
9184                                        type: 'playersproperties',
9185                                        template: 'choice',
9186                                        options: [
9187                                            {
9188                                                id: 'b1',
9189                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b1.name',
9190                                                visible: function (diamond, player) {
9191                                                    return player.pos <= 3;
9192                                                },
9193                                            },
9194                                            {
9195                                                id: 'b2',
9196                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
9197                                                visible: function (diamond, player) {
9198                                                    return player.pos <= 4;
9199                                                },
9200                                            },
9201                                            {
9202                                                id: 'b3',
9203                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
9204                                                visible: function (diamond, player) {
9205                                                    return player.pos <= 5;
9206                                                },
9207                                            },
9208                                            {
9209                                                id: 'b4',
9210                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
9211                                                step: {
9212                                                    type: 'playersproperties',
9213                                                    template: 'properties',
9214                                                    options: [],
9215                                                    properties: [
9216                                                        { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
9217                                                        {
9218                                                            name: 'pitcher',
9219                                                            required: true,
9220                                                            mode: 'number',
9221                                                            getName: function (properties) {
9222                                                                if (properties.earnedpoint.value === true) {
9223                                                                    return properties.earnedpoint.trueValue;
9224                                                                }
9225
9226                                                                return properties.earnedpoint.falseValue;
9227                                                            },
9228                                                            defaultValue: function (selectedTeam) {
9229                                                                return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
9230                                                            },
9231                                                            label: 'directives.scoreboard.baseball.tabStats.pitcher',
9232                                                            list: function (selectedTeam) {
9233                                                                var list = []
9234
9235                                                                var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
9236                                                                if (pitcher) {
9237                                                                    list.push({ label: pitcher.number, data: pitcher });
9238                                                                }
9239
9240                                                                selectedTeam.positions.forEach(function (position) {
9241                                                                    position.substitutions.forEach(function (substitution) {
9242                                                                        if (substitution.out.playerPosition == 'pitcher') {
9243                                                                            if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
9244                                                                                list.push({ label: substitution.out.number, data: substitution.out });
9245                                                                            }
9246                                                                        }
9247                                                                    })
9248                                                                })
9249
9250                                                                return list;
9251                                                            }
9252                                                        }
9253                                                    ]
9254                                                }
9255                                            }
9256                                        ]
9257                                    }
9258                                },
9259                                {
9260                                    id: 'out',
9261                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.runnerout.name',
9262                                    step: {
9263                                        type: 'playersproperties',
9264                                        template: 'choice',
9265                                        options: [
9266                                            {
9267                                                id: 'b1',
9268                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b1.name',
9269                                                step: {
9270                                                    type: 'playersproperties',
9271                                                    template: 'properties',
9272                                                    options: [],
9273                                                    properties: [
9274                                                        {
9275                                                            name: 'assist',
9276                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
9277                                                            multiple: {
9278                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
9279                                                                getName: function (number) {
9280                                                                    return `assist${number + 1}`;
9281                                                                },
9282                                                                max: 9
9283                                                            },
9284                                                            required: false
9285                                                        },
9286                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
9287                                                    ]
9288                                                },
9289                                                visible: function (diamond, player) {
9290                                                    return player.pos <= 3;
9291                                                },
9292                                            },
9293                                            {
9294                                                id: 'b2',
9295                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
9296                                                step: {
9297                                                    type: 'playersproperties',
9298                                                    template: 'properties',
9299                                                    options: [],
9300                                                    properties: [
9301                                                        {
9302                                                            name: 'assist',
9303                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
9304                                                            multiple: {
9305                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
9306                                                                getName: function (number) {
9307                                                                    return `assist${number + 1}`;
9308                                                                },
9309                                                                max: 9
9310                                                            },
9311                                                            required: false
9312                                                        },
9313                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
9314                                                    ]
9315                                                },
9316                                                visible: function (diamond, player) {
9317                                                    return player.pos <= 4;
9318                                                },
9319                                            },
9320                                            {
9321                                                id: 'b3',
9322                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
9323                                                step: {
9324                                                    type: 'playersproperties',
9325                                                    template: 'properties',
9326                                                    options: [],
9327                                                    properties: [
9328                                                        {
9329                                                            name: 'assist',
9330                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
9331                                                            multiple: {
9332                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
9333                                                                getName: function (number) {
9334                                                                    return `assist${number + 1}`;
9335                                                                },
9336                                                                max: 9
9337                                                            },
9338                                                            required: false
9339                                                        },
9340                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
9341                                                    ]
9342                                                },
9343                                                visible: function (diamond, player) {
9344                                                    return player.pos <= 5;
9345                                                },
9346                                            },
9347                                            {
9348                                                id: 'b4',
9349                                                name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
9350                                                step: {
9351                                                    type: 'playersproperties',
9352                                                    template: 'properties',
9353                                                    options: [],
9354                                                    properties: [
9355                                                        {
9356                                                            name: 'assist',
9357                                                            label: 'directives.scoreboard.baseball.tabStats.assists',
9358                                                            multiple: {
9359                                                                label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
9360                                                                getName: function (number) {
9361                                                                    return `assist${number + 1}`;
9362                                                                },
9363                                                                max: 9
9364                                                            },
9365                                                            required: false
9366                                                        },
9367                                                        { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' },
9368                                                    ]
9369                                                }
9370                                            }
9371                                        ]
9372                                    }
9373                                },
9374                            ]
9375                        }
9376                    },
9377                    {
9378                        id: 'advance',
9379                        other: [{ name: 'category', id: 'fielderchoice' }],
9380                        name: 'directives.scoreboard.baseball.tabStats.onBasesTypes.fielderchoice.name',
9381                        step: {
9382                            type: 'playersproperties',
9383                            template: 'choice',
9384                            options: [
9385                                {
9386                                    id: 'b2',
9387                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
9388                                    visible: function (diamond, player) {
9389                                        return player.pos < 4;
9390                                    },
9391                                },
9392                                {
9393                                    id: 'b3',
9394                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
9395                                    visible: function (diamond, player) {
9396                                        return player.pos < 5;
9397                                    },
9398        
9398                        },
9399                                {
9400                                    id: 'b4',
9401                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
9402                                    step: {
9403                                        type: 'playersproperties',
9404                                        template: 'properties',
9405                                        options: [],
9406                                        properties: [
9407                                            { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
9408                                            {
9409                                                name: 'pitcher',
9410                                                required: true,
9411                                                mode: 'number',
9412                                                getName: function (properties) {
9413                                                    if (properties.earnedpoint.value === true) {
9414                                                        return properties.earnedpoint.trueValue;
9415                                                    }
9416
9417                                                    return properties.earnedpoint.falseValue;
9418                                                },
9419                                                defaultValue: function (selectedTeam) {
9420                                                    return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
9421                                                },
9422                                                label: 'directives.scoreboard.baseball.tabStats.pitcher',
9423                                                list: function (selectedTeam) {
9424                                                    var list = []
9425
9426                                                    var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
9427                                                    if (pitcher) {
9428                                                        list.push({ label: pitcher.number, data: pitcher });
9429                                                    }
9430
9431                                                    selectedTeam.positions.forEach(function (position) {
9432                                                        position.substitutions.forEach(function (substitution) {
9433                                                            if (substitution.out.playerPosition == 'pitcher') {
9434                                                                if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
9435                                                                    list.push({ label: substitution.out.number, data: substitution.out });
9436                                                                }
9437                                                            }
9438                                                        })
9439                                                    })
9440
9441                                                    return list;
9442                                                }
9443                                            }
9444                                        ]
9445                                    }
9446                                }
9447                            ]
9448                        }
9449                    }
9450                ]
9451            },
9452            baseonball: {
9453                title: 'directives.scoreboard.baseball.tabStats.out',                
9454                type: 'type',
9455                template: 'choice',
9456                name: 'directives.scoreboard.baseball.tabStats.onBasesTypes.baseonball.name',
9457                options: [
9458                    {
9459                        id: 'ballLimit',                        
9460                        autoGenerateRunners: function (outline, seq, diamond, sequence) {
9461                            var events = [];
9462                            var baseNames = { 3: "b1", 4: "b2", 5: "b3", 6: "b4" };
9463
9464                            outline.forEach(function (outlineStep) {
9465                                if (outlineStep.id == "runner") {
9466                                    var shouldMove = outlineStep.data.pos == 3;
9467
9468                                    if (outlineStep.data.pos > 3) {
9469                                        var playerCount = 0;
9470                                        for (var i = outlineStep.data.pos - 1; i > 2; i--) {
9471                                            if (_.find(diamond.offense, { pos: i })) {
9472                                                playerCount++;
9473                                            }
9474                                        }
9475
9476                                        shouldMove = playerCount == outlineStep.data.pos - 3;
9477                                    }
9478
9479                                    var runnerEvent = {
9480                                        seq: seq++,
9481                                        type: shouldMove ? "advance" : "none",
9482                                        category: null,
9483                                        playersproperties: [{
9484                                            seq: 1,
9485                                            name: baseNames[outlineStep.data.pos + (shouldMove * 1)],
9486                                            id: outlineStep.data.id,
9487                                            pos: outlineStep.data.pos,
9488                                            row: outlineStep.data.row,
9489                                            number: outlineStep.data.playerNumber,
9490                                            teamid: outlineStep.data.teamId
9491                                        }]
9492                                    }
9493
9494                                    if (shouldMove && outlineStep.data.pos === 5) {
9495                                        var ballLimitEvent = _.find(sequence, { type: 'ballLimit' });
9496                                        runnerEvent.playersproperties = runnerEvent.playersproperties.concat(ballLimitEvent.playersproperties);
9497                                        _.remove(sequence, { type: 'ballLimit' });                                                                      
9498                                    }
9499
9500                                    events.push(runnerEvent);
9501                                }
9502                            })
9503
9504                            return events;
9505                        },
9506                        step: {
9507                            type: 'playersproperties',
9508                            template: 'properties',
9509                            options: [],
9510                            condition: function (diamond) {
9511                                var thirdBasePlayer = _.findIndex(diamond.offense, { playerPosition: 'thirdbase' }) != -1;
9512                                var shouldMove = false;
9513                                if (thirdBasePlayer) {
9514                                    var playerCount = 0;
9515                                    for (var i = 4; i > 2; i--) {
9516                                        if (_.find(diamond.offense, { pos: i })) {
9517                                            playerCount++;
9518                                        }
9519                                    }
9520
9521                                    shouldMove = playerCount == 2;
9522                                }
9523                                return shouldMove;
9524                            },
9525                            properties: [
9526                                { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
9527                                {
9528                                    name: 'pitcher',
9529                                    required: true,
9530                                    mode: 'number',
9531                                    getName: function (properties) {
9532                                        if (properties.earnedpoint.value === true) {
9533                                            return properties.earnedpoint.trueValue;
9534                                        }
9535
9536                                        return properties.earnedpoint.falseValue;
9537                                    },
9538                                    defaultValue: function (selectedTeam) {
9539                                        return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
9540                                    },
9541                                    label: 'directives.scoreboard.baseball.tabStats.pitcher',
9542                                    list: function (selectedTeam) {
9543                                        var list = []
9544
9545                                        var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
9546                                        if (pitcher) {
9547                                            list.push({ label: pitcher.number, data: pitcher });
9548                                        }
9549
9550                                        selectedTeam.positions.forEach(function (position) {
9551                                            position.substitutions.forEach(function (substitution) {
9552                                                if (substitution.out.playerPosition == 'pitcher') {
9553                                                    if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
9554                                                        list.push({ label: substitution.out.number, data: substitution.out });
9555                                                    }
9556                                                }
9557                                            })
9558                                        })
9559
9560                                        return list;
9561                                    }
9562                                }
9563                            ]
9564                        }
9565                    }
9566                ],
9567            
9568                step: {}
9569            },
9570            strikeout: {
9571                id: 'strikeout',
9572                name: 'directives.scoreboard.baseball.tabStats.outsTypes.strikeout.name',
9573                autoGenerateRunners: function (outline, seq) {
9574                    var events = [];
9575                    var baseNames = { 3: "b1", 4: "b2", 5: "b3" };
9576                    outline.forEach(function (outlineStep) {
9577                        if (outlineStep.id == "runner") {
9578                            var runnerEvent = {
9579                                seq: seq++,
9580                                type: "none",
9581                                category: null,
9582                                playersproperties: [{
9583                                    seq: 1,
9584                                    name: baseNames[outlineStep.data.pos],
9585                                    id: outlineStep.data.id,
9586                                    pos: outlineStep.data.pos,
9587                                    row: outlineStep.data.row,
9588                                    number: outlineStep.data.playerNumber,
9589                                    teamid: outlineStep.data.teamId
9590                                }
9591                                ]
9592
9593                            }
9594                            events.push(runnerEvent);
9595                        }
9596                    })
9597
9598                    return events;
9599                },
9600                type: '',
9601                template: 'choice',
9602                options: [
9603                    {
9604                        id: 'out',
9605                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.runnerout.name',
9606                        other: [{ name: 'category', id: 'uncaughtthirdstrike' }, { name: 'group', id: 'out' }, { name: 'type', id: 'strikeout' }],
9607                        step: {
9608                            type: 'playersproperties',
9609                            template: 'properties',
9610                            options: [],
9611                            properties: [
9612                                {
9613                                    name: 'assist',
9614                                    label: 'directives.scoreboard.baseball.tabStats.assists',
9615                                    multiple: {
9616                                        label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
9617                                        getName: function (number) {
9618                                            return `assist${number + 1}`;
9619                                        },
9620                                        max: 9
9621                                    },
9622                                    required: false
9623                                },
9624                                { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
9625                            ]
9626                        }
9627                    },
9628                    {
9629                        id: 'advance',
9630                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advance.name',
9631                        other: [{ name: 'category', id: 'uncaughtthirdstrike' }, { name: 'group', id: 'out' }, { name: 'type', id: 'strikeout' }],
9632                        step: {
9633                            template: 'choice',
9634                            options: [
9635                                {
9636                                    id: 'badpitch',
9637                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.badpitch.name',
9638                                    other: [function (player, diamond) {
9639                                        var other = { type: 'playersproperties' };
9640
9641                                        other.name = 'pitcher';
9642                                        other.player = _.find(diamond.defense, { pos: 1 });
9643
9644                                        return other;
9645
9646                                    }],
9647                                },
9648                                {
9649                                    id: 'passedball',
9650                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.passedball.name',
9651                                    other: [function (player, diamond) {
9652                                        var other = { type: 'playersproperties' };
9653
9654                                        other.name = 'receiver';
9655                                        other.player = _.find(diamond.defense, { pos: 2 });
9656
9657                                        return other;
9658
9659                                    }],
9660                                }
9661                            ]
9662                        }
9663                    },
9664                    {
9665                        id: 'error',
9666                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.error.name',
9667                        other: [{ name: 'category', id: 'uncaughtthirdstrike' }, { name: 'group', id: 'out' }, { name: 'type', id: 'strikeout' }],
9668                        step: {
9669                            type: 'playersproperties',
9670                            template: 'properties',
9671                            options: [],
9672                            properties: [
9673                                { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
9674                            ]
9675                        }
9676                    }
9677                ]
9678            }
9679        });
9680
9681
9682    angular
9683        .module('app.directives')
9684        .value('scoreboardBaseballRunnerSteps', {
9685            hitter: {
9686                title: 'directives.scoreboard.baseball.tabStats.baserunner',
9687                type: 'type',
9688                template: 'choice',
9689                onConfirm: function (selectedStep) {
9690                    if (mode_self.selectedPlayerProperties() != null) {
9691                        playerToData(selectedStep.type, mode_self.selectedPlayerProperties());
9692                    }
9693
9694                    mode_self.createEvent();
9695                },
9696                options: [
9697                    {
9698                        id: 'advance',
9699                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advance.name',
9700                        step: {
9701                            type: 'playersproperties',
9702                            template: 'choice',
9703                            options: [
9704                                {
9705                                    id: 'b2',
9706                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
9707                                    visible: function (diamond, player) {
9708                                        return player.pos < 4;
9709                                    },
9710                                },
9711                                {
9712                                    id: 'b3',
9713                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
9714                                    visible: function (diamond, player) {
9715                                        return player.pos < 5;
9716                                    },
9717                                },
9718                                {
9719                                    id: 'b4',
9720                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
9721                                    step: {
9722                                        type: 'playersproperties',
9723                                        template: 'properties',
9724                                        options: [],
9725                                        properties: [
9726                                            { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
9727                                            {
9728                                                name: 'pitcher',
9729                                                required: true,
9730                                                mode: 'number',
9731                                                getName: function (properties) {
9732                                                    if (properties.earnedpoint.value === true) {
9733                                                        return properties.earnedpoint.trueValue;
9734                                                    }
9735
9736                                                    return properties.earnedpoint.falseValue;
9737                                                },
9738                                                defaultValue: function (selectedTeam) {
9739                                                    return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
9740                                                },
9741                                                label: 'directives.scoreboard.baseball.tabStats.pitcher',
9742                                                list: function (selectedTeam) {
9743                                                    var list = []
9744
9745                                                    var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
9746                                                    if (pitcher) {
9747                                                        list.push({ label: pitcher.number, data: pitcher });
9748                                                    }
9749
9750                                                    selectedTeam.positions.forEach(function (position) {
9751                                                        position.substitutions.forEach(function (substitution) {
9752                                                            if (substitution.out.playerPosition == 'pitcher') {
9753                                                                if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
9754                                                                    list.push({ label: substitution.out.number, data: substitution.out });
9755                                                                }
9756                                                            }
9757                                                        })
9758                                                    })
9759
9760                                                    return list;
9761                                                }
9762                                            }
9763                                        ]
9764                                    }
9765                                }
9766                            ]
9767                        }
9768                    },
9769                    {
9770                        id: 'advance',
9771                        other: [{ name: 'category', id: 'error' }],
9772                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advancewitherror.name',
9773                        step: {
9774                            type: 'playersproperties',
9775                            template: 'choice',
9776                            options: [
9777                                {
9778                                    id: 'b2',
9779                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
9780                                    step: {
9781                                        type: 'playersproperties',
9782                                        template: 'properties',
9783                                        options: [],
9784                                        properties: [
9785                                            { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
9786                                        ]
9787                                    },
9788                                    visible: function (diamond, player) {
9789                                        return player.pos < 4;
9790                                    },
9791                                },
9792                                {
9793                                    id: 'b3',
9794                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
9795                                    step: {
9796                                        type: 'playersproperties',
9797                                        template: 'properties',
9798                                        options: [],
9799                                        properties: [
9800                                            { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
9801                                        ]
9802                                    },
9803                                    visible: function (diamond, player) {
9804                                        return player.pos < 5;
9805                                    },
9806                                },
9807                                {
9808                                    id: 'b4',
9809                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
9810                                    step: {
9811                                        type: 'playersproperties',
9812                                        template: 'properties',
9813                                        options: [],
9814                                        properties: [
9815                                            { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
9816                                            {
9817                                                name: 'pitcher',
9818                                                required: true,
9819                                                mode: 'number',
9820                                                getName: function (properties) {
9821                                                    if (properties.earnedpoint.value === true) {
9822                                                        return properties.earnedpoint.trueValue;
9823                                                    }
9824
9825                                                    return properties.earnedpoint.falseValue;
9826                                                },
9827                                                defaultValue: function (selectedTeam) {
9828                                                    return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
9829                                                },
9830                                                label: 'directives.scoreboard.baseball.tabStats.pitcher',
9831                                                list: function (selectedTeam) {
9832                                                    var list = []
9833
9834                                                    var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
9835                                                    if (pitcher) {
9836                                                        list.push({ label: pitcher.number, data: pitcher });
9837                                                    }
9838
9839                                                    selectedTeam.positions.forEach(function (position) {
9840                                                        position.substitutions.forEach(function (substitution) {
9841                                                            if (substitution.out.playerPosition == 'pitcher') {
9842                                                                if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
9843                                                                    list.push({ label: substitution.out.number, data: substitution.out });
9844                                                                }
9845                                                            }
9846                                                        })
9847                                                    })
9848
9849                                                    return list;
9850                                                }
9851                                            },
9852                                            { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
9853                                        ]
9854                                    }
9855                                }
9856                            ]
9857                        }
9858                    },
9859                    {
9860                        id: 'advance',
9861                        other: [{ name: 'category', id: 'relay' }],
9862                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.relay.name',
9863                        step: {
9864                            type: 'playersproperties',
9865                            template: 'choice',
9866                            options: [
9867                                {
9868                                    id: 'b2',
9869                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
9870                                    visible: function (diamond, player) {
9871                                        return player.pos < 4;
9872                                    },
9873                                },
9874                                {
9875                                    id: 'b3',
9876                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
9877                                    visible: function (diamond, player) {
9878                                        return player.pos < 5;
9879                                    },
9880                                },
9881                                {
9882                                    id: 'b4',
9883                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
9884                                    step: {
9885                                        type: 'playersproperties',
9886                                        template: 'properties',
9887                                        options: [],
9888                                        properties: [
9889                                            { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
9890                                            {
9891                                                name: 'pitcher',
9892                                                required: true,
9893                                                mode: 'number',
9894                                                getName: function (properties) {
9895                                                    if (properties.earnedpoint.value === true) {
9896                                                        return properties.earnedpoint.trueValue;
9897                                                    }
9898
9899                                                    return properties.earnedpoint.falseValue;
9900                                                },
9901                                                defaultValue: function (selectedTeam) {
9902                                                    return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
9903                                                },
9904                                                label: 'directives.scoreboard.baseball.tabStats.pitcher',
9905                                                list: function (selectedTeam) {
9906                                                    var list = []
9907
9908                                                    var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
9909                                                    if (pitcher) {
9910                                                        list.push({ label: pitcher.number, data: pitcher });
9911                                                    }
9912
9913                                                    selectedTeam.positions.forEach(function (position) {
9914                                                        position.substitutions.forEach(function (substitution) {
9915                                                            if (substitution.out.playerPosition
9915 == 'pitcher') {
9916                                                                if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
9917                                                                    list.push({ label: substitution.out.number, data: substitution.out });
9918                                                                }
9919                                                            }
9920                                                        })
9921                                                    })
9922
9923                                                    return list;
9924                                                }
9925                                            }
9926                                        ]
9927                                    }
9928                                }
9929                            ]
9930                        }
9931                    },
9932                    {
9933                        id: 'runnerout',
9934                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.runnerout.name',
9935                        step: {
9936                            type: 'playersproperties',
9937                            template: 'choice',
9938                            options: [
9939                                {
9940                                    id: 'b1',
9941                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b1.name',
9942                                    step: {
9943                                        type: 'playersproperties',
9944                                        template: 'properties',
9945                                        options: [],
9946                                        properties: [
9947                                            {
9948                                                name: 'assist',
9949                                                label: 'directives.scoreboard.baseball.tabStats.assists',
9950                                                multiple: {
9951                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
9952                                                    getName: function (number) {
9953                                                        return `assist${number + 1}`;
9954                                                    },
9955                                                    max: 9
9956                                                },
9957                                                required: false
9958                                            },
9959                                            { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
9960                                        ]
9961                                    },
9962                                    visible: function (diamond, player) {
9963                                        return player.pos <= 3;
9964                                    },
9965                                },
9966                                {
9967                                    id: 'b2',
9968                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
9969                                    step: {
9970                                        type: 'playersproperties',
9971                                        template: 'properties',
9972                                        options: [],
9973                                        properties: [
9974                                            {
9975                                                name: 'assist',
9976                                                label: 'directives.scoreboard.baseball.tabStats.assists',
9977                                                multiple: {
9978                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
9979                                                    getName: function (number) {
9980                                                        return `assist${number + 1}`;
9981                                                    },
9982                                                    max: 9
9983                                                },
9984                                                required: false
9985                                            },
9986                                            { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
9987                                        ]
9988                                    },
9989                                    visible: function (diamond, player) {
9990                                        return player.pos <= 4;
9991                                    },
9992                                },
9993                                {
9994                                    id: 'b3',
9995                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
9996                                    step: {
9997                                        type: 'playersproperties',
9998                                        template: 'properties',
9999                                        options: [],
10000                                        properties: [
10001                                            {
10002                                                name: 'assist',
10003                                                label: 'directives.scoreboard.baseball.tabStats.assists',
10004                                                multiple: {
10005                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
10006                                                    getName: function (number) {
10007                                                        return `assist${number + 1}`;
10008                                                    },
10009                                                    max: 9
10010                                                },
10011                                                required: false
10012                                            },
10013                                            { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
10014                                        ]
10015                                    },
10016                                    visible: function (diamond, player) {
10017                                        return player.pos <= 5;
10018                                    },
10019                                },
10020                                {
10021                                    id: 'b4',
10022                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
10023                                    step: {
10024                                        type: 'playersproperties',
10025                                        template: 'properties',
10026                                        options: [],
10027                                        properties: [
10028                                            {
10029                                                name: 'assist',
10030                                                label: 'directives.scoreboard.baseball.tabStats.assists',
10031                                                multiple: {
10032                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
10033                                                    getName: function (number) {
10034                                                        return `assist${number + 1}`;
10035                                                    },
10036                                                    max: 9
10037                                                },
10038                                                required: false
10039                                            },
10040                                            { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
10041                                        ]
10042                                    }
10043                                }
10044                            ]
10045                        }
10046                    }
10047                ]
10048            },
10049            runner: {
10050                id: 'runner',
10051                title: 'directives.scoreboard.baseball.tabStats.baserunner',
10052                type: 'type',
10053                template: 'choice',
10054                allowSelectRunner: false,
10055                onConfirm: function (selectedStep) {
10056                    if (mode_self.selectedPlayerProperties() != null) {
10057                        playerToData(selectedStep.type, mode_self.selectedPlayerProperties());
10058                    }
10059
10060                    mode_self.createEvent();
10061                },
10062                options: [
10063                    {
10064                        id: 'advance',
10065                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advance.name',
10066                        step: {
10067                            type: 'playersproperties',
10068                            template: 'choice',
10069                            options: [
10070                                {
10071                                    id: 'b2',
10072                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
10073                                    visible: function (diamond, player) {
10074                                        return player.pos < 4;
10075                                    },
10076                                },
10077                                {
10078                                    id: 'b3',
10079                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
10080                                    visible: function (diamond, player) {
10081                                        return player.pos < 5;
10082                                    },
10083                                },
10084                                {
10085                                    id: 'b4',
10086                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
10087                                    step: {
10088                                        type: 'playersproperties',
10089                                        template: 'properties',
10090                                        options: [],
10091                                        properties: [
10092                                            { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
10093                                            {
10094                                                name: 'pitcher',
10095                                                required: true,
10096                                                mode: 'number',
10097                                                getName: function (properties) {
10098                                                    if (properties.earnedpoint.value === true) {
10099                                                        return properties.earnedpoint.trueValue;
10100                                                    }
10101
10102                                                    return properties.earnedpoint.falseValue;
10103                                                },
10104                                                defaultValue: function (selectedTeam) {
10105                                                    return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
10106                                                },
10107                                                label: 'directives.scoreboard.baseball.tabStats.pitcher',
10108                                                list: function (selectedTeam) {
10109                                                    var list = []
10110
10111                                                    var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
10112                                                    if (pitcher) {
10113                                                        list.push({ label: pitcher.number, data: pitcher });
10114                                                    }
10115
10116                                                    selectedTeam.positions.forEach(function (position) {
10117                                                        position.substitutions.forEach(function (substitution) {
10118                                                            if (substitution.out.playerPosition == 'pitcher') {
10119                                                                if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
10120                                                                    list.push({ label: substitution.out.number, data: substitution.out });
10121                                                                }
10122                                                            }
10123                                                        })
10124                                                    })
10125
10126                                                    return list;
10127                                                }
10128                                            },
10129                                            {
10130                                                name: 'rbi',
10131                                                getPlayer: function (value, sequence) {
10132                                                    if (value) {
10133                                                        return sequence.hitter
10134                                                    }
10135
10136                                                    return null;
10137                                                },
10138                                                required: true,
10139                                                defaultValue: true,
10140                                                type: 'checkbox',
10141                                                label: 'directives.scoreboard.baseball.tabStats.runBattedIn'
10142                                            },
10143                                        ]
10144                                    }
10145                                }
10146                            ]
10147                        }
10148                    },
10149                    {
10150                        id: 'advance',
10151                        other: [{ name: 'category', id: 'error' }],
10152                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.advancewitherror.name',
10153                        step: {
10154                            type: 'playersproperties',
10155                            template: 'choice',
10156                            options: [
10157                                {
10158                                    id: 'b2',
10159                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
10160                                    step: {
10161                                        type: 'playersproperties',
10162                                        template: 'properties',
10163                                        options: [],
10164                                        properties: [
10165                                            { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' }
10166                                        ]
10167                                    },
10168                                    visible: function (diamond, player) {
10169                                        return player.pos < 4;
10170                                    },
10171                                },
10172                                {
10173                                    id: 'b3',
10174                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
10175                                    step: {
10176                                        type: 'playersproperties',
10177                                        template: 'properties',
10178                                        options: [],
10179                                        properties: [
10180                                            { name: 'error', required: true, label: 'directives.scoreboard.basebal
10180l.tabStats.errorNumber' }
10181                                        ]
10182                                    },
10183                                    visible: function (diamond, player) {
10184                                        return player.pos < 5;
10185                                    },
10186                                },
10187                                {
10188                                    id: 'b4',
10189                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
10190                                    step: {
10191                                        type: 'playersproperties',
10192                                        template: 'properties',
10193                                        options: [],
10194                                        properties: [
10195                                            { name: 'earnedpoint', required: true, defaultValue: true, trueValue: 'earnedruns', falseValue: 'unearnedruns', type: 'checkbox', label: 'directives.scoreboard.baseball.tabStats.earnedPoint' },
10196                                            {
10197                                                name: 'pitcher',
10198                                                required: true,
10199                                                mode: 'number',
10200                                                getName: function (properties) {
10201                                                    if (properties.earnedpoint.value === true) {
10202                                                        return properties.earnedpoint.trueValue;
10203                                                    }
10204
10205                                                    return properties.earnedpoint.falseValue;
10206                                                },
10207                                                defaultValue: function (selectedTeam) {
10208                                                    return _.find(selectedTeam.positions, { playerPosition: 'pitcher' })
10209                                                },
10210                                                label: 'directives.scoreboard.baseball.tabStats.pitcher',
10211                                                list: function (selectedTeam) {
10212                                                    var list = []
10213
10214                                                    var pitcher = angular.extend(_.find(selectedTeam.positions, { playerPosition: 'pitcher' }));
10215                                                    if (pitcher) {
10216                                                        list.push({ label: pitcher.number, data: pitcher });
10217                                                    }
10218
10219                                                    selectedTeam.positions.forEach(function (position) {
10220                                                        position.substitutions.forEach(function (substitution) {
10221                                                            if (substitution.out.playerPosition == 'pitcher') {
10222                                                                if (!list.filter(function (p) { return p.id === substitution.out.id; }).length > 0) {
10223                                                                    list.push({ label: substitution.out.number, data: substitution.out });
10224                                                                }
10225                                                            }
10226                                                        })
10227                                                    })
10228
10229                                                    return list;
10230                                                }
10231                                            },
10232                                            { name: 'error', required: true, label: 'directives.scoreboard.baseball.tabStats.errorNumber' },
10233                                            {
10234                                                name: 'rbi',
10235                                                getPlayer: function (value, sequence) {
10236                                                    if (value) {
10237                                                        return sequence.hitter
10238                                                    }
10239
10240                                                    return null;
10241                                                },
10242                                                required: true,
10243                                                defaultValue: true,
10244                                                type: 'checkbox',
10245                                                label: 'directives.scoreboard.baseball.tabStats.runBattedIn'
10246                                            },
10247                                        ]
10248                                    }
10249                                }
10250                            ]
10251                        }
10252                    },
10253                    {
10254                        id: 'runnerout',
10255                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.runnerout.name',
10256                        step: {
10257                            type: 'playersproperties',
10258                            template: 'choice',
10259                            options: [
10260                                {
10261                                    id: 'b1',
10262                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b1.name',
10263                                    step: {
10264                                        type: 'playersproperties',
10265                                        template: 'properties',
10266                                        options: [],
10267                                        properties: [
10268                                            {
10269                                                name: 'assist',
10270                                                label: 'directives.scoreboard.baseball.tabStats.assists',
10271                                                multiple: {
10272                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
10273                                                    getName: function (number) {
10274                                                        return `assist${number + 1}`;
10275                                                    },
10276                                                    max: 9
10277                                                },
10278                                                required: false
10279                                            },
10280                                            { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
10281                                        ]
10282                                    },
10283                                    visible: function (diamond, player) {
10284                                        return player.pos <= 3;
10285                                    },
10286                                },
10287                                {
10288                                    id: 'b2',
10289                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b2.name',
10290                                    step: {
10291                                        type: 'playersproperties',
10292                                        template: 'properties',
10293                                        options: [],
10294                                        properties: [
10295                                            {
10296                                                name: 'assist',
10297                                                label: 'directives.scoreboard.baseball.tabStats.assists',
10298                                                multiple: {
10299                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
10300                                                    getName: function (number) {
10301                                                        return `assist${number + 1}`;
10302                                                    },
10303                                                    max: 9
10304                                                },
10305                                                required: false
10306                                            },
10307                                            { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
10308                                        ]
10309                                    },
10310                                    visible: function (diamond, player) {
10311                                        return player.pos <= 4;
10312                                    },
10313                                },
10314                                {
10315                                    id: 'b3',
10316                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b3.name',
10317                                    step: {
10318                                        type: 'playersproperties',
10319                                        template: 'properties',
10320                                        options: [],
10321                                        properties: [
10322                                            {
10323                                                name: 'assist',
10324                                                label: 'directives.scoreboard.baseball.tabStats.assists',
10325                                                multiple: {
10326                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
10327                                                    getName: function (number) {
10328                                                        return `assist${number + 1}`;
10329                                                    },
10330                                                    max: 9
10331                                                },
10332                                                required: false
10333                                            },
10334                                            { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
10335                                        ]
10336                                    },
10337                                    visible: function (diamond, player) {
10338                                        return player.pos <= 5;
10339                                    },
10340                                },
10341                                {
10342                                    id: 'b4',
10343                                    name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.b4.name',
10344                                    step: {
10345                                        type: 'playersproperties',
10346                                        template: 'properties',
10347                                        options: [],
10348                                        properties: [
10349                                            {
10350                                                name: 'assist',
10351                                                label: 'directives.scoreboard.baseball.tabStats.assists',
10352                                                multiple: {
10353                                                    label: 'directives.scoreboard.baseball.tabStats.assistNumberN',
10354                                                    getName: function (number) {
10355                                                        return `assist${number + 1}`;
10356                                                    },
10357                                                    max: 9
10358                                                },
10359                                                required: false
10360                                            },
10361                                            { name: 'out', required: true, label: 'directives.scoreboard.baseball.tabStats.outNumber' }
10362                                        ]
10363                                    }
10364                                }
10365                            ]
10366                        }
10367                    },
10368                    {
10369                        id: 'none',
10370                        other: [function (data) {
10371                            var pos_name = {
10372                                2: 'b4',
10373                                3: 'b1',
10374                                4: 'b2',
10375                                5: 'b3'
10376                            }
10377
10378                            var other = { type: 'playersproperties' };
10379                            other.name = pos_name[data.pos];
10380                            other.player = data;
10381
10382                            return other;
10383                        }],
10384
10385                        name: 'directives.scoreboard.baseball.tabStats.baserunnerTypes.none.name',
10386                    },
10387                ]
10388            }
10389        });
10390})();
10391;
10392(function () {
10393    'use strict';
10394
10395    angular
10396        .module('app.directives')
10397        .controller('ScoreboardBaseballActionsController', ScoreboardBaseballActionsController);
10398
10399    ScoreboardBaseballActionsController.$inject = ['$rootScope', '$scope', '$timeout', '$localStorage', '$translate', 'ScoreboardBaseballService', 'scoreboardBaseballSteps', 'scoreboardBaseballRunnerSteps'];
10400
10401    function ScoreboardBaseballActionsController($rootScope, $scope, $timeout, $localStorage, $translate, scoreboardBaseballService, scoreboardBaseballSteps, scoreboardBaseballRunnerSteps) {
10402        var vm = this;
10403
10404        vm.formatInningName = function (period, pos) {
10405            if (pos == 1) {
10406                return $translate.instant('widgets.games.scoreboard.baseball.tab-stats.history.scoreboardBaseballHistory.startOf') + ' ' + period;
10407            } else {
10408                return $translate.instant('widgets.games.scoreboard.baseball.tab-stats.history.scoreboardBaseballHistory.endOf') + ' ' + period;
10409            }
10410        }
10411
10412        vm.isActionBoxShown = false;
10413        vm.selectedRootStep = null;
10414        vm.stepsTrace = [];
10415        vm.selectedPlayerProperties = null;
10416        vm.stepsOutline = [];
10417
10418        vm.currentOutline = 0;
10419        vm.sequence = $scope.sequence;
10420        vm.lineup = $scope.lineup;
10421        vm.target = null;
10422        vm.popupMode = 'list';
10423        vm.selectedProperty = null;
10424        vm.defenseTeam = null;
10425        vm.offenseTeam = null;
10426        vm.diamond = null;
10427        vm.selectedTeam = null;
10428        vm.pitcherPitchCount = { pitch: 0, strike: 0, ball: 0 }
10429
10430        vm.playerPopup = {
10431            visible: false,
10432            top: 0,
10433            left: 0,
10434            calculatingOverflow: false
10435        };
10436
10437        vm.getDefenseTeam = function () {
10438            var defenseTeamId = vm.diamond.defense[0].teamId;
10439            var defenseTeam = _.find(vm.lineup.teams, { teamId: defenseTeamId });
10440
10441            return defenseTeam;
10442        }
10443
10444        vm.getOffenseTeam = function () {
10445            var defenseTeamId = vm.diamond.defense[0].teamId;
10446            var offenseTeam = _.find(vm.lineup.teams, function (team) { return team.teamId != defenseTeamId });
10447
10448            return offenseTeam;
10449        }
10450
10451        $scope.$watchGroup(['sequence', 'lineup', 'diamond'], function (newValues) {
10452            vm.sequence = newValues[0];
10453            vm.lineup = newValues[1];
10454            vm.diamond = newValues[2];
10455
10456            if (vm.sequence && vm.lineup && vm.diamond) {
10457                vm.defenseTeam = vm.getDefenseTeam();
10458                vm.offenseTeam = vm.getOffenseTeam();
10459                processSequence(vm.sequence);
10460            }
10461        })
10462
10463
10464
10465        $scope.$watch(function () {
10466            return $scope.selectedPlayer;
10467        }, function (selectedPlayer) {
10468            if (selectedPlayer) {
10469                if (selectedPlayer.isDefense == false) {
10470                    vm.showActionBox('baserunners', selectedPlayer, false)
10471                }
10472                else {
10473                    vm.showActionBox('misc', selectedPlayer, false);
10474                }
10475            }
10476        }, true)
10477
10478        vm.closePopup = function () {
10479            vm.playerPopup.visible = false;
10480        }
10481
10482        vm.choosePlayer = function (player) {
10483            vm.selectedProper
10483ty.player = player;
10484            vm.closePopup();
10485        }
10486
10487        vm.openPlayerPopup = function (playerPropertie, event) {
10488            event.stopPropagation();
10489            vm.closePopup();
10490
10491            vm.target = event.target;
10492
10493            vm.selectedProperty = playerPropertie;
10494
10495            if (playerPropertie.list) {
10496                vm.playerList = playerPropertie.list(vm.defenseTeam);
10497            }
10498            else {
10499                vm.playerList = vm.filterPositions(vm.defenseTeam.positions);
10500            }
10501
10502            vm.playerPopup.calculatingOverflow = true;
10503            vm.playerPopup.visible = true;
10504            vm.playerPopup.top = $(event.currentTarget).position().top;
10505            vm.playerPopup.left = $(event.currentTarget).position().left + $(event.currentTarget).outerWidth() + 1;
10506            vm.playerPopup.action = vm.choosePlayer;
10507            vm.playerPopup.team = vm.defenseTeam;
10508
10509            $timeout(function () {
10510                var overflow = vm.getPlayerPopupOverflow();                
10511                vm.playerPopup.top = vm.playerPopup.top - overflow;
10512                vm.playerPopup.calculatingOverflow = false;
10513            })
10514
10515            vm.setDocumentEvent();
10516        }
10517
10518        vm.openPitcherPopup = function (pitcher, event) {
10519            event.stopPropagation();
10520            vm.closePopup();
10521
10522            vm.selectedProperty = pitcher;
10523            vm.target = event.target;
10524
10525            var playerList = [];
10526            var pitcherTeam = _.find(vm.lineup.teams, { teamId: pitcher.teamId })
10527            pitcherTeam.positions.forEach(function (player) {
10528                if (player.playerPosition == 'pitcher') {
10529                    playerList.push({ label: player.number, data: player });
10530                    if(pitcher.seq !== 3) {
10531                        vm.currentPitcherName = player.playerName
10532                    }
10533                }
10534
10535                (player.substitutions || []).forEach(function (substitution) {
10536                    if (substitution.out.playerPosition == 'pitcher') {
10537                        playerList.push({ label: substitution.out.number, data: substitution.out });
10538                    }
10539                })
10540            })
10541
10542            vm.playerList = playerList;
10543            vm.playerPopup.visible = true;
10544            vm.playerPopup.top = $(event.target).position().top;
10545            vm.playerPopup.left = $(event.target).position().left + $(event.target).outerWidth() + 1;
10546            vm.playerPopup.action = function (newPitcher) { vm.choosePitcher(pitcher, newPitcher) };
10547            vm.playerPopup.team = pitcherTeam;
10548        }
10549
10550        vm.choosePitcher = function (editedPitcher, newPitcher) {
10551            editedPitcher.id = newPitcher.id;
10552            editedPitcher.number = newPitcher.number;
10553            vm.closePopup();
10554        }
10555
10556        vm.filterPositions = function (positions) {
10557            var positionToFilter = ['designatedhitter', 'extrahitter'];
10558            var sortedPositions = _.sortBy(_.filter(positions, function (position) {
10559                return _.indexOf(positionToFilter, position.playerPosition) == -1;
10560            }), 'pos');
10561
10562            return _.map(sortedPositions, function (position) {
10563                return { label: position.pos, data: position }
10564            });
10565        }
10566
10567        vm.showActionBox = function (type, data, showRunners) {
10568            var outline = [];
10569            var step = scoreboardBaseballSteps[type];
10570
10571            if (data) {
10572                if (data.id == vm.sequence.hitter.id) {
10573                    step = scoreboardBaseballRunnerSteps.hitter
10574                }
10575
10576                step = $.extend({}, step, { data: data });
10577            } else {
10578                $scope.onSelectPlayer(vm.sequence.hitter.id);
10579            }
10580
10581            outline.push(step);
10582
10583            if (showRunners !== false) {
10584                vm.getRunners().forEach(function (runner) {
10585                    var steps = $.extend({}, scoreboardBaseballRunnerSteps.runner, { data: runner });
10586
10587                    outline.push(steps);
10588                });
10589            }
10590
10591            vm.currentOutline = 0;
10592            vm.stepsOutline = outline;
10593            vm.selectedRootStep = vm.stepsOutline[0];
10594            vm.selectedStep = vm.stepsOutline[0];
10595            vm.isActionBoxShown = true;
10596        }
10597
10598        vm.getRunners = function (offsetPlayers) {
10599            var runner_pos = [5, 4, 3];
10600            var runners = [];
10601
10602            runner_pos.forEach(function (runner_pos) {
10603                var runner = _.find(vm.diamond.offense, { pos: runner_pos });
10604                if (runner) {
10605                    runners.push(runner);
10606                }
10607            })
10608
10609            return runners;
10610        }
10611
10612        vm.optionIsVisible = function (option) {
10613            if (option.visible) {
10614                if (angular.isFunction(option.visible)) {
10615                    return option.visible(vm.diamond, vm.stepsOutline[vm.currentOutline].data);
10616                }
10617
10618                return option.visible;
10619            }
10620            return true;
10621        }
10622
10623        vm.onAction = function (sequence) {
10624            if ($scope.onAction) {
10625                $scope.onAction(sequence);
10626            }
10627        }
10628
10629        vm.goToStep = function (type, option, data) {
10630            vm.selectedPlayerProperties = null;
10631
10632            if (type === 'playersproperties') {
10633                var properties = {};
10634                properties.player = vm.stepsOutline[vm.currentOutline].data;
10635                if (vm.selectedStep.getData && angular.isFunction(vm.selectedStep.getData)) {
10636                    properties.player = vm.selectedStep.getData(vm.diamond);
10637                }
10638                properties.name = vm.selectedStep.options[option].id;                
10639                playerToData(type, [properties]);
10640            }
10641            else {
10642                var other = [];
10643                var extras = {};
10644                
10645                var chosenStep = vm.selectedStep.options[option];
10646                if (chosenStep.other) {
10647                    chosenStep.other.forEach(function (_other) {
10648                        if (typeof _other == 'function') {
10649                            var otherValue = _other(vm.stepsOutline[vm.currentOutline].data, vm.diamond);
10650                            if (otherValue != null) {
10651                                other.push(otherValue);
10652                            }                            
10653                        }
10654                        else {
10655                            other.push(_other);
10656                        }
10657                    })
10658                }
10659
10660                if (chosenStep.autoGenerateRunners) {
10661                    extras.autoGenerateRunners = chosenStep.autoGenerateRunners;
10662                }
10663
10664                vm.validateStep(type, option, data, other, extras);
10665            }
10666
10667            if (option != null) {
10668                var hasStep = vm.selectedStep.options[option].step
10669                if (vm.selectedStep.options[option].step && vm.selectedStep.options[option].step.condition) {
10670                    hasStep = vm.selectedStep.options[option].step.condition(vm.diamond);
10671                }
10672
10673                if (hasStep) {
10674                    vm.selectedStep = angular.extend(vm.selectedStep.options[option].step, { data: vm.selectedStep.data });
10675                }
10676                else {
10677                    vm.onConfirm(vm.selectedStep);
10678                }
10679            }
10680
10681            if (vm.selectedStep.properties) {
10682
10683                var player_properties = {};
10684                vm.selectedStep.properties.forEach(function (propertie) {
10685                    propertie.player = undefined;
10686                    propertie.players = [];
10687
10688                    if (propertie.defaultValue) {
10689                        if (angular.isFunction(propertie.defaultValue)) {
10690                            propertie.player = propertie.defaultValue(vm.defenseTeam) || undefined;
10691                        }
10692                        else {
10693                            propertie.value = propertie.defaultValue;
10694                        }
10695
10696                    }
10697
10698
10699                    player_properties[propertie.name] = propertie;
10700                })
10701
10702                vm.selectedPlayerProperties = player_properties;
10703            }
10704        }
10705
10706        vm.addPlayer = function (property) {                        
10707            property.players.push({ player: undefined });
10708        }
10709
10710        vm.removePlayer = function (property, player) {
10711            _.remove(property.players, player);
10712        }
10713
10714        vm.validateStep = function (type, option, data, other, extras) {
10715            var node = {}
10716            node.type = type;
10717            node.option = option;
10718            node.data = data;
10719            node.other = other;
10720            node.extras = extras;
10721
10722            vm.stepsTrace.push(node);
10723        }
10724
10725        vm.createEvent = function () {            
10726            var event = {};
10727            var autoGenerateRunners = null;
10728            
10729            var sequence = vm.sequence;
10730
10731            event.seq = (sequence.events || []).length + 1;
10732
10733            if (vm.stepsOutline[vm.currentOutline] && vm.stepsOutline[vm.currentOutline].autoGenerateRunners) {
10734                autoGenerateRunners = vm.stepsOutline[vm.currentOutline].autoGenerateRunners;
10735            }
10736            
10737            vm.stepsTrace.forEach(function (node) {
10738                if (node.extras && node.extras.autoGenerateRunners) {
10739                    autoGenerateRunners = node.extras.autoGenerateRunners;
10740                }
10741                
10742                if (node.type === "playersproperties") {
10743                    event[node.type] = (event[node.type] || []).concat(node.data);
10744                }
10745                else if(node.type) {
10746                    event[node.type] = node.data;
10747                }
10748
10749                if (node.other) {
10750                    node.other.forEach(function (other) {
10751                        if (other.type && other.type == 'playersproperties') {
10752                            var property = playerToProperty(other);
10753                            event.playersproperties = (event.playersproperties || []).concat(property);
10754                        }
10755                        else {
10756                            event[other.name] = other.id;
10757                        }
10758                    })
10759                }
10760            });
10761
10762            if (event.playersproperties) {
10763                var seq = 1;
10764                event.playersproperties.forEach(function (property) {
10765                    property.seq = seq++;
10766                })
10767            }
10768
10769            sequence.events.push(event);   
10770
10771            var extraEvents = [];
10772            if (autoGenerateRunners) {
10773                extraEvents = autoGenerateRunners(vm.stepsOutline, (sequence.events || []).length + 1, vm.diamond, sequence.events);
10774            }
10775
10776            sequence.events = sequence.events.concat(extraEvents);
10777            vm.stepsTrace = [];
10778            
10779            vm.onAction(sequence);
10780
10781            if (vm.currentOutline + 1 >= vm.stepsOutline.length) {
10782                vm.isActionBoxShown = false;
10783            }
10784        }
10785
10786        vm.onConfirm = function () {
10787            // TODO add validation of players properties required *********************            
10788            if (vm.selectedPlayerProperties != null) {
10789                playerToData(vm.selectedStep.type, vm.selectedPlayerProperties);
10790            }
10791
10792            vm.createEvent();
10793        }
10794
10795        vm.nextHitter = function () {
10796            vm.sequence.status = 'closed';
10797            vm.onAction(vm.sequence);
10798        }
10799
10800        vm.skipHitter = function () {
10801            var event = { type: 'skiphitter', seq: vm.sequence.events.length + 1 };
10802            vm.sequence.events.push(event);
10803            vm.onAction(vm.sequence);
10804        }
10805
10806        vm.onCloseGame = function () {            
10807            if ($scope.onCloseGame) {
10808                $scope.onCloseGame();
10809            }
10810
10811            vm.hideConfirmClose();
10812        }
10813
10814        vm.backStep = function () {
10815            vm.stepsTrace = vm.stepsTrace.slice(0, -1);
10816
10817            if (vm.stepsTrace.length == 0) {
10818                vm.selectedStep = vm.selectedRootStep;
10819            }
10820            else {
10821                var currentStep = vm.selectedRootStep;
10822                vm.stepsTrace.forEach(function (travelNode) {
10823                    var stepIndex = travelNode.option;
10824                    currentStep = currentStep.options[stepIndex].step;
10825                });
10826                vm.selectedStep = currentStep;
10827            }
10828        }
10829
10830        vm.chooseStartHitter = function (hitter) {
10831            vm.sequence.hitter = hitter;
10832            vm.onAction(vm.sequence);
10833        }
10834
10835        function playerToData(type, properties) {
10836            var playersproperties = [];
10837
10838            if (type && type == 'playersproperties') {
10839                _.forEach(properties, function (selected_property) {
10840                    if (selected_property.getPlayer) {
10841                        selected_property.player = selected_property.getPlayer(selected_property.value, vm.sequence);
10842                    }
10843
10844                    if (selected_property.player) {
10845                        var property = playerToProperty(selected_property);
10846                        playersproperties.push(property);
10847
10848                        if (selected_property.getName && angular.isFunction(selected_property.getName)) {
10849                            property.name = selected_property.getName(properties);
10850                        }
10851                    }
10852
10853                    if (selected_property.players && selected_property.players.length > 0) {
10854                        selected_property.players.forEach(function (player, index) {
10855                            if (player.player) {
10856                                var property = playerToProperty(player);
10857                                
10858                                if (selected_property.multiple.getName && angular.isFunction(selected_property.multiple.getName)) {
10859                                    property.name = selected_property.multiple.getName(index);
10860                                }
10861                                else {
10862                                    property.name = selected_property.name;
10863                                }
10864                                playersproperties.push(property);
10865                            }
10866                        })
10867                    }
10868                });
10869
10870                vm.validateStep(type, null, playersproperties);
10871            }
10872        }
10873
10874        function playerToProperty(_property) {
10875            var property = {};
10876            var player = _property.player || {};
10877
10878            property.name = _property.name;
10879            property.number = player.number;
10880            property.id = player.id;
10881            property.pos = player.pos;
10882            property.row = player.row;
10883            property.teamId = player.teamId;
10884
10885            return property;
10886        }
10887
10888        function processSequence(sequence) {
10889            $scope.onSelectPlayer(null);
10890            var events = vm.sequence.events || [];
10891            vm.selectedStep = null;
10892            vm.selectedRootStep = null;
10893            $scope.onSelectPlayer(undefined);
10894                        
10895            var ballCount = (_.filter(vm.sequence.pitchs, { category: 'ball' }) || []).length;
10896            if (vm.sequence.status == 'active' && ballCount >= 4) {
10897                vm.sequence.status = 'ballLimit';
10898            }
10899
10900            vm.pitcherPitchCount = vm.sequence.pitchers && vm.sequence.pitchers.length > 0 ? vm.sequence.pitchers[vm.sequence.pitchers.length - 1].pitchGame || { pitch: 0, strike: 0, ball: 0 } : { pitch: 0, strike: 0, ball: 0 };
10901
10902            if (vm.sequence.status == 'starthitter') {
10903                vm.selectedTeam = _.find(vm.lineup.teams, { teamId: vm.sequence.hitter.teamId });
10904                $scope.shouldAllowSelectRunner = false;
10905            }
10906            else if (vm.sequence.status == 'pitcherrequested') { 
10907                $scope.shouldAllowSelectRunner = false;
10908            }
10909            else if (vm.sequence.status == 'ballLimit') {                                
10910                $scope.shouldAllowSelectRunner = false;
10911                vm.showActionBox('baseonball');           
10912
10913                events.forEach(function (event) {
10914                    var eventGroup = event.group;
10915                    var eventType = event.type;
10916                    if (eventGroup == 'onbases' && event.type == 'baseonball') {                    
10917                        vm.currentOutline = 0;
10918                        vm.selectedRootStep = vm.stepsOutline[vm.currentOutline];
10919                        vm.selectedStep = vm.selectedRootStep;                        
10920                        vm.goToStep(vm.selectedStep.type, 0, vm.selectedStep.options[0].id);
10921                        
10922                    }
10923                    else {                        
10924                        vm.currentOutline = vm.currentOutline + 1;
10925                        vm.selectedRootStep = vm.stepsOutline[vm.currentOutline];
10926                        vm.selectedStep = vm.selectedRootStep;                        
10927                    }
10928
10929                    if (vm.selectedStep && vm.selectedStep.data) {
10930                        if ($scope.onSelectPlayer) {
10931                            $scope.onSelectPlayer(vm.selectedStep.data.id);
10932                        }
10933                    }
10934                });
10935            }
10936            else if (vm.sequence.status == 'strikeLimit') {                
10937                $scope.shouldAllowSelectRunner = false;
10938
10939                vm.showActionBox('strikeout');
10940            }
10941            else {
10942                if (events.length > 0 && vm.sequence.status != 'completed') {
10943                    var boxShown = false;
10944
10945                    events.forEach(function (event) {
10946                        var eventGroup = event.group;
10947
10948                        if (eventGroup == 'out' || eventGroup == 'onbases') {
10949                            boxShown = true;
10950                            vm.showActionBox(eventGroup);
10951                            vm.currentOutline = 1;
10952                            vm.selectedRootStep = vm.stepsOutline[vm.currentOutline];
10953                            vm.selectedStep = vm.selectedRootStep;
10954                        }
10955                        else {
10956                            if (boxShown) {
10957                                vm.currentOutline = vm.currentOutline + 1;
10958                                vm.selectedRootStep = vm.stepsOutline[vm.currentOutline];
10959                                vm.selectedStep = vm.selectedRootStep;
10960                            }
10961                        }
10962
10963                        if (vm.selectedStep && vm.selectedStep.data) {
10964                            if ($scope.onSelectPlayer) {
10965                                $scope.onSelectPlayer(vm.selectedStep.data.id);
10966                            }
10967                        }
10968                    });
10969                }
10970                else {
10971                    vm.isActionBoxShown = false;
10972                }
10973
10974                if (vm.selectedRootStep) {
10975                    $scope.shouldAllowSelectRunner = vm.selectedRootStep.allowSelectRunner !== false;
10976                }
10977                else {
10978                    $scope.shouldAllowSelectRunner = true;
10979                }
10980            }
10981        }
10982    }
10983})();
10984;
10985(function () {
10986    'use strict';
10987
10988    angular
10989        .module('app.directives')
10990        .directive('scoreboardBaseballActions', scoreboardBaseballActions)
10991
10992    scoreboardBaseballActions.$inject = ['ModalService'];
10993
10994    function scoreboardBaseballActions(modalService) {
10995        return {
10996            restrict: 'E',
10997            scope: {
10998                onAction: '=',
10999                sequence: '=',
11000                lineup: '=',
11001                diamond: '=',
11002                selectedPlayer: '=',
11003                onSelectPlayer: '=',
11004                onCloseGame: '=',
11005                shouldAllowSelectRunner: '=',
11006                gameEnd: '='
11007            },
11008            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-stats/actions/scoreboard-baseball-actions.tpl.html',
11009            controller: 'ScoreboardBaseballActionsController',
11010            controllerAs: 'scoreboardBaseballActions',
11011            link: function ($scope, element, attrs, controller) {
11012                var confirmCloseModal = modalService.init($("#confirm-close-game", element));
11013
11014                $(document).on('click', '#scoreboardBaseballActions-closegame', function () {
11015                    $scope.$apply(controller.closePopup());
11016                });
11017
11018                element.on('$destroy', function () {                    
11019                    $(document).off('click');
11020                })
11021
11022                controller.setDocumentEvent = function () {
11023                    $(document).on('click.playerPopup', function () {                        
11024                        controller.playerPopup.visible = false;
11025                        $scope.$apply();
11026                        $(document).off('click.playerPopup');
11027                    })
11028                }
11029
11030                controller.getPlayerPopupOverflow = function () {
11031                    var elem = $("#player-popup", element)[0];
11032
11033                    if (elem) {
11034                        var popupRect = elem.getBoundingClientRect();
11035                        var windowHeight = $(window).height();
11036
11037                        if (popupRect && popupRect.bottom) {
11038                            if (popupRect.bottom > windowHeight) {
11039                                return popupRect.bottom - windowHeight + 10;
11040						    }
11041                        }
11042
11043                    }
11044                    
11045                    return 0;
11046                }
11047
11048                controller.showConfirmClose = confirmCloseModal.show;
11049                controller.hideConfirmClose = confirmCloseModal.hide;
11050            }
11051        };
11052    }
11053})();;
11054(function () {
11055    'use strict';
11056
11057    angular
11058        .module('app.directives')
11059        .controller('ScoreboardBaseballHistoryWidgetController', ScoreboardBaseballHistoryWidgetController);
11060
11061    ScoreboardBaseballHistoryWidgetController.$inject = ['$scope', '$translate', 'ScoreboardBaseballService'];
11062
11063    function ScoreboardBaseballHistoryWidgetController($scope, $translate, scoreboardBaseballService) {
11064        var vm = this;
11065        
11066        vm.formatInningName = function (period, pos) {
11067            if (pos == 1) {
11068                return $translate.instant('widgets.games.scoreboard.baseball.tab-stats.history.scoreboardBaseballHistory.startOf') + " " + period;
11069            } else {
11070                return $translate.instant('widgets.games.scoreboard.baseball.tab-stats.history.scoreboardBaseballHistory.endOf') + " " + period;
11071            }
11072        }
11073
11074        vm.getSequenceLabel = function (group, type, category) {
11075            var groupType = $translate.instant(scoreboardBaseballService.getGroup(group)) + " - " + $translate.instant(scoreboardBaseballService.getType(type))
11076            if (category) {
11077                groupType = groupType + " - " + $translate.instant(scoreboardBaseballService.getCategory(category));
11078            }
11079            return groupType;
11080        }
11081
11082        vm.getTeamAvatar = function (teamId) {
11083            return _.get(_.find($scope.teams, { id: teamId }), 'avatar');
11084        }
11085    }
11086})();
11087;
11088(function () {
11089    'use strict';
11090
11091    angular
11092        .module('app.directives')
11093        .directive('scoreboardBaseballHistory', scoreboardBaseballHistory)
11094
11095    scoreboardBaseballHistory.$inject = [];
11096
11097    function scoreboardBaseballHistory() {
11098        return {
11099            restrict: 'E',
11100            scope: {
11101                periods: '=',
11102                teams: '='
11103            },
11104            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-stats/history/scoreboard-baseball-history.tpl.html',
11105            controller: 'ScoreboardBaseballHistoryWidgetController',
11106            controllerAs: 'scoreboardBaseballHistory'
11107        };
11108    }
11109})();;
11110(function () {
11111    'use strict';
11112
11113    angular
11114        .module('app.directives')
11115        .controller('ScoreboardBaseballEditPitchController', ScoreboardBaseballEditPitchController);
11116
11117    ScoreboardBaseballEditPitchController.$inject = ['$scope'];
11118
11119    function ScoreboardBaseballEditPitchController($scope) {
11120        var vm = this;
11121        var pitchType = {
11122            ball: 'directives.widgets.games.scoreboard.baseball.tabStats.scoreboardBaseballPitchCount.ball',
11123            decision: 'directives.widgets.games.scoreboard.baseball.tabStats.scoreboardBaseballPitchCount.strikeDecision',
11124            swing: 'directives.widgets.games.scoreboard.baseball.tabStats.scoreboardBaseballPitchCount.strikeSwing',
11125            foul: 'directives.widgets.games.scoreboard.baseball.tabStats.scoreboardBaseballPitchCount.foulBall'
11126        }
11127
11128        vm.showModal = false;
11129        vm.pitches = []; 
11130        vm.pitchers = [];
11131        vm.hitter = null;
11132
11133        if ($scope.sequence) {
11134            vm.pitches = $scope.sequence.pitchs;
11135            vm.pitchers = $scope.sequence.pitchers;
11136            vm.hitter = $scope.sequence.hitter;
11137		}
11138
11139        vm.close = function () {
11140            $scope.show = false;
11141            vm.hideEditPitchPopup();
11142        }
11143
11144        vm.getPitcherName = function (pitcherId) {
11145            return _.get(_.find(vm.pitchers, { id: pitcherId }), 'playerName');
11146        }
11147
11148        vm.getPitchType = function (category, type) {
11149            switch (category) {
11150                case 'ball':
11151                    return pitchType.ball;
11152                case 'strike':
11153                    switch (type) {
11154                        case 'decision':
11155                            return pitchType.decision;
11156                        case 'swing':
11157                            return pitchType.swing;
11158                        case 'foulball':
11159                            return pitchType.foul;
11160                    }
11161			}
11162        }
11163
11164        vm.deletePitch = function (pitch) {
11165            if (!$scope.disabled) {
11166                var sequence = $scope.sequence;
11167                _.remove(sequence.pitchs, pitch);
11168
11169                if ($scope.onUpdate) {
11170                    $scope.onUpdate(sequence);
11171                }
11172            }
11173        }
11174
11175        $scope.$watchGroup(['show'], function (values) {
11176            if (values[0]) {
11177                vm.showEditPitchPopup();
11178            }
11179            else {
11180                vm.hideEditPitchPopup();
11181            }
11182
11183            vm.showModal = values[0];
11184        });
11185
11186        $scope.$watchGroup(['sequence'], function (values) {
11187            var sequence = values[0] || {};
11188                        
11189            vm.pitches = sequence.pitchs || [];
11190            vm.pitchers = sequence.pitchers || [];
11191            vm.hitter = sequence.hitter;
11192        })
11193
11194    }    
11195})();
11196;
11197(function () {
11198    'use strict';
11199
11200    angular
11201        .module('app.directives')
11202        .directive('scoreboardBaseballEditPitch', scoreboardBaseballEditPitch)
11203
11204    scoreboardBaseballEditPitch.$inject = ['ModalService'];
11205
11206    function scoreboardBaseballEditPitch(modalService) {
11207        return {
11208            restrict: 'E',                        
11209            scope: {                
11210                show: '=',
11211                sequence: '=',
11212                onUpdate: '=',
11213                loading: '=',
11214                disabled: '='
11215            },
11216            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-stats/edit-pitch-count/scoreboard-baseball-edit-pitch.tpl.html',
11217            controller: 'ScoreboardBaseballEditPitchController',
11218            controllerAs: 'scoreboardBaseballEditPitch',
11219            link: function (scope, element, attrs, controller) {
11220                var modal = modalService.init($('.scoreboard-baseball-edit-pitch', element));
11221
11222                element.on('$destroy', function () {
11223                    $(document).off('click');
11224                    modal.element.off('hidden.bs.modal');                    
11225                });
11226
11227                controller.showEditPitchPopup = modal.show;
11228                controller.hideEditPitchPopup = modal.hide;
11229                                
11230                modal.element.on('hidden.bs.modal', function (e) {
11231                    if (scope.show) {
11232                        scope.show = false;
11233                        scope.$apply();
11234                    }
11235                })
11236            }
11237        };
11238    }
11239})();;
11240(function () {
11241    'use strict';
11242
11243    angular
11244        .module('app.directives')
11245        .controller('ScoreboardBaseballTabLineupWidgetController', ScoreboardBaseballTabLineupWidgetController);
11246
11247    ScoreboardBaseballTabLineupWidgetController.$inject = ['$rootScope', '$scope', 'ScoreboardBaseballService'];
11248
11249    function ScoreboardBaseballTabLineupWidgetController($rootScope, $scope, scoreboardBaseballService) {
11250        var vm = this;
11251
11252        vm.gameDetails = angular.fromJson(__gameDetails__.replace(/[\n\r]+/g, ' '));
11253
11254        // State variables
11255        vm.lineup = {
11256            "teams": []
11257        };
11258        vm.loadingSave = false;
11259
11260        vm.gameActive = vm.gameDetails.statusId !== 1
11261
11262        $rootScope.$on('onGameStatusChange', function (event, statusId) {
11263            vm.gameActive = statusId !== 1;
11264        })
11265
11266        $scope.$watch(function () { return vm.lineup.teams }, function (teams) {
11267            vm.lineup.teams.forEach(function (team) {
11268                team.orderedPositions = buildPositions(team);
11269            });
11270        }, true)
11271
11272        // State functions
11273        vm.movePosition = function (params) {
11274            const teamId = params.teamId;
11275            const to = params.to;
11276            const from = params.from;
11277
11278            const team = _.find(vm.lineup.teams, function (val) {
11279                return val.teamId === teamId;
11280            });
11281
11282            if (team) {
11283                const positions = params.list;
11284                const temp = positions[to];
11285                const toTemp = positions[to].row;
11286                const fromTemp = positions[from].row;
11287                positions[to] = positions[from];
11288                positions[to].row = toTemp;
11289                positions[from] = temp;
11290                positions[from].row = fromTemp;
11291
11292                var index = 1;
11293                team.positions = _.reduce(positions, function (result, value) {
11294                    value.players.forEach(function (player) { player.row = index });
11295                    index++;
11296                    return result.concat(value.players);
11297                }, [])               
11298            }
11299        }
11300
11301        vm.putLineup = function () {
11302
11303            var positions = scoreboardBaseballService.getDefensePositions();
11304            vm.loadingSave = true;
11305
11306            vm.lineup.teams.forEach(function (team) {
11307                var index = 1;
11308
11309                team.positions = _.reduce(team.orderedPositions, function (result, value) {
11310                    value.players.forEach(function (player) { player.row = index });
11311                    index++;
11312                    return result.concat(value.players);
11313                }, [])        
11314            })            
11315            
11316            scoreboardBaseballService.putLineupBaseball(__solutionId__, vm.gameDetails.id, vm.lineup)
11317                .then(function (response) {
11318                    vm.loadingSave = false;
11319                })
11320                .catch(function (error) {
11321                    vm.loadingSave = false;
11322                    bugsnag.notify(error);
11323                });
11324        }
11325
11326        //Component mount
11327        getLineup();
11328
11329        // Helpers
11330        function sortBatters() {
11331            _.forEach(vm.lineup.teams, function (team) {
11332                team.positions.sort(function (a, b) {
11333                    return a.row - b.row;
11334                });
11335            })
11336        }
11337
11338        function getLineup() {
11339            scoreboardBaseballService.getLineupBaseball(__solutionId__, vm.gameDetails.id)
11340                .then(function (response) {
11341                    console.log(response);
11342                    vm.lineup = response.data;
11343                    sortBatters();
11344
11345                    vm.lineup.teams.forEach(function (team) {
11346                        team.orderedPositions = buildPositions(team);
11347                    });
11348                })
11349                .catch(function (error) {
11350                    bugsnag.notify(error);
11351                });
11352        }
11353
11354        function buildPositions(team) {
11355            var playerPositions = [];
11356
11357            var pitcherDesignatedHitter = _.filter(team.positions, function (position) { return position.playerPosition == 'pitcher' || position.playerPosition == 'designatedhitter' });
11358
11359            team.positions.map(function (position) {
11360                var hasPitcher = _.find(pitcherDesignatedHitter, { playerPosition: 'pitcher' });
11361
11362                if (position.playerPosition == 'pitcher') {
11363                    playerPositions.push({ players: _.sortBy(pitcherDesignatedHitter, function (player) { return player.playerPosition != 'designatedhitter' }) });
11364                }
11365                else if (position.playerPosition == 'designatedhitter' && !hasPitcher) {
11366                    playerPositions.push({ players: [position] })
11367                }
11368                else if (position.playerPosition != 'designatedhitter') {
11369                    playerPositions.push({ players: [position] })
11370                }
11371            });
11372
11373            return playerPositions;
11374        }
11375    }
11376})();
11377;
11378(function () {
11379    'use strict';
11380
11381    angular
11382        .module('app.directives')
11383        .directive('scoreboardBaseballTabLineup', scoreboardBaseballTabLineup)
11384
11385    scoreboardBaseballTabLineup.$inject = [];
11386
11387    function scoreboardBaseballTabLineup() {
11388        return {
11389            restrict: 'E',
11390            scope: {
11391                widget: '='
11392            },
11393            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-lineup/scoreboard-baseball-tab-lineup.tpl.html',
11394            controller: 'ScoreboardBaseballTabLineupWidgetController',
11395            controllerAs: 'scoreboardBaseballTabLineup'
11396        };
11397    }
11398})();;
11399(function () {
11400    'use strict';
11401
11402    angular
11403        .module('app.directives')
11404        .controller('ScoreboardBaseballTabLineupBattersWidgetController', ScoreboardBaseballTabLineupBattersWidgetController);
11405
11406    ScoreboardBaseballTabLineupBattersWidgetController.$inject = ['$scope'];
11407
11408    function ScoreboardBaseballTabLineupBattersWidgetController($scope) {
11409        var vm = this;
11410        vm.gameActive = $scope.gameActive
11411
11412        $scope.$watch('gameActive', function (gameActive) {
11413            vm.gameActive = gameActive;
11414        });
11415
11416        vm.arrayMove = function (from, to) {
11417            $scope.arrayMove({ params: { teamId: $scope.teamId, to: to, from: from, list: $scope.team.orderedPositions } })
11418        }
11419}
11420})();
11421;
11422(function () {
11423    'use strict';
11424
11425    angular
11426        .module('app.directives')
11427        .directive('scoreboardBaseballTabLineupBatters', scoreboardBaseballTabLineupBatters)
11428
11429    scoreboardBaseballTabLineupBatters.$inject = [];
11430
11431    function scoreboardBaseballTabLineupBatters() {
11432        return {
11433            restrict: 'E',
11434            scope: {
11435                widget: '=',
11436                team: '=',
11437                arrayMove: '&',
11438                teamId: '=',
11439                gameActive: '=',
11440            },
11441            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-lineup/batters/scoreboard-baseball-tab-lineup-batters.tpl.html',
11442            controller: 'ScoreboardBaseballTabLineupBattersWidgetController',
11443            controllerAs: 'scoreboardBaseballTabLineupBatters'
11444        };
11445    }
11446})();;
11447(function () {
11448    'use strict';
11449
11450    angular
11451        .module('app.directives')
11452        .controller('ScoreboardBaseballTabLineupPlayersWidgetController', ScoreboardBaseballTabLineupPlayersWidgetController);
11453
11454    ScoreboardBaseballTabLineupPlayersWidgetController.$inject = ['$scope', 'ScoreboardBaseballService'];
11455
11456    function ScoreboardBaseballTabLineupPlayersWidgetController($scope, scoreboardBaseballService) {
11457        var vm = this;
11458
11459        vm.errors = [];
11460
11461        // Constant variables
11462        vm.MAX_SELECTED_PLAYERS = Infinity;
11463
11464        vm.gameActive = $scope.gameActive
11465
11466        $scope.$watch('gameActive', function (gameActive) {
11467            vm.gameActive = gameActive;
11468        });
11469
11470        // State variables
11471        vm.list = [];
11472        vm.allNumbers = [];
11473        vm.disabledNumbers = [];
11474        vm.positions = scoreboardBaseballService.getDefensePositions();
11475        vm.isEditing = {
11476            player: null,
11477            value: false
11478        };
11479
11480        vm.editNumber = function (player) {
11481            vm.isEditing.value = !vm.isEditing.value;
11482            vm.isEditing.player = player
11483        }
11484
11485        vm.getStyle = function (player) {
11486            let style = {};
11487            style['color'] = '#919191'
11488
11489            if (vm.isEditing.value && player.id === vm.isEditing.player.id) {
11490                style['color'] = '#000';
11491            }
11492            style['background'] = 'none'
11493            style['border'] = 'none'
11494            return style;
11495        }
11496
11497        vm.submitHandler = function (event, player) {
11498            vm.changeNumber(player.id, event.target[0].value)
11499            event.target[0].value = '';
11500            vm.isEditing.value = !vm.isEditing.value;
11501        }
11502
11503        // State functions
11504        vm.changeNumber = function (id, num) {
11505            let tempPlayer = _.find($scope.team.positions, function (player) {
11506                return player.id == id
11507            })
11508            tempPlayer ? tempPlayer.playerNumber = num : null;
11509
11510            let tempPlayerAvailable = _.find($scope.team.playersAvailable, function (player) {
11511                return player.id == id
11512            })
11513            tempPlayerAvailable ? tempPlayerAvailable.playerNumber = num : null;
11514            getNumbers();
11515        }
11516
11517        vm.checkPlayer = function (player) {
11518            if (player.checked) {
11519                _.remove($scope.team.playersAvailable, { id: player.id });
11520                $scope.team.positions.push(player);
11521
11522            } else {
11523                _.remove($scope.team.positions, { id: player.id });
11524                $scope.team.playersAvailable.unshift(player);
11525            }
11526        }
11527
11528        vm.sortSubstitution = function (item) {
11529            switch (item) {
11530                case 'number':
11531                    vm.sortedBy = 1;
11532                    vm.list = _.sortBy(vm.list, function (player) {
11533                        return player.number;
11534                    })
11535                    break;
11536                case 'name':
11537                    vm.sortedBy = 2;
11538                    vm.list = _.sortBy(vm.list, function (player) {
11539                        return player.playerName;
11540                    })
11541                    break;
11542                case 'position':
11543                    vm.sortedBy = 3;
11544                    vm.list = _.sortBy(vm.list, function (player) {
11545                        return player.pos;
11546                    })
11547                    break;
11548                case 'checked':
11549                    vm.sortedBy = 4;
11550                    vm.list = _.sortBy(vm.list, function (player) {
11551                        return player.checked;
11552                    }).reverse();
11553                    break;
11554                default:
11555                    vm.sortedBy = 2;
11556                    vm.list = _.sortBy(vm.list, function (player) {
11557                        return player.playerName;
11558                    })
11559                    break;
11560            }
11561        }
11562        vm.sortSubstitution();
11563
11564        // Component mount
11565        $scope.$watch('team', function () {
11566            buildList();
11567            getNumbers();
11568        });
11569
11570        $scope.$watch(function () {
11571            return vm.list;
11572        }, function () {
11573            validateLineup();
11574        }, true)
11575
11576        function validateLineup() {
11577            var errors = [];
11578            var selectedList = _.filter(vm.list, { checked: true });
11579
11580            selectedList.forEach(function (player) {
11581                if (player.playerPosition && player.playerPosition != 'infielder' && player.playerPosition != 'extrahitter') {
11582                    var positionPlayers = _.filter(selectedList, { playerPosition: player.playerPosition });
11583                    if (positionPlayers.length > 1) {
11584                        errors.push({ playerId: player.id, error: 'position' })
11585					}
11586				}
11587            })
11588            vm.errors = errors;
11589        }
11590
11591        vm.isError = function(playerId, error) {
11592            return _.findIndex(vm.errors, { playerId: playerId, error: error }) > -1;
11593		}
11594
11595        // Helpers
11596        function buildList() {
11597            const positions = $scope.team.positions.map(function (val) {
11598                val.checked = true;
11599                return val;
11600            });
11601            const playersAvailable = $scope.team.playersAvailable.map(function (val) {
11602                val.checked = false;
11603                return val;
11604            });
11605            vm.list = positions.concat(playersAvailable);
11606        }
11607
11608        function getNumbers() {
11609            vm.disabledNumbers = vm.list.map(function (player) {
11610                return player.playerNumber;
11611            });
11612            vm.allNumbers = [];
11613            vm.allNumbers.push("0");
11614            vm.allNumbers.push("00");
11615            for (let i = 1; i <= 99; i++) {
11616                vm.allNumbers.push(i.toString());
11617            }
11618        }
11619
11620    }
11621})();
11622;
11623(function () {
11624    'use strict';
11625
11626    angular
11627        .module('app.directives')
11628        .directive('scoreboardBaseballTabLineupPlayers', scoreboardBaseballTabLineupPlayers)
11629
11630    scoreboardBaseballTabLineupPlayers.$inject = [];
11631
11632    function scoreboardBaseballTabLineupPlayers() {
11633        return {
11634            restrict: 'E',
11635            scope: {
11636                widget: '=',
11637                team: '=',
11638                gameActive: '=',
11639            },
11640            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-lineup/players/scoreboard-baseball-tab-lineup-players.tpl.html',
11641            controller: 'ScoreboardBaseballTabLineupPlayersWidgetController',
11642            controllerAs: 'scoreboardBaseballTabLineupPlayers'
11643        };
11644    }
11645})();;
11646(function () {
11647    'use strict';
11648
11649    angular
11650        .module('app.directives')
11651        .controller('ScoreboardBaseballSaveButtonWidgetController', ScoreboardBaseballSaveButtonWidgetController);
11652
11653    ScoreboardBaseballSaveButtonWidgetController.$inject = ['$scope'];
11654
11655    function ScoreboardBaseballSaveButtonWidgetController($scope) {
11656        var vm = this;
11657        vm.gameActive = $scope.gameActive
11658
11659        $scope.$watch('gameActive', function (gameActive) {
11660            vm.gameActive = gameActive;
11661        })
11662    }
11663})();
11664;
11665(function () {
11666    'use strict';
11667
11668    angular
11669        .module('app.directives')
11670        .directive('scoreboardBaseballSaveButton', scoreboardBaseballSaveButton)
11671
11672    scoreboardBaseballSaveButton.$inject = ['$timeout'];
11673
11674    function scoreboardBaseballSaveButton($timeout) {
11675        return {
11676            restrict: 'E',
11677            scope: {
11678                widget: '=',
11679                onSave: '&',
11680                loading: '=',
11681                gameActive: '=',
11682            },
11683            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/baseball/save/scoreboard-baseball-save-button.tpl.html',
11684            controller: 'ScoreboardBaseballSaveButtonWidgetController',
11685            controllerAs: 'scoreboardBaseballSaveButton',
11686            link: function (scope) {
11687                $timeout(function () {
11688                    const savebar = $(`#save-${scope.widget}`);
11689                    var breakpoint = undefined;
11690                    function stickyHandler() {
11691                        var wS = $(this).scrollTop();
11692                        var hT = $(`#save-${scope.widget}`).offset().top
11693                        if (breakpoint === undefined && hT < 0) {
11694                            breakpoint = wS;
11695                            savebar.addClass("sticky-save-button")
11696                        } else if (breakpoint !== undefined && wS > breakpoint) {
11697                            savebar.addClass("sticky-save-button")
11698                        } else {
11699                            savebar.removeClass("sticky-save-button");
11700                        }
11701                    }
11702                    $(`#editWindow-${scope.widget}`).scroll(stickyHandler);
11703                });
11704            }
11705        };
11706    }
11707})();;
11708(function () {
11709    'use strict';
11710
11711    angular
11712        .module('app.directives')
11713        .controller('NumberSelectWidgetController', NumberSelectWidgetController);
11714
11715    NumberSelectWidgetController.$inject = ['$scope'];
11716
11717    function NumberSelectWidgetController($scope) {
11718        var vm = this;
11719        vm.isDisabled = $scope.isDisabled
11720
11721        $scope.$watch('isDisabled', function (isDisabled) {
11722            vm.isDisabled = isDisabled;
11723        });
11724    }
11725})();
11726;
11727
11728(function () {
11729    'use strict';
11730
11731    angular
11732        .module('app.directives')
11733        .directive('numberSelect', numberSelect)
11734
11735    numberSelect.$inject = ['$timeout', '$compile'];
11736
11737    function numberSelect($timeout, $compile) {
11738        return {
11739            restrict: 'E',
11740            scope: {
11741                itemId: '@',
11742                disabledNumbers: '=',
11743                allNumbers: '=',
11744                selectedNumber: '=',
11745                onNumberChange: '=',
11746                isDisabled: '=',
11747                popoverClass: '='
11748            },
11749            templateUrl: 'public/v2/app/core/directives/number-select/number-select.tpl.html',
11750            controller: 'NumberSelectWidgetController',
11751            controllerAs: 'numberSelect',
11752            link: function (scope) {
11753                scope.$watch('[allNumbers, selectedNumber, disabledNumbers, itemId]', function () {                    
11754                    const compiled = $compile(`
11755                    <div class='{{popoverClass}}'>
11756                        <number-select-menu on-number-change="onNumberChange" all-numbers="allNumbers" selected-number="selectedNumber" disabled-numbers="disabledNumbers" item-id="itemId"></number-select-menu>
11757                    </div>
11758                    `)(scope);
11759                    $timeout(function () {                        
11760                        $(`#popover-id-${scope.itemId}`).popover({
11761                            trigger: 'focus',
11762                            placement: 'bottom',
11763                            html: true,
11764                            content: compiled
11765                        });
11766                    });
11767                })
11768            }
11769        };
11770    }
11771})();
11772
11773
11774
11775;
11776(function () {
11777    'use strict';
11778
11779    angular
11780        .module('app.directives')
11781        .controller('NumberSelectMenuWidgetController', NumberSelectMenuWidgetController);
11782
11783    NumberSelectMenuWidgetController.$inject = ['$scope'];
11784
11785    function NumberSelectMenuWidgetController($scope) {
11786        var vm = this;
11787        vm.getClass = function (num) {
11788            if ($scope.selectedNumber === num) {
11789				return { 'popover-number-cell-selected': true };
11790            } else if ($scope.disabledNumbers.includes(num)) {
11791				return { 'popover-number-cell-disabled': true };
11792			}
11793			return false;
11794        }
11795    }
11796})();
11797;
11798(function () {
11799    'use strict';
11800
11801    angular
11802        .module('app.directives')
11803        .directive('numberSelectMenu', numberSelectMenu)
11804
11805    numberSelectMenu.$inject = [];
11806
11807    function numberSelectMenu() {
11808        return {
11809            restrict: 'E',
11810            scope: {
11811                itemId: '=',
11812                disabledNumbers: '=',
11813                allNumbers: '=',
11814                selectedNumber: '=',
11815                onNumberChange: '&'
11816            },
11817            templateUrl: 'public/v2/app/core/directives/number-select/menu/number-select-menu.tpl.html',
11818            controller: 'NumberSelectMenuWidgetController',
11819            controllerAs: 'numberSelectMenu'
11820        };
11821    }
11822})();;
11823(function () {
11824    'use strict';
11825
11826    angular
11827        .module('app.directives')
11828        .controller('TemplateEditorController', TemplateEditorController);
11829
11830    TemplateEditorController.$inject = ['$scope', '$sce'];
11831
11832    function TemplateEditorController($scope, $sce) {
11833        var vm = this;
11834        vm.tempFiles = {};
11835        vm.selectedItem = {};
11836
11837        vm.sanitize = function (html) {
11838            return $sce.trustAsHtml(html);
11839
11840        }
11841        vm.fileChange = function (file) {
11842            vm.tempFiles[vm.selectedItem.id] = file;
11843        }
11844
11845        vm.getItem = function (type, item, listItemId) {
11846            switch (type) {
11847                case 'text':
11848                    if (vm.editable && listItemId && item[listItemId]) {
11849                        var fieldName = _.get(_.find(vm.listFields, { Id: item[listItemId] }), 'Name');
11850                        var element = angular.element(item.text);
11851                        var newhtml = element.html().replace(element.text(), fieldName);
11852                        element.html(newhtml);
11853                        return vm.sanitize(element[0].outerHTML);
11854                    }
11855
11856                    if (vm.item && item[listItemId]) {
11857                        var id = item[listItemId];
11858                        var element = angular.element(item.text);
11859                        var newhtml = element.html().replace(element.text(), _.get(_.find(vm.item.content, { id: id }), 'value'));
11860                        element.html(newhtml);
11861                        return vm.sanitize(element[0].outerHTML);
11862                    }
11863
11864                    return vm.sanitize(item.text);
11865
11866                case 'image':
11867                    if (vm.editable && listItemId && item[listItemId]) {
11868                        return _.get(_.find(vm.listFields, { Id: item[listItemId] }), 'Name');
11869                    }
11870
11871                    if (vm.item && item[listItemId]) {
11872                        var id = item[listItemId];
11873                        return _.get(_.find(vm.item.content, { id: id }), 'value');
11874                    }
11875
11876                    return item.url;
11877                case 'button':
11878                    if (listItemId == 'listItem-url') {
11879                        if (vm.item && item[listItemId]) {
11880                            var id = item[listItemId];
11881                            return _.get(_.find(vm.item.content, { id: id }), 'value');
11882                        }
11883
11884                        return item.url;
11885                    }
11886                    else if (listItemId == 'listItem-name') {
11887                        if (vm.editable && listItemId && item[listItemId]) {
11888                            var fieldName = _.get(_.find(vm.listFields, { Id: item[listItemId] }), 'Name');
11889                            var element = angular.element(item.text);
11890                            var newhtml = element.html().replace(element.text(), fieldName);
11891                            element.html(newhtml);
11892                            return vm.sanitize(element[0].outerHTML);
11893                        }
11894
11895                        if (vm.item && item[listItemId]) {
11896                            var id = item[listItemId];
11897                            var element = angular.element(item.text);
11898                            var newhtml = element.html().replace(element.text(), _.get(_.find(vm.item.content, { id: id }), 'value'));
11899                            element.html(newhtml);
11900                            return vm.sanitize(element[0].outerHTML);
11901                        }
11902
11903                        return vm.sanitize(item.text);
11904                    }
11905                    return '';
11906
11907            }
11908
11909            return item.text;
11910        }
11911
11912        vm.itemParameters = {
11913            text: [
11914                { type: 'html', id: 'text', label: 'directives.templateEditor.templateEditor.parameters.text' },
11915                { type: 'listItem', id: 'listItem', label: 'directives.templateEditor.templateEditor.parameters.listItem', t
11915ypes: ['text', 'link'] }
11916            ],
11917            image: [
11918                { type: 'file', id: 'url', label: 'directives.templateEditor.templateEditor.parameters.image' },
11919                { type: 'number', id: 'width', label: 'directives.templateEditor.templateEditor.parameters.width' },
11920                { type: 'number', id: 'height', label: 'directives.templateEditor.templateEditor.parameters.height' },
11921                { type: 'listItem', id: 'listItem', label: 'directives.templateEditor.templateEditor.parameters.listItem', types: ['image'] }
11922            ],
11923            line: [
11924                { type: 'number', id: 'height', label: 'directives.templateEditor.templateEditor.parameters.height' },
11925                { type: 'number', id: 'width', label: 'directives.templateEditor.templateEditor.parameters.widthPercent' },
11926                { type: 'color', id: 'color', label: 'directives.templateEditor.templateEditor.parameters.color' }
11927            ],
11928            button: [
11929                { type: 'string', id: 'url', label: 'directives.templateEditor.templateEditor.parameters.link' },
11930                { type: 'html', id: 'text', label: 'directives.templateEditor.templateEditor.parameters.text' },
11931                { type: 'color', id: 'backgroundColor', label: 'directives.templateEditor.templateEditor.parameters.backgroundColor' },
11932                { type: 'number', id: 'borderRadius', label: 'directives.templateEditor.templateEditor.parameters.borderRadius' },
11933                { type: 'checkbox', id: 'fullWidth', label: 'Full Width', trueValue: true, falseValue: false, label: 'directives.templateEditor.templateEditor.parameters.fullWidth' },
11934                { type: 'listItem', id: 'listItem-url', label: 'directives.templateEditor.templateEditor.parameters.listUrl', types: ['link'] },
11935                { type: 'listItem', id: 'listItem-name', label: 'directives.templateEditor.templateEditor.parameters.listText', types: ['link', 'text'] }
11936            ]
11937        }
11938
11939        vm.filterListItems = function (parameter) {            
11940            var fields = vm.listFields;
11941            
11942            if (!parameter.types)
11943                return fields;
11944
11945            return _.filter(fields, function (field) { return _.includes(parameter.types, field.Type) });
11946        }
11947    }
11948})();
11949;
11950
11951(function () {
11952    'use strict';
11953
11954    angular
11955        .module('app.directives')
11956        .directive('templateEditor', templateEditor)
11957
11958    templateEditor.$inject = ['$timeout', '$compile'];
11959
11960    function templateEditor($timeout, $compile) {
11961        return {
11962            restrict: 'E',
11963            scope: {
11964                template: '=',
11965                templateItems: '=',
11966                editable: '=',
11967                beforeSave: '=',
11968                list: '=',
11969                selectedList: '=',
11970                item: '='
11971            },
11972            templateUrl: 'public/v2/app/core/directives/template-editor/template-editor.tpl.html',
11973            controller: 'TemplateEditorController',
11974            controllerAs: 'templateEditor',
11975            link: function (scope, element, attrs, controller) {
11976                var items = scope.templateItems;
11977
11978                controller.beforeSave = scope.beforeSave || {};
11979                controller.editable = scope.editable !== false;
11980                controller.items = items;                
11981                controller.item = scope.item;
11982                controller.showPopup = function (item) {
11983                    controller.selectedItem = item;
11984                    controller.clone = angular.copy(controller.items[item.id]);
11985                    $('#parameterDialog', element).modal('show');
11986                }
11987
11988                scope.$watch('templateItems', function (items) {
11989                    controller.items = items;
11990                });
11991
11992                scope.$watchGroup(['list', 'selectedList'], function (values) {
11993                    
11994                    if (values[0] && values[1]) {                        
11995                        var selectedList = _.find(values[0], { id: _.parseInt(values[1]) });
11996                        if (selectedList) {
11997                            var listDefinition = angular.fromJson(selectedList.value);
11998                            controller.listFields = listDefinition.Fields                                                      
11999                        }
12000                    }
12001                    
12002                })
12003
12004                scope.$watch('item', function (item) {
12005                    controller.item = item;
12006                })
12007
12008                $('#parameterDialog', element).on('hide.bs.modal', function (event) {                    
12009                    if (controller.save != true) {                        
12010                        scope.$apply(controller.items[controller.selectedItem.id] = controller.clone);
12011                    }                    
12012                    controller.save = false
12013                });
12014                
12015            }
12016        };
12017    }
12018})();
12019
12020
12021
12022;
12023(function () {
12024    'use strict';
12025
12026    angular
12027        .module('app.directives')
12028        .controller('ListFiltersController', ListFiltersController);
12029
12030    ListFiltersController.$inject = ['$scope'];
12031
12032    function ListFiltersController($scope) {
12033        var vm = this;
12034
12035        vm.addFilter = function() {
12036            vm.filters.push({ id: undefined, type: undefined, default: undefined });            
12037        }
12038
12039        vm.removeFilter = function (filter) {
12040            _.remove(vm.filters, filter);
12041        }
12042
12043        vm.getFilterTypes = function (field) {
12044            var field = _.find(vm.listFields, { Id: field });
12045
12046            if (field) {
12047                return vm.filterTypes[field.Type];
12048            }
12049
12050            return [];
12051        }
12052    }
12053})();
12054;
12055
12056(function () {
12057    'use strict';
12058
12059    angular
12060        .module('app.directives')
12061        .directive('listFilters', listFilters)
12062
12063    listFilters.$inject = ['$timeout', '$compile'];
12064
12065    function listFilters($timeout, $compile) {
12066        return {
12067            restrict: 'E',
12068            scope: {
12069                filters: '=',
12070                list: '=',
12071                selectedList: '=',                
12072            },
12073            templateUrl: 'public/v2/app/core/directives/widget/settings/control
12073s/filters/list-filters.tpl.html',
12074            controller: 'ListFiltersController',
12075            controllerAs: 'listFilters',
12076            link: function (scope, element, attrs, controller) {    
12077                controller.filterTypes = {
12078                    'text': [{ id: 'select', name: 'directives.listFilters.select' }, { id: 'search', name: 'directives.listFilters.search' }]
12079                }
12080
12081                controller.filters = scope.filters;                
12082                controller.selectedList = scope.selectedList;
12083                controller.list = scope.list;
12084
12085                scope.$watchGroup(['list', 'selectedList'], function (values) {
12086                    if (values[0] && values[1]) {
12087                        var selectedList = _.find(values[0], { id: _.parseInt(values[1]) });
12088                        if (selectedList) {
12089                            var listDefinition = angular.fromJson(selectedList.value);
12090                            
12091                            controller.listFields = _.filter(listDefinition.Fields, function (field) { return controller.filterTypes[field.Type] })                            
12092                        }
12093                    }
12094
12095                })
12096
12097            }
12098        };
12099    }
12100})();
12101
12102
12103
12104;
12105(function () {
12106    'use strict';
12107
12108    angular
12109        .module('app.directives')
12110        .controller('WidgetSettingsLanguageController', WidgetSettingsLanguageController);
12111
12112    WidgetSettingsLanguageController.$inject = ['$scope', '$localStorage'];
12113
12114    function WidgetSettingsLanguageController($scope, $localStorage) {
12115        var vm = this;
12116        vm.websiteLanguages = website.languages;
12117        vm.selectedLanguage = angular.isUndefined($localStorage.currentLanguage)
12118            ? __defaultLanguage__
12119            : $localStorage.currentLanguage.culture;
12120
12121        $scope.onUpdateLanguage(vm.selectedLanguage);
12122    }
12123})();
12124;
12125
12126(function () {
12127    'use strict';
12128
12129    angular
12130        .module('app.directives')
12131        .directive('widgetSettingsLanguage', widgetSettingsLanguage)
12132
12133    widgetSettingsLanguage.$inject = ['$timeout', '$compile'];
12134
12135    function widgetSettingsLanguage($timeout, $compile) {
12136        return {
12137            restrict: 'E',
12138            scope: {
12139                onUpdateLanguage: '='
12140            },
12141            templateUrl: 'public/v2/app/core/directives/widget/settings/controls/language/widget-settings-language.tpl.html',
12142            controller: 'WidgetSettingsLanguageController',
12143            controllerAs: 'widgetSettingsLanguage',
12144            link: function (scope, element, attrs, controller) {    
12145            }
12146        };
12147    }
12148})();
12149
12150
12151
12152;
12153(function () {
12154    'use strict';
12155
12156    angular
12157        .module('app.directives')
12158        .controller('GameBroadcastWidgetController', GameBroadcastWidgetController);
12159
12160    GameBroadcastWidgetController.$inject = ['$rootScope', '$scope', '$sce', '$translate', 'WebsiteEditorService'];
12161
12162    function GameBroadcastWidgetController($rootScope, $scope, $sce, $translate, websiteEditorService) {
12163        var vm = this;
12164
12165        //State variable
12166        vm.widget = angular.fromJson(widgets[$scope.widget]);
12167        vm = Object.assign(vm, angular.fromJson(__gameDetails__
12168            .replace(/[\n\r]+/g, ' ')));
12169        vm.backgroundImage = 'https://cache.kreezee.com/images/v2/broadcast-widget-background.png';
12170        vm.broadcastLink = extractYoutubeLinkOrReturnUrl(vm.broadcast);
12171
12172        //On component mount
12173        for (var parameter in vm.widget.parameters) {
12174            switch (vm.widget.parameters[parameter].id) {
12175                case 'widgetTransparency':
12176                    vm.widgetTransparency = vm.widget.parameters[parameter].value;
12177                    break;
12178                case 'roundedCorner':
12179                    vm.roundedCorner = vm.widget.parameters[parameter].value;
12180                    break;
12181                case 'backgroundColor':
12182                    vm.backgroundColor = vm.widget.parameters[parameter].value;
12183                    break;
12184            }
12185        }
12186
12187
12188        // Listener
12189        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
12190            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
12191                .then(function () {
12192                    for (var parameter in vm.widget.parameters) {
12193                        switch (vm.widget.parameters[parameter].id) {
12194                            case 'widgetTransparency':
12195                                vm.widget.parameters[parameter].value = data.widgetTransparency;
12196                                vm.widgetTransparency = data.widgetTransparency;
12197                                break;
12198                            case 'roundedCorner':
12199                                vm.widget.parameters[parameter].value = data.roundedCorner;
12200                                vm.roundedCorner = data.roundedCorner;
12201                                break;
12202                            case 'backgroundColor':
12203                                vm.widget.parameters[parameter].value = data.backgroundColor;
12204                                vm.backgroundColor = data.backgroundColor;
12205                                break;
12206                        }
12207                    }
12208                    widgets[$scope.widget] = angular.toJson(vm.widget);
12209                })
12210                .catch(function (error) {
12211                    bugsnag.notify(error);
12212                });
12213        });
12214
12215        $scope.$on('$destroy', listener);
12216
12217        function extractYoutubeLinkOrReturnUrl(url) {
12218            var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/;
12219            var match = url.match(regExp);
12220            var finalResult = '';
12221            if (match && match[7].length == 11) {
12222                finalResult = 'https://www.youtube.com/embed/' + match[7];
12223            }
12224            if (finalResult == '') {
12225                vm.isYoutubeLink = false;
12226                return $sce.trustAsResourceUrl(url);
12227            } else {
12228                vm.isYoutubeLink = true;
12229                return $sce.trustAsResourceUrl(finalResult);
12230            }
12231        }
12232    }
12233})();
12234;
12235(function () {
12236    'use strict';
12237
12238    angular
12239        .module('app.directives')
12240        .directive('gameBroadcast', gameBroadcast)
12241
12242    gameBroadcast.$inject = [];
12243
12244    function gameBroadcast() {
12245        return {
12246            restrict: 'E',
12247            scope: {
12248                widget: '='
12249            },
12250            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/game-broadcast/game-broadcast.tpl.html',
12251            controller: 'GameBroadcastWidgetController',
12252            controllerAs: 'gameBroadcast'
12253        };
12254    }
12255})();;
12256(function () {
12257    'use strict';
12258
12259    angular
12260        .module('app.directives')
12261        .controller('GameDetailsLineupsController', GameDetailsLineupsController);
12262
12263    GameDetailsLineupsController.$inject = ['$rootScope', '$scope', '$translate', '$localStorage', 'UrlService', 'PlayerService', 'PositionService'];
12264
12265    function GameDetailsLineupsController($rootScope, $scope, $translate, $localStorage, urlService, playerService, positionService) {
12266        var vm = this;
12267
12268        vm = Object.assign(vm, angular.fromJson(__gameDetails__.replace(/[\n\r]+/g, ' ')));
12269        vm.url = urlService;
12270        vm.player = playerService;
12271        vm.position = positionService;
12272        vm.sportId = $localStorage.solution.sportId;
12273
12274        buildColumns($scope.lineupColumns);
12275        vm.teamList.sort(function (a, b) {
12276            if (a.id === vm.visitorTeamId) {
12277                return -1;
12278            } else {
12279                return 1;
12280            }
12281        });
12282
12283        vm.showStat = function (column) {
12284            if (vm.isMobile && column.visibleMobile) {
12285                return true;
12286            } else if (!vm.isMobile && column.visibleDesktop) {
12287                return true;
12288            }
12289            return false;
12290        }
12291
12292        vm.getBirthday = function (birthday) {
12293            return birthday !== null ? moment(birthday).format($translate.instant('directives.widgets.team.details.lineup.format.birthday')) : '';
12294        }
12295
12296        vm.getValue = function (player, teamName, colId) {                        
12297            switch (colId) {
12298                case 1:
12299                    return { value: player.number, class: 'text-center', sortValue: _.parseInt(player.number) };
12300                case 2:
12301                    return { value: player.name, class: 'text-nowrap sticky-col', sortValue: _.kebabCase(player.name), url: vm.url.getPlayerUrl(player.name, player.id) };
12302                case 3:
12303                    return { value: positionService.getPosition(player.position, 'abbreviation'), class: 'text-center' };
12304                case 4:
12305                    return { value: teamName, class: 'text-nowrap', sortValue: _.kebabCase(teamName), url: vm.url.getTeamUrl(teamName, vm.id) };
12306                case 5:
12307                    return { value: playerService.getAge(player.birthday), class: 'text-center' };
12308                case 6:
12309                    return { value: player.height, class: 'text-center' };
12310                case 7:
12311                    return { value: player.weight, class: 'text-center' };
12312                case 8:
12313                case 13:
12314                case 14:
12315                    return { value: player.level, sortValue: _.kebabCase(player.level), class: 'text-center' };
12316                case 9:
12317                    return { value: vm.getBirthday(player.birthday), class: 'text-center' };
12318                case 10:
12319                    return { value: $translate.instant(playerService.getStatus(player.LineupStatus)), class: 'text-center' };
12320                case 11:
12321                    return { value: $translate.instant(playerService.getPlayerType(player.PlayerStatus)), sortValue: _.kebabCase(player.Type), class: 'text-center' }
12322            }
12323
12324            return { value: '', class: 'text-center' };
12325        }
12326        
12327        if(vm.statusId === 1){
12328            _.forEach(vm.teamList, function(team){
12329                _.forEach(team.playersCategories, function(category, catIdx){
12330                    const tempPlayers = _.filter(category.players, function (player) { return player.status === "Selected" })
12331                    if(tempPlayers.length > 0){
12332                        team.playersCategories[catIdx].players = tempPlayers
12333                    }
12334                })
12335            })
12336        }
12337
12338        setTeams();
12339
12340        $scope.$watch('localFirst', function () {
12341            setTeams();
12342        });
12343
12344        $scope.$watch('lineupColumns', function () {
12345            buildColumns($scope.lineupColumns);
12346        })
12347
12348        function setTeams() {
12349            if ($scope.localFirst) {
12350                vm.teams = [vm.teamList[1], vm.teamList[0]];
12351            } else {
12352                vm.teams = [vm.teamList[0], vm.teamList[1]];
12353            }
12354        }
12355
12356        function buildColumns(columnsToDisplay) {
12357            vm.columns = [];
12358            
12359            columnsToDisplay.forEach(function (col) {
12360                var stat = playerService.getPlayerColumn(col.id);
12361                vm.columns.push({
12362                    id: col.id,
12363                    visibleDesktop: col.visibleDesktop,
12364                    visibleMobile: col.visibleMobile,
12365                    name: stat.name
12366                });
12367            });           
12368        }
12369    }
12370})();
12371;
12372(function () {
12373    'use strict';
12374
12375    angular
12376        .module('app.directives')
12377        .directive('gameDetailsLineups', gameDetailsLineups)
12378
12379    gameDetailsLineups.$inject = [];
12380
12381    function gameDetailsLineups() {
12382        return {
12383            restrict: 'E',
12384            scope: {                
12385                widget: '=',
12386                localFirst: '=',
12387                lineupColumns: '=',
12388            },
12389            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/game-details/lineups/game-details-lineups.tpl.html',
12390            controller: 'GameDetailsLineupsController',
12391            controllerAs: 'lineups'
12392        };
12393    }
12394})();;
12395(function () {
12396    'use strict';
12397
12398    angular
12399        .module('app.directives')
12400        .controller('GamePlayersStats', GamePlayersStats);
12401
12402    GamePlayersStats.$inject = ['$rootScope', '$scope', '$localStorage', '$window', 'WebsiteEditorService', '$timeout', 'UrlService', 'StatisticService', 'PositionService', 'GoogleMapService', 'FacilityService', 'GameService'];
12403
12404    function GamePlayersStats($rootScope, $scope, $localStorage, $window, websiteEditorService, $timeout, urlService, statisticService, positionService, googleMapService, facilityService, gameService) {
12405        var vm = this;
12406        vm.widget = angular.fromJson(widgets[$scope.widget]);
12407
12408        vm = Object.assign(vm, angular.fromJson(__gameDetails__
12409            .replace(/[\n\r]+/g, ' ')));
12410        
12411        vm.url = urlService
12412        vm.position = positionService
12413        vm.bothTeams = false
12414        vm.playersToShow = []
12415        vm.allPosColumns = {}
12416        vm.allTeamPos = {}
12417        vm.sportId = $localStorage.solution.sportId;        
12418
12419        // Set view model parameters.
12420        for (var parameter in vm.widget.parameters) {
12421            switch (vm.widget.parameters[parameter].id) {
12422                case 'selectedTeam':
12423                    vm.selectedTeam = vm.widget.parameters[parameter].value;
12424                    vm.teamName = vm.selectedTeam === 'bothTeams' ? 'bothTeams' : vm[`${vm.selectedTeam}Name`]
12425                    vm.teamId = vm.selectedTeam === 'bothTeams' ? -1 : vm[`${vm.selectedTeam}Id`]
12426                    break;
12427                case 'selectedPosition':
12428                    vm.selectedPosition = vm.widget.parameters[parameter].value;
12429                    $timeout(function () {
12430                        vm.columns = vm.getColumns(vm.selectedPosition)
12431                    })
12432                    break;
12433                case 'columnsDisplaySelect':
12434                    vm.columnsDisplaySelect = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
12435                    $timeout(function () {
12436                        buildColumns(vm.columnsDisplaySelect);
12437                    })
12438                    break;
12439            }
12440        }
12441
12442        vm.clickFacility = function () {
12443            var url = googleMapService.getMapSearchUrl(vm.facility[0].facilityAddress);
12444            window.open(url, "_blank");
12445        }
12446
12447        vm.getTeamInfo = function (teamId, detail) {
12448            let currentTeam = _.filter(vm.teamList, function (team) {
12449                return team.id === Number(teamId)
12450            })
12451            if (detail === 'name') { return currentTeam[0].name }
12452            if (detail === 'img') { return currentTeam[0].avatar }
12453        }
12454
12455        vm.showStat = function (column) {
12456            if (isMobile() && column.visibleMobile) {
12457                return true;
12458            } else if (!isMobile() && column.visibleDesktop) {
12459                return true;
12460            }
12461            return false;
12462        }
12463
12464        vm.getStatisticValue = function (player, statisticId) {
12465            if (player.stats.length > 0) {
12466                var playerStat = _.find(player.stats, function (statistic) {
12467                    return statistic.statTypeId === statisticId;
12468                });
12469
12470                if (playerStat) {
12471                    return playerStat.displayValue;
12472                }
12473            }
12474
12475            return '0';
12476        };
12477
12478        vm.getPlayers = function () {
12479            _.forEach(vm.teamList, function (team) {
12480                var teamPlayers = _.filter(team.players, { status: "Selected" });
12481                if (vm.selectedPosition > 0) {
12482                    if (vm.teamId > 0) {
12483                        _.forEach(teamPlayers, function (player) {
12484                            if (player.teamId == vm.teamId && player.categoryId == vm.selectedPosition) {
12485                                vm.playersToShow.push(player)
12486                            }
12487                        })
12488                    }
12489                    else {
12490                        _.forEach(teamPlayers, function (player) {
12491                            if (player.categoryId == vm.selectedPosition) {
12492                                vm.playersToShow.push(player)
12493                            }
12494                        })
12495                    }
12496                } else {
12497                    if (vm.teamId > 0) {
12498                        _.forEach(teamPlayers, function (player) {
12499                            if (player.teamId == vm.teamId) {
12500                                vm.playersToShow.push(player)
12501                            }
12502                        })
12503                    }
12504                    else {
12505                        _.forEach(teamPlayers, function (player) {
12506                            vm.playersToShow.push(player)
12507                        })
12508                    }
12509                }
12510            })
12511
12512            if (vm.selectedPosition > 0 && vm.teamId < 0) {
12513                vm.playersToShow = _.groupBy(vm.playersToShow, function (player) {
12514                    return player.teamId
12515                })
12516            }
12517            if (vm.selectedPosition < 0 && vm.teamId > 0) {
12518                vm.playersToShow = _.groupBy(vm.playersToShow, function (player) {
12519                    return player.categoryId
12520                })
12521            }
12522            if (vm.selectedPosition > 0 && vm.teamId > 0) {
12523                vm.playersToShow = _.groupBy(vm.playersToShow, function (player) {
12524                    return player.teamId
12525                })
12526            }
12527            if (vm.selectedPosition < 0 && vm.teamId < 0) {
12528                vm.allTeamPos[vm.teamList[0].id] = {
12529                    8: [],
12530                    9: [],
12531                    10: [],
12532                    21: []
12533                }
12534                vm.allTeamPos[vm.teamList[1].id] = {
12535                    8: [],
12536                    9: [],
12537                    10: [],
12538                    21: []
12539                }
12540
12541                _.forEach(vm.playersToShow, function (player) {
12542                    vm.allTeamPos[player.teamId][player.categoryId].push(player)
12543                })
12544            }
12545
12546            vm.hasData = Object.keys(vm.playersToShow).length > 0
12547        }
12548
12549        vm.getPlayers()
12550
12551        vm.getColumns = function (catId) {
12552            let columns;
12553
12554            switch (Number(catId)) {
12555                case 8:
12556                    columns = statisticService.getPlayerStatisticColumnsByColumnIds([99, 100, 101, 91, 102, 93, 90, 96, 97, 98]);
12557                    break;
12558                case 9:
12559                    columns = statisticService.getPlayerStatisticColumnsByColumnIds([67, 77, 80, 75, 72])
12560                    break;
12561                case 10:
12562                    columns = statisticService.getPlayerStatisticColumnsByColumnIds([134, 137, 140, 141, 142, 152, 154, 155, 162])
12563                    break;
12564                case 21:
12565                    columns = statisticService.getPlayerStatisticColumnsByColumnIds([65, 105, 107, 108])
12566                    break;
12567                case -1:
12568                    vm.allPosColumns[8] = statisticService.getPlayerStatisticColumnsByColumnIds([99, 100, 101, 91, 102, 93, 90, 96, 97, 98])
12569                    vm.allPosColumns[9] = statisticService.getPlayerStatisticColumnsByColumnIds([67, 77, 80, 75, 72])
12570                    vm.allPosColumns[10] = statisticService.getPlayerStatisticColumnsByColumnIds([134, 137, 140, 141, 142, 152, 154, 155, 162])
12571                    vm.allPosColumns[21] = statisticService.getPlayerStatisticColumnsByColumnIds([65, 105, 107, 108])
12572                    columns = vm.allPosColumns
12573                    break;
12574            }
12575
12576            // TODO Initialize column sort / change hardcoded value.
12577            _.find(columns, function (column) {
12578                switch (Number(catId)) {
12579                    case 8:
12580                        column.id === 100;
12581                        break;
12582                    case 9:
12583                        column.id === 81;
12584                        break;
12585                    case 10:
12586                        column.id === 134;
12587                        break;
12588                    case 21:
12589                        column.id === 65;
12590                        break;
12591                }
12592                return column;
12593            })
12594            return columns
12595        }
12596        // Triggered when parameters are changed.
12597        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
12598            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
12599                .then(function (response) {
12600                    // Save parameters   
12601                    for (var parameter in vm.widget.parameters) {
12602                        switch (vm.widget.parameters[parameter].id) {
12603                            case 'selectedTeam':
12604                                vm.widget.parameters[parameter].value = data.selectedTeam;
12605                                vm.selectedTeam = data.selectedTeam;
12606                                vm.teamName = vm.selectedTeam === 'bothTeams' ? 'bothTeams' : vm[`${vm.selectedTeam}Name`]
12607                                vm.teamId = vm.selectedTeam === 'bothTeams' ? -1 : vm[`${vm.selectedTeam}Id`]
12608                                break;
12609                            case 'selectedPosition':
12610                                vm.widget.parameters[parameter].value = data.selectedPosition;
12611                                vm.selectedPosition = data.selectedPosition;
12612                                vm.columns = vm.getColumns(vm.selectedPosition)
12613                                break;
12614                            case 'columnsDisplaySelect':
12615                                vm.widget.parameters[parameter].value = data.columnsDisplaySelect;
12616                                vm.columnsDisplaySelect = angular.fromJson(data.columnsDisplaySelect.replace(/\'/g, '"'));
12617                                buildColumns(vm.columnsDisplaySelect);
12618                                break;
12619                        }
12620                    }
12621                    vm.playersToShow = []
12622                    vm.getPlayers()
12623                    // Update the variable.
12624                    widgets[$scope.widget] = angular.toJson(vm.widget);
12625                })
12626                .catch(function (error) {
12627                    bugsnag.notify(error);
12628                });
12629        });
12630
12631        function buildColumns(columnsToDisplay) {
12632            vm.columns = [];
12633            columnsToDisplay.forEach(function (col) {
12634                var stat = statisticService.getPlayerStatisticByStatId(col.id);
12635                if (stat) {
12636                    vm.columns.push({
12637                        id: col.id,
12638                        visibleDesktop: col.visibleDesktop,
12639                        visibleMobile: col.visibleMobile,
12640                        name: stat.name,
12641                        abbreviation: stat.abbreviation
12642                    })
12643                }
12644            });
12645
12646            switch (vm.selectedTeam) {
12647                case 'localTeam':
12648                    vm.teamId = vm.localTeamId;
12649                    vm.team = _.find(vm.teamList, { id: vm.teamId });
12650                    break;
12651                case 'visitorTeam':
12652                    vm.teamId = vm.visitorTeamId;
12653                    vm.team = _.find(vm.teamList, { id: vm.teamId });
12654                    break;
12655            }
12656            vm.teamId = vm[`${vm.selectedTeam}Id`];
12657            vm.team = _.find(vm.teamList, { id: vm.teamId });
12658
12659            var players = _.get(_.find(vm.team.playersCategories, { id: 10 }), 'players');
12660            vm.players = players;
12661
12662            var teamSummaryStats = _.find(vm.team.players, { id: 0, categoryId: 10 })
12663            if (teamSummaryStats) {
12664                vm.teamSummary = teamSummaryStats;
12665            }
12666        }
12667
12668        facilityService.getFacilitiesDetailsWithUpdateDate(__solutionId__)
12669            .then(function (response) {
12670
12671                vm.facility = _.filter(response.data.facilities, function (facility) {
12672                    return facility.name === vm.sportCenterName
12673                })
12674            })
12675            .catch(function (error) {
12676                bugsnag.notify(error);
12677            });
12678        $scope.$on('$destroy', listener);
12679
12680        function isMobile() {
12681            return $window.innerWidth <= 600;
12682        }
12683    }
12684})();
12685;
12686(function () {
12687    'use strict';
12688
12689    angular
12690        .module('app.directives')
12691        .directive('gamePlayersStats', gamePlayersStats)
12692
12693    gamePlayersStats.$inject = [];
12694
12695    function gamePlayersStats() {
12696        return {
12697            restrict: 'E',
12698            scope: {
12699                widget: '='
12700            },
12701            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/game-players-stats/game-players-stats.tpl.html',
12702            controller: 'GamePlayersStats',
12703            controllerAs: 'gamePlayersStats',
12704        };
12705    }
12706})();
12707;
12708(function () {
12709    'use strict';
12710
12711    angular
12712        .module('app.directives')
12713        .controller('PlayByPlayWidgetController', PlayByPlayWidgetController);
12714
12715    PlayByPlayWidgetController.$inject = ['$rootScope', '$scope', 'UrlService', 'PositionService', 'EventService'];
12716
12717    function PlayByPlayWidgetController($rootScope, $scope, urlService, positionService, eventService) {
12718        var vm = this;
12719        var gameDetails = Object.assign(vm, angular.fromJson(__gameDetails__
12720                                                                .replace(/[\n\r]+/g, ' ')));
12721        vm.url = urlService;
12722        vm.periods = [
12723            { number: 1 }, { number: 2 }, { number: 3 }
12724        ];
12725        vm.selectedPeriod = 1; // Set default selected period to 1.
12726        
12727        buildEvents(1);
12728
12729        // TODO Get parameter of the widget....
12730        var widgetDefinition = angular.fromJson(widgets[$scope.widget]);
12731       
12732        vm.selectPeriod = function(period) {
12733            // Update the selected period.
12734            vm.selectedPeriod = period.number;
12735
12736            // Get the events for the selected period.
12737            buildEvents(period.number);
12738        };
12739
12740        function buildEvents(period) {
12741            vm.events = [];
12742
12743            _.forEach(gameDetails.eventList, function(event) {
12744                // Get events for the selected period.
12745                if (period == event.periodId) {
12746                    var newEvent = null;
12747                    var team = _.find(gameDetails.teamList, function(team) {
12748                        return team.id === event.teamId;
12749                    });
12750
12751                    switch (event.eventTypeId) {
12752                        case 1: // Goal
12753                            // Get scorer (Stat type = 6).
12754                            // TODO Find a way to chained these finds functions.
12755                            var scorer = _.find(event.statList, function(stat) {
12756                                return stat.statTypeId === 6;
12757                            });
12758
12759                            var goalScorer = null;
12760                            if (scorer) {
12761                                scorer = _.find(team.players, function (player) {
12762                                    return player.id === scorer.playerId;
12763                                });                                
12764
12765                                goalScorer = {
12766                                    id: scorer.id,
12767                                    number: scorer.number,
12768                                    name: `${scorer.firstName} ${scorer.lastName}`,
12769                                    avatar: scorer.avatar,
12770                                    position: positionService.getPosition(scorer.position, 1),
12771                                    goals: scorer.stats && scorer.stats.length > 0 ? _.find(scorer.stats, function (stat) { return stat.statTypeId === 6; }).value : 0
12772                                }
12773                            }
12774
12775                            // Get assists (Stat type = 7).                            
12776                            var assists = _.filter(event.statList, function(stat) {
12777                                return stat.statTypeId === 7;
12778                            });
12779
12780                            newEvent = {
12781                                qualifier: eventService.getEventById(event.qualifier),
12782                                type: 'goal',
12783                                time: event.time,
12784                                team: {
12785                                    id: team.id,
12786                                    name: team.name,
12787                                    abbreviation: team.abbreviation,
12788                                    avatar: team.avatar,
12789                                    home: team.id === gameDetails.localTeamId ? true: false
12790                                },
12791                                scorer: goalScorer,
12792                                assists: []
12793                            };
12794
12795                            assists.forEach(function (assist) {
12796                                var player = _.find(team.players, function(player) {
12797                                    return player.id === assist.playerId;
12798                                });       
12799
12800                                newEvent.assists.push({
12801                                    id: player.id,
12802                                    number: player.number,
12803                                    name: `${player.firstName} ${player.lastName}`,
12804                                    avatar: player.avatar,
12805                                    position: positionService.getPosition(player.position, 1),
12806                                    assists: player.stats && player.stats.length > 0 ? _.find(player.stats, function(stat) { return stat.statTypeId === 7; }).value : 0
12807                                });
12808                            });
12809                            break;
12810                            
12811                        case 2: // Penalty
12812                            var player = _.find(team.players, function(player) {
12813                                return player.id === event.statList[0].playerId;
12814                            });
12815
12816                            var penaltyPlayer = null;
12817
12818                            if (player) {
12819                                penaltyPlayer = {
12820                                    id: player.id,
12821                                    position: positionService.getPosition(player.position, 1),
12822                                    number: player.number,
12823                                    name: `${player.firstName} ${player.lastName}`,
12824                                    avatar: player.avatar
12825                                }
12826
12827                            }
12828                            
12829                            newEvent = {
12830                                qualifier: eventService.getPenaltyById(event.qualifier),
12831                                secondQualifier: eventService.getPenaltyTypeById(event.secondQualifier),
12832                                type: 'penalty',
12833                                time: event.time,
12834                                team: {
12835                                    id: team.id,
12836                                    name: team.name,
12837                                    abbreviation: team.abbreviation,
12838                                    avatar: team.avatar,
12839                                    home: team.id === gameDetails.localTeamId ? true: false
12840                                },
12841                                player: penaltyPlayer
12842                            }
12843                            break;
12844                    }
12845
12846                    if (newEvent !== null) {
12847                        vm.events.push(newEvent)
12848                    }                    
12849                }                
12850            });
12851
12852            vm.events = _.orderBy(vm.events, ['time'], ['asc']);
12853        }        
12854    }
12855})();
12856;
12857(function () {
12858    'use strict';
12859
12860    angular
12861        .module('app.directives')
12862        .directive('playByPlay', playByPlay)
12863
12864    playByPlay.$inject = [];
12865
12866    function playByPlay() {
12867        return {
12868            restrict: 'E',
12869            scope: {                
12870                widget: '=',
12871                showPlayerStats: '='
12872            },
12873            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/game-details/play-by-play/play-by-play.tpl.html',
12874            controller: 'PlayByPlayWidgetController',
12875            controllerAs: 'playByPlay'
12876        };
12877    }
12878})();;
12879(function () {
12880    'use strict';
12881
12882    angular
12883        .module('app.directives')
12884        .controller('GameDetailsSummaryController', GameDetailsSummaryController);
12885
12886    GameDetailsSummaryController.$inject = ['$rootScope', '$scope', 'UrlService', 'PositionService', 'EventService', 'GameService'];
12887
12888    function GameDetailsSummaryController($rootScope, $scope, urlService, positionService, eventService, gameService) {
12889        var vm = this;        
12890        var gameDetails = angular.fromJson(__gameDetails__
12891                                                .replace(/[\n\r]+/g, ' ')); 
12892        var seasonStatistics = [];       
12893        vm.url = urlService;
12894        vm.event = eventService;        
12895            
12896        // TODO Get parameter of the widget....
12897        var widgetDefinition = angular.fromJson(widgets[$scope.widget]);        
12898                
12899        // Get season statistics.
12900        gameService.getStatisticsReportByGameId(gameDetails.id)
12901            .then(function(response) {
12902                // Set season statistics.
12903                seasonStatistics = response.data;
12904
12905                // Build the game summary array.
12906                buildSummary();
12907
12908                // Build the staff list.
12909                buildStaffList();
12910            })
12911            .catch(function(error) {
12912                // TODO Bugsnag...
12913            });
12914        
12915        function buildSummary() {
12916            var score = getInitialScore();
12917            var period;
12918            vm.periods = [
12919                { id: 1, goals: [], penalties: [] }, { id: 2, goals: [], penalties: [] }, { id: 3, goals: [], penalties: [] }
12920            ];
12921
12922            // Sort the list by periodId.
12923            gameDetails.eventList = _.sortBy(gameDetails.eventList, 'periodId', 'time');
12924
12925            _.forEach(gameDetails.eventList, function(event) {
12926                var team = _.find(gameDetails.teamList, function(team) {
12927                    return team.id === event.teamId;
12928                });               
12929
12930                switch (event.eventTypeId) {
12931                    case 1: // Goal
12932                        // Goal, update the score.
12933                        // TODO Probably a better way to do this...                        
12934                        score = angular.fromJson(angular.toJson(score));
12935                        if (team.id === gameDetails.visitorTeamId) {
12936                            score.visitor.value += 1;
12937                        } else {
12938                            score.home.value += 1;
12939                        }
12940                    
12941                        // Get scorer (Stat type = 6).
12942                        // TODO Find a way to chained these finds functions.
12943                        var scorer = _.find(event.statList, function(stat) {
12944                            return stat.statTypeId === 6;
12945                        });
12946
12947                        var goalScorer = null;
12948
12949                        if (scorer) {
12950                            scorer = _.find(team.players, function(player) {
12951                                return player.id === scorer.playerId;
12952                            });          
12953
12954                            goalScorer = {
12955                                id: scorer.id,
12956                                number: scorer.number,
12957                                name: `${scorer.firstName} ${scorer.lastName}`,
12958                                avatar: scorer.avatar,
12959                                position: positionService.getPosition(scorer.position, 1),
12960                                goals: getCumulativeGoals(scorer)
12961                            }
12962                        }
12963                        
12964                        // Get assists (Stat type = 7).                            
12965                        var assists = _.filter(event.statList, function(stat) {
12966                            return stat.statTypeId === 7;
12967                        });                                                                                
12968
12969                        var newGoal = {
12970                            qualifier: eventService.getEventById(event.qualifier),
12971                            time: event.time,
12972                            team: {
12973                                id: team.id,
12974                                name: team.name,
12975                                abbreviation: team.abbreviation,
12976                                avatar: team.avatar,
12977                                home: team.id === gameDetails.localTeamId ? true: false
12978                            },
12979                            score: score,
12980                            scorer: goalScorer,
12981                            emptyNet: event.secondQualifier === 259,
12982                            assists: []
12983                        };
12984                        
12985                        assists.forEach(function(assist) {
12986                            var player = _.find(team.players, function(player) {
12987                                return player.id === assist.playerId;
12988                            });       
12989                            
12990                            newGoal.assists.push({
12991                                id: player.id,
12992                                number: player.number,
12993                                name: `${player.firstName} ${player.lastName}`,
12994                                avatar: player.avatar,
12995                                position: positionService.getPosition(player.position, 1),
12996                                assists: getCumulativeAssists(player)
12997                            });
12998                        });
12999
13000                        period = _.find(vm.periods, function(period) {
13001                            return period.id === event.periodId;
13002                        });
13003    
13004                        // Add the missing period and goal.
13005                        if (angular.isUndefinedOrNull(period)) {
13006                            vm.periods.push({
13007                                id: event.periodId,
13008                                goals: [newGoal],
13009                                penalties: []
13010                            });
13011                        } else {
13012                            // Push the new goal into the current period.
13013                            period.goals.push(newGoal);
13014                        }
13015                        break;  
13016                        
13017                    case 2: // Penalty
13018                        var player = _.find(event.statList, function(stat) {
13019                            return stat.statTypeId === 8;
13020                        });
13021                        
13022                        var penaltyPlayer = null;
13023                                                
13024                        if (player) {
13025                            // TODO Should support event without stats                        
13026                            player = _.find(team.players, function (_player) {
13027                                return _player.id === player.playerId;
13028                            }); 
13029
13030                            penaltyPlayer = {
13031                                id: player.id,
13032                                number: player.number,
13033                                name: `${player.firstName} ${player.lastName}`,
13034                                avatar: player.avatar,
13035                                position: positionService.getPosition(player.position, 1)
13036                            }
13037                        }
13038
13039                        var newPenalty = {
13040                            qualifier: eventService.getPenaltyById(event.qualifier),
13041                            secondQualifier: eventService.getPenaltyTypeById(event.secondQualifier),
13042                            time: event.time,
13043                            team: {
13044                                id: team.id,
13045                                name: team.name,
13046                                abbreviation: team.abbreviation,
13047                                avatar: team.avatar,
13048                                home: team.id === gameDetails.localTeamId ? true: false
13049                            },
13050                            player: penaltyPlayer
13051                        };
13052    
13053                        period = _.find(vm.periods, function(period) {
13054                            return period.id === event.periodId;
13055                        });
13056        
13057                        // Add the missing period and goal.                            
13058                        if (angular.isUndefinedOrNull(period)) {
13059                            vm.periods.push({
13060                                id: event.periodId,
13061                                goals: [],
13062                                penalties: [newPenalty]
13063                            });
13064                        } else {
13065                            // Push the new penalty into the current period.
13066                            period.penalties.push(newPenalty);
13067                        }
13068                        
13069                        break;
13070                    
13071                    case 6: // Shootout
13072                        var shootoutEvent = _.find(event.statList, function (stat) {
13073                            return stat.statTypeId === 12;
13074                        });
13075
13076                        if (angular.isDefined(shootoutEvent)) {
13077                            var shoutoutPlayer = _.find(team.players, function (_player) {
13078                                return _player.id === shootoutEvent.playerId;
13079                            });
13080
13081                            var home = team.id === gameDetails.localTeamId ? true : false;
13082
13083                            var newShootout = {
13084                                team: {
13085                                    id: team.id,
13086                                    name: team.name,
13087                                    abbreviation: team.abbreviation,
13088                                    avatar: team.avatar,
13089                                    home: home
13090                                },
13091                                player: {
13092                                    id: shoutoutPlayer.id,
13093                                    number: shoutoutPlayer.number,
13094                                    name: `${shoutoutPlayer.firstName} ${shoutoutPlayer.lastName}`,
13095                                    avatar: shoutoutPlayer.avatar,
13096                                    position: positionService.getPosition(shoutoutPlayer.position, 1)
13097                                },
13098                                goal: shootoutEvent.value === 1
13099                            }
13100
13101                            period = _.find(vm.periods, function (period) {
13102                                return period.id === event.periodId;
13103                            });
13104
13105                            // Add the missing shootout.                            
13106                            if (angular.isUndefinedOrNull(period)) {
13107                                vm.periods.push({
13108                                    id: event.periodId,
13109                                    shootouts: [newShootout]
13110                                });
13111                            } else {
13112                                // Push the new shootout into the current period.
13113                                period.shootouts.push(newShootout);
13114                            }
13115                        }
13116
13117                        break;
13118                }                 
13119            });
13120        } 
13121
13122        function buildStaffList() {
13123            vm.staffList = [];
13124
13125            for(var staff in gameDetails.staffList) {
13126                var type = _.find(vm.staffList, function(currentStaff) {
13127                    return currentStaff.type === gameDetails.staffList[staff].type
13128                });
13129
13130                if (angular.isUndefinedOrNull(type)) {
13131                    vm.staffList.push({ 
13132                        type: gameDetails.staffList[staff].type, 
13133                        name: positionService.getStaffPosition(gameDetails.staffList[staff].type), 
13134                        staff: [gameDetails.staffList[staff]]
13135                    });
13136                } else {
13137                    type.staff.push(gameDetails.staffList[staff])
13138                }
13139            }
13140            
13141        }
13142        
13143        function getInitialScore() {
13144            return {
13145                visitor: {
13146                    abbreviation: _.find(gameDetails.teamList, function(team) {
13147                        return team.id === gameDetails.visitorTeamId;
13148                    }).abbreviation,
13149                    value: 0
13150                },
13151                home: {
13152                    abbreviation: _.find(gameDetails.teamList, function(team) {
13153                        return team.id === gameDetails.localTeamId;
13154                    }).abbreviation,
13155                    value: 0
13156                }
13157            };
13158        }
13159
13160        function getCumulativeGoals(player) {
13161            var goals = 1;
13162
13163            _.forEach(vm.periods, function(period) {
13164                _.forEach(period.goals, function(goal) {
13165                    if (goal.scorer && goal.scorer.id === player.id) {
13166                        goals += 1;        
13167                    }   
13168                });
13169            });
13170
13171            // Get current season goals total.
13172            var seasonStatistic = getSeasonStatistic(player, 6);
13173
13174            return goals + (angular.isDefined(seasonStatistic) ? seasonStatistic.Value : 0);
13175        }
13176
13177        function getCumulativeAssists(player) {
13178            var assists = 1;
13179
13180            _.forEach(vm.periods, function(period) {
13181                _.forEach(period.goals, function(goal) {
13182                    _.forEach(goal.assists, function(assits) {
13183                        if (assits.id === player.id) {
13184                            assists += 1;        
13185                        }  
13186                    }) 
13187                });
13188            });
13189
13190            // Get current season goals total.
13191            var seasonStatistic = getSeasonStatistic(player, 7);
13192
13193            return assists + (angular.isDefined(seasonStatistic) ? seasonStatistic.Value : 0);
13194        }
13195
13196        function getSeasonStatistic(player, statisticId) {
13197            return _.find(seasonStatistics, function(seasonStatistic) {
13198                return (player.id === seasonStatistic.PlayerId && seasonStatistic.StatTypeId === statisticId)
13199            });
13200        }
13201    }
13202})();
13203;
13204(function () {
13205    'use strict';
13206
13207    angular
13208        .module('app.directives')
13209        .directive('gameDetailsSummary', gameDetailsSummary)
13210
13211    gameDetailsSummary.$inject = [];
13212
13213    function gameDetailsSummary() {
13214        return {
13215            restrict: 'E',
13216            scope: {                
13217                widget: '=',
13218                showPlayerStats: '='
13219            },
13220            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/game-details/summary/game-details-summary.tpl.html',
13221            controller: 'GameDetailsSummaryController',
13222            controllerAs: 'summary'
13223        };
13224    }
13225})();;
13226(function () {
13227    'use strict';
13228
13229    angular
13230        .module('app.directives')
13231        .controller('GameDetailsStatisticsController', GameDetailsStatisticsController);
13232
13233    GameDetailsStatisticsController.$inject = ['$rootScope', '$scope', '$localStorage', 'UrlService', 'PositionService', 'StatisticService', 'PlayerService'];
13234
13235    function GameDetailsStatisticsController($rootScope, $scope, $localStorage, urlService, positionService, statisticService, playerService) {
13236        var vm = this;
13237        var statsSportConfig = {
13238            1: {
13239                2: {
13240                    order: 1,
13241                    stats: [6, 7, 29, 8, 26, 27],
13242                    sort: [29, 'desc']
13243                },
13244                1: {
13245                    order: 2,
13246                    stats: [23, 10, 22, 30, 24, 32, 8],
13247                    sort: [22, 'desc']
13248                }
13249            },
13250            2: {
13251                9: {
13252                    order: 1,
13253                    stats: [66, 67, 68, 69, 70, 71, 72, 73, 77, 75, 78, 79, 80, 81, 82, 83, 86, 85],
13254                    sort: [80, 'desc']
13255                },
13256                8: {
13257                    order: 2,
13258                    stats: [99, 100, 101, 91, 102, 93, 90, 96, 97, 98],
13259                    sort: [100, 'desc']
13260                },
13261            },
13262            4: {
13263                10: {
13264                    order: 1,
13265                    stats: [128, 131, 133, 136, 139, 142, 146, 157, 149, 150, 151, 156],
13266                    sort: [128, 'desc']
13267                },
13268            },
13269            6: {
13270                3: {
13271                    order: 1,
13272                    stats: [36, 37, 38, 39, 40, 41, 43, 44],
13273                    sort: [37, 'desc']
13274                },
13275                4: {
13276                    order: 2,
13277                    stats: [46, 47, 48, 49, 50, 64],
13278                    sort: [46, 'desc']
13279                },
13280            },
13281            14: {
13282                16: {
13283                    order: 1,
13284                    stats: [53, 54, 55, 60, 57, 56, 58, 59],
13285                    sort: [60, 'desc']
13286                },
13287                17: {
13288                    order: 2,
13289                    stats: [53, 54, 55, 60, 57, 56, 58, 59],
13290                    sort: [60, 'desc']
13291                }
13292            }
13293        }
13294        
13295        //State variables
13296        vm = Object.assign(vm, angular.fromJson(__gameDetails__.replace(/[\n\r]+/g, ' ')));
13297        vm.url = urlService;
13298        vm.position = positionService;
13299        vm.sportId = $localStorage.solution.sportId;
13300        vm.playerCategories = {};
13301
13302        var sportPlayerCategories = statsSportConfig[vm.sportId];        
13303
13304        //State functions
13305        vm.sort = function (playerCategory, column) {
13306            // Reset columns sort.
13307            _.forEach(playerCategory.columns, function (_column) {
13308                if (_column.id !== column.id) {
13309                    _column.sort = '';
13310                }
13311            });
13312
13313            if (angular.isUndefined(column.sort)) {
13314                column.sort = 'desc';
13315            } else {
13316                // Toggle sort order.
13317                column.sort = column.sort === 'desc'
13318                    ? column.sort = 'asc'
13319                    : column.sort = 'desc';
13320            }
13321
13322            var players = _.filter(playerCategory.players, function (player) {
13323                return player.status === "Selected" || player.stats.length > 0;
13324            });
13325
13326            if (players.length > 0) {
13327                // Get index of sorted column
13328                var index = _.findIndex(players[0].stats, function (statistic) {
13329                    return statistic.statTypeId === _.find(playerCategory.columns, function (column) { return column.sort; }).id;
13330                });
13331
13332                playerCategory.players = _.orderBy(players, function (player) {
13333                    if (player.stats != null && player.stats[index] != null) {
13334                        return player.stats[index].value;
13335                    } else {
13336                        return 0;
13337                    }
13338                }, [column.sort]);
13339            }
13340        };
13341
13342        vm.showStat = function (column) {
13343            if (vm.isMobile && column.visibleMobile) {
13344                return true;
13345            } else if (!vm.isMobile && column.visibleDesktop) {
13346                return true;
13347            }
13348            return false;
13349        }
13350
13351        vm.getBirthday = function (birthday) {
13352            return birthday !== null ? moment(birthday).format($translate.instant('directives.widgets.team.details.lineup.format.birthday')) : '';
13353        }
13354
13355        vm.getStatisticValue = function (player, statisticId) {
13356            if (_.startsWith(statisticId, 'player')) {
13357                var playerParamId = _.parseInt(statisticId.match(/^player(\d+)$/)[1]);
13358                switch (playerParamId) {
13359                    case 1:
13360                        return { value: player.number, class: 'text-center', sortValue: _.parseInt(player.number) };
13361                    case 2:
13362                        return { value: player.name, class: 'text-nowrap sticky-col', sortValue: _.kebabCase(player.name), url: vm.url.getPlayerUrl(player.name, player.id) };
13363                    case 3:
13364                        return { value: positionService.getPosition(player.position, 'abbreviation'), class: 'text-center' };
13365                    case 4:
13366                        return { value: player.teamName, class: 'text-nowrap', sortValue: _.kebabCase(player.teamName), url: vm.url.getTeamUrl(player.teamName, vm.id) };
13367                    case 5:
13368                        return { value: playerService.getAge(player.birthday), class: 'text-center' };
13369                    case 6:
13370                        return { value: player.height, class: 'text-center' };
13371                    case 7:
13372                        return { value: player.weight, class: 'text-center' };
13373                    case 8:
13374                    case 13:
13375                    case 14:
13376                        return { value: player.level, sortValue: _.kebabCase(player.level), class: 'text-center' };
13377                    case 9:
13378                        return { value: vm.getBirthday(player.birthday), class: 'text-center' };
13379                    case 10:
13380                        return { value: $translate.instant(playerService.getStatus(player.LineupStatus)), class: 'text-center' };
13381                    case 11:
13382                        return { value: $translate.instant(playerService.getPlayerType(player.PlayerStatus)), sortValue: _.kebabCase(player.Type), class: 'text-center' }
13383                }
13384
13385                return { value: '', class: 'text-center' };
13386            }
13387            else {
13388                if (player.stats.length > 0) {
13389                    var playerStat = _.find(player.stats, function (statistic) {
13390                        return statistic.statTypeId === statisticId;
13391                    });
13392
13393                    if (playerStat) {
13394                        return { value: playerStat.displayValue, class: 'text-center', sortValue: playerStat.value };
13395                    }
13396                }
13397
13398                return { value: '0', class: 'text-center' };
13399            }
13400        };
13401
13402        //Component mount
13403        // Sort team list (visitor first)
13404        vm.teamList.sort(function (a, b) {
13405            if (a.id === vm.visitorTeamId) {
13406                return -1;
13407            } else {
13408                return 1;
13409            }
13410        });
13411
13412        setTeams();
13413
13414        $scope.$watch('localFirst', function () {
13415            setTeams();
13416        })
13417
13418        buildTeams();
13419
13420        //Functions
13421        function setTeams() {
13422            console.log('TEAMS')
13423            if ($scope.localFirst) {
13424                vm.teams = [vm.teamList[1], vm.teamList[0]];
13425            } else {
13426                vm.teams = [vm.teamList[0], vm.teamList[1]];
13427            }
13428        }
13429
13430        function buildTeams() {
13431
13432            _.forEach(vm.teams, function (team) {
13433                var teamCategories = {
13434                    categories: []
13435                };
13436
13437                _.forEach(sportPlayerCategories, function (value, key) {
13438
13439                    var categoryColumns = $scope.statsColumns[key].map(function (col) {
13440                        if (_.startsWith(col.id, 'player')) {
13441                            var stat = playerService.getPlayerColumn(_.parseInt(col.id.match(/^player(\d+)$/)[1]));
13442                        }
13443                        else {
13444                            var stat = statisticService.getPlayerStatisticByStatId(col.id);
13445                        }
13446
13447                        return {
13448                            id: col.id,
13449                            visibleDesktop: col.visibleDesktop,
13450                            visibleMobile: col.visibleMobile,
13451                            stat: (stat || {}),
13452                        }
13453                    });
13454
13455                    var category = {
13456                        id: _.parseInt(key),
13457                        columns: categoryColumns,
13458                        players: [],
13459                        order: value.order
13460                    };
13461
13462                    _.find(category.columns, function (column) {
13463                        return column.id === value.sort[0];
13464                    }).sort = value.sort[1];
13465                    teamCategories.categories.push(category);             
13466                });
13467
13468                vm.playerCategories[team.id] = teamCategories;
13469            })
13470
13471            _.forEach(vm.teams, function (team) {
13472                _.forEach(team.playersCategories, function (playerCategory) {
13473                    var players = _.filter(playerCategory.players, function (player) {
13474                        return player.status === 'Selected' || player.stats.length > 0;
13475                    });
13476
13477                    if (players.length > 0) {
13478                        // TODO Get index of sorted column
13479                        var category = _.find(vm.playerCategories[team.id].categories, { id: playerCategory.id });
13480
13481                        if (category) {
13482                            var index = _.findIndex(players[0].stats, function (statistic) {
13483                                return statistic.statTypeId === _.find(category.columns, function (column) { return column.sort; }).id;
13484                            });
13485    
13486                            category.players = _.orderBy(players, function (player) {
13487                                if (player.stats != null && player.stats[index] != null) {
13488                                    return player.stats[index].value;
13489                                } else {
13490                                    return 0;
13491                                }
13492                            }, ['desc']);
13493                        }
13494                    }
13495                });
13496            });
13497        }
13498    }
13499})();
13500;
13501(function () {
13502    'use strict';
13503
13504    angular
13505        .module('app.directives')
13506        .directive('gameDetailsStatistics', gameDetailsStatistics)
13507
13508    gameDetailsStatistics.$inject = [];
13509
13510    function gameDetailsStatistics() {
13511        return {
13512            restrict: 'E',
13513            scope: {                
13514                widget: '=',
13515                localFirst: '=',
13516                statsColumns: '=',
13517            },
13518            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/game-details/statistics/game-details-statistics.tpl.html',
13519            controller: 'GameDetailsStatisticsController',
13520            controllerAs: 'statistics'
13521        };
13522    }
13523})();;
13524(function () {
13525    'use strict';
13526
13527    angular
13528        .module('app.directives')
13529        .controller('GameDetailsStatisticsBaseballController', GameDetailsStatisticsBaseballController);
13530
13531    GameDetailsStatisticsBaseballController.$inject = ['$rootScope', '$scope', '$localStorage', 'UrlService', 'ScoreboardBaseballService', 'StatisticService'];
13532
13533    function GameDetailsStatisticsBaseballController($rootScope, $scope, $localStorage, urlService, scoreboardBaseballService, statisticService) {
13534        var vm = this;
13535
13536        var statsSportConfig = {
13537            2: {
13538                //9: {
13539                //    order: 1,
13540                //    stats: [67, 80, 69, 71, 77, 75, 72, 79],
13541                //    sort: ['row', 'asc'],
13542                //    showPosRow: true
13543                //},
13544                8: {
13545                    order: 2,
13546                    stats: [99, 95, 116, 93, 92, 91, 96, 97, 98],
13547                    sort: [100, 'desc'],
13548                    showPosRow: false
13549                },
13550            }
13551        }
13552        
13553        //State variables
13554        vm = Object.assign(vm, angular.fromJson(__gameDetails__.replace(/[\n\r]+/g, ' ')));
13555        vm.url = urlService;
13556        vm.sportId = $localStorage.solution.sportId;
13557        vm.playerCategories = {};
13558
13559        var sportPlayerCategories = statsSportConfig[vm.sportId];        
13560
13561        //State functions
13562        vm.sort = function (playerCategory, columnId, defaultSort) {
13563            // Reset columns sort.   
13564            
13565            var columnSort = defaultSort || 'desc';
13566            if (columnId == playerCategory.sort.id) {
13567                // Toggle sort order.
13568                columnSort = playerCategory.sort.sort === 'desc'
13569                    ? 'asc'
13570                    : 'desc';
13571            }
13572            
13573            var players = _.filter(playerCategory.players, function (player) {
13574                return player.status === "Selected" || player.stats.length > 0;
13575            });
13576
13577            if (players.length > 0) {
13578                // Get index of sorted column
13579                if (columnId != 'row') {
13580                    var index = _.findIndex(players[0].stats, function (statistic) {
13581                        return statistic.statTypeId === columnId;
13582                    });
13583
13584                    playerCategory.players = _.orderBy(players, function (player) {
13585                        if (player.stats != null && player.stats[index] != null) {
13586                            return player.stats[index].value;
13587                        } else {
13588                            return 0;
13589                        }
13590                    }, [columnSort]);
13591
13592                    playerCategory.sort = { id: columnId, sort: columnSort };
13593                }
13594                else {
13595                    playerCategory.players = _.orderBy(players, function (player) {
13596                        return vm.getRow(player);
13597                    }, [columnSort]);
13598
13599                    playerCategory.sort = { id: 'row', sort: columnSort };
13600                }
13601            }
13602        };
13603
13604        vm.getStatisticValue = function (player, statisticId) {
13605            if (player.stats.length > 0) {
13606
13607                var playerStat = _.find(player.stats, function (statistic) {
13608                    return statistic.statTypeId === statisticId;
13609                });
13610
13611                if (playerStat) {
13612                    return playerStat.displayValue;
13613                }
13614            }
13615
13616            return '0';
13617        };
13618
13619        vm.getRow = function (player) {
13620            return _.get(_.find(player.properties, { name: 'row' }), 'value');
13621        }
13622
13623        vm.getPosition = function (position) {            
13624            return _.get(_.find(scoreboardBaseballService.getDefensePositions(), { id: position }), 'abbreviation');
13625        }
13626
13627        //Component mount
13628        // Sort team list (visitor first)
13629        vm.teamList.sort(function (a, b) {
13630            if (a.id === vm.visitorTeamId) {
13631                return -1;
13632            } else {
13633                return 1;
13634            }
13635        });
13636
13637        setTeams();
13638
13639        $scope.$watch('localFirst', function () {
13640            setTeams();
13641        })
13642
13643        buildTeams();
13644
13645        //Functions
13646        function setTeams() {
13647            if ($scope.localFirst) {
13648                vm.teams = [vm.teamList[1], vm.teamList[0]];
13649            } else {
13650                vm.teams = [vm.teamList[0], vm.teamList[1]];
13651            }
13652        }
13653
13654        function buildTeams() {
13655
13656            _.forEach(vm.teams, function (team) {
13657                var teamCategories = {
13658                    categories: []
13659                };
13660
13661                _.forEach(sportPlayerCategories, function (value, key) {
13662                    var category = {
13663                        id: _.parseInt(key),
13664                        columns: statisticService.getPlayerStatisticColumnsByColumnIds(value.stats),
13665                        showPosRow: value.showPosRow,
13666                        players: [],
13667                        order: value.order,
13668                        sort: { id: value.sort[0], sort: value.sort[1] }
13669                    };
13670
13671                    teamCategories.categories.push(category);
13672                });
13673
13674                vm.playerCategories[team.id] = teamCategories;
13675                
13676            })
13677
13678            _.forEach(vm.teams, function (team) {
13679                _.forEach(team.playersCategories, function (playerCategory) {
13680                    var players = _.filter(playerCategory.players, function (player) {
13681                        return player.status === "Selected" || player.stats.length > 0;
13682                    });
13683
13684                    if (players.length > 0) {
13685                        // TODO Get index of sorted column
13686                        var category = _.find(vm.playerCategories[team.id].categories, { id: playerCategory.id });                                                
13687
13688                        if (category) { 
13689                            if (category.sort.id == 'row') {
13690                                category.players = _.orderBy(players, function (player) {
13691                                    return vm.getRow(player);
13692                                }, [category.sort.sort]);
13693                            }
13694                            else {
13695                                var index = _.findIndex(players[0].stats, function (statistic) {
13696                                    return statistic.statTypeId === category.sort.id;
13697                                });
13698
13699                                category.players = _.orderBy(players, function (player) {
13700                                    if (player.stats != null && player.stats[index] != null) {
13701                                        return player.stats[index].value;
13702                                    } else {
13703                                        return 0;
13704                                    }
13705                                }, [category.sort.sort])
13706                            }                             
13707
13708                            var teamSummaryStats = _.find(team.players, { id: 0, categoryId: playerCategory.id })
13709                            if (teamSummaryStats) {
13710                                category.teamSummary = teamSummaryStats;
13711                            }
13712                        }
13713
13714                    }
13715                });
13716            });
13717        }
13718    }
13719})();
13720;
13721(function () {
13722    'use strict';
13723
13724    angular
13725        .module('app.directives')
13726        .directive('gameDetailsStatisticsBaseball', gameDetailsStatisticsBaseball)
13727
13728    gameDetailsStatisticsBaseball.$inject = [];
13729
13730    function gameDetailsStatisticsBaseball() {
13731        return {
13732            restrict: 'E',
13733            scope: {                
13734                widget: '=',
13735                localFirst: '='
13736            },
13737            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/game-details/statistics/baseball/game-details-statistics.tpl.html',
13738            controller: 'GameDetailsStatisticsBaseballController',
13739            controllerAs: 'statistics'
13740        };
13741    }
13742})();;
13743(function () {
13744    'use strict';
13745
13746    angular
13747        .module('app.directives')
13748        .controller('GameDetailsWidgetController', GameDetailsWidgetController);
13749
13750    GameDetailsWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', 'UrlService', 'PlayerService', 'PositionService', 'SeasonService', 'WebsiteEditorService', 'GoogleMapService', 'FacilityService'];
13751
13752    function GameDetailsWidgetController($rootScope, $scope, $localStorage, urlService, playerService, positionService, seasonService, websiteEditorService, googleMapService, facilityService) {
13753        var vm = this;
13754
13755        //State variables
13756        vm = Object.assign(vm, angular.fromJson(__gameDetails__.replace(/[\n\r]+/g, ' ')));
13757        vm.widget = angular.fromJson(widgets[$scope.widget]);
13758        vm.showPlayerStats = false;
13759        vm.url = urlService;
13760        vm.player = playerService;
13761        vm.position = positionService;
13762        vm.sportId = $localStorage.solution.sportId;
13763        vm.localFirst = false;
13764        
13765        vm.messageTypes = {
13766            1: { class: 'important-note' },
13767            2: { class: 'warning-note' },
13768            3: { class: 'message-note' },
13769            4: { class: 'note-note' }
13770        }
13771
13772        //State functions
13773        vm.getTimeFormatted = function(time) {
13774            return  moment(time, 'hh:mm').format('LT');
13775        };
13776
13777        vm.clickFacility = function () {
13778            var url = googleMapService.getMapSearchUrl(vm.facility[0].facilityAddress);
13779            window.open(url, "_blank");
13780        }
13781
13782        facilityService.getFacilitiesDetailsWithUpdateDate(__solutionId__)
13783            .then(function (response) {
13784                vm.facility = _.filter(response.data.facilities, function (facility) {
13785                    return facility.name === vm.sportCenterName
13786                })
13787            })
13788            .catch(function (error) {
13789                bugsnag.notify(error);
13790            });
13791
13792        //On component mount
13793        for (var parameter in vm.widget.parameters) {
13794            switch (vm.widget.parameters[parameter].id) {
13795                case 'localFirst':
13796                    vm.localFirst = vm.widget.parameters[parameter].value === 'true';
13797                    break;
13798                case 'columnsDisplayStatisticsSelect':
13799                    vm.columnsStatisticsTab = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
13800                    break;
13801                case 'columnsDisplayLineupSelect':
13802                    vm.columnsLineupTab = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
13803                    break;
13804            }
13805        }
13806
13807        // Listener
13808        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
13809            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
13810                .then(function (response) {
13811                    for (var parameter in vm.widget.parameters) {
13812                        switch (vm.widget.parameters[parameter].id) {
13813                            case 'localFirst':
13814                                vm.widget.parameters[parameter].value = data.localFirst.toString();
13815                                vm.localFirst = data.localFirst;
13816                                break;
13817
13818                            case 'columnsDisplayStatisticsSelect':   
13819                                vm.widget.parameters[parameter].value = data.columnsDisplayStatisticsSelect;
13820                                vm.columnsStatisticsTab = angular.fromJson(data.columnsDisplayStatisticsSelect.replace(/\'/g, '"'));
13821                                break;
13822
13823                            case 'columnsDisplayLineupSelect':
13824                                vm.widget.parameters[parameter].value = data.columnsDisplayLineupSelect;
13825                                vm.columnsLineupTab = angular.fromJson(data.columnsDisplayLineupSelect.replace(/\'/g, '"'));
13826                                break;
13827                        }
13828                    }
13829                    widgets[$scope.widget] = angular.toJson(vm.widget);
13830                })
13831                .catch(function (error) {
13832                    bugsnag.notify(error);
13833                });
13834        });
13835
13836        $scope.$on('$destroy', listener);
13837
13838        seasonService.getSeasonParametersBySeasonId(__solutionId__, vm.seasonId)
13839        .then(function(response) {
13840            const configShowPlayerStats = response.data.find(function(config){
13841                return config.Code === 'SHOWPLAYERSTATS';
13842            })
13843            vm.showPlayerStats = configShowPlayerStats && configShowPlayerStats.Value !== '0';
13844        })
13845        .catch(function(error) {
13846            bugsnag.notify(error);
13847        });
13848    }
13849})();
13850;
13851(function () {
13852    'use strict';
13853
13854    angular
13855        .module('app.directives')
13856        .directive('gameDetails', gameDetails)
13857
13858    gameDetails.$inject = [];
13859
13860    function gameDetails() {
13861        return {
13862            restrict: 'E',
13863            scope: {                
13864                widget: '='
13865            },
13866            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/game-details/game-details.tpl.html',
13867            controller: 'GameDetailsWidgetController',
13868            controllerAs: 'gameDetails'
13869        };
13870    }
13871})();;
13872(function () {
13873    'use strict';
13874
13875    angular
13876        .module('app.directives')
13877        .controller('GameHittersStatsWidgetController', GameHittersStatsWidgetController);
13878
13879    GameHittersStatsWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$translate', '$window', 'UrlService', 'PlayerService', 'PositionService', 'SeasonService', 'StatisticService', 'ScoreboardBaseballService', 'WebsiteEditorService', 'GoogleMapService', 'FacilityService', 'SignalrService'];
13880
13881    function GameHittersStatsWidgetController($rootScope, $scope, $localStorage, $translate, $window, urlService, playerService, positionService, seasonService, statisticService, scoreboardBaseballService, websiteEditorService, googleMapService, facilityService, signalrService) {
13882        var vm = this;
13883
13884        //State variables
13885        vm = Object.assign(vm, angular.fromJson(__gameDetails__.replace(/[\n\r]+/g, ' ')));
13886        vm.widget = angular.fromJson(widgets[$scope.widget]);
13887        vm.showPlayerStats = false;
13888        vm.url = urlService;
13889        vm.player = playerService;
13890        vm.position = positionService;
13891        vm.sportId = $localStorage.solution.sportId;        
13892        vm.columnsDisplaySelect = [];
13893        vm.columns = [];
13894        vm.teamSummary = {};
13895
13896        var signalrConnection = signalrService.getConnection(signalrService.GROUPS.BaseballGameUpdate(vm.id));
13897
13898        signalrConnection.on(signalrService.EVENTS.BaseballStatsUpdate, function (response) {
13899            var gameUpdated = angular.fromJson(response.replace(/[\n\r]+/g, ' '));
13900            
13901            if (gameUpdated.id == vm.id) {
13902                vm = Object.assign(vm, gameUpdated);
13903                buildColumns(vm.columnsDisplaySelect);
13904                $scope.$apply();
13905            }
13906        });
13907
13908        //State functions
13909        vm.getStatisticValue = function (player, statisticId) {
13910            if (player && player.stats && player.stats.length > 0) {
13911
13912                var playerStat = _.find(player.stats, function (statistic) {
13913                    return statistic.statTypeId === statisticId;
13914                });
13915
13916                if (playerStat) {
13917                    return playerStat.displayValue;
13918                }
13919            }
13920
13921            return '0';
13922        };
13923
13924        vm.getRow = function (player) {
13925            return _.get(_.find(player.properties, { name: 'row' }), 'value');
13926        }
13927
13928        var defensePositions = scoreboardBaseballService.getDefensePositions();
13929        vm.getPosition = function (position, positions) {
13930            if (!positions)
13931                return '';
13932
13933            var translatedPositions = [];
13934
13935            (positions || []).forEach(function (position) {
13936                if (position != 0) {
13937                    translatedPositions.push($translate.instant(_.get(_.find(defensePositions, { id: position }), 'abbreviation')));
13938                }
13939            })
13940
13941            return translatedPositions.join(", ");
13942        }
13943
13944        vm.showStat = function (column) {
13945            if (isMobile() && column.visibleMobile) {
13946                return true;
13947            } else if (!isMobile() && column.visibleDesktop) {
13948                return true;
13949            }
13950            return false;
13951        }
13952
13953        vm.getStyle = function () {
13954            var style = {};
13955            if (!vm.widgetTransparency) {
13956                style['background-color'] = vm.backgroundColor;
13957                style['background-size'] = 'cover';
13958                style['background-position'] = 'center';
13959                style['border-color'] = vm.border.color;
13960            }
13961
13962            style['border-width'] = `${vm.border.width}px`;
13963            style['border-color'] = vm.border.color;
13964            style['border-radius'] = `${vm.border.radius}px`;
13965            return style;
13966        }
13967
13968        //On component mount
13969        for (var parameter in vm.widget.parameters) {
13970            switch (vm.widget.parameters[parameter].id) {
13971                case 'selectedTeam':
13972                    vm.selectedTeam = vm.widget.parameters[parameter].value;         
13973                    break;
13974
13975                case 'columnsDisplaySelect':
13976                    vm.columnsDisplaySelect = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));                    
13977                    break;
13978
13979                case 'widgetTransparency':
13980                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
13981                    break;
13982
13983                case 'backgroundColor':
13984                    vm.backgroundColor = vm.widget.parameters[parameter].value;
13985                    break;
13986
13987                case 'border':
13988                    vm.border = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
13989                    break;
13990            }
13991        }
13992
13993        buildColumns(vm.columnsDisplaySelect);        
13994
13995        // Listener
13996        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
13997            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
13998                .then(function (response) {
13999                    for (var parameter in vm.widget.parameters) {
14000                        switch (vm.widget.parameters[parameter].id) {                            
14001                            case 'selectedTeam':
14002                                vm.widget.parameters[parameter].value = data.selectedTeam.toString();
14003                                vm.selectedTeam = data.selectedTeam;
14004                                break
14005
14006                            case 'columnsDisplaySelect':
14007                                vm.widget.parameters[parameter].value = data.columnsDisplaySelect;
14008                                vm.columnsDisplaySelect = angular.fromJson(data.columnsDisplaySelect.replace(/\'/g, '"'));
14009                                break;
14010
14011                            case 'widgetTransparency':
14012                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
14013                                vm.widgetTransparency = data.widgetTransparency;
14014                                break;
14015
14016                            case 'backgroundColor':
14017                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
14018                                vm.backgroundColor = data.backgroundColor;
14019                                break;
14020
14021                            case 'border':
14022                                vm.widget.parameters[parameter].value = data.border;
14023                                vm.border = angular.fromJson(data.border.replace(/\'/g, '"'));
14024                                break;
14025                        }
14026                    }
14027                    widgets[$scope.widget] = angular.toJson(vm.widget);
14028                    buildColumns(vm.columnsDisplaySelect);
14029                })
14030                .catch(function (error) {
14031                    bugsnag.notify(error);
14032                });
14033        });
14034
14035        $scope.$on('$destroy', listener);
14036
14037        seasonService.getSeasonParametersBySeasonId(__solutionId__, vm.seasonId)
14038        .then(function(response) {
14039            const configShowPlayerStats = response.data.find(function(config){
14040                return config.Code === 'SHOWPLAYERSTATS';
14041            })
14042            vm.showPlayerStats = configShowPlayerStats && configShowPlayerStats.Value !== '0';
14043        })
14044        .catch(function(error) {
14045            bugsnag.notify(error);
14046        });
14047
14048        function buildColumns(columnsToDisplay) {
14049            vm.columns = [];
14050            columnsToDisplay.forEach(function (col) {
14051                var stat = statisticService.getPlayerStatisticByStatId(col.id);
14052                if (stat) {
14053                    vm.columns.push({
14054                        id: col.id,
14055                        visibleDesktop: col.visibleDesktop,
14056                        visibleMobile: col.visibleMobile,
14057                        name: stat.name,
14058                        abbreviation: stat.abbreviation
14059                    })
14060                }
14061            });
14062
14063            switch (vm.selectedTeam) {
14064                case 'localTeam':
14065                    vm.teamId = vm.localTeamId;
14066                    vm.team = _.find(vm.teamList, { id: vm.teamId });
14067                    break;
14068                case 'visitorTeam':
14069                    vm.teamId = vm.visitorTeamId;
14070                    vm.team = _.find(vm.teamList, { id: vm.teamId });
14071                    break;
14072            }
14073            vm.teamId = vm[`${vm.selectedTeam}Id`];
14074            vm.team = _.find(vm.teamList, { id: vm.teamId });
14075            var players = []
14076
14077            var categories = _.filter(_.orderBy(vm.team.playersCategories, 'id'), function (category) {
14078                return (category.id == 9 || category.id == 21);
14079            });
14080
14081            _.forEach(categories, function (category) {                
14082                _.forEach(category.players, function (player) {
14083
14084                    var historyPosition = _.get(_.find(player.properties, { name: 'historyposition' }), 'value');
14085
14086                    if (historyPosition) {
14087                        var positions = JSON.parse(historyPosition);
14088
14089                        player.positions = positions || [];
14090                    }
14091                    else if (player.positionId) {
14092                        player.positions = [player.positionId]
14093                    }
14094
14095                    var hidePlayer = false;
14096                    var hasDesignatedHitter = _.findIndex(category.players, { positionId: 10 }) != -1;
14097                    
14098                    if ((player.positionId == 1 && hasDesignatedHitter) || player.positions && player.positions.length == 2 && player.positions[0] == 1 && player.positions[1] == 0) {
14099                        
14100                        hidePlayer = (_.get(_.find(player.stats, { statTypeId: 66 }), 'value') || 0) == 0
14101					}
14102
14103                    if (!hidePlayer) {
14104                        if (category.id == 9) {
14105                            players.push(player);
14106                        }
14107                        else if (!_.find(players, (item) => item.id === player.id)) {
14108                            players.push(player);
14109                        }
14110                    }
14111                })
14112            })
14113
14114            players = _.orderBy(players, function (player) {                
14115                return _.parseInt(vm.getRow(player));
14116            }, ['ASC']);
14117
14118            var currentRow = -1;
14119            players.forEach(function (player) {
14120                var row = vm.getRow(player);
14121                if (row == currentRow) {
14122                    player.isSubstitute = true;
14123                }
14124
14125                currentRow = row;
14126            })            
14127
14128            vm.players = players;
14129                         
14130            var teamSummaryStats = _.find(vm.team.players, { id: 0, categoryId: 9 })
14131            if (teamSummaryStats) {
14132                vm.teamSummary = teamSummaryStats;
14133            }
14134        }
14135
14136        function isMobile() {
14137            return $window.innerWidth <= 600;
14138        }
14139    }
14140})();
14141;
14142(function () {
14143    'use strict';
14144
14145    angular
14146        .module('app.directives')
14147        .directive('gameHittersStats', gameHittersStats)
14148
14149    gameHittersStats.$inject = [];
14150
14151    function gameHittersStats() {
14152        return {
14153            restrict: 'E',
14154            scope: {                
14155                widget: '='
14156            },
14157            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/game-hitters-stats/game-hitters-stats.tpl.html',
14158            controller: 'GameHittersStatsWidgetController',
14159            controllerAs: 'gameHittersStats'
14160        };
14161    }
14162})();;
14163(function () {
14164    'use strict';
14165
14166    angular
14167        .module('app.directives')
14168        .controller('GamePitchersStatsWidgetController', GamePitchersStatsWidgetController);
14169
14170    GamePitchersStatsWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$window', 'UrlService', 'PlayerService', 'PositionService', 'SeasonService', 'StatisticService', 'ScoreboardBaseballService', 'WebsiteEditorService', 'GoogleMapService', 'FacilityService', 'SignalrService'];
14171
14172    function GamePitchersStatsWidgetController($rootScope, $scope, $localStorage, $window, urlService, playerService, positionService, seasonService, statisticService, scoreboardBaseballService, websiteEditorService, googleMapService, facilityService, signalrService) {
14173        var vm = this;
14174
14175        //State variables
14176        vm = Object.assign(vm, angular.fromJson(__gameDetails__.replace(/[\n\r]+/g, ' ')));
14177        vm.widget = angular.fromJson(widgets[$scope.widget]);
14178        vm.showPlayerStats = false;
14179        vm.url = urlService;
14180        vm.player = playerService;
14181        vm.position = positionService;
14182        vm.sportId = $localStorage.solution.sportId;        
14183        vm.columnsDisplaySelect = [];
14184        vm.columns = [];
14185        vm.teamSummary = {};        
14186
14187        var signalrConnection = signalrService.getConnection(signalrService.GROUPS.BaseballGameUpdate(vm.id));
14188
14189        signalrConnection.on(signalrService.EVENTS.BaseballStatsUpdate, function (response) {
14190            var gameUpdated = angular.fromJson(response.replace(/[\n\r]+/g, ' '));
14191
14192            if (gameUpdated.id == vm.id) {
14193                vm = Object.assign(vm, angular.fromJson(response.replace(/[\n\r]+/g, ' ')));
14194                buildColumns(vm.columnsDisplaySelect);
14195                $scope.$apply();
14196            }
14197        });
14198
14199
14200        //State functions
14201
14202        vm.getStatisticValue = function (player, statisticId) {
14203            if (player && player.stats && player.stats.length > 0) {
14204
14205                var playerStat = _.find(player.stats, function (statistic) {
14206                    return statistic.statTypeId === statisticId;
14207                });
14208
14209                if (playerStat) {
14210                    return playerStat.displayValue;
14211                }
14212            }
14213
14214            return '0';
14215        };
14216
14217        vm.getPosition = function (position) {
14218            return _.get(_.find(scoreboardBaseballService.getDefensePositions(), { id: position }), 'abbreviation');
14219        }
14220
14221        vm.showStat = function (column) {
14222            if (isMobile() && column.visibleMobile) {
14223                return true;
14224            } else if (!isMobile() && column.visibleDesktop) {
14225                return true;
14226            }
14227            return false;
14228        }
14229
14230        vm.getStyle = function () {
14231            var style = {};
14232            if (!vm.widgetTransparency) {
14233                style['background-color'] = vm.backgroundColor;
14234                style['background-size'] = 'cover';
14235                style['background-position'] = 'center';
14236                style['border-color'] = vm.border.color;
14237            }
14238
14239            style['border-width'] = `${vm.border.width}px`;
14240            style['border-color'] = vm.border.color;
14241            style['border-radius'] = `${vm.border.radius}px`;
14242            return style;
14243        }
14244
14245        //On component mount
14246        for (var parameter in vm.widget.parameters) {
14247            switch (vm.widget.parameters[parameter].id) {
14248                case 'selectedTeam':
14249                    vm.selectedTeam = vm.widget.parameters[parameter].value;         
14250                    break;
14251
14252                case 'columnsDisplaySelect':
14253                    vm.columnsDisplaySelect = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));                    
14254                    break;
14255
14256                case 'widgetTransparency':
14257                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
14258                    break;
14259
14260                case 'backgroundColor':
14261                    vm.backgroundColor = vm.widget.parameters[parameter].value;
14262                    break;
14263
14264                case 'border':
14265                    vm.border = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
14266                    break;
14267            }
14268        }
14269
14270        buildColumns(vm.columnsDisplaySelect);        
14271
14272        // Listener
14273        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
14274            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
14275                .then(function (response) {
14276                    for (var parameter in vm.widget.parameters) {
14277                        switch (vm.widget.parameters[parameter].id) {                            
14278                            case 'selectedTeam':
14279                                vm.widget.parameters[parameter].value = data.selectedTeam.toString();
14280                                vm.selectedTeam = data.selectedTeam;
14281                                break
14282
14283                            case 'columnsDisplaySelect':
14284                                vm.widget.parameters[parameter].value = data.columnsDisplaySelect;
14285                                vm.columnsDisplaySelect = angular.fromJson(data.columnsDisplaySelect.replace(/\'/g, '"'));
14286                                break;
14287
14288                            case 'widgetTransparency':
14289                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
14290                                vm.widgetTransparency = data.widgetTransparency;
14291                                break;
14292
14293                            case 'backgroundColor':
14294                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
14295                                vm.backgroundColor = data.backgroundColor;
14296                                break;
14297
14298                            case 'border':
14299                                vm.widget.parameters[parameter].value = data.border;
14300                                vm.border = angular.fromJson(data.border.replace(/\'/g, '"'));
14301                                break;
14302                        }
14303                    }
14304                    widgets[$scope.widget] = angular.toJson(vm.widget);
14305                    buildColumns(vm.columnsDisplaySelect);
14306                })
14307                .catch(function (error) {
14308                    bugsnag.notify(error);
14309                });
14310        });
14311
14312        $scope.$on('$destroy', listener);
14313
14314        seasonService.getSeasonParametersBySeasonId(__solutionId__, vm.seasonId)
14315        .then(function(response) {
14316            const configShowPlayerStats = response.data.find(function(config){
14317                return config.Code === 'SHOWPLAYERSTATS';
14318            })
14319            vm.showPlayerStats = configShowPlayerStats && configShowPlayerStats.Value !== '0';
14320        })
14321        .catch(function(error) {
14322            bugsnag.notify(error);
14323        });
14324
14325        function buildColumns(columnsToDisplay) {
14326            vm.columns = [];
14327            columnsToDisplay.forEach(function (col) {
14328                var stat = statisticService.getPlayerStatisticByStatId(col.id);
14329                if (stat) {
14330                    vm.columns.push({
14331                        id: col.id,
14332                        visibleDesktop: col.visibleDesktop,
14333                        visibleMobile: col.visibleMobile,
14334                        name: stat.name,
14335                        abbreviation: stat.abbreviation
14336                    })
14337                }
14338            });
14339
14340            switch (vm.selectedTeam) {
14341                case 'localTeam':
14342                    vm.teamId = vm.localTeamId;
14343                    vm.team = _.find(vm.teamList, { id: vm.teamId });
14344                    break;
14345                case 'visitorTeam':
14346                    vm.teamId = vm.visitorTeamId;
14347                    vm.team = _.find(vm.teamList, { id: vm.teamId });
14348                    break;
14349            }
14350            vm.teamId = vm[`${vm.selectedTeam}Id`];
14351            vm.team = _.find(vm.teamList, { id: vm.teamId });
14352
14353            var players = _.get(_.find(vm.team.playersCategories, { id: 8 }), 'players');   
14354            vm.players = players;
14355                         
14356            var teamSummaryStats = _.find(vm.team.players, { id: 0, categoryId: 8 })
14357            if (teamSummaryStats) {
14358                vm.teamSummary = teamSummaryStats;
14359            }
14360        }
14361
14362        function isMobile() {
14363            return $window.innerWidth <= 600;
14364        }
14365    }
14366})();
14367;
14368(function () {
14369    'use strict';
14370
14371    angular
14372        .module('app.directives')
14373        .directive('gamePitchersStats', gamePitchersStats)
14374
14375    gamePitchersStats.$inject = [];
14376
14377    function gamePitchersStats() {
14378        return {
14379            restrict: 'E',
14380            scope: {                
14381                widget: '='
14382            },
14383            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/game-pitchers-stats/game-pitchers-stats.tpl.html',
14384            controller: 'GamePitchersStatsWidgetController',
14385            controllerAs: 'gamePitchersStats'
14386        };
14387    }
14388})();;
14389(function () {
14390    'use strict';
14391
14392    angular
14393        .module('app.directives')
14394        .controller('BoxScoreSummaryWidgetController', BoxScoreSummaryWidgetController);
14395
14396    BoxScoreSummaryWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$window', 'UrlService', 'PlayerService', 'PositionService', 'SeasonService', 'StatisticService', 'ScoreboardBaseballService', 'ScoreboardBasketballService', 'WebsiteEditorService', 'GoogleMapService', 'FacilityService', 'SignalrService'];
14397
14398    function BoxScoreSummaryWidgetController($rootScope, $scope, $localStorage, $window, urlService, playerService, positionService, seasonService, statisticService, scoreboardBaseballService, scoreboardBasketballService, websiteEditorService, googleMapService, facilityService, signalrService) {
14399        var vm = this;
14400
14401        //State variables
14402        vm = Object.assign(vm, angular.fromJson(__gameDetails__.replace(/[\n\r]+/g, ' ')));
14403        
14404        vm.widget = angular.fromJson(widgets[$scope.widget]);
14405        vm.showPlayerStats = false;
14406        vm.url = urlService;
14407        vm.player = playerService;
14408        vm.position = positionService;
14409        vm.sportId = $localStorage.solution.sportId;        
14410        vm.columnsDisplaySelect = [];
14411        vm.columns = [];
14412        vm.teamSummary = {};        
14413        vm.type = _.get(_.find(vm.widget.properties, { key: 'type' }), 'value');
14414
14415        vm.filter = _.filter;
14416
14417        var signalrConnection = signalrService.getConnection(signalrService.GROUPS.BaseballGameUpdate(vm.id));
14418
14419        signalrConnection.on(signalrService.EVENTS.BaseballStatsUpdate, function (response) {
14420            var gameUpdated = angular.fromJson(response.replace(/[\n\r]+/g, ' '));
14421
14422            if (gameUpdated.id == vm.id) {
14423                vm = Object.assign(vm, gameUpdated);
14424                buildColumns(vm.columnsDisplaySelect);
14425                $scope.$apply();
14426            }
14427        });
14428
14429
14430        //State functions
14431
14432        vm.getStatisticValue = function (player, statisticId) {
14433            if (player && player.stats && player.stats.length > 0) {
14434
14435                var playerStat = _.find(player.stats, function (statistic) {
14436                    return statistic.statTypeId === statisticId;
14437                });
14438
14439                if (playerStat) {
14440                    return playerStat.displayValue;
14441                }
14442            }
14443
14444            return '0';
14445        };
14446
14447        vm.getPosition = function (position) {
14448            return _.get(_.find(scoreboardBaseballService.getDefensePositions(), { id: position }), 'abbreviation');
14449        }
14450
14451        vm.showStat = function (column) {
14452            if (isMobile() && column.visibleMobile) {
14453                return true;
14454            } else if (!isMobile() && column.visibleDesktop) {
14455                return true;
14456            }
14457            return false;
14458        }
14459
14460        vm.hasVisibleColumns = function (columns) {
14461            var visibleColumns = _.filter(columns, function (column) { return vm.showStat(column) });
14462
14463            return visibleColumns.length > 0;
14464        } 
14465
14466        vm.getStyle = function () {
14467            var style = {};
14468            if (!vm.widgetTransparency) {
14469                style['background-color'] = vm.backgroundColor;
14470                style['background-size'] = 'cover';
14471                style['background-position'] = 'center';
14472                style['border-color'] = vm.border.color;
14473            }
14474
14475            style['border-width'] = `${vm.border.width}px`;
14476            style['border-color'] = vm.border.color;
14477            style['border-radius'] = `${vm.border.radius}px`;
14478            return style;
14479        }
14480
14481        //On component mount
14482        for (var parameter in vm.widget.parameters) {
14483            switch (vm.widget.parameters[parameter].id) {
14484                case 'showTeamHeader':
14485                    vm.showTeamHeader = vm.widget.parameters[parameter].value === 'true';
14486                    break;
14487
14488                case 'selectedTeam':
14489                    vm.selectedTeam = vm.widget.parameters[parameter].value;         
14490                    break;
14491
14492                case 'columnsDisplaySelect':
14493                    vm.columnsDisplaySelect = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));                    
14494                    break;
14495
14496                case 'widgetTransparency':
14497                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
14498                    break;
14499
14500                case 'backgroundColor':
14501                    vm.backgroundColor = vm.widget.parameters[parameter].value;
14502                    break;
14503
14504                case 'border':
14505                    vm.border = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
14506                    break;
14507            }
14508        }
14509
14510        buildColumns(vm.columnsDisplaySelect);        
14511
14512        // Listener
14513        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
14514            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
14515                .then(function (response) {
14516                    for (var parameter in vm.widget.parameters) {
14517                        switch (vm.widget.parameters[parameter].id) {
14518                            case 'showTeamHeader':
14519                                vm.widget.parameters[parameter].value = data.showTeamHeader.toString();
14520                                vm.showTeamHeader = data.showTeamHeader;
14521                                break;
14522                            
14523                            case 'selectedTeam':
14524                                vm.widget.parameters[parameter].value = data.selectedTeam.toString();
14525                                vm.selectedTeam = data.selectedTeam;
14526                                break
14527
14528                            case 'columnsDisplaySelect':
14529                                vm.widget.parameters[parameter].value = data.columnsDisplaySelect;
14530                                vm.columnsDisplaySelect = angular.fromJson(data.columnsDisplaySelect.replace(/\'/g, '"'));
14531                                break;
14532
14533                            case 'widgetTransparency':
14534                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
14535                                vm.widgetTransparency = data.widgetTransparency;
14536                                break;
14537
14538                            case 'backgroundColor':
14539                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
14540                                vm.backgroundColor = data.backgroundColor;
14541                                break;
14542
14543                            case 'border':
14544                                vm.widget.parameters[parameter].value = data.border;
14545                                vm.border = angular.fromJson(data.border.replace(/\'/g, '"'));
14546                                break;
14547                        }
14548                    }
14549                    widgets[$scope.widget] = angular.toJson(vm.widget);
14550                    buildColumns(vm.columnsDisplaySelect);
14551                })
14552                .catch(function (error) {
14553                    bugsnag.notify(error);
14554                });
14555        });
14556
14557        $scope.$on('$destroy', listener);
14558
14559        seasonService.getSeasonParametersBySeasonId(__solutionId__, vm.seasonId)
14560        .then(function(response) {
14561            const configShowPlayerStats = response.data.find(function(config){
14562                return config.Code === 'SHOWPLAYERSTATS';
14563            })
14564            vm.showPlayerStats = configShowPlayerStats && configShowPlayerStats.Value !== '0';
14565        })
14566        .catch(function(error) {
14567            bugsnag.notify(error);
14568        });
14569
14570        function buildColumns(columnsToDisplay) {            
14571            switch (vm.selectedTeam) {
14572                case 'localTeam':
14573                    vm.teamId = vm.localTeamId;
14574                    vm.team = _.find(vm.teamList, { id: vm.teamId });
14575                    break;
14576                case 'visitorTeam':
14577                    vm.teamId = vm.visitorTeamId;
14578                    vm.team = _.find(vm.teamList, { id: vm.teamId });
14579                    break;
14580            }
14581            vm.teamId = vm[`${vm.selectedTeam}Id`];
14582            vm.team = _.find(vm.teamList, { id: vm.teamId });
14583
14584            var categoryId = _.parseInt(_.get(_.find(vm.widget.properties, { key: 'categoryId' }), 'value'));
14585
14586            var players = _.filter(_.get(_.find(vm.team.playersCategories, { id: categoryId }), 'players'), { status: 'Selected' });
14587            var teamSummaryStats = null;
14588            switch (vm.sportId) {
14589                case 4:
14590                    teamSummaryStats = _.find(vm.team.players, { categoryId: 10 })
14591                    break;
14592                default:
14593                    teamSummaryStats = _.find(vm.team.players, { categoryId: 8 })
14594            }
14595            if (teamSummaryStats) {
14596                vm.teamSummary = teamSummaryStats;
14597            }
14598
14599            var columns = [];
14600            columnsToDisplay.forEach(function (col) {
14601                var stat = statisticService.getPlayerStatisticByStatId(col.id);
14602                if (stat) {
14603                    var columnPlayers = [];
14604
14605                    players.forEach(function (player) {
14606                        var hasStats = _.find(player.stats, function (stat) { return stat.statTypeId == col.id && stat.value });
14607
14608                        if (hasStats) {
14609                            columnPlayers.push({
14610                                name: player.name,
14611                                value: hasStats.displayValue
14612                            })
14613                        }
14614                    })
14615
14616                    columns.push({
14617                        id: col.id,
14618                        visibleDesktop: col.visibleDesktop,
14619                        visibleMobile: col.visibleMobile,
14620                        name: stat.name,
14621                        abbreviation: stat.abbreviation,
14622                        players: columnPlayers
14623                    })
14624                }
14625            });  
14626
14627            vm.columns = _.filter(columns, function (column) { return column.players.length > 0 })           
14628        }
14629
14630        function isMobile() {
14631            return $window.innerWidth <= 600;
14632        }
14633    }
14634})();
14635;
14636(function () {
14637    'use strict';
14638
14639    angular
14640        .module('app.directives')
14641        .directive('boxScoreSummary', boxScoreSummary)
14642
14643    boxScoreSummary.$inject = [];
14644
14645    function boxScoreSummary() {
14646        return {
14647            restrict: 'E',
14648            scope: {                
14649                widget: '='
14650            },
14651            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/box-score-summary/box-score-summary.tpl.html',
14652            controller: 'BoxScoreSummaryWidgetController',
14653            controllerAs: 'boxScoreSummary'
14654        };
14655    }
14656})();;
14657(function () {
14658    'use strict';
14659
14660    angular
14661        .module('app.directives')
14662        .controller('ShotsOnGoalWidgetController', ShotsOnGoalWidgetController);
14663
14664    ShotsOnGoalWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', 'StatisticService', 'WebsiteEditorService'];
14665
14666    function ShotsOnGoalWidgetController($rootScope, $scope, $localStorage, statisticService, websiteEditorService) {
14667        var vm = this;
14668
14669        //State variable
14670        vm.widget = angular.fromJson(widgets[$scope.widget]);      
14671        vm = Object.assign(vm, angular.fromJson(__gameDetails__
14672            .replace(/[\n\r]+/g, ' ')));      
14673
14674        vm.sportId = $localStorage.solution.sportId;
14675        vm.periods = [];
14676
14677        //State functions
14678        vm.getTotalShots = function(team) {
14679            return _.sumBy(team.periods, 'shotsOnGoal');
14680        };
14681
14682        //On component mount
14683        initializeSummary();
14684        for (var parameter in vm.widget.parameters) {
14685            switch (vm.widget.parameters[parameter].id) {
14686                case 'visitorBottom':
14687                    vm.visitorBottom = vm.widget.parameters[parameter].value === 'true';
14688                    break;
14689            }
14690        }
14691
14692        // Listener
14693        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
14694            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
14695                .then(function (response) {
14696                    for (var parameter in vm.widget.parameters) {
14697                        switch (vm.widget.parameters[parameter].id) {
14698                            case 'visitorBottom':
14699                                vm.widget.parameters[parameter].value = data.visitorBottom.toString();
14700                                vm.visitorBottom = data.visitorBottom;
14701                                break;
14702                        }
14703                    }
14704                    widgets[$scope.widget] = angular.toJson(vm.widget);
14705                })
14706                .catch(function (error) {
14707                    bugsnag.notify(error);
14708                });
14709        });
14710
14711        $scope.$on('$destroy', listener);
14712
14713        //Functions
14714        function initializeSummary() {
14715            var periods = [];
14716
14717            var numberOfPeriods = 3;
14718            var numberOfOvertimes = 0;
14719
14720            if ($localStorage.season.parameters && $localStorage.season.parameters.length > 0) {
14721                numberOfPeriods = parseInt(_.find($localStorage.season.parameters, function (parameter) {
14722                    return parameter.Code === 'PERIODNUMBER'
14723                }).Value);
14724                
14725                var overtimeParm = _.find($localStorage.season.parameters, function (parameter) {
14726                    return parameter.Code === 'OVERTIMENUMBER'
14727                });
14728
14729                if (overtimeParm != undefined) {
14730                    numberOfOvertimes = parseInt(overtimeParm.Value);
14731                }
14732            }
14733
14734            for (var i = 1; i <= numberOfPeriods; i++) {
14735                periods.push({ 
14736                    number: i,
14737                    regular: true
14738                });
14739            }
14740
14741            if (vm.periodId >= 5 && vm.periodId <= 9) {
14742                for (i = 5; i <= vm.periodId; i++) {
14743                    if (numberOfOvertimes > i - 5) {
14744                        periods.push({
14745                            number: i,
14746                            overtime: true
14747                        });
14748                    }
14749                }
14750            }
14751
14752            vm.teams = {
14753                visitor: {
14754                    name: vm.visitorTeamName,
14755                    logo: vm.visitorTeamAvatar,
14756                    abbreviation: _.find(vm.teamList, function(team) {
14757                        return team.id === vm.visitorTeamId;
14758                    }).abbreviation,
14759                    periods: getPeriodEvents(periods, vm.localTeamId)
14760                },
14761                local: {
14762                    name: vm.localTeamName,
14763                    logo: vm.localTeamAvatar,
14764                    abbreviation: _.find(vm.teamList, function(team) {
14765                        return team.id === vm.localTeamId;
14766                    }).abbreviation,
14767                    periods: getPeriodEvents(periods, vm.visitorTeamId)
14768                }
14769            };
14770
14771            vm.periods = periods;
14772        }
14773
14774        function getPeriodEvents(periods, teamId) {            
14775            var teamPeriods = angular.fromJson(angular.toJson(periods));
14776            
14777            for (var period in teamPeriods) {
14778                var events = _.filter(vm.eventList, function(event) {
14779                    return event.eventTypeId === 7 && 
14780                            event.periodId === teamPeriods[period].number && 
14781                            event.teamId === teamId;
14782                });
14783
14784                _.forEach(events, function(event) {
14785                    var statistic = _.find(event.statList, function(statistic) {
14786                        return statistic.statTypeId === 23;
14787                    });
14788
14789                    if (angular.isUndefined(teamPeriods[period].shotsOnGoal)) {
14790                        teamPeriods[period].shotsOnGoal = statistic.value;
14791                    } else {
14792                        teamPeriods[period].shotsOnGoal += statistic.value;
14793                    }
14794                });                
14795                
14796                var team = _.find(vm.teamList, { id: teamId });
14797                var statsShots = _.filter(team.statsTeam, { teamId: teamId, statTypeId: statisticService.getSportTeamStatsByType('shotsOnGoal', vm.sportId) });
14798                var totalShots = _.sumBy(statsShots, 'value');
14799
14800                teamPeriods[period].shotsOnGoal = (teamPeriods[period].shotsOnGoal || 0) + totalShots;
14801            }
14802    
14803            return teamPeriods
14804        }
14805    }    
14806})();
14807;
14808(function () {
14809    'use strict';
14810
14811    angular
14812        .module('app.directives')
14813        .directive('shotsOnGoal', shotsOnGoal)
14814
14815    shotsOnGoal.$inject = [];
14816
14817    function shotsOnGoal() {
14818        return {
14819            restrict: 'E',
14820            scope: {                
14821                widget: '='
14822            },
14823            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/shots-on-goal/shots-on-goal.tpl.html',
14824            controller: 'ShotsOnGoalWidgetController',
14825            controllerAs: 'shotsOnGoal'
14826        };
14827    }
14828})();;
14829(function () {
14830    'use strict';
14831
14832    angular
14833        .module('app.directives')
14834        .controller('ScoreboardBaseballWidgetController', ScoreboardBaseballWidgetController);
14835
14836    ScoreboardBaseballWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', 'StatisticService', 'WebsiteEditorService'];
14837
14838    function ScoreboardBaseballWidgetController($rootScope, $scope, $localStorage, statisticService, websiteEditorService) {
14839        var vm = this;
14840    }    
14841})();
14842;
14843(function () {
14844    'use strict';
14845
14846    angular
14847        .module('app.directives')
14848        .directive('scoreboardBaseball', scoreboardBaseball)
14849
14850    scoreboardBaseball.$inject = [];
14851
14852    function scoreboardBaseball() {
14853        return {
14854            restrict: 'E',
14855            scope: {                
14856                widget: '='
14857            },
14858            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/baseball/scoreboard-baseball.tpl.html',
14859            controller: 'ScoreboardBaseballWidgetController',
14860            controllerAs: 'scoreboardBaseball'
14861        };
14862    }
14863})();;
14864(function () {
14865    'use strict';
14866
14867    angular
14868        .module('app.directives')
14869        .controller('ScoreboardBaseballScoreWidgetController', ScoreboardBaseballScoreWidgetController);
14870
14871    ScoreboardBaseballScoreWidgetController.$inject = ['$rootScope', '$scope'];
14872
14873    function ScoreboardBaseballScoreWidgetController($rootScope, $scope) {
14874        var vm = this;
14875    }
14876})();
14877;
14878(function () {
14879    'use strict';
14880
14881    angular
14882        .module('app.directives')
14883        .directive('scoreboardBaseballScore', scoreboardBaseballScore)
14884
14885    scoreboardBaseballScore.$inject = [];
14886
14887    function scoreboardBaseballScore() {
14888        return {
14889            restrict: 'E',
14890            scope: {                
14891                widget: '=',
14892                score: '=',
14893                active: '='
14894            },
14895            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-stats/score/scoreboard-baseball-score.tpl.html',
14896            controller: 'ScoreboardBaseballScoreWidgetController',
14897            controllerAs: 'scoreboardBaseballScore'
14898        };
14899    }
14900})();;
14901(function () {
14902    'use strict';
14903
14904    angular
14905        .module('app.directives')
14906        .controller('ScoreboardBaseballLineupWidgetController', ScoreboardBaseballLineupWidgetController);
14907
14908    ScoreboardBaseballLineupWidgetController.$inject = ['$scope', 'ScoreboardBaseballService'];
14909
14910    function ScoreboardBaseballLineupWidgetController($scope, scoreboardBaseballService) {
14911        var vm = this;
14912        vm.openId = undefined;
14913        vm.selectedTeam = null;
14914        vm.selectedPlayer = null;
14915        vm.playerToSubstitute = null;
14916        vm.step = "1";
14917        vm.gameStatus = $scope.gameStatus;
14918        vm.lineup = $scope.lineup;
14919        vm.positions = scoreboardBaseballService.getDefensePositions();
14920        vm.numbers = Array.from(Array(100).keys());
14921        vm.numbers.push('00');
14922        vm.selectedTabTeam = null;
14923
14924        vm.possiblePositions = [1, 2, 3, 4, 5, 6, 7, 8, 9]
14925        vm.defensePositions = _.filter(vm.positions, function (pos) { return pos.name != 'pinchhitter' && pos.name != 'pinchrunner' });
14926        vm.offensePositions = _.filter(vm.positions, function (pos) { return pos.name == 'pinchhitter' || pos.name == 'pinchrunner' || pos.name == 'designatedhitter' });
14927        vm.displayedPositions = [];
14928
14929        vm.isOpen = function (id) {
14930            return vm.openId === id;
14931        }
14932
14933        vm.clickOpen = function (id) {
14934            if (vm.openId === id) {
14935                vm.openId = undefined;
14936            } else {
14937                vm.openId = id;
14938            }
14939        }
14940        $scope.$watch('gameStatus', function () {
14941            vm.gameStatus = $scope.gameStatus;
14942        });
14943
14944        vm.showAvailablePlayers = function (team, player) {
14945            vm.selectedTeam = team;
14946            vm.subList = vm.selectedTeam.playersAvailable;
14947            vm.subList = _.sortBy(vm.subList, function (player) {
14948                return player.playerName;
14949            })
14950            vm.sortedBy = 2;
14951            vm.selectedPlayer = player;
14952            vm.step = "1";
14953            $scope.showAvailablePlayers();
14954        }
14955
14956        vm.switchTab = function (teamId) {
14957            vm.selectedTeamTab = teamId;
14958            return false;
14959        }
14960
14961        vm.sortSubstitution = function (item) {
14962            switch (item) {
14963                case 'number':
14964                    vm.sortedBy = 1;
14965                    vm.subList = _.sortBy(vm.subList, function (player) {
14966                        return player.number;
14967                    })
14968                    break;
14969                case 'name':
14970                    vm.sortedBy = 2;
14971                    vm.subList = _.sortBy(vm.subList, function (player) {
14972                        return player.playerName;
14973                    })
14974                    break;
14975                case 'position':
14976                    vm.sortedBy = 3;
14977                    vm.subList = _.sortBy(vm.subList, function (player) {
14978                        return player.pos;
14979                    })
14980                    break;  
14981                default:
14982                    vm.sortedBy = 2;
14983                    vm.subList = _.sortBy(vm.subList, function (player) {
14984                        return player.playerName;
14985                    })
14986                    break;
14987            }
14988        }
14989
14990        vm.selectPlayer = function (player) {
14991            vm.playerToSubstitute = _.cloneDeep(player);
14992            vm.playerToSubstitute.pos = vm.selectedPlayer.pos;
14993            vm.displayedPositions = player.teamId == $scope.offenseTeam ? vm.offensePositions : vm.defensePositions;
14994            
14995            vm.step = "2";
14996        }
14997
14998        vm.back = function () {
14999            vm.step = "1";
15000        }
15001
15002        vm.closeConfirm = function () {
15003            $scope.hideConfirmPitcherSubstitution();
15004        }
15005
15006        vm.substitutePlayer = function (force) {              
15007            if (force || vm.selectedPlayer.playerPosition != 'pitcher') {
15008                if ($scope.onSubstitutePlayer) {
15009                    $scope.onSubstitutePlayer(vm.selectedPlayer, vm.playerToSubstitute);
15010                    $scope.hideAvailablePlayers();
15011                    $scope.hideConfirmPitcherSubstitution();
15012                }
15013            }
15014            else {
15015                $scope.showConfirmPitcherSubstitution();
15016            }
15017        }
15018    }
15019})();
15020;
15021(function () {
15022    'use strict';
15023
15024    angular
15025        .module('app.directives')
15026        .directive('scoreboardBaseballLineup', scoreboardBaseballLineup)
15027
15028    scoreboardBaseballLineup.$inject = ['ModalService'];
15029
15030    function scoreboardBaseballLineup(modalService) {
15031        return {
15032            restrict: 'E',
15033            scope: {
15034                widget: '=',
15035                lineup: '=',
15036                onSubstitutePlayer: '=',
15037                gameStatus: '=',
15038                offenseTeam: '='
15039            },
15040            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-stats/lineup/scoreboard-baseball-lineup.tpl.html',
15041            controller: 'ScoreboardBaseballLineupWidgetController',
15042            controllerAs: 'scoreboardBaseballLineup',
15043            link: function (scope, element, attributes, controller) {
15044                var substitutionModal = modalService.init($('.substitution-modal', element));
15045                var confirmPitcherSubstitutionModal = modalService.init($('.confirm-pitcher-sub
15045stitution-modal', element));
15046
15047                scope.hideAvailablePlayers = function () {
15048                    substitutionModal.hide();                    
15049                }
15050
15051                scope.showAvailablePlayers = function () {
15052                    substitutionModal.show();
15053                }
15054
15055                scope.showConfirmPitcherSubstitution = function () {
15056                    confirmPitcherSubstitutionModal.show();
15057                }
15058
15059                scope.hideConfirmPitcherSubstitution = function () {
15060                    confirmPitcherSubstitutionModal.hide();
15061                }
15062            }
15063        };
15064    }
15065})();;
15066(function () {
15067    'use strict';
15068
15069    angular
15070        .module('app.directives')
15071        .controller('ScoreboardBaseballLogWidgetController', ScoreboardBaseballLogWidgetController);
15072
15073    ScoreboardBaseballLogWidgetController.$inject = ['$scope', '$translate', 'ordinalFilter', 'ScoreboardBaseballService']
15074
15075    function ScoreboardBaseballLogWidgetController($scope, $translate, ordinalFilter, scoreboardBaseballService) {
15076        var vm = this;
15077        var selectedEvent = null;
15078
15079        vm.gameDetails = $scope.gameDetails;          
15080
15081        vm.hitCategories = [
15082            { id: 'b1', name: $translate.instant('widgets.games.scoreboard.baseball.log.1stBase') },
15083            { id: 'b2', name: $translate.instant('widgets.games.scoreboard.baseball.log.2ndBase') },
15084            { id: 'b3', name: $translate.instant('widgets.games.scoreboard.baseball.log.3rdBase') },
15085            { id: 'b4', name: $translate.instant('widgets.games.scoreboard.baseball.log.homePlate') },
15086        ]
15087
15088        vm.earnedRunsTypes = [
15089            { id: 'earnedruns', name: $translate.instant('widgets.games.scoreboard.baseball.log.earnedRun') },
15090            { id: 'unearnedruns', name: $translate.instant('widgets.games.scoreboard.baseball.log.unearnedRun') }
15091        ]
15092
15093        vm.rbiTypes = [
15094            { id: 'rbi', name: $translate.instant('widgets.games.scoreboard.baseball.log.rbi') },
15095            { id: 'noRbi', name: $translate.instant('widgets.games.scoreboard.baseball.log.noRbi') }
15096        ]
15097
15098        vm.basesTypes = {
15099            b1: { id: 'hit', name: $translate.instant('widgets.games.scoreboard.baseball.log.single') },
15100            b2: { id: 'hit', name: $translate.instant('widgets.games.scoreboard.baseball.log.double') },
15101            b3: { id: 'hit', name: $translate.instant('widgets.games.scoreboard.baseball.log.triple') },
15102            b4: { id: 'hit', name: $translate.instant('widgets.games.scoreboard.baseball.log.homerun') }
15103        }
15104
15105        vm.eventTypes = [
15106            { id: 'error', name: $translate.instant('widgets.games.scoreboard.baseball.log.error') },
15107            { id: 'sacerror', name: $translate.instant('widgets.games.scoreboard.baseball.log.sacerror') },
15108        ]
15109                
15110        vm.optionalType = { id: 'optional', name: $translate.instant('widgets.games.scoreboard.baseball.log.optional') };
15111
15112        vm.getEventTypes = function (event) {
15113            var types = [];
15114            var baseId;
15115            if (event.type == 'hit') {
15116                var baseId;
15117                switch (event.category) {
15118                    case 'single':
15119                        baseId = 'b1';
15120                        break;
15121                    case 'double':
15122                        baseId = 'b2';
15123                        break;
15124                    case 'triple':
15125                        baseId = 'b3';
15126                        break;
15127                    case 'homerun':
15128                        baseId = 'b4';
15129                        break;
15130                }
15131            }
15132            else {    
15133                baseId = event.baseId;
15134                
15135            }
15136
15137            types = [vm.basesTypes[event.baseId]];
15138            types = types.concat(vm.eventTypes);
15139
15140            if (baseId == 'b1') {
15141                types.push(vm.optionalType);
15142            }
15143            
15144            return types;
15145        }
15146
15147        vm.updateEvent = function (event) {
15148            if (!event.hasError()) {
15149                var content = event.formatEvent();            
15150            
15151                let sequence;
15152                $scope.periods.forEach(function (period) {
15153
15154                    period.sequences.forEach(function (_sequence) {
15155                        if (_sequence.id == event.sequenceId) {
15156                            sequence = _sequence;
15157                        }
15158                    })
15159                })
15160                let foundEvent = _.find(sequence.events, { seq: event.seq });
15161                _.assign(foundEvent, content);
15162
15163                if ($scope.onUpdateEvent) {
15164                    $scope.onUpdateEvent(sequence);
15165                }            
15166            
15167                event.editMode = false;
15168            }
15169        }
15170
15171        vm.getValue = function (id, list, type) {            
15172            var item = _.find(list, { id: id });
15173            if (type == 'player') {
15174                return (_.get(item, 'number') || '-') + '  - ' + _.get(item, 'name');
15175            }
15176
15177            return _.get(item, 'name');
15178        }
15179
15180        vm.formatInningName = function (period, pos) {
15181            if (pos == 1) {
15182                return $translate.instant('widgets.games.scoreboard.baseball.tab-stats.history.scoreboardBaseballHistory.startOf') + " " + period;
15183            } else {
15184                return $translate.instant('widgets.games.scoreboard.baseball.tab-stats.history.scoreboardBaseballHistory.endOf') + " " + period;
15185            }
15186        }
15187
15188        $scope.$watch('gameDetails', function (gameDetails) {            
15189            vm.gameDetails = gameDetails;
15190
15191            vm.quarters = [];
15192
15193            _.range(vm.gameDetails.periodId).forEach(function (period) {
15194                vm.quarters.push({ id: period + 1, name: `${ordinalFilter(period + 1)} ${$translate.instant('widgets.games.scoreboard.basketball.history.quarter')}` });
15195            })
15196
15197            vm.range = _.range;
15198            vm.teams = {};
15199
15200            vm.gameDetails.teamList.forEach(function (team) {
15201                vm.teams[team.id] = team;
15202                vm.teams[team.id].selectedPlayers = _.filter(vm.teams[team.id].players, { status: 'Selected' });                
15203                vm.teams[team.id].playerCollection = _.keyBy(vm.teams[team.id].selectedPlayers, 'id');
15204                vm.teams[team.id].staffCollection = _.keyBy(vm.teams[team.id].staffs, 'id');
15205            });
15206        })        
15207
15208        $scope.$watch('periods', function (periods) {            
15209            vm.events = {};
15210
15211            periods.forEach(function (period) {
15212                var periodEvents = [];
15213
15214                period.sequences.forEach(function (sequence) {                    
15215                    sequence.events.forEach(function (event) {                        
15216                        event.hitter = sequence.hitter;
15217
15218                        var earnedRuns = _.find(event.playersProperties, function (property) { return property.name == 'earnedruns' || property.name == 'unearnedruns' });
15219                        if (earnedRuns) {                                                         
15220                            periodEvents.push(new EarnedRun(event, earnedRuns, sequence.id));
15221                        }
15222
15223                        if (event.type == 'hit' || event.type == 'hitterdefenseerror' || event.type == 'fielderchoice' || event.type == 'sacerror') {
15224                            periodEvents.push(new Hit(event, sequence.id));
15225                        }
15226                    });
15227                });           
15228
15229                vm.events[`${period.period}-${period.pos}`] = periodEvents;
15230            });
15231        })
15232
15233        function EarnedRun(_event, _earnedRuns, sequenceId) {
15234            var self = this;
15235            angular.extend(self, _.cloneDeep(_event));
15236
15237            self.error = null;
15238            self.sequenceId = sequenceId;
15239
15240            var shooterProperty = _.find(self.properties, { name: 'shooter' });    
15241
15242            if (_event.type == 'hit') {
15243                self.scorerTeamId = _event.hitter.teamId;
15244                self.scorerId = _event.hitter.id;
15245            }
15246            else {
15247                var b4Property = _.find(_event.playersProperties, { name: 'b4' });                
15248
15249                if (b4Property) {
15250                    self.scorerTeamId = b4Property.teamId;
15251                    self.scorerId = b4Property.id;
15252                }
15253            }            
15254            
15255            self.eventType = 'earnedruns';
15256            self.earnedRuns = _earnedRuns.name;     
15257            self.earnedId = _earnedRuns.id;
15258            self.earnedTeamId = _earnedRuns.teamId;
15259
15260            self.hitterId = _event.hitter.id;
15261            self.hitterTeamId = _event.hitter.teamId;
15262
15263            var rbiProperty = _.find(self.playersProperties, { name: 'rbi' });
15264
15265            if (rbiProperty) {
15266                self.rbi = 'rbi';
15267            }
15268            else {
15269                self.rbi = 'noRbi';
15270            }
15271
15272            self.hasError = function () {               
15273                return false;
15274            }
15275                                    
15276            self.formatEvent = function () {
15277                var eventContent = {};
15278                eventContent.seq = self.seq;
15279                eventContent.type = self.type;
15280                eventContent.isProcess = self.isProcess;
15281                eventContent.group = self.group;
15282                eventContent.category = self.category;
15283                eventContent.hitter = self.hitter;
15284                eventContent.playersProperties = self.playersProperties;
15285
15286                var earnedRunProperty = _.find(eventContent.playersProperties, function (property) { return property.name == 'earnedruns' || property.name == 'unearnedruns' });
15287                earnedRunProperty.name = self.earnedRuns;
15288                earnedRunProperty.id = self.earnedId;
15289
15290                if (self.rbi == 'noRbi') {
15291                    eventContent.playersProperties = _.filter(eventContent.playersProperties, function (property) { return property.name != 'rbi' });
15292                }
15293                else {
15294                    var rbiProperty = _.find(eventContent.playersProperties, { name: 'rbi' });
15295                    if (!rbiProperty) {
15296                        var newRbi = {};
15297                        newRbi.name = 'rbi';
15298                        newRbi.id = self.hitterId;
15299                        newRbi.teamId = self.hitterTeamId;
15300
15301                        eventContent.playersProperties.push(newRbi);
15302                    }                   
15303                }
15304
15305                return eventContent;
15306            };
15307
15308            self.editMode = false;
15309        } 
15310
15311        function Hit(_event, sequenceId) {
15312            var self = this;
15313            angular.extend(self, _.cloneDeep(_event));
15314
15315            self.eventType = 'hit';
15316            self.sequenceId = sequenceId;
15317
15318            var baseId;
15319            var eventTypeId;
15320
15321            if (_event.type == "hitterdefenseerror") {
15322                var baseProperty  = _.get(_.find(_event.playersProperties, function (property) {
15323                    return _.includes(['b1', 'b2', 'b3', 'b4'], property.name);
15324                }), 'name');
15325                baseId = baseProperty || 'b1';
15326                eventTypeId = 'error';
15327            }
15328            else if (_event.type == "sacerror") {                
15329                var baseProperty = _.get(_.find(_event.playersProperties, function (property) {
15330                    return _.includes(['b1', 'b2', 'b3', 'b4'], property.name);
15331                }), 'name');
15332                baseId = baseProperty || 'b1';
15333                eventTypeId = 'sacerror';                
15334			}
15335            else if (_event.type == "fielderchoice") {
15336                baseId = 'b1';
15337                eventTypeId = 'optional';
15338            }
15339            else if (_event.type == 'hit') {
15340                switch (_event.category) {
15341                    case 'single':
15342                        baseId = 'b1';
15343                        break;
15344                    case 'double':
15345                        baseId = 'b2';
15346                        break;
15347                    case 'triple':
15348                        baseId = 'b3';
15349                        break;
15350                    case 'homerun':
15351                        baseId = 'b4';
15352                        break;
15353                }
15354
15355                eventTypeId = 'hit';                
15356            }
15357                        
15358            var defenseErrorProperty = _.find(_event.playersProperties, { name: 'defenseerror' }) || {};
15359            self.defenseErrorId = defenseErrorProperty.id;
15360            var team = _.filter(vm.teams, function (team) { return team.id != _event.hitter.teamId });
15361            self.defenseErrorTeamId = team[0].id;
15362
15363            self.baseId = baseId;
15364            self.eventTypeId = eventTypeId;
15365
15366            self.hitterId = _event.hitter.id;
15367            self.hitterTeamId = _event.hitter.teamId;
15368
15369            self.playersProperties = _event.playersProperties;
15370
15371            self.hasError = function () {
15372                if (self.eventTypeId == 'error') {
15373                    if (!self.defenseErrorId) {
15374                        self.error = { type: 'player' }
15375                        return true;
15376                    }
15377
15378                    var collection = _.filter(vm.teams, function (team) { return team.id != _event.hitter.teamId })[0].playerCollection;
15379
15380                    if (!collection[self.defenseErrorId]) {
15381                        self.error = { type: 'player' }
15382                        return true;
15383                    }
15384                }
15385
15386                self.error = null;
15387                return false;
15388            }
15389            
15390            self.formatEvent = function () {
15391                var eventContent = {};
15392
15393                var playersProperties = _.filter(self.playersProperties, function (property) { return property.name != 'defenseerror' && !_.includes(['b1', 'b2', 'b3', 'b4'], property.name); });
15394
15395                if (self.eventTypeId == 'error' || self.eventTypeId == 'sacerror') {
15396                    eventContent.category = null;
15397                    eventContent.group = 'onbases';
15398                    eventContent.seq = self.seq;
15399                    eventContent.type = self.eventTypeId == 'error' ? "hitterdefenseerror" : "sacerror";
15400
15401                    var team = _.filter(vm.teams, function (team) { return team.id != _event.hitter.teamId });
15402                    eventContent.playersProperties = playersProperties;
15403
15404                    var defenseProperty = {}
15405                    defenseProperty.id = self.defenseErrorId;
15406                    defenseProperty.teamId = team[0].id;
15407                    defenseProperty.name = "defenseerror";
15408
15409                    var baseProperty = {};
15410                    baseProperty.id = self.hitterId;
15411                    baseProperty.teamId = self.hitterTeamId;
15412                    baseProperty.name = self.baseId;
15413
15414                    eventContent.playersProperties.push(defenseProperty);
15415                    eventContent.playersProperties.push(baseProperty)
15416                }
15417                else if (self.eventTypeId == 'optional') {
15418                    eventContent.seq = self.seq;
15419                    eventContent.type = 'fielderchoice';
15420                    eventContent.group = 'onbases';
15421                    eventContent.playersProperties = playersProperties;
15422                    eventContent.category = null;
15423                }
15424                else if (self.eventTypeId == 'hit') {
15425                    eventContent.seq = self.seq;
15426                    eventContent.type = 'hit';
15427                    eventContent.group = 'onbases';
15428                    eventContent.playersProperties = playersProperties;
15429
15430                    var category;
15431                    switch (self.baseId) {
15432                        case 'b1':
15433                            category = 'single';
15434                            break;
15435                        case 'b2':
15436                            category = 'double;'
15437                            break;
15438                        case 'b3':
15439                            category = 'triple';
15440                            break;
15441                        case 'b4':
15442                            category = 'homerun';
15443                            break;
15444                    }
15445
15446                    eventContent.category = category;
15447                }                
15448
15449                return eventContent;
15450            }
15451
15452            self.editMode = false;
15453        } 
15454    }    
15455})();
15456;
15457(function () {
15458    'use strict';
15459
15460    angular
15461        .module('app.directives')
15462        .directive('scoreboardBaseballLog', scoreboardBaseballLog)
15463
15464    scoreboardBaseballLog.$inject = ['ModalService'];
15465
15466    function scoreboardBaseballLog(modalService) {
15467        return {
15468            restrict: 'E',
15469            scope: {                                
15470                gameDetails: '=',                
15471                onUpdateEvent: '=',                                
15472                periods: '='
15473            },
15474            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-stats/log/scoreboard-baseball-log.tpl.html',
15475            controller: 'ScoreboardBaseballLogWidgetController',
15476            controllerAs: 'scoreboardBaseballLog',
15477        };
15478    }
15479})();;
15480(function () {
15481    'use strict';
15482
15483    angular
15484        .module('app.directives')
15485        .controller('ScoreboardBaseballPitchCountWidgetController', ScoreboardBaseballPitchCountWidgetController);
15486
15487    ScoreboardBaseballPitchCountWidgetController.$inject = ['$rootScope', '$scope'];
15488
15489    function ScoreboardBaseballPitchCountWidgetController($rootScope, $scope) {
15490        var vm = this;
15491
15492        vm.balls = 0;
15493        vm.strikes = 0;
15494        vm.strikeouts = 0; 
15495
15496        vm.addBall = function (category) {
15497            if (!$scope.disabled) {
15498                if ($scope.onPitch) {
15499                    $scope.onPitch({ category: 'ball', type: null }, category);
15500                }
15501            }
15502        }
15503
15504        vm.addStrike = function (type, category) {
15505            if (!$scope.disabled) {
15506                if ($scope.onPitch) {
15507                    $scope.onPitch({ category: 'strike', type: type }, category)
15508                }
15509            }
15510        }
15511
15512        $scope.$watch('pitchs', function (pitchs) {
15513            vm.balls = 0;
15514            vm.strikes = 0;
15515
15516            (pitchs || []).forEach(function (pitch) {
15517                if (pitch.category == 'ball') {
15518                    vm.balls++;
15519                }
15520                else if (pitch.category == 'strike') {
15521                    if (pitch.type != 'foulball' || vm.strikes != 2) {
15522                        vm.strikes++;
15523                    }                    
15524                }
15525            })
15526        })
15527
15528        $scope.$watch('strikeouts', function (strikeouts) {
15529            vm.strikeouts = strikeouts || 0;
15530        })
15531    }
15532})();
15533;
15534(function () {
15535    'use strict';
15536
15537    angular
15538        .module('app.directives')
15539        .directive('scoreboardBaseballPitchCount', scoreboardBaseballPitchCount)
15540
15541    scoreboardBaseballPitchCount.$inject = [];
15542
15543    function scoreboardBaseballPitchCount() {
15544        return {
15545            restrict: 'E',
15546            scope: {                
15547                widget: '=',
15548                onPitch: '=',
15549                pitchs: '=',
15550                disabled: '=',
15551                strikeouts: '=',
15552            },
15553            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/baseball/tab-stats/pitch-count/scoreboard-baseball-pitch-count.tpl.html',
15554            controller: 'ScoreboardBaseballPitchCountWidgetController',
15555            controllerAs: 'scoreboardBaseballPitchCount'
15556        };
15557    }
15558})();;
15559(function () {
15560    'use strict';
15561
15562    angular
15563        .module('app.directives')
15564        .controller('ScoreboardAddPlayerController', ScoreboardAddPlayerController);
15565
15566    ScoreboardAddPlayerController.$inject = ['$scope', '$localStorage', 'PositionService', 'GameService'];
15567
15568    function ScoreboardAddPlayerController($scope, $localStorage, positionService, gameService) {
15569        var vm = this;
15570        var sportId = $localStorage.solution.sportId;
15571
15572        vm.showModal = false;
15573        vm.playerId = null;
15574        vm.firstName = "";
15575        vm.lastName = "";
15576        vm.number = "0";
15577        vm.position = "";
15578        vm.status = "";
15579        vm.positions = positionService.getPositions(sportId);
15580        vm.teams = $scope.teams;
15581        vm.team = $scope.selectedTeamId.toString();        
15582        vm.birthdate = null;
15583        vm.gameId = $scope.gameId;
15584
15585        vm.errors = {
15586            firstname: false,
15587            lastname: false,
15588            team: false
15589        }
15590
15591        vm.validatePlayer = function () {
15592            var isValid = true;
15593            vm.errors = { firstname: false, lastname: false, team: false };
15594
15595            if (vm.firstName == "") {
15596                vm.errors.firstname = true;
15597                isValid = false;
15598            }
15599
15600            if (vm.lastName == "") {
15601                vm.errors.lastname = true;
15602                isValid = false;
15603            }
15604
15605            if (vm.team == null) {
15606                vm.errors.team = true;
15607                isValid = false;
15608            }
15609
15610            return isValid;
15611        }
15612
15613        vm.allNumbers = [];
15614        vm.allNumbers.push("0");
15615        vm.allNumbers.push("00");
15616
15617        for (let i = 1; i <= 99; i++) {
15618            vm.allNumbers.push(i.toString());
15619        }
15620
15621        vm.changeNumber = function (id, number) {            
15622            vm.number = number
15623        }
15624
15625        vm.addPlayer = function () {
15626            var isValid = vm.validatePlayer();
15627            if (isValid) { 
15628                var player = { firstName: vm.firstName, lastName: vm.lastName, number: vm.number, positionId: vm.position, teamId: vm.team, status: vm.status };
15629                gameService.addPlayer(__solutionId__, vm.gameId, player).then(function (result) {
15630                    if ($scope.afterChange) {
15631                        $scope.afterChange(result);
15632                    }
15633                });
15634                $scope.show = false;
15635                vm.hideAddPlayerPopup();
15636            }
15637        }
15638
15639        vm.editPlayer = function () {
15640            var isValid = vm.validatePlayer();
15641            if (isValid) {
15642                var player = { id: vm.playerId, firstName: vm.firstName, lastName: vm.lastName, number: vm.number, positionId: vm.position, teamId: vm.team, status: vm.status };
15643                gameService.updatePlayer(__solutionId__, vm.gameId, player).then(function (result) {
15644                    if ($scope.afterChange) {
15645                        $scope.afterChange(result);
15646                    }
15647                });
15648                $scope.show = false;
15649                vm.hideAddPlayerPopup();
15650            }
15651        }
15652
15653        vm.close = function () {
15654            $scope.show = false;
15655            vm.hideAddPlayerPopup();
15656        }
15657
15658        $scope.$watchGroup(['show', 'player'], function (values) {          
15659            vm.playerId = null;
15660            vm.position = "";
15661            vm.number = "0";
15662            vm.firstName = "";
15663            vm.lastName = "";
15664            vm.status = "";
15665            vm.team = $scope.selectedTeamId.toString();
15666
15667            if (values[1]) {
15668                var player = values[1];
15669
15670                vm.playerId = player.id;
15671                vm.lastName = player.lastName;
15672                vm.firstName = player.firstName;
15673                vm.position = player.positionId.toString();
15674                vm.number = player.number;
15675                vm.status = player.status;
15676                vm.team = player.teamId.toString();
15677            }
15678
15679            if (vm.showModal != values[0]) {
15680                vm.errors = { firstname: false, lastname: false, team: false };
15681
15682                if (values[0]) {            
15683                    vm.showAddPlayerPopup();
15684                }
15685                else {                
15686                    vm.hideAddPlayerPopup();
15687                }
15688
15689                vm.showModal = values[0];
15690            }
15691        });
15692    }    
15693})();
15694;
15695(function () {
15696    'use strict';
15697
15698    angular
15699        .module('app.directives')
15700        .directive('scoreboardAddPlayer', scoreboardAddPlayer)
15701
15702    scoreboardAddPlayer.$inject = ['ModalService'];
15703
15704    function scoreboardAddPlayer(modalService) {
15705        return {
15706            restrict: 'E',                        
15707            scope: {                
15708                show: '=',
15709                teams: '=',
15710                selectedTeamId: '=',
15711                player: '=',
15712                gameId: '=',
15713                afterChange: '=',
15714            },
15715            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/add-player/add-player.tpl.html',
15716            controller: 'ScoreboardAddPlayerController',
15717            controllerAs: 'scoreboardAddPlayer',
15718            link: function (scope, element, attrs, controller) {
15719                var modal = modalService.init($('.add-player', element));
15720
15721                element.on('$destroy', function () {
15722                    $(document).off('click');
15723                    modal.element.off('hidden.bs.modal');                    
15724                });
15725
15726                controller.showAddPlayerPopup = modal.show;
15727                controller.hideAddPlayerPopup = modal.hide;
15728                                
15729                modal.element.on('hidden.bs.modal', function (e) {
15730                    if (scope.show) {
15731                        scope.show = false;
15732                        scope.$apply();
15733                    }
15734                })
15735            }
15736        };
15737    }
15738})();;
15739(function () {
15740    'use strict';
15741
15742    angular
15743        .module('app.directives')
15744        .controller('ScoreboardAddStaffController', ScoreboardAddStaffController);
15745
15746    ScoreboardAddStaffController.$inject = ['$scope', 'PositionService', 'GameService', 'StaffService'];
15747
15748    function ScoreboardAddStaffController($scope, positionService, gameService, staffService) {
15749        var vm = this;
15750
15751        vm.showModal = false;
15752        vm.staffId = null;
15753        vm.firstName = "";
15754        vm.lastName = "";        
15755        vm.title = "";
15756        vm.titles = $scope.isSolution ? positionService.getStaffSolutionPositions() : positionService.getStaffTeamPositions();
15757        vm.teams = $scope.teams;
15758        vm.team = $scope.selectedTeamId ? $scope.selectedTeamId.toString() : "";   
15759        vm.gameId = $scope.gameId;
15760
15761        vm.errors = {
15762            firstname: false,
15763            lastname: false,
15764            title: false
15765        }
15766
15767        vm.validateStaff = function () {
15768            var isValid = true;
15769            vm.errors = { firstname: false, lastname: false, title: false };
15770
15771            if (vm.firstName == "") {
15772                vm.errors.firstname = true;
15773                isValid = false;
15774            }
15775
15776            if (vm.lastName == "") {
15777                vm.errors.lastname = true;
15778                isValid = false;
15779            }
15780
15781            if (vm.title == "") {
15782                vm.errors.title = true;
15783                isValid = false;
15784            }
15785
15786            return isValid;
15787        }
15788
15789        vm.addStaff = function () {     
15790            var isValid = vm.validateStaff();
15791            if (isValid) {
15792                var linkId = $scope.isSolution ? __solutionId__ : vm.team;
15793                var staff = { firstName: vm.firstName, lastName: vm.lastName, type: vm.title, linkId: linkId, status: vm.status };
15794
15795                var promise;
15796                if ($scope.isSolution) {
15797                    promise = staffService.create(__solutionId__, staff);
15798                }
15799                else {
15800                    promise = gameService.addStaff(__solutionId__, vm.gameId, staff);
15801                }
15802
15803                promise.then(function (result) {
15804                    if ($scope.afterChange) {
15805                        $scope.afterChange(result);
15806                    }
15807                });
15808                $scope.show = false;
15809                vm.hideAddStaffPopup();
15810            }
15811        }
15812
15813        vm.editStaff = function () {
15814            var isValid = vm.validateStaff();
15815            if (isValid) {
15816                var linkId = $scope.isSolution ? __solutionId__ : vm.team;
15817                var staff = { id: vm.staffId, firstName: vm.firstName, lastName: vm.lastName, type: vm.title, linkId: linkId, status: vm.status };
15818                gameService.updateStaff(__solutionId__, vm.gameId, staff).then(function (result) {
15819                    if ($scope.afterChange) {
15820                        $scope.afterChange(result);
15821                    }
15822                });
15823                $scope.show = false;
15824                vm.hideAddStaffPopup();
15825            }
15826        }
15827
15828        vm.close = function () {
15829            $scope.show = false;
15830            vm.hideAddStaffPopup();
15831        }
15832
15833        $scope.$watchGroup(['show', 'staff'], function (values) {    
15834            vm.staffId = null;
15835            vm.title = "";
15836            vm.firstName = "";
15837            vm.lastName = "";
15838            vm.status = "";
15839            vm.team = $scope.selectedTeamId ? $scope.selectedTeamId.toString() : "";
15840
15841            if (values[1]) {
15842                var staff = values[1];
15843
15844                vm.staffId = staff.id;
15845                vm.title = staff.type;
15846                vm.firstName = staff.firstName;
15847                vm.lastName = staff.lastName;
15848                vm.status = staff.status;
15849                vm.team = staff.linkId.toString();
15850            }
15851
15852            if (vm.showModal != values[0]) {
15853                vm.errors = { firstname: false, lastname: false, title: false };
15854
15855                if (values[0]) {
15856                    vm.showAddStaffPopup();
15857                }
15858                else {
15859                    vm.hideAddStaffPopup();
15860                }
15861
15862                vm.showModal = values[0];
15863            }
15864        });
15865    }    
15866})();
15867;
15868(function () {
15869    'use strict';
15870
15871    angular
15872        .module('app.directives')
15873        .directive('scoreboardAddStaff', scoreboardAddStaff)
15874
15875    scoreboardAddStaff.$inject = ['ModalService'];
15876
15877    function scoreboardAddStaff(modalService) {
15878        return {
15879            restrict: 'E',                        
15880            scope: {                
15881                show: '=',
15882                teams: '=',
15883                selectedTeamId: '=',
15884                staff: '=',
15885                afterChange: '=',
15886                isSolution: '=',
15887                gameId: '='
15888            },
15889            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/add-staff/add-staff.tpl.html',
15890            controller: 'ScoreboardAddStaffController',
15891            controllerAs: 'scoreboardAddStaff',
15892            link: function (scope, element, attrs, controller) {
15893                var modal = modalService.init($('.add-staff', element));
15894
15895                element.on('$destroy', function () {
15896                    $(document).off('click');
15897                    modal.element.off('hidden.bs.modal');                    
15898                });
15899
15900                controller.showAddStaffPopup = modal.show;
15901                controller.hideAddStaffPopup = modal.hide;
15902                                
15903                modal.element.on('hidden.bs.modal', function (e) {
15904                    if (scope.show) {
15905                        scope.show = false;
15906                        scope.$apply();
15907                    }
15908                })
15909            }
15910        };
15911    }
15912})();;
15913(function () {
15914    'use strict';
15915
15916    angular
15917        .module('app.directives')
15918        .controller('ScoreboardGameStaffPopupController', ScoreboardGameStaffPopupController);
15919
15920    ScoreboardGameStaffPopupController.$inject = ['$scope', 'PositionService'];
15921
15922    function ScoreboardGameStaffPopupController($scope, positionService) {
15923        var vm = this;
15924
15925        vm.gameDetails = $scope.gameDetails;        
15926        vm.getStaffPosition = positionService.getStaffPosition;
15927        vm.showModal = false;
15928        vm.showAddStaff = false;
15929        vm.staff = $scope.staff;
15930        vm.selectedStaff = [];
15931       
15932        vm.close = function () {
15933            $scope.show = false;
15934            vm.hideGameStaffPopup();
15935        }
15936
15937        vm.openAddStaff = function () {
15938            vm.showAddStaff = true;
15939        }        
15940
15941        vm.addStaff = function (staff) {            
15942            _.remove(vm.staff, staff);
15943
15944            if (staff.status == 'Deleted') {
15945                staff.status = '';
15946            }
15947            else if (staff.status == "") {
15948                staff.status = 'Created';
15949            }
15950            
15951            vm.selectedStaff.push(staff);
15952        }
15953
15954        vm.removeStaff = function (staff) {
15955            _.remove(vm.selectedStaff, staff);
15956
15957            if (staff.status == 'Created') {
15958                staff.status = '';
15959            }
15960            else if (staff.status == '') {
15961                staff.status = 'Deleted';
15962            }
15963
15964            vm.staff.push(staff);
15965        }
15966
15967        vm.saveStaff = function () {
15968            if ($scope.onUpdate) {
15969                var staff = vm.selectedStaff.concat(vm.staff);
15970
15971                $scope.onUpdate(staff);
15972            }
15973
15974            vm.close();
15975        }
15976
15977        vm.onStaffCreated = function () {
15978            if ($scope.refreshStaff) {
15979                $scope.refreshStaff();
15980            }
15981        }
15982
15983        $scope.$watchGroup(['show'], function (values) {            
15984            if (values[0]) {                            
15985                vm.showGameStaffPopup();
15986            }
15987            else {                
15988                vm.hideGameStaffPopup();
15989            }
15990
15991            vm.showModal = values[0];
15992        });
15993
15994        $scope.$watchGroup(['staff', 'gameDetails'], function (values) {
15995            var staff = values[0] || [];
15996            var gameDetails = values[1];
15997            vm.gameDetails = gameDetails;
15998
15999            if (gameDetails) {
16000                var signedStaff = angular.fromJson(_.get(_.find(gameDetails.properties, { name: 'StaffSigned' }), 'value')) || [];
16001                var selectedStaff = gameDetails.staffList;
16002                staff.forEach(function (staff) {
16003                    staff.status = '';
16004                    staff.signed = function (sign) {
16005                        var isSigned = _.indexOf(signedStaff, staff.id) != -1;
16006
16007                        if (angular.isDefined(sign)) {
16008                            if (sign && !isSigned) {
16009                                signedStaff.push(staff.id);
16010                                $scope.onStaffSignedChange(signedStaff);
16011                            }
16012                            else if (!sign && isSigned) {
16013                                signedStaff = _.without(signedStaff, staff.id);
16014                                $scope.onStaffSignedChange(signedStaff);
16015                            }
16016                        }
16017
16018                        return isSigned;
16019                    }});
16020                
16021                vm.staff = _.filter(staff, function (staffMember) {
16022                    var isSelected = _.find(selectedStaff, { id: staffMember.id }) != null;
16023                    return !isSelected;
16024                }); 
16025
16026                vm.selectedStaff = _.filter(staff, function (staffMember) {
16027                    var isSelected = _.find(selectedStaff, { id: staffMember.id }) != null;
16028                    return isSelected;
16029                }); ;
16030            }
16031        })
16032    }    
16033})();
16034;
16035(function () {
16036    'use strict';
16037
16038    angular
16039        .module('app.directives')
16040        .directive('scoreboardGameStaffPopup', scoreboardGameStaffPopup)
16041
16042    scoreboardGameStaffPopup.$inject = ['ModalService'];
16043
16044    function scoreboardGameStaffPopup(modalService) {
16045        return {
16046            restrict: 'E',                        
16047            scope: {                
16048                show: '=',           
16049                staff: '=',
16050                gameDetails: '=',
16051                onUpdate: '=',
16052                onStaffSignedChange: '=',
16053                refreshStaff: '=',
16054            },
16055            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/game-staff-popup/game-staff-popup.tpl.html',
16056            controller: 'ScoreboardGameStaffPopupController',
16057            controllerAs: 'scoreboardGameStaffPopup',
16058            link: function (scope, element, attrs, controller) {
16059                var modal = modalService.init($('.game-staff-popup', element));
16060
16061                element.on('$destroy', function () {
16062                    $(document).off('click');
16063                    modal.element.off('hidden.bs.modal');                    
16064                });
16065
16066                controller.showGameStaffPopup = modal.show;
16067                controller.hideGameStaffPopup = modal.hide;
16068                                
16069                modal.element.on('hidden.bs.modal', function (e) {
16070                    if (scope.show) {
16071                        scope.show = false;
16072                        scope.$apply();
16073                    }
16074                })
16075            }
16076        };
16077    }
16078})();;
16079(function () {
16080    'use strict';
16081
16082    angular
16083        .module('app.directives')
16084        .controller('ScoreboardBasketballWidgetController', ScoreboardBasketballWidgetController);
16085
16086    ScoreboardBasketballWidgetController.$inject = ['$scope', '$q', 'ScoreboardBasketballService', 'SeasonService', 'StaffService', 'GameService', 'UrlService'];
16087
16088    function ScoreboardBasketballWidgetController($scope, $q, scoreboardBasketballService, seasonService, staffService, gameService, urlService) {
16089        var vm = this;
16090
16091        var details = angular.fromJson(__gameDetails__.replace(/[\n\r]+/g, ' '));
16092        vm.gameId = _.get(details, 'id');
16093        vm.seasonId = _.get(details, 'seasonId');
16094        vm.gameDetails = null;
16095        vm.seasonParameters = null;
16096        vm.reverseTeams = false;
16097        vm.staff = [];
16098
16099        vm.url = urlService;
16100
16101        getGameDetails(true);
16102
16103        seasonService.getSeasonParametersBySeasonId(__solutionId__, vm.seasonId).then(function (parameters) {
16104            vm.seasonParameters = parameters.data || [];
16105        })
16106
16107        staffService.getBySolutionId(__solutionId__).then(function (staff) {            
16108            vm.staff = staff.data;
16109        });
16110        
16111        vm.showGameStaffPopup = false;        
16112         
16113        vm.openGameStaffPopup = function () {                 
16114            vm.showGameStaffPopup = true;
16115        }
16116
16117        vm.createEvent = function (event) { 
16118            scoreboardBasketballService.createEvent(__solutionId__, vm.gameDetails.id, event)
16119                .then(function () {
16120                    getGameDetails();
16121                    //vm.showToast({ type: 'success', message: $translate.instant('widgets.games.scoreboard.basketball.actions.eventCreated') });
16122                })
16123                .catch(function () {
16124                    //vm.showToast({ type: 'error', message: $translate.instant('widgets.games.scoreboard.basketball.actions.errorHasOccured') });
16125                });       
16126        }
16127
16128        vm.onUpdateStaff = function (staff) {
16129            scoreboardBasketballService.updateStaffList(__solutionId__, vm.gameId, staff).then(function () {
16130                getGameDetails();
16131            })
16132        }
16133
16134        vm.onUpdateNote = function (note) {
16135            gameService.updateNote(vm.gameId, note).then(function () {
16136                $scope.$emit(`onNoteChange-${vm.gameId}`, note);
16137            });
16138        }
16139
16140        vm.onStaffSignedChange = function (staffSigned) {
16141            gameService.updateStaffSigned(vm.gameId, staffSigned);
16142		}
16143
16144        vm.refreshStaff = function () {
16145            staffService.getBySolutionId(__solutionId__).then(function (staff) {
16146                vm.staff = staff.data;
16147            });
16148        }
16149
16150        vm.startGame = function () {
16151            scoreboardBasketballService.startGame(__solutionId__, vm.gameId).then(function (result) {
16152                getGameDetails();
16153            });
16154        }
16155
16156        vm.onRosterChange = function () {
16157            var allPlayers = vm.visitorTeam.players.concat(vm.localTeam.players);
16158            var allStaff = vm.visitorTeam.staffs.concat(vm.localTeam.staffs);            
16159
16160            var lineup = {};
16161            lineup.gameId = vm.gameId;
16162            lineup.players = allPlayers;
16163            lineup.staffs = allStaff;
16164
16165            scoreboardBasketballService.updateLineup(__solutionId__, vm.gameId, lineup);         
16166        }
16167
16168        vm.onPlayerStaffChange = function () {
16169            getGameDetails();
16170        }
16171
16172        vm.updateProperties = function (teamId) {
16173            var team = _.find(vm.gameDetails.teamList, { id: teamId });
16174            var onCourtPlayers = _.filter(team.players, { onField: true, status: 'Selected' });                          
16175            var properties = [];
16176                        
16177            properties.push({ name: 'color', value: team.teamColor });   
16178            properties.push({ name: 'playerList', value: JSON.stringify(_.map(onCourtPlayers, function (player) { return player.id })) });
16179            properties.push({ name: 'bonusPts', value: team.bonus });
16180            properties.push({ name: 'signedStaff', value: JSON.stringify(team.signedStaff) });
16181            scoreboardBasketballService.updateProperties(__solutionId__, vm.gameId, teamId, properties);
16182        }
16183
16184        vm.onCloseGame = function () {
16185            scoreboardBasketballService.closeGame(__solutionId__, vm.gameId).then(function () {
16186                getGameDetails();
16187            });
16188        }
16189
16190        vm.onGameUpdate = function () {
16191            scoreboardBasketballService.updateGame(__solutionId__, vm.gameId, vm.gameDetails).then(function () {
16192                getGameDetails();
16193            })
16194        }
16195
16196        vm.onGamePeriodUpdate = function (periodId) {
16197            scoreboardBasketballService.updatePeriod(__solutionId__, vm.gameId, periodId).then(function () {
16198                getGameDetails();
16199            })
16200        }
16201
16202        vm.onGameRollback = function () {
16203            scoreboardBasketballService.rollback(__solutionId__, vm.gameId).then(function () {
16204                getGameDetails();
16205            });
16206        }
16207
16208        vm.onReverseTeam = function () {                 
16209            vm.gameDetails.properties = vm.gameDetails.properties || [];
16210
16211            var reverseTeamProperty = _.find(vm.gameDetails.properties, { name: "reverse" });
16212
16213            if (reverseTeamProperty) {
16214                reverseTeamProperty.value = vm.reverseTeams;
16215            }
16216            else {
16217                vm.gameDetails.properties.push({ name: "reverse", value: vm.reverseTeams })
16218            }            
16219
16220            vm.onGameUpdate();
16221        }
16222
16223        vm.onUpdateEvent = function (content) {                        
16224            scoreboardBasketballService.updateEvent(__solutionId__, vm.gameId, content).then(function () {
16225                getGameDetails();
16226            });
16227        }
16228
16229        vm.onDeleteEvent = function (eventId) {
16230            scoreboardBasketballService.deleteEvent(__solutionId__, vm.gameId, eventId).then(function () {
16231                getGameDetails();
16232            });
16233        }
16234
16235        function getGameDetails() {
16236            scoreboardBasketballService.getDetails(__solutionId__, vm.gameId).then(function (response) {
16237
16238                vm.gameDetails = response.data;
16239
16240                vm.visitorTeam = _.find(vm.gameDetails.teamList, { id: vm.gameDetails.visitorTeamId });
16241                vm.localTeam = _.find(vm.gameDetails.teamList, { id: vm.gameDetails.localTeamId });
16242
16243                vm.visitorTeam.teamColor = _.get(_.find(vm.visitorTeam.teamProperties || [], { name: 'color' }), 'value');
16244                vm.localTeam.teamColor = _.get(_.find(vm.localTeam.teamProperties || [], { name: 'color' }), 'value');
16245
16246                vm.visitorTeam.bonus = _.get(_.find(vm.visitorTeam.teamProperties || [], { name: 'bonusPts' }), 'value');
16247                vm.localTeam.bonus = _.get(_.find(vm.localTeam.teamProperties || [], { name: 'bonusPts' }), 'value');
16248
16249                vm.visitorTeam.signedStaff = angular.fromJson(_.get(_.find(vm.visitorTeam.teamProperties || [], { name: 'signedStaff' }), 'value')) || [];
16250                vm.localTeam.signedStaff = angular.fromJson(_.get(_.find(vm.localTeam.teamProperties || [], { name: 'signedStaff' }), 'value')) || [];
16251                
16252                var visitorOnFields = angular.fromJson(_.get(_.find(vm.visitorTeam.teamProperties || [], { name: 'playerList' }), 'value'));
16253                var localOnFields = angular.fromJson(_.get(_.find(vm.localTeam.teamProperties || [], { name: 'playerList' }), 'value'));
16254
16255                _.forEach(visitorOnFields || [], function (playerId) {
16256                    var teamPlayer = _.find(vm.visitorTeam.players, { id: playerId })
16257                    if (teamPlayer.status == 'Selected') {
16258                        teamPlayer.onField = true;
16259                    }
16260                })
16261
16262                _.forEach(localOnFields || [], function (playerId) {
16263                    var teamPlayer = _.find(vm.localTeam.players, { id: playerId })
16264                    if (teamPlayer.status == 'Selected') {
16265                        teamPlayer.onField = true;
16266                    }
16267                })
16268
16269                vm.timeouts = {};
16270                vm.timeouts[vm.visitorTeam.id] = [];
16271                vm.timeouts[vm.localTeam.id] = [];
16272
16273                var timeouts = _.clone(vm.timeouts);
16274                var timeoutsData = _.filter(response.data.eventList, { eventtypeid: 15 });
16275
16276                timeoutsData.forEach(function (timeout) {
16277                    var timeoutContent = angular.fromJson(timeout.content);
16278                    var teamId = _.get(_.find(timeoutContent.properties, { name: 'team' }), 'id')
16279
16280                    timeoutContent.id = timeout.id;
16281                    timeouts[teamId].push(timeoutContent);
16282                })
16283
16284                vm.timeouts = timeouts;
16285
16286                if (!vm.visitorTeam.teamColor) {
16287                    vm.visitorTeam.teamColor = '#000000';
16288                }
16289
16290                if (!vm.localTeam.teamColor) {
16291                    vm.localTeam.teamColor = '#FFFFFF';
16292                }
16293
16294                document.documentElement.style.setProperty(`--team-color-${vm.visitorTeam.id}`, vm.visitorTeam.teamColor);
16295                document.documentElement.style.setProperty(`--team-color-${vm.localTeam.id}`, vm.localTeam.teamColor);
16296
16297                var reverseProperty = _.find(vm.gameDetails.properties || [], { name: 'reverse' })
16298                if (reverseProperty) {
16299                    var reverseTeams = reverseProperty.value === "true";
16300                    vm.gameDetails.reverseTeams = reverseTeams
16301                    vm.reverseTeams = reverseTeams;
16302                }
16303            });
16304        }
16305    }    
16306})();
16307;
16308(function () {
16309    'use strict';
16310
16311    angular
16312        .module('app.directives')
16313        .directive('scoreboardBasketball', scoreboardBasketball)
16314
16315    scoreboardBasketball.$inject = [];
16316
16317    function scoreboardBasketball() {
16318        return {
16319            restrict: 'E',
16320            scope: {                
16321                widget: '='
16322            },
16323            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/basketball/scoreboard-basketball.tpl.html',
16324            controller: 'ScoreboardBasketballWidgetController',
16325            controllerAs: 'scoreboardBasketball'
16326        };
16327    }
16328})();;
16329(function () {
16330    'use strict';
16331
16332    angular
16333        .module('app.directives')
16334        .controller('ScoreboardBasketballSummaryWidgetController', ScoreboardBasketballSummaryWidgetController);
16335
16336    ScoreboardBasketballSummaryWidgetController.$inject = ['$scope', '$translate', 'ordinalFilter']
16337
16338    function ScoreboardBasketballSummaryWidgetController($scope, $translate, ordinalFilter) {
16339        var vm = this;
16340
16341        vm.gameDetails = $scope.gameDetails;        
16342        vm.gameDetails.visitorPeriods = { 1: 26, 2: 31, 3: 6, 4: 0 };
16343        vm.gameDetails.localPeriods = { 1: 20, 2: 12, 3: 20, 4: 3 };
16344        vm.range = _.range;
16345        vm.useTime = false;
16346        vm.period = '';
16347
16348        vm.periodNumber = _.parseInt(_.get(_.find($scope.seasonParameters, { Code: 'PERIODNUMBER' }), 'Value'));
16349        vm.overtimeNumber = _.parseInt(_.get(_.find($scope.seasonParameters, { Code: 'OVERTIMENUMBER' }), 'Value'));
16350
16351        var useTimeParameter = _.get(_.find($scope.seasonParameters, { Code: 'USETIME' }), 'Value');
16352        if (useTimeParameter) {
16353            vm.useTime = useTimeParameter === "1"
16354        }
16355
16356        setTeams();
16357
16358        $scope.$watch('gameDetails', function (gameDetails) {
16359            vm.gameDetails = gameDetails;            
16360            vm.gameDetails.visitorPeriods = { 1: 26, 2: 31, 3: 6, 4: 0 };
16361            vm.gameDetails.localPeriods = { 1: 20, 2: 12, 3: 20, 4: 3 };
16362
16363            vm.period = vm.gameDetails.periodId;
16364
16365            if (vm.gameDetails.periodId <= vm.periodNumber) {
16366                vm.period = ordinalFilter(vm.gameDetails.periodId);
16367            }
16368            else {
16369                vm.period = $translate.instant('widgets.games.scoreboard.basketball.timing.OT') + ' ' + (vm.gameDetails.periodId - vm.periodNumber);
16370            }
16371
16372            setTeams();
16373        }, true)
16374
16375        function setTeams() {
16376            var visitorTeam = { result: vm.gameDetails.visitorResult, avatar: vm.gameDetails.visitorTeamAvatar, name: vm.gameDetails.visitorTeamName };
16377            var localTeam = { result: vm.gameDetails.localResult, avatar: vm.gameDetails.localTeamAvatar, name: vm.gameDetails.localTeamName };
16378            
16379            vm.leftTeam = visitorTeam;
16380            vm.rightTeam = localTeam;
16381            if (vm.gameDetails.reverseTeams) {
16382                vm.leftTeam = localTeam;
16383                vm.rightTeam = visitorTeam;
16384            }
16385        }
16386    }    
16387})();
16388;
16389(function () {
16390    'use strict';
16391
16392    angular
16393        .module('app.directives')
16394        .directive('scoreboardBasketballSummary', scoreboardBasketballSummary)
16395
16396    scoreboardBasketballSummary.$inject = [];
16397
16398    function scoreboardBasketballSummary() {
16399        return {
16400            restrict: 'E',
16401            scope: {                
16402                widget: '=',
16403                gameDetails: '=',
16404                seasonParameters: '='
16405            },
16406            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/basketball/summary/scoreboard-basketball-summary.tpl.html',
16407            controller: 'ScoreboardBasketballSummaryWidgetController',
16408            controllerAs: 'scoreboardBasketballSummary'
16409        };
16410    }
16411})();;
16412(function () {
16413    'use strict';
16414
16415    angular
16416        .module('app.directives')
16417        .controller('ScoreboardBasketballTimingWidgetController', ScoreboardBasketballTimingWidgetController);
16418
16419    ScoreboardBasketballTimingWidgetController.$inject = ['$scope', '$translate'];
16420
16421    function ScoreboardBasketballTimingWidgetController($scope, $translate) {
16422        var vm = this;
16423
16424        vm.periodNumber = _.parseInt(_.get(_.find($scope.seasonParameters, { Code: 'PERIODNUMBER' }), 'Value'));
16425        vm.overtimeNumber = _.parseInt(_.get(_.find($scope.seasonParameters, { Code: 'OVERTIMENUMBER' }), 'Value'));
16426        vm.repeatOvertime = _.get(_.find($scope.seasonParameters, { Code: 'OVERTIMEREPEAT' }), 'Value') == '1';
16427
16428        vm.useTime = false;
16429        vm.period = "";
16430
16431        var useTimeParameter = _.get(_.find($scope.seasonParameters, { Code: 'USETIME' }), 'Value');
16432        if (useTimeParameter) {
16433            vm.useTime = useTimeParameter === "1"
16434        }
16435
16436        vm.showEndOfQuarter = function () {                
16437            return (vm.gameDetails.periodId < vm.overtimeNumber + vm.periodNumber) || vm.repeatOvertime;
16438        }
16439
16440        vm.showCancelEndOfQuarter = function () {
16441            var periodEvents = _.filter(vm.gameDetails.eventList, { periodid: vm.gameDetails.periodId });
16442
16443            return vm.gameDetails.periodId > 1 && periodEvents.length == 0;
16444        }
16445
16446        vm.errors = {
16447            time: { error: false, value: '' }
16448        }
16449
16450        vm.gameDetails = $scope.gameDetails;
16451        vm.time = function (time) {            
16452            if (angular.isDefined(time)) {                    
16453                vm.errors.time.error = false;
16454                if (time.match(/^\d$/)) {
16455                    time = `0${time}:00`;
16456                }
16457
16458                if (time.match(/^\d{4}$/)) {
16459                    time = time.slice(0, 2) + ':' + time.slice(2);
16460                }
16461
16462                if (time.match(/^\d{2}:\d{2}$/)) {
16463                    vm.gameDetails.time = `00:${time}`;
16464
16465                    if ($scope.onGameUpdate) {
16466                        $scope.onGameUpdate();
16467                    }   
16468                }
16469                else {
16470                    vm.errors.time.error = true;
16471                    vm.errors.time.value = time;                    
16472                }            
16473            }
16474
16475            if (vm.errors.time.error) {
16476                return vm.errors.time.value;
16477            }
16478
16479            return vm.gameDetails.time.slice(-5);
16480        }
16481
16482        vm.closeGame = function () {
16483            if ($scope.onCloseGame) {
16484                $scope.onCloseGame();
16485            }
16486        }
16487
16488        vm.endQuarter = function () {            
16489            if ($scope.onPeriodUpdate) {
16490                $scope.onPeriodUpdate(vm.gameDetails.periodId + 1);
16491            }            
16492        }
16493
16494        vm.cancelEndQuarter = function () {
16495            if ($scope.onPeriodUpdate) {
16496                if (vm.gameDetails.periodId > 1) {
16497                    $scope.onPeriodUpdate(vm.gameDetails.periodId - 1);
16498                }
16499            }
16500        }
16501
16502        vm.cancelEndGame = function () {
16503            if ($scope.onRollback) {
16504                $scope.onRollback();
16505            }
16506        }
16507
16508        vm.onTimeKeypress = function (event) {
16509            var newchar = String.fromCharCode(event.charCode || event.keyCode);
16510
16511            if (!newchar.match(/[0-9:]/)) {
16512                event.preventDefault();
16513            }            
16514        }
16515
16516        $scope.$watch('gameDetails', function (gameDetails) {
16517            vm.gameDetails = gameDetails;
16518            vm.period = vm.gameDetails.periodId;
16519
16520            if (vm.gameDetails.periodId <= vm.periodNumber) {
16521                vm.period = vm.gameDetails.periodId;
16522            }
16523            else {
16524                vm.period = $translate.instant('widgets.games.scoreboard.basketball.timing.OT') + ' ' + (vm.gameDetails.periodId - vm.periodNumber);
16525            }
16526        })
16527    }    
16528})();
16529;
16530(function () {
16531    'use strict';
16532
16533    angular
16534        .module('app.directives')
16535  
16535      .directive('scoreboardBasketballTiming', scoreboardBasketballTiming)
16536
16537    scoreboardBasketballTiming.$inject = [];
16538
16539    function scoreboardBasketballTiming() {
16540        return {
16541            restrict: 'E',
16542            scope: {                
16543                widget: '=',
16544                gameDetails: '=',
16545                seasonParameters: '=',
16546                onCloseGame: '=',
16547                onGameUpdate: '=',
16548                onPeriodUpdate: '=',
16549                onRollback: '=',
16550            },
16551            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/basketball/timing/scoreboard-basketball-timing.tpl.html',
16552            controller: 'ScoreboardBasketballTimingWidgetController',
16553            controllerAs: 'scoreboardBasketballTiming'
16554        };
16555    }
16556})();;
16557(function () {
16558    'use strict';
16559
16560    angular
16561        .module('app.directives')
16562        .controller('ScoreboardBasketballActionsWidgetController', ScoreboardBasketballActionsWidgetController);
16563
16564    ScoreboardBasketballActionsWidgetController.$inject = ['$scope', '$translate', 'ScoreboardBasketballService', 'SolutionService'];
16565
16566    function ScoreboardBasketballActionsWidgetController($scope, $translate, scoreboardBasketballService, solutionService) {
16567        var vm = this;
16568        var FOUL_EVENT_ID = 14;
16569
16570        vm.gameDetails = $scope.gameDetails;     
16571        vm.showPopup = false;
16572        vm.showStaff = false;
16573        vm.showFreeThrows = false;
16574        vm.target = null;
16575        vm.selectedAction = null;
16576        vm.selectedValue = null;
16577        vm.bonusConfig = 8;
16578
16579        vm.foulsLimitConfig = _.get(_.find($scope.seasonParameters, { Code: 'FOULSLIMIT' }), 'Value') || 5;        
16580        vm.periodNumber = _.parseInt(_.get(_.find($scope.seasonParameters, { Code: 'PERIODNUMBER' }), 'Value') || "0");        
16581
16582        vm.usePresence = false;
16583
16584        solutionService.getSolutionById(__solutionId__).then(function (result) {
16585            var configs = result.data.configs;
16586            var usePresence = false
16587            var scoreboardSettingsConfig = _.find(configs, { code: 'SCOREBOARDSETTINGS' });
16588            if (scoreboardSettingsConfig) {
16589                var parsedScoreboardSettingsConfig = JSON.parse(scoreboardSettingsConfig.value);
16590                var usePresenceConfig = _.find(parsedScoreboardSettingsConfig, { name: 'USEPRESENCE' });
16591                if (usePresenceConfig) {
16592                    usePresence = usePresenceConfig.value == 1;
16593                }
16594            }
16595
16596            vm.usePresence = usePresence;
16597        });
16598
16599        processBonusConfig();
16600
16601        vm.bonusReachedTeam = null;
16602        vm.selectedPlayer = null;
16603        vm.toast = {};
16604        
16605        vm.teams = vm.gameDetails.teamList;
16606        vm.visitorTeam = _.find(vm.teams, { id: vm.gameDetails.visitorTeamId });
16607        vm.localTeam = _.find(vm.teams, { id: vm.gameDetails.localTeamId });
16608        setFouls();
16609
16610        $scope.$watch('gameDetails', function (gameDetails) {            
16611            vm.gameDetails = gameDetails;
16612            vm.teams = vm.gameDetails.teamList;
16613            processBonusConfig();
16614            setFouls();
16615        }, true)
16616
16617        vm.teams.sort(function (a, b) {
16618            if (a.id == vm.gameDetails.visitorTeamId) {
16619                return -1;
16620            }
16621            else if (b.id == vm.gameDetails.visitorTeamId) {
16622                return 1;
16623            }
16624
16625            return 0;
16626        })
16627
16628        vm.clickAction = function (action, value) {
16629            vm.showPopup = true;
16630            vm.target = $(event.currentTarget);
16631            vm.selectedAction = action;
16632            vm.selectedValue = value;
16633
16634            if (action == 'foul') {
16635                vm.showStaff = true;
16636                vm.showFreeThrows = true;
16637                if (value == 'technical') {
16638                    vm.showTechnicalFoulType = true;
16639                }
16640                else {
16641                    vm.showTechnicalFoulType = false;
16642                }
16643            }
16644            else {
16645                vm.showStaff = false;
16646                vm.showFreeThrows = false;
16647            }
16648        }
16649
16650        vm.closePopup = function () {
16651            vm.showPopup = false;
16652            vm.selectedAction = null;
16653            vm.selectedValue = null;
16654        }
16655
16656        vm.playerSelect = function (player, type, freeThrows, technicalFoulType) {
16657            vm.selectedPlayer = player;
16658            switch (vm.selectedAction) {
16659                case 'points':
16660                case 'missed':
16661                    var event = { type: 'shoot', period: vm.gameDetails.periodId, properties: [], details: [], time: vm.gameDetails.time };
16662                    event.properties.push({ id: player.id, teamId: player.teamId, name: 'shooter' });
16663                    event.details.push({ name: 'success', value: vm.selectedAction == 'points' });
16664                    event.details.push({ name: 'pointsCount', value: vm.selectedValue });
16665                    break;
16666                case 'foul':
16667                    var event = { type: 'fault', period: vm.gameDetails.periodId, properties: [], details: [], time: vm.gameDetails.time };
16668                    event.properties.push({ id: player.id, teamId: player.teamId, name: type });                    
16669                    event.details.push({ name: 'type', value: vm.selectedValue });
16670                    event.details.push({ name: 'freeThrows', value: freeThrows });
16671
16672                    if (technicalFoulType) {
16673                        event.details.push({ name: 'technicalFoulType', value: technicalFoulType });
16674                    }
16675
16676                    if (type == 'player') {
16677                        player.fouls = player.fouls + 1;
16678                        if (player.fouls == vm.foulsLimitConfig || player.fouls == vm.foulsLimitConfig - 1) {
16679                            vm.showFoulsLimitReached();
16680                        }
16681
16682                        if (player.teamId == vm.visitorTeam.id) {
16683                            vm.visitorTeam.fouls++;                            
16684
16685                            if (vm.visitorTeam.fouls == vm.bonusConfig || vm.visitorTeam.fouls == vm.bonusConfig - 1) {                                
16686                                vm.bonusReachedTeam = vm.visitorTeam;
16687                                vm.showBonusReached();
16688                            }
16689                        }
16690                        else if (player.teamId == vm.localTeam.id) {
16691                            vm.localTeam.fouls++;
16692
16693                            if (vm.localTeam.fouls == vm.bonusConfig || vm.localTeam.fouls == vm.bonusConfig - 1) {                                
16694                                vm.bonusReachedTeam = vm.localTeam;
16695                                vm.showBonusReached();
16696                            }
16697                        }
16698                    }
16699
16700                    break;
16701                case 'rebound': 
16702                    var event = { type: 'rebound', period: vm.gameDetails.periodId, properties: [], details: [], time: vm.gameDetails.time };
16703                    event.properties.push({ id: player.id, teamId: player.teamId, name: 'shooter' });
16704                    event.details.push({ name: 'type', value: vm.selectedValue });
16705                    break;
16706                case 'presence':
16707                    var event = { type: 'presence', period: vm.gameDetails.periodId, properties: [], details: [], time: vm.gameDetails.time };
16708                    event.properties.push({ id: player.id, teamId: player.teamId, name: 'player' });
16709                    break;
16710            }
16711                        
16712            if ($scope.createEvent && event) {
16713                $scope.createEvent(event)
16714            }
16715        }
16716
16717        function setFouls() {
16718            vm.visitorTeam.fouls = 0;
16719            vm.localTeam.fouls = 0;
16720            
16721            vm.gameDetails.eventList.forEach(function (event) {
16722                if (event.eventtypeid == FOUL_EVENT_ID &&
16723                    ((vm.gameDetails.periodId <= vm.periodNumber && event.periodid == vm.gameDetails.periodId) || 
16724                        (vm.gameDetails.periodId > vm.periodNumber && event.periodid >= vm.periodNumber))) {
16725                    var content = JSON.parse(event.content);
16726                    var isStaff = _.find(content.properties, { name: 'staff' }) != null;
16727                    
16728                    if (!isStaff) {
16729                        if (event.teamid == vm.visitorTeam.id) {
16730                            vm.visitorTeam.fouls++;
16731                        }
16732                        else if (event.teamid == vm.localTeam.id) {
16733                           vm.localTeam.fouls++;
16734                        }
16735                    }
16736                }
16737            })
16738        }
16739
16740        function processBonusConfig()
16741        {
16742            vm.bonusConfig = 8;
16743            var bonusSeasonConfig = _.get(_.find($scope.seasonParameters, { Code: 'BONUSFOULS' }), 'Value');
16744            if (bonusSeasonConfig) {
16745                bonusSeasonConfig = angular.fromJson(bonusSeasonConfig) || [];
16746
16747                var period = vm.gameDetails.periodId <= vm.periodNumber ? vm.gameDetails.periodId : vm.periodNumber;
16748                var bonusPeriod = _.get(_.find(bonusSeasonConfig, { period: period }), 'value');
16749                if (bonusPeriod) {
16750                    vm.bonusConfig = bonusPeriod;
16751                }
16752            }
16753        }
16754    }    
16755})();
16756;
16757(function () {
16758    'use strict';
16759
16760    angular
16761        .module('app.directives')
16762        .directive('scoreboardBasketballActions', scoreboardBasketballActions)
16763
16764    scoreboardBasketballActions.$inject = ['ModalService'];
16765
16766    function scoreboardBasketballActions(modalService) {
16767        return {
16768            restrict: 'E',
16769            replace: true,
16770            scope: {                
16771                widget: '=',
16772                createEvent: '=',
16773                gameDetails: '=',
16774                seasonParameters: '='
16775            },
16776            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/basketball/actions/scoreboard-basketball-actions.tpl.html',
16777            controller: 'ScoreboardBasketballActionsWidgetController',
16778            controllerAs: 'scoreboardBasketballActions',
16779            link: function ($scope, element, attrs, controller) {                
16780                var bonusModal = modalService.init($("#scoreboard-basketball-bonus-modal", element));
16781                var foulsLimitReachedModal = modalService.init($("#scoreboard-basketball-player-fouls-limit", element));
16782
16783                element.on('$destroy', function () {
16784                    $(document).off('click');
16785                });
16786
16787                controller.showBonusReached = bonusModal.show;
16788                controller.hideBonusReached = bonusModal.hide;
16789
16790                controller.showFoulsLimitReached = foulsLimitReachedModal.show;
16791                controller.hideFoulsLimitReached = foulsLimitReachedModal.hide;
16792
16793                controller.showToast = function (toast) {
16794                    controller.toast = toast;
16795                    $('.toast', element).toast('show');
16796                }
16797            }
16798        };
16799    }
16800})();;
16801(function () {
16802    'use strict';
16803
16804    angular
16805        .module('app.directives')
16806        .controller('ScoreboardBasketballRosterWidgetController', ScoreboardBasketballRosterWidgetController);
16807
16808    ScoreboardBasketballRosterWidgetController.$inject = ['$scope', '$translate', '$interval', 'PositionService', 'SolutionService', 'ScoreboardBasketballService']
16809
16810    function ScoreboardBasketballRosterWidgetController($scope, $translate, $interval, positionService, solutionService, scoreboardBasketballService) {
16811        var vm = this;
16812        var FOULS_ID = 156;
16813        var POINTS_ID = 132;
16814        var PRESENCE_ID = 169;
16815        var timeoutsTypes = {
16816            GAME: 'game',
16817            HALF: 'half',
16818            QUARTER: 'quarter'
16819        }
16820
16821        vm.MAX_TIMEOUTS = 2;              
16822        
16823        vm.gameDetails = $scope.gameDetails;
16824        vm.team = $scope.team;        
16825        vm.btnColor = '#000000';        
16826        vm.showRoster = false;
16827        vm.sort = 'number';
16828        vm.direction = 'asc'; 
16829        vm.sortStaff = 'name';
16830        vm.directionStaff = 'asc'; 
16831        vm.sortedFieldPlayers = sortFieldPlayers(vm.team.players);
16832        vm.staffPositions = positionService.getStaffTeamPositions();
16833        vm.foulsLimitConfig = _.get(_.find($scope.seasonParameters, { Code: 'FOULSLIMIT' }), 'Value') || 5;
16834        vm.periodNumber = _.get(_.find($scope.seasonParameters, { Code: 'PERIODNUMBER' }), 'Value');
16835        vm.timeoutsConfig = _.get(_.find($scope.seasonParameters, { Code: 'TIMEOUTS' }), 'Value');
16836        vm.timeoutsDuration = 0;
16837        vm.timeoutsDurationOvertime = 0;
16838        vm.timer = 0;
16839        vm.timerInterval = null;
16840        vm.half = vm.gameDetails.periodId > vm.periodNumber / 2;
16841        vm.isOvertime = vm.gameDetails.periodId > vm.periodNumber;
16842        vm.showAddPlayer = false;
16843        vm.showAddStaff = false;
16844        vm.selectedTeamId = null;
16845        vm.selectedPlayer = null;
16846        vm.selectedStaff = null;
16847        vm.showLevel = false;
16848        vm.usePresence = false;
16849
16850        solutionService.getSolutionById(__solutionId__).then(function (result) {
16851            var configs = result.data.configs;
16852            var showLevel = false;
16853            var usePresence = false
16854            var scoreboardSettingsConfig = _.find(configs, { code: 'SCOREBOARDSETTINGS' });
16855            if (scoreboardSettingsConfig) {
16856                var parsedScoreboardSettingsConfig = JSON.parse(scoreboardSettingsConfig.value);
16857                var showLevelConfig = _.find(parsedScoreboardSettingsConfig, { name: 'SHOWLEVEL' });
16858                if (showLevelConfig) {
16859                    showLevel = showLevelConfig.value == 1
16860                }
16861
16862                var usePresenceConfig = _.find(parsedScoreboardSettingsConfig, { name: 'USEPRESENCE' });
16863                if (usePresenceConfig) {
16864                    usePresence = usePresenceConfig.value == 1;
16865                }
16866            }
16867            vm.showLevel = showLevel;
16868            vm.usePresence = usePresence;
16869        });
16870        
16871        processPlayers();
16872
16873        processTimeoutsConfig()
16874                
16875        vm.allNumbers = [];
16876        vm.disabledNumbers = [];
16877        vm.selectedInfo = 'faults';
16878
16879        vm.disabledNumbers = vm.team.players.map(function (player) {
16880            return player.number;
16881        });
16882        vm.allNumbers = [];
16883        vm.allNumbers.push("0");
16884        vm.allNumbers.push("00");
16885
16886        for (let i = 1; i <= 99; i++) {
16887            vm.allNumbers.push(i.toString());
16888        }
16889
16890        vm.changeNumber = function (playerId, number) {                        
16891            var player = _.find(vm.team.players, { id: _.parseInt(playerId) });
16892                if (player.status == 'Selected') {
16893                var oldNumber = player.number;
16894                player.number = number;
16895                vm.disabledNumbers = vm.team.players.map(function (player) {
16896                    return player.number;
16897                });      
16898
16899                if (oldNumber != player.number) {
16900                    vm.onRosterChange();                
16901                }
16902            }
16903        }
16904
16905        vm.onRosterChange = function () {
16906            if ($scope.onRosterChange) {
16907                $scope.onRosterChange();
16908            }            
16909        }
16910
16911        vm.onPlayerStaffChange = function () {
16912            if ($scope.onPlayerStaffChange) {
16913                $scope.onPlayerStaffChange();
16914            }
16915        }
16916
16917        vm.range = _.range;
16918
16919        vm.getStaffPosition = positionService.getStaffPosition;
16920
16921        vm.setOnField = function (player) {            
16922            player.onField = !player.onField;           
16923            if ($scope.onPropertiesUpdate) {                                
16924                $scope.onPropertiesUpdate(vm.team.id);
16925            }
16926        }
16927
16928        vm.setTimeouts = function (timeout) {
16929            var currentTimeout = _.clone(timeout);
16930            
16931            if (timeout.number == 1 && (vm.half == true && !vm.isOvertime) && timeout.active == false && !timeout.ongoing) {                                
16932                timeout.active = true;
16933                timeout.ongoing = true;                
16934            }
16935            else {
16936                var compareNumber;
16937                if (timeout.active) {
16938                    compareNumber = timeout.number + 1;
16939                }
16940                else {
16941                    compareNumber = timeout.number - 1;
16942                }
16943
16944                var preventChange = false;
16945                var prevTimeout = vm.getTimeout(compareNumber);
16946                if (prevTimeout) {
16947                    if (prevTimeout.active != !timeout.active) {
16948                        preventChange = true;
16949                    }
16950                }
16951
16952                if (!preventChange) {
16953
16954                    if (timeout.ongoing) {
16955                        timeout.active = true;
16956                    }
16957                    else {
16958                        timeout.active = !timeout.active;
16959                    }
16960                    timeout.ongoing = false;
16961                }
16962
16963                if ((!currentTimeout.active || currentTimeout.ongoing) && (timeout.active && !timeout.ongoing)) {
16964                    vm.showTimeoutTimer();
16965                }
16966            }
16967
16968            vm.updateTimeout(currentTimeout, timeout);
16969        }
16970
16971        vm.showTimeoutTimer = function () {
16972            vm.showTimerModal();
16973
16974            var duration = 0;
16975            if (!vm.isOvertime) {
16976                duration = vm.timeoutsDuration;
16977            }
16978            else {
16979                duration = vm.timeoutsDurationOvertime;
16980            }
16981
16982            vm.timer = duration - 10;
16983
16984            vm.timer = vm.timer < 0 ? 0 : vm.timer;
16985
16986            vm.timerInterval = $interval(function () {
16987                if (vm.timer > 0) {
16988                    vm.timer -= 1;
16989                }
16990
16991                if (vm.timer == 0) {
16992                    $interval.cancel(vm.timerInterval);
16993                }
16994            }, 1000);
16995        }
16996
16997        vm.updateTimeout = function (timeout, newTimeout) {
16998            var event = { type: 'timeout', period: vm.gameDetails.periodId, properties: [], details: [], time: vm.gameDetails.time };
16999            event.properties.push({ id: vm.team.id, name: 'team' });
17000            event.details.push({ name: 'number', value: newTimeout.number });
17001            event.details.push({ name: 'ongoing', value: newTimeout.ongoing });
17002
17003            if (!timeout.active && newTimeout.active) {                
17004                scoreboardBasketballService.createEvent(__solutionId__, vm.gameDetails.id, event)
17005                    .then(function (response) {
17006                        var event = response.data;
17007                        var timeout = _.find(vm.timeouts, { number: newTimeout.number })
17008                        timeout.id = event.id;                        
17009                      //  vm.showToast({ type: 'success', message: $translate.instant('widgets.games.scoreboard.basketball.actions.eventCreated') });
17010                    })
17011                    .catch(function () {
17012                       // vm.showToast({ type: 'error', message: $translate.instant('widgets.games.scoreboard.basketball.actions.errorHasOccured') });
17013                    });       
17014            }
17015            else if (timeout.ongoing != newTimeout.ongoing) {                                
17016                event.id = newTimeout.id;
17017                scoreboardBasketballService.updateEvent(__solutionId__, vm.gameDetails.id, event)
17018                    .then(function () {
17019                        //vm.showToast({ type: 'success', message: $translate.instant('widgets.games.scoreboard.basketball.actions.eventCreated') });
17020                    })
17021                    .catch(function () {
17022                        //vm.showToast({ type: 'error', message: $translate.instant('widgets.games.scoreboard.basketball.actions.errorHasOccured') });
17023                    });       
17024            }            
17025            else if (timeout.active && !newTimeout.active) {                                
17026                scoreboardBasketballService.deleteEvent(__solutionId__, vm.gameDetails.id, newTimeout.id)
17027                    .then(function () {
17028                        newTimeout.id = null;
17029                       // vm.showToast({ type: 'success', message: $translate.instant('widgets.games.scoreboard.basketball.actions.eventCreated') });
17030                    })
17031                    .catch(function () {
17032                       // vm.showToast({ type: 'error', message: $translate.instant('widgets.games.scoreboard.basketball.actions.errorHasOccured') });
17033                    });       
17034            }
17035        }
17036
17037        vm.getTimeout = function (number) {
17038            var timeout = _.find(vm.timeouts, { number: number });
17039            return timeout;
17040        }
17041
17042        vm.addPlayer = function (player) {            
17043            vm.selectedPlayer = player;
17044            vm.showAddPlayer = true;            
17045        }
17046
17047        vm.addStaff = function (staff) {
17048            vm.selectedStaff = staff;
17049            vm.showAddStaff = true;
17050        }
17051
17052        $scope.$watch(function () {
17053            return vm.team.teamColor;
17054        }, function (newColor) {
17055            if (newColor.length == 4) {
17056                var subresult = /^#?([a-f\d]{3})$/i.exec(newColor);
17057                newColor = `#${subresult[1]}${subresult[1]}`
17058            }
17059                
17060            document.documentElement.style.setProperty(`--team-color-${vm.team.id}`, newColor);
17061            if (newColor.toUpperCase() == '#FFFFFF') {
17062                document.documentElement.style.setProperty(`--team-border-${vm.team.id}`, '#888888');
17063            }
17064            else {
17065                document.documentElement.style.setProperty(`--team-border-${vm.team.id}`, newColor);
17066            }
17067
17068            var rgb = hexToRgb(newColor);
17069                
17070            var colorContrast = (299 * rgb.r + 587 * rgb.g + 114 * rgb.b) / 1000;
17071
17072            if (Math.abs(0 - colorContrast) > Math.abs(255 - colorContrast)) {
17073                vm.btnColor = '#000000';
17074            }
17075            else {
17076                vm.btnColor = '#FFFFFF'
17077            }
17078        });
17079
17080        $scope.$watch('team', function (team) {
17081            vm.team = team;
17082            vm.sortedFieldPlayers = _.filter(sortFieldPlayers(vm.team.players), { status: 'Selected' });
17083            _.forEach(vm.team.players, function (player) {                
17084                player.points = _.reduce(player.stats, function (prev, value) {
17085                    if (value.statTypeId == POINTS_ID) {
17086                        return prev + value.value;
17087                    }
17088                    return prev;
17089                }, 0);
17090
17091                player.fouls = _.reduce(player.stats, function (prev, value) {
17092                    if (value.statTypeId == FOULS_ID) {
17093                        return prev + value.value;
17094                    }
17095                    return prev;
17096                }, 0);
17097
17098                player.presences = _.reduce(player.stats, function (prev, value) {
17099                    if (value.statTypeId == PRESENCE_ID) {
17100                        return prev + value.value;
17101                    }
17102                    return prev;
17103                }, 0);
17104            })
17105        }, true)
17106
17107        $scope.$watch('gameDetails', function (gameDetails) {
17108            vm.gameDetails = gameDetails;
17109            vm.half = vm.gameDetails.periodId > vm.periodNumber / 2;            
17110            vm.isOvertime = vm.gameDetails.periodId > vm.periodNumber;
17111
17112            processPlayers();
17113            processTimeoutsConfig();
17114        })
17115
17116        $scope.$watch(function () {
17117            return $scope.timeouts
17118        }, setTimeouts, true)
17119
17120        function setTimeouts(timeoutsData) {
17121            var filteredData = [];
17122            var mode = timeoutsTypes.GAME;
17123            if (vm.timeoutsConfig) {
17124                mode = vm.timeoutsConfig.type;
17125            }
17126
17127            if (mode === timeoutsTypes.GAME || vm.gameDetails.periodId <= vm.periodNumber) {
17128                switch (mode) {
17129                    case timeoutsTypes.GAME:
17130                        filteredData = timeoutsData;
17131                        break;
17132                    case timeoutsTypes.HALF:
17133                        filteredData = _.filter(timeoutsData, function (timeout) {
17134                            if (!vm.half) {
17135                                return timeout.period <= vm.periodNumber / 2;
17136                            }
17137                            else {
17138                                return timeout.period > vm.periodNumber / 2;
17139                            }
17140                        })
17141                        break;
17142                    case timeoutsTypes.QUARTER:
17143                        filteredData = _.filter(timeoutsData, { period: vm.gameDetails.periodId });
17144                        break;
17145                }
17146            }
17147            else {
17148                filteredData = _.filter(timeoutsData, function (timeout) {
17149                    return timeout.period === vm.gameDetails.periodId;
17150                });
17151            }
17152
17153            filteredData.forEach(function (timeoutData) {
17154                var numberData = _.get(_.find(timeoutData.details, { name: 'number' }), 'value');
17155                var timeout = _.find(vm.timeouts, { number: parseInt(numberData) });
17156                var ongoingData = _.get(_.find(timeoutData.details, { name: 'ongoing' }), 'value');
17157
17158                if (timeout) {
17159                    timeout.ongoing = ongoingData == 'true';
17160                    timeout.active = true;
17161                    timeout.id = timeoutData.id;
17162                }
17163            })
17164        }
17165
17166        vm.onColorChange = function () {
17167            if ($scope.onPropertiesUpdate) {
17168                $scope.onPropertiesUpdate(vm.team.id)
17169            }
17170        }
17171
17172        function hexToRgb(hex) {
17173            var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
17174            return result ? {
17175                r: parseInt(result[1], 16),
17176                g: parseInt(result[2], 16),
17177                b: parseInt(result[3], 16)
17178            } : null;
17179        }
17180
17181        function sortFieldPlayers(players) {
17182            return _.orderBy(players, [function (player) {
17183                return player && player.number ? _.parseInt(player.number) : Infinity;                
17184            }], ['asc']);
17185        }
17186
17187        function processTimeoutsConfig() {
17188            var maxTimeouts = vm.MAX_TIMEOUTS;
17189            vm.timeoutsConfig = _.get(_.find($scope.seasonParameters, { Code: 'TIMEOUTS' }), 'Value');
17190
17191            if (vm.timeoutsConfig) {
17192                vm.timeoutsConfig = angular.fromJson(vm.timeoutsConfig);
17193
17194                if (vm.timeoutsConfig.type === timeoutsTypes.GAME || vm.gameDetails.periodId <= vm.periodNumber) {
17195                    switch (vm.timeoutsConfig.type) {
17196                        case timeoutsTypes.GAME:
17197                            maxTimeouts = _.get(_.find(vm.timeoutsConfig.timeouts, { period: 1 }), 'value') || vm.MAX_TIMEOUTS;
17198                            break;
17199                        case timeoutsTypes.HALF:
17200                            if (vm.half) {
17201                                maxTimeouts = _.get(_.find(vm.timeoutsConfig.timeouts, { period: 2 }), 'value') || vm.MAX_TIMEOUTS;
17202                            }
17203                            else {
17204                                maxTimeouts = _.get(_.find(vm.timeoutsConfig.timeouts, { period: 1 }), 'value') || vm.MAX_TIMEOUTS;
17205                            }
17206                            break;
17207                        case timeoutsTypes.QUARTER:
17208                            maxTimeouts = _.get(_.find(vm.timeoutsConfig.timeouts, { period: vm.gameDetails.periodId }), 'value') || vm.MAX_TIMEOUTS;
17209                            break;
17210                    }
17211                }
17212                else {
17213                    maxTimeouts = vm.timeoutsConfig.timeoutsOvertime || 0;
17214                }
17215
17216                vm.timeoutsDuration = vm.timeoutsConfig.duration || 60;
17217                vm.timeoutsDurationOvertime = vm.timeoutsConfig.durationOvertime || 60;
17218            }
17219
17220            vm.timeouts = []
17221            for (var i = 0; i < maxTimeouts; i++) {
17222                vm.timeouts.push({ id: null, number: i + 1, ongoing: false, active: false });
17223            }
17224
17225            setTimeouts($scope.timeouts);
17226        }
17227
17228        function processPlayers() {
17229            _.forEach(vm.team.players, function (player) {
17230                player.points = _.reduce(player.stats, function (prev, value) {
17231                    if (value.statTypeId == POINTS_ID) {
17232                        return prev + value.value;
17233                    }
17234                    return prev;
17235                }, 0);
17236
17237                player.fouls = _.reduce(player.stats, function (prev, value) {
17238                    if (value.statTypeId == FOULS_ID) {
17239                        return prev + value.value;
17240                    }
17241                    return prev;
17242                }, 0);
17243
17244                player.presences = _.reduce(player.stats, function (prev, value) {
17245                    if (value.statTypeId == PRESENCE_ID ) {
17246                        return prev + value.value;
17247                    }
17248                    return prev;
17249                }, 0);
17250
17251                player.selected = function (checked) {
17252                    if (angular.isDefined(checked)) {
17253                        if (checked) {
17254                            player.status = 'Selected';
17255                        }
17256                        else {                            
17257                            player.status = '';
17258                        }
17259                    }
17260
17261                    return player.status == 'Selected';
17262                }
17263            })
17264
17265            _.forEach(vm.team.staffs, function (staff) {
17266                staff.selected = function (checked) {
17267                    if (angular.isDefined(checked)) {
17268                        if (checked) {
17269                            staff.status = 'Selected';
17270                        }
17271                        else {
17272                            staff.status = '';
17273                        }
17274                    }
17275
17276                    return staff.status == 'Selected';
17277                }
17278
17279                staff.signed = function (sign) {
17280                    var isSigned = _.indexOf(vm.team.signedStaff, staff.id) != -1;
17281
17282                    if (angular.isDefined(sign)) {
17283                        if (sign && !isSigned) {
17284                            vm.team.signedStaff.push(staff.id);
17285                            $scope.onPropertiesUpdate(vm.team.id);
17286                        }
17287                        else if(!sign && isSigned) {
17288                            vm.team.signedStaff = _.without(vm.team.signedStaff, staff.id);
17289                            $scope.onPropertiesUpdate(vm.team.id);
17290						}
17291                    }
17292
17293                    return isSigned;
17294				}
17295            })
17296        }
17297
17298        vm.sortPlayers = function(sort) {
17299            if (vm.sort != sort) {
17300                vm.sort = sort;
17301                vm.direction = 'asc';
17302            }
17303            else {                
17304                vm.direction = vm.direction == 'asc' ? 'desc' : 'asc';
17305            }
17306        }
17307
17308        vm.sortStaffItem = function (sort) {
17309            if (vm.sortStaff != sort) {
17310                vm.sortStaff = sort;
17311                vm.directionStaff = 'asc';
17312            }
17313            else {
17314                vm.directionStaff = vm.directionStaff == 'asc' ? 'desc' : 'asc';
17315            }
17316        }
17317
17318        vm.comparator = function (v1, v2) {                        
17319            if (vm.sort == 'number') {
17320                return _.parseInt(v1.value) < _.parseInt(v2.value) ? -1 : 1; 
17321            }
17322            if (vm.sort == 'selected') {
17323                return !!v1.value < !!v2.value ? -1 : 1;
17324            }
17325            
17326            return v1.value < v2.value ? -1 : 1;
17327        };
17328
17329        vm.comparatorStaff = function (v1, v2) {
17330            if (vm.sortStaff == 'type') {
17331                return _.parseInt(v1.value) < _.parseInt(v2.value) ? -1 : 1;
17332            }
17333            if (vm.sortStaff == 'selected') {
17334                return !!v1.value < !!v2.value ? -1 : 1;
17335            }
17336
17337            return v1.value < v2.value ? -1 : 1;
17338        };
17339    }    
17340})();
17341;
17342(function () {
17343    'use strict';
17344
17345    angular
17346        .module('app.directives')
17347        .directive('scoreboardBasketballRoster', scoreboardBasketballRoster)
17348
17349    scoreboardBasketballRoster.$inject = ['ModalService', '$interval'];
17350
17351    function scoreboardBasketballRoster(modalService, $interval) {
17352        return {
17353            restrict: 'E',
17354            scope: {                
17355                widget: '=',
17356                team: '=',
17357                timeouts: '=',
17358                gameDetails: '=',
17359                seasonParameters: '=',
17360                onRosterChange: '=',
17361                onPropertiesUpdate: '=',
17362                onPlayerStaffChange: '=',
17363            },
17364            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/basketball/roster/scoreboard-basketball-roster.tpl.html',
17365            controller: 'ScoreboardBasketballRosterWidgetController',
17366            controllerAs: 'scoreboardBasketballRoster',
17367            link: function ($scope, element, attrs, controller) {
17368                var timerModal = modalService.init($("#scoreboard-basketball-roster-timer", element));
17369                
17370                element.on('$destroy', function () {
17371                    $(document).off('click');
17372                });
17373
17374                controller.showTimerModal = timerModal.show;
17375                controller.hideTimerModal = timerModal.hide;
17376
17377                timerModal.element.on('hidden.bs.modal', function (e) {
17378                    controller.timer = 0;
17379                    $interval.cancel(controller.timerInterval);
17380                })
17381            }
17382        };
17383    }
17384})();;
17385(function () {
17386    'use strict';
17387
17388    angular
17389        .module('app.directives')
17390        .controller('ScoreboardBasketballSelectPlayerController', ScoreboardBasketballSelectPlayerController);
17391
17392    ScoreboardBasketballSelectPlayerController.$inject = ['$scope'];
17393
17394    function ScoreboardBasketballSelectPlayerController($scope) {
17395        var vm = this;
17396        vm.showPopup = false;
17397        vm.target = null;
17398        vm.teams = $scope.teams;
17399        vm.showStaff = $scope.showStaff;
17400        vm.showFreeThrows = $scope.showFreeThrows;
17401        self.showTechnicalFoulType = $scope.showTechnicalFoulType;
17402        vm.selectedType = null;
17403        vm.selectedItem = null;
17404        vm.selectedTechnicalFoulType = null;
17405        vm.isInFlow = false;
17406        vm.filter = _.filter;        
17407        vm.reverseTeams = $scope.reverseTeams;
17408
17409        sortPlayers(vm.teams);
17410
17411        $scope.$watch('teams', function (teams) {                          
17412            sortPlayers(teams);
17413        }, true)
17414
17415        vm.closePopup = function (e) {
17416            if ($scope.onClose) {
17417                $scope.onClose();
17418
17419                if (e) {
17420                    $scope.$apply();
17421                    e.stopPropagation();
17422                }
17423            };
17424        }
17425
17426        vm.selectPlayer = function (player, type) {                        
17427            vm.selectedType = type;
17428            vm.selectedItem = player;
17429            vm.selectedTechnicalFoulType = null;
17430
17431            if (type == 'staff') {
17432                vm.selectedItem.teamId = player.linkId;
17433            }
17434
17435            if (vm.showTechnicalFoulType && type == 'staff') {
17436                vm.isInFlow = true;
17437                vm.hideSelectPlayerPopup();
17438                vm.showTechnicalFoulTypePopup();
17439            }
17440            else {
17441                if (vm.showFreeThrows) {
17442                    vm.isInFlow = true;
17443                    vm.hideSelectPlayerPopup();
17444                    vm.showFreeThrowsPopup();
17445                }
17446                else if ($scope.onPlayerSelect) {
17447                    $scope.onPlayerSelect(vm.selectedItem, vm.selectedType);
17448                    vm.closePopup();
17449                }
17450            }
17451        }
17452
17453        vm.selectTechnicalFoulType = function (type) {
17454            vm.selectedTechnicalFoulType = type;
17455            vm.isInFlow = true;
17456            vm.hideTechnicalFoulTypePopup();
17457            vm.showFreeThrowsPopup();
17458
17459        }
17460
17461        vm.selectFreeThrows = function (freeThrows) {
17462            if ($scope.onPlayerSelect) {
17463                $scope.onPlayerSelect(vm.selectedItem, vm.selectedType, freeThrows, vm.selectedTechnicalFoulType);
17464                vm.closePopup();
17465            }
17466        }
17467
17468        $scope.$watchGroup(['showPopup'], function (values) {
17469            if (values[0]) {
17470                vm.selectedType = null;
17471                vm.selectedItem = null;
17472                vm.showSelectPlayerPopup();
17473            }
17474            else {
17475                vm.hideSelectPlayerPopup();
17476                vm.hideFreeThrowsPopup();
17477            }
17478            vm.showPopup = values[0];
17479        });
17480
17481        $scope.$watch('showStaff', function (showStaff) {
17482            vm.showStaff = showStaff;
17483        })
17484
17485        $scope.$watch('showFreeThrows', function (showFreeThrows) {
17486            vm.showFreeThrows = showFreeThrows;
17487        })
17488
17489        $scope.$watch('showTechnicalFoulType', function (showTechnicalFoulType) {
17490            vm.showTechnicalFoulType = showTechnicalFoulType;
17491            console.log(showTechnicalFoulType);
17492        })
17493
17494        $scope.$watch('reverseTeams', function (reverseTeams) {
17495            vm.reverseTeams = reverseTeams;
17496        })
17497
17498        function sortPlayers(teams) {
17499            var teams = _.cloneDeep(teams);            
17500
17501            teams.forEach(function (team) {
17502                team.players = _.orderBy(team.players, [function (player) {
17503                    return player.onField ? 1 : 0;
17504                },
17505                function (player) {
17506                    return player && player.number ? _.parseInt(player.number) : Infinity;
17507                }], ['desc', 'asc']);
17508            })
17509                        
17510            vm.teams = teams.sort(function (a, b) {
17511                if (a.id == $scope.visitorTeamId) {
17512                    return -1;
17513                }
17514                else if (b.id == $scope.visitorTeamId) {
17515                    return 1;
17516                }
17517
17518                return 0;                
17519            });
17520
17521        }
17522    }    
17523})();
17524;
17525(function () {
17526    'use strict';
17527
17528    angular
17529        .module('app.directives')
17530        .directive('scoreboardBasketballSelectPlayer', scoreboardBasketballSelectPlayer)
17531
17532    scoreboardBasketballSelectPlayer.$inject = ['ModalService'];
17533
17534    function scoreboardBasketballSelectPlayer(modalService) {
17535        return {
17536            restrict: 'E',            
17537            transclude: true,
17538            scope: {                
17539                widget: '=',
17540                teams: '=',                
17541                target: '=',
17542                visitorTeamId: '=',
17543                reverseTeams: '=',
17544                showPopup: '=',
17545                showStaff: '=',
17546                showTechnicalFoulType: '=',
17547                showFreeThrows: '=',
17548                onClose: '=',
17549                onPlayerSelect: '='
17550            },
17551            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/basketball/popup/scoreboard-basketball-select-player.tpl.html',
17552            controller: 'ScoreboardBasketballSelectPlayerController',
17553            controllerAs: 'scoreboardBasketballSelectPlayer',
17554            link: function (scope, element, attrs, controller) {                             
17555                var modal = modalService.init($('.scoreboard-basketball-select-player', element));
17556                var freeThrowsModal = modalService.init($('.scoreboard-basketball-free-throws-modal', element));
17557                var technicalFoulModal = modalService.init($('.scoreboard-basketball-technical-foul-modal', element));
17558
17559                element.on('$destroy', function () {
17560                    $(document).off('click');
17561                    modal.element.off('hidden.bs.modal');
17562                    freeThrowsModal.element.off('hidden.bs.modal');
17563                });
17564                
17565                controller.showSelectPlayerPopup = modal.show;
17566                controller.hideSelectPlayerPopup = modal.hide;
17567
17568                controller.showFreeThrowsPopup = freeThrowsModal.show;
17569                controller.hideFreeThrowsPopup = freeThrowsModal.hide;
17570
17571                controller.showTechnicalFoulTypePopup = technicalFoulModal.show;
17572                controller.hideTechnicalFoulTypePopup = technicalFoulModal.hide;
17573
17574                var hiddenEvent = function (e) {                    
17575                    if (scope.showPopup && !controller.isInFlow) {                        
17576                        scope.showPopup = false;
17577                        scope.$apply();
17578                    }
17579
17580                    controller.isInFlow = false;
17581                }
17582
17583                modal.element.on('hidden.bs.modal', hiddenEvent)
17584                freeThrowsModal.element.on('hidden.bs.modal', hiddenEvent)
17585                technicalFoulModal.element.on('hidden.bs.modal', hiddenEvent)
17586            }
17587        };
17588    }
17589})();;
17590(function () {
17591    'use strict';
17592
17593    angular
17594        .module('app.directives')
17595        .controller('ScoreboardBasketballBonusWidgetController', ScoreboardBasketballBonusWidgetController);
17596
17597    ScoreboardBasketballBonusWidgetController.$inject = ['$scope'];
17598
17599    function ScoreboardBasketballBonusWidgetController($scope) {
17600        var vm = this;
17601
17602        vm.gameDetails = $scope.gameDetails;        
17603
17604        setTeams();
17605
17606        vm.onBonusBlur = function (teamId) {
17607            if ($scope.onBonusUpdate) {
17608                $scope.onBonusUpdate(teamId);
17609            }
17610        }
17611
17612        $scope.$watch('gameDetails', function (gameDetails) {
17613            vm.gameDetails = gameDetails;
17614
17615            setTeams();
17616        }, true)
17617
17618        function setTeams() {
17619            var visitorTeam = _.find(vm.gameDetails.teamList, { id: vm.gameDetails.visitorTeamId });
17620            var localTeam = _.find(vm.gameDetails.teamList, { id: vm.gameDetails.localTeamId });               
17621
17622            vm.leftTeam = visitorTeam;
17623            vm.rightTeam = localTeam;            
17624
17625            if (vm.gameDetails.reverseTeams) {
17626                vm.leftTeam = localTeam;
17627                vm.rightTeam = visitorTeam;
17628            }
17629        }
17630    }    
17631})();
17632;
17633(function () {
17634    'use strict';
17635
17636    angular
17637        .module('app.directives')
17638        .directive('scoreboardBasketballBonus', scoreboardBasketballBonus)
17639
17640    scoreboardBasketballBonus.$inject = [];
17641
17642    function scoreboardBasketballBonus() {
17643        return {
17644            restrict: 'E',
17645            scope: {                
17646                widget: '=',
17647                gameDetails: '=',
17648                onBonusUpdate: '=',
17649            },
17650            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/basketball/bonus/scoreboard-basketball-bonus.tpl.html',
17651            controller: 'ScoreboardBasketballBonusWidgetController',
17652            controllerAs: 'scoreboardBasketballBonus'
17653        };
17654    }
17655})();;
17656(function () {
17657    'use strict';
17658
17659    angular
17660        .module('app.directives')
17661        .controller('ScoreboardBasketballHistoryWidgetController', ScoreboardBasketballHistoryWidgetController);
17662
17663    ScoreboardBasketballHistoryWidgetController.$inject = ['$scope', '$translate', 'ordinalFilter']
17664
17665    function ScoreboardBasketballHistoryWidgetController($scope, $translate, ordinalFilter) {
17666        var vm = this;
17667        var selectedEvent = null;
17668
17669        vm.gameDetails = $scope.gameDetails;  
17670        vm.useTime = false;
17671
17672        var useTimeParameter = _.get(_.find($scope.seasonParameters, { Code: 'USETIME' }), 'Value');
17673        if (useTimeParameter) {
17674            vm.useTime = useTimeParameter === "1"
17675        }
17676
17677        vm.points = [
17678            { id: '1', name: $translate.instant('widgets.games.scoreboard.basketball.history.freeThrow') },
17679            { id: '2', name: $translate.instant('widgets.games.scoreboard.basketball.history.2pts') },
17680            { id: '3', name: $translate.instant('widgets.games.scoreboard.basketball.history.3pts') }
17681        ]
17682
17683        vm.success = [
17684            { id: 'true', name: $translate.instant('widgets.games.scoreboard.basketball.history.made') },
17685            { id: 'false', name: $translate.instant('widgets.games.scoreboard.basketball.history.missed') },
17686        ]
17687
17688        vm.foulTypes = [
17689            { id: 'personnal', name: $translate.instant('widgets.games.scoreboard.basketball.history.personalFoul') },
17690            { id: 'technical', name: $translate.instant('widgets.games.scoreboard.basketball.history.technicalFoul') },
17691            { id: 'disqualifying', name: $translate.instant('widgets.games.scoreboard.basketball.history.disqualifyingFoul') },
17692            { id: 'unsportsmanlike', name: $translate.instant('widgets.games.scoreboard.basketball.history.unsportsmanlikeFoul') },
17693        ]
17694
17695        vm.reboundTypes = [
17696            { id: 'offensive', name: $translate.instant('widgets.games.scoreboard.basketball.history.offensiveRebound') },
17697            { id: 'defensive', name: $translate.instant('widgets.games.scoreboard.basketball.history.defensiveRebound') },            
17698        ]
17699
17700        vm.freeThrows = [
17701            { id: '0', name: '0' },
17702            { id: '1', name: '1' },
17703            { id: '2', name: '2' },
17704            { id: '3', name: '3' },
17705        ]
17706
17707        vm.updateEvent = function (event) {
17708            var content = event.formatEvent();
17709
17710            if ($scope.onUpdateEvent && !event.hasError()) {
17711                $scope.onUpdateEvent(content);
17712                event.editMode = false;
17713            }
17714
17715        }
17716
17717        vm.clickDeleteEvent = function (event) {
17718            selectedEvent = event;
17719            vm.showConfirmDelete();
17720        }
17721
17722        vm.deleteEvent = function () {
17723            if ($scope.onDeleteEvent) {
17724                $scope.onDeleteEvent(selectedEvent.id)
17725            }
17726            vm.hideConfirmDelete();
17727        }
17728
17729        vm.onTimeKeypress = function (event) {
17730            var newchar = String.fromCharCode(event.charCode || event.keyCode);
17731
17732            if (!newchar.match(/[0-9:]/)) {
17733                event.preventDefault();
17734            }
17735        }
17736
17737        vm.getValue = function (id, list) {                        
17738            return _.get(_.find(list, { id: id }), 'name');
17739        }
17740
17741        vm.getName = function (id, list) {
17742            var player = _.find(list, { id: id });
17743            return `${_.get(player, 'number')}
17743 - ${_.get(player, 'name')}`
17744        }
17745
17746        $scope.$watch('gameDetails', function (gameDetails) {            
17747            vm.gameDetails = gameDetails;
17748
17749            vm.quarters = [];
17750
17751            _.range(vm.gameDetails.periodId).forEach(function (period) {
17752                vm.quarters.push({ id: period + 1, name: `${ordinalFilter(period + 1)} ${$translate.instant('widgets.games.scoreboard.basketball.history.quarter')}` });
17753            })
17754
17755            vm.range = _.range;
17756            vm.teams = {};
17757
17758            vm.gameDetails.teamList.forEach(function (team) {
17759                vm.teams[team.id] = team;
17760                vm.teams[team.id].selectedPlayers = _.filter(vm.teams[team.id].players, { status: 'Selected' });
17761                vm.teams[team.id].selectedStaffs = _.filter(vm.teams[team.id].staffs, { status: 'Selected' });;
17762                vm.teams[team.id].playerCollection = _.keyBy(vm.teams[team.id].selectedPlayers, 'id');
17763                vm.teams[team.id].staffCollection = _.keyBy(vm.teams[team.id].staffs, 'id');
17764            });
17765
17766            vm.events = _.groupBy(
17767                _.map(_.filter(vm.gameDetails.eventList, function (event) { return event.eventtypeid == 14 || event.eventtypeid == 13 || event.eventtypeid == 16 || event.eventtypeid == 18 }),
17768                function (event) {
17769                    var eventDefinition = JSON.parse(event.content);
17770                    if (eventDefinition.type == 'shoot') {
17771                        var shoot = new Shoot(eventDefinition, event.id);
17772                        return shoot;
17773                    }
17774
17775                    if (eventDefinition.type == 'fault') {
17776                        var foul = new Foul(eventDefinition, event.id);
17777                        return foul;
17778                    }
17779
17780                    if (eventDefinition.type == 'rebound') {                        
17781                        var rebound = new Rebound(eventDefinition, event.id);
17782                        return rebound;
17783                    }
17784                    
17785                    if (eventDefinition.type == 'presence') {
17786                        var presence = new Presence(eventDefinition, event.id);
17787                        return presence;
17788                    }
17789
17790                    return null;
17791
17792                    }), 'period');  
17793        })        
17794
17795        function Shoot(_event, eventId) {
17796            var self = this;
17797            angular.extend(self, _event);
17798
17799            self.error = null;
17800            self.id = eventId;
17801
17802            var shooterProperty = _.find(self.properties, { name: 'shooter' });    
17803            
17804            self.team = vm.teams[shooterProperty.teamid];
17805            self.teamId = self.team.id;
17806            self.shooterPlayer = self.team.playerCollection[shooterProperty.id];
17807            self.propertyId = _.get(self.shooterPlayer, 'id');
17808            self.pointsCount = _.get(_.find(self.details, { 'name': 'pointsCount' }), 'value');
17809            self.success = _.get(_.find(self.details, { 'name': 'success' }), 'value');
17810
17811            self.hasError = function () {
17812                if (!self.propertyId) {
17813                    self.error = { type: 'player' }
17814                    return true;
17815                }
17816
17817                if (!vm.teams[self.teamId].playerCollection[self.propertyId]) {
17818                    self.error = { type: 'player' }
17819                    return true;
17820                }
17821
17822                self.error = null;
17823                return false;
17824            }
17825                                    
17826            self.formatEvent = function () {
17827                var eventContent = {};
17828                eventContent.id = self.id;
17829                eventContent.type = 'shoot';
17830                eventContent.period = self.period;
17831                eventContent.time = self.time;
17832                     
17833                eventContent.details = [];
17834                eventContent.details.push({ name: 'success', value: self.success });
17835                eventContent.details.push({ name: 'pointsCount', value: self.pointsCount });
17836                     
17837                eventContent.properties = [];
17838                eventContent.properties.push({ id: self.propertyId, name: 'shooter', teamid: self.teamId });
17839
17840                return eventContent;
17841            }
17842
17843            self.timeSetter = function (time) {
17844                if (angular.isDefined(time)) {
17845                    if (time.match(/^\d$/)) {
17846                        time = `0${time}:00`;
17847                    }
17848
17849                    if (time.match(/^\d{4}$/)) {
17850                        time = time.slice(0, 2) + ':' + time.slice(2);
17851                    }
17852
17853                    if (time.match(/^\d{2}:\d{2}$/)) {
17854                        self.time = `00:${time}`;
17855                    }
17856                }
17857
17858                return self.time.slice(-5);
17859            }
17860
17861            self.editMode = false;
17862        } 
17863
17864        function Foul(_event, eventId) {
17865            var self = this;
17866            angular.extend(self, _event);
17867
17868            self.id = eventId;
17869            self.error = null;
17870
17871            var playerProperty = _.find(self.properties, { name: 'player' });
17872            var staffProperty = _.find(self.properties, { name: 'staff' });
17873
17874            var teamId = playerProperty ? playerProperty.teamid : staffProperty.teamid;
17875
17876            self.isPlayer = !!playerProperty;
17877
17878            self.player = null;
17879            self.staff = null;
17880            self.propertyId = null;
17881
17882            self.team = vm.teams[teamId];            
17883            self.teamId = self.team.id;
17884            
17885            if (self.isPlayer) {
17886                self.player = self.team.playerCollection[playerProperty.id]
17887                self.propertyId = _.get(self.player, 'id');
17888            }
17889            else {
17890                self.staff = self.team.staffCollection[staffProperty.id];
17891                self.propertyId = _.get(self.staff, 'id');
17892            }
17893
17894            self.foulType = _.get(_.find(self.details, { 'name': 'type' }), 'value');
17895            self.freeThrows = _.get(_.find(self.details, { 'name': 'freeThrows' }), 'value');   
17896
17897            self.timeSetter = function (time) {
17898                if (angular.isDefined(time)) {                    
17899                    if (time.match(/^\d$/)) {
17900                        time = `0${time}:00`;
17901                    }
17902
17903                    if (time.match(/^\d{4}$/)) {
17904                        time = time.slice(0, 2) + ':' + time.slice(2);
17905                    }
17906
17907                    if (time.match(/^\d{2}:\d{2}$/)) {
17908                        self.time = `00:${time}`;                        
17909                    }
17910                }
17911
17912                return self.time.slice(-5);
17913            }
17914
17915            self.hasError = function () {
17916                if (!self.propertyId) {
17917                    self.error = { type: 'player' }
17918                    return true;
17919                }
17920
17921                var collection = self.isPlayer ? vm.teams[self.teamId].playerCollection : vm.teams[self.teamId].staffCollection;
17922
17923                if (!collection[self.propertyId]) {
17924                    self.error = { type: 'player' }
17925                    return true;
17926                }
17927
17928                self.error = null;
17929                return false;
17930            }
17931            
17932            self.formatEvent = function () {
17933                var eventContent = {};
17934                eventContent.id = self.id;
17935                eventContent.type = 'fault';
17936                eventContent.period = self.period;
17937                eventContent.time = self.time;
17938
17939                eventContent.details = [];
17940                eventContent.details.push({ name: 'type', value: self.foulType });
17941                eventContent.details.push({ name: 'freeThrows', value: self.freeThrows });
17942
17943                eventContent.properties = [];
17944                eventContent.properties.push({ id: self.propertyId, name: self.isPlayer ? 'player' : 'staff', teamid: self.teamId });
17945
17946                return eventContent;
17947            }
17948            
17949            self.editMode = false;
17950        } 
17951
17952        function Rebound(_event, eventId) {
17953            var self = this;
17954            angular.extend(self, _event);
17955
17956            self.error = null;
17957            self.id = eventId;
17958
17959            var shooterProperty = _.find(self.properties, { name: 'shooter' });
17960
17961            self.team = vm.teams[shooterProperty.teamid];
17962            self.teamId = self.team.id;
17963            self.shooterPlayer = self.team.playerCollection[shooterProperty.id];
17964            self.propertyId = _.get(self.shooterPlayer, 'id');
17965            self.reboundType = _.get(_.find(self.details, { 'name': 'type' }), 'value');            
17966
17967            self.hasError = function () {
17968                if (!self.propertyId) {
17969                    self.error = { type: 'player' }
17970                    return true;
17971                }
17972
17973                if (!vm.teams[self.teamId].playerCollection[self.propertyId]) {
17974                    self.error = { type: 'player' }
17975                    return true;
17976                }
17977
17978                self.error = null;
17979                return false;
17980            }
17981
17982            self.formatEvent = function () {
17983                var eventContent = {};
17984                eventContent.id = self.id;
17985                eventContent.type = 'rebound';
17986                eventContent.period = self.period;
17987                eventContent.time = self.time;
17988
17989                eventContent.details = [];
17990                eventContent.details.push({ name: 'type', value: self.reboundType });                
17991
17992                eventContent.properties = [];
17993                eventContent.properties.push({ id: self.propertyId, name: 'shooter', teamid: self.teamId });
17994
17995                return eventContent;
17996            }
17997
17998            self.timeSetter = function (time) {
17999                if (angular.isDefined(time)) {
18000                    if (time.match(/^\d$/)) {
18001                        time = `0${time}:00`;
18002                    }
18003
18004                    if (time.match(/^\d{4}$/)) {
18005                        time = time.slice(0, 2) + ':' + time.slice(2);
18006                    }
18007
18008                    if (time.match(/^\d{2}:\d{2}$/)) {
18009                        self.time = `00:${time}`;
18010                    }
18011                }
18012
18013                return self.time.slice(-5);
18014            }
18015
18016            self.editMode = false;
18017        } 
18018
18019
18020        function Presence(_event, eventId) {
18021            var self = this;
18022            angular.extend(self, _event);
18023
18024            self.error = null;
18025            self.id = eventId;
18026
18027            var playerProperty = _.find(self.properties, { name: 'player' });
18028
18029            self.team = vm.teams[playerProperty.teamid];
18030            self.teamId = self.team.id;
18031            self.player = self.team.playerCollection[playerProperty.id];
18032            self.propertyId = _.get(self.player, 'id');            
18033
18034            self.hasError = function () {
18035                if (!self.propertyId) {
18036                    self.error = { type: 'player' }
18037                    return true;
18038                }
18039
18040                if (!vm.teams[self.teamId].playerCollection[self.propertyId]) {
18041                    self.error = { type: 'player' }
18042                    return true;
18043                }
18044
18045                self.error = null;
18046                return false;
18047            }
18048
18049            self.formatEvent = function () {
18050                var eventContent = {};
18051                eventContent.id = self.id;
18052                eventContent.type = 'presence';
18053                eventContent.period = self.period;
18054                eventContent.time = self.time;
18055
18056                eventContent.properties = [];
18057                eventContent.properties.push({ id: self.propertyId, name: 'player', teamid: self.teamId });
18058
18059                return eventContent;
18060            }
18061
18062            self.timeSetter = function (time) {
18063                if (angular.isDefined(time)) {
18064                    if (time.match(/^\d$/)) {
18065                        time = `0${time}:00`;
18066                    }
18067
18068                    if (time.match(/^\d{4}$/)) {
18069                        time = time.slice(0, 2) + ':' + time.slice(2);
18070                    }
18071
18072                    if (time.match(/^\d{2}:\d{2}$/)) {
18073                        self.time = `00:${time}`;
18074                    }
18075                }
18076
18077                return self.time.slice(-5);
18078            }
18079
18080            self.editMode = false;
18081        } 
18082    }    
18083})();
18084;
18085(function () {
18086    'use strict';
18087
18088    angular
18089        .module('app.directives')
18090        .directive('scoreboardBasketballHistory', scoreboardBasketballHistory)
18091
18092    scoreboardBasketballHistory.$inject = ['ModalService'];
18093
18094    function scoreboardBasketballHistory(modalService) {
18095        return {
18096            restrict: 'E',
18097            scope: {                                
18098                gameDetails: '=',                
18099                onUpdateEvent: '=',
18100                onDeleteEvent: '=',
18101                seasonParameters: '='
18102            },
18103            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/basketball/history/scoreboard-basketball-history.tpl.html',
18104            controller: 'ScoreboardBasketballHistoryWidgetController',
18105            controllerAs: 'scoreboardBasketballHistory',
18106            link: function ($scope, element, attrs, controller) {
18107                var confirmDeleteModal = modalService.init($("#confirm-delete-event", element));
18108
18109                element.on('$destroy', function () {
18110                    $(document).off('click');
18111                })
18112
18113                controller.showConfirmDelete = confirmDeleteModal.show;
18114                controller.hideConfirmDelete = confirmDeleteModal.hide;
18115            }
18116        };
18117    }
18118})();;
18119(function () {
18120    'use strict';
18121
18122    angular
18123        .module('app.directives')
18124        .controller('ScoreboardBasketballNoteWidgetController', ScoreboardBasketballNoteWidgetController);
18125
18126    ScoreboardBasketballNoteWidgetController.$inject = ['$scope'];
18127
18128    function ScoreboardBasketballNoteWidgetController($scope) {
18129        var vm = this;        
18130
18131        vm.gameDetails = $scope.gameDetails;        
18132
18133        var cancelNote = _.get(_.find(vm.gameDetails.properties, { name: 'Comment' }), 'value');
18134        vm.note = _.get(_.find(vm.gameDetails.properties, { name: 'Comment' }), 'value');
18135
18136        vm.editMode = false;
18137
18138        vm.saveNote = function () {
18139            vm.editMode = false;
18140            if ($scope.onUpdateNote) {
18141                $scope.onUpdateNote(vm.note);
18142                cancelNote = vm.note;
18143            }            
18144        }
18145
18146        vm.cancelNote = function () {
18147            vm.editMode = false;
18148            vm.note = cancelNote;
18149        }
18150    }    
18151})();
18152;
18153(function () {
18154    'use strict';
18155
18156    angular
18157        .module('app.directives')
18158        .directive('scoreboardBasketballNote', scoreboardBasketballNote)
18159
18160    scoreboardBasketballNote.$inject = [];
18161
18162    function scoreboardBasketballNote() {
18163        return {
18164            restrict: 'E',
18165            scope: {                
18166                widget: '=',
18167                gameDetails: '=',
18168                onUpdateNote: '=',
18169            },
18170            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/scoreboard/basketball/note/scoreboard-basketball-note.tpl.html',
18171            controller: 'ScoreboardBasketballNoteWidgetController',
18172            controllerAs: 'scoreboardBasketballNote'
18173        };
18174    }
18175})();;
18176(function () {
18177    'use strict';
18178
18179    angular
18180        .module('app.directives')
18181        .controller('StarsOfTheGameWidgetController', StarsOfTheGameWidgetController);
18182
18183    StarsOfTheGameWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$translate', 'UrlService', 'WebsiteEditorService'];
18184
18185    function StarsOfTheGameWidgetController($rootScope, $scope, $localStorage, $translate, urlService, websiteEditorService) {
18186        var vm = this;
18187        vm.url = urlService;
18188        vm.background = { image: '', position: '' };
18189
18190        vm = Object.assign(vm, angular.fromJson(__gameDetails__
18191            .replace(/[\n\r]+/g, ' ')));
18192        vm.widget = angular.fromJson(widgets[$scope.widget]);
18193        vm.starList = _.orderBy(vm.starList, 'typeStarId', 'asc');
18194        vm.threeStars = _.filter(vm.starList, function (star) { return star.typeStarId <= 3 });
18195        vm.playersOfTheGame = _.filter(vm.starList, function (star) { return star.typeStarId > 3 });
18196
18197        // TODO Get parameter of the widget....
18198        var widgetDefinition = angular.fromJson(widgets[$scope.widget]);        
18199
18200        vm.getStars = function(nbStars) {
18201            return new Array(nbStars);
18202        };
18203
18204        // Set view model parameters.
18205        for (var parameter in vm.widget.parameters) {
18206            switch (vm.widget.parameters[parameter].id) {
18207                case 'title':
18208                    vm.title = vm.widget.parameters[parameter].value;
18209                    break;
18210
18211                case 'showTitle':
18212                    vm.showTitle = vm.widget.parameters[parameter].value === 'true';
18213                    break;
18214
18215                case 'showPlayerAvatars':
18216                    vm.showPlayerAvatars = vm.widget.parameters[parameter].value === 'true';
18217                    break;
18218                
18219                case 'widgetTransparency':
18220                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
18221                    break;
18222
18223                case 'backgroundColor':
18224                    vm.backgroundColor = vm.widget.parameters[parameter].value;
18225                    break;
18226
18227                case 'border':
18228                    vm.border = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
18229                    break;
18230
18231                case 'backgroundImage':
18232                    vm.background.image = vm.widget.parameters[parameter].value;
18233                    break;
18234
18235                case 'backgroundImagePosition':
18236                    vm.background.position = vm.widget.parameters[parameter].value;
18237                    break;
18238            }
18239        }
18240
18241        vm.getStyle = function () {
18242            var style = {};
18243            if (!vm.widgetTransparency) {
18244                style['background-color'] = vm.backgroundColor;
18245                style['border-color'] = vm.border.color;
18246
18247                if (vm.background && vm.background.image) {
18248                    style['background-image'] = `url("${vm.background.image}")`;
18249                    style['background-repeat'] = 'no-repeat';
18250                    style['background-position'] = vm.background.position || 'center center';
18251                }
18252
18253            }
18254
18255            style['border-width'] = `${vm.border.width}px`;
18256            style['border-color'] = vm.border.color;
18257            style['border-radius'] = `${vm.border.radius}px`;
18258
18259            return style;
18260        }
18261
18262        vm.widgetStyle = vm.getStyle();
18263
18264
18265        // Triggered when parameters are changed.
18266        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
18267            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
18268                .then(function (response) {
18269                    // Save parameters.
18270
18271                    for (var parameter in vm.widget.parameters) {
18272                        switch (vm.widget.parameters[parameter].id) {
18273                            case 'title':
18274                                vm.widget.parameters[parameter].value = data.title;
18275                                vm.title = data.title;
18276                                break;
18277
18278                            case 'showTitle':
18279                                vm.widget.parameters[parameter].value = data.showTitle.toString();
18280                                vm.showTitle = data.showTitle;
18281                                break;
18282
18283                            case 'showPlayerAvatars':
18284                                vm.widget.parameters[parameter].value = data.showPlayerAvatars.toString();
18285                                vm.showPlayerAvatars = data.showPlayerAvatars;
18286                                break;
18287
18288                            case 'widgetTransparency':
18289                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
18290                                vm.widgetTransparency = data.widgetTransparency;
18291                                break;
18292
18293                            case 'backgroundColor':
18294                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
18295                                vm.backgroundColor = data.backgroundColor;
18296                                break;
18297
18298                            case 'border':
18299                                vm.widget.parameters[parameter].value = data.border;
18300                                vm.border = angular.fromJson(data.border.replace(/\'/g, '"'));
18301                                break;
18302
18303                            case 'backgroundImage':
18304                                vm.widget.parameters[parameter].value = data.backgroundImage.toString();
18305                                vm.background.image = data.backgroundImage;
18306                                break;
18307
18308                            case 'backgroundImagePosition':
18309                                vm.widget.parameters[parameter].value = data.backgroundImagePosition.toString();
18310                                vm.background.position = data.backgroundImagePosition;
18311                                break;
18312
18313                        }
18314                    }
18315
18316                    vm.widgetStyle = vm.getStyle();
18317
18318                    // Update the variable.
18319                    widgets[$scope.widget] = angular.toJson(vm.widget);
18320                })
18321                .catch(function (error) {
18322                    bugsnag.notify(error);
18323                });
18324        });
18325
18326        $scope.$on('$destroy', listener);
18327    }    
18328})();
18329;
18330(function () {
18331    'use strict';
18332
18333    angular
18334        .module('app.directives')
18335        .directive('starsOfTheGame', starsOfTheGame)
18336
18337    starsOfTheGame.$inject = [];
18338
18339    function starsOfTheGame() {
18340        return {
18341            restrict: 'E',
18342            scope: {                
18343                widget: '='
18344            },
18345            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/stars-of-the-game/stars-of-the-game.tpl.html',
18346            controller: 'StarsOfTheGameWidgetController',
18347            controllerAs: 'starsOfTheGame'
18348        };
18349    }
18350})();;
18351(function () {
18352    'use strict';
18353
18354    angular
18355        .module('app.directives')
18356        .controller('TeamMatchupWidgetController', TeamMatchupWidgetController);
18357
18358    TeamMatchupWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$translate', 'StatisticService', 'WebsiteEditorService'];
18359
18360    function TeamMatchupWidgetController($rootScope, $scope, $localStorage, $translate, statisticService, websiteEditorService) {
18361        var vm = this;
18362
18363        //State variables
18364        vm.widget = angular.fromJson(widgets[$scope.widget]);      
18365        vm = Object.assign(vm, angular.fromJson(__gameDetails__
18366                                                    .replace(/[\n\r]+/g, ' ')));        
18367        vm.periods = [];
18368        vm.sportId = $localStorage.solution.sportId;
18369        vm.visitorBottom = false;
18370
18371        //State functions
18372        vm.getFormatTime = function() {
18373            switch (vm.statusId) {
18374                case 2:
18375                    //var periodDuration = parseInt(_.find($localStorage.season.parameters, function(parameter) {
18376                    //        if ((vm.periodId >= 1) && (vm.periodId <= 4)) {
18377                    //            return parameter.Code === `PERIOD${vm.periodId}`;
18378                    //        } else if ((vm.periodId >= 5) && (vm.periodId <= 8)) {
18379                    //            return parameter.Code === `OVERTIME${vm.periodId}`;
18380                    //        }                               
18381                    //    }).Value);
18382
18383                    return moment(new Date(/*moment(`00:${periodDuration}:00`, 'hh:mm:ss') - */moment(vm.time, 'hh:mm:ss')), 'hh:mm:ss')
18384                            .format('mm:ss'); //moment(vm.time, 'hh:mm:ss').format('LTS').substr(3, 5);
18385            }
18386        };        
18387        
18388        //On component mount
18389        initializeSummary();
18390        for (var parameter in vm.widget.parameters) {
18391            switch (vm.widget.parameters[parameter].id) {
18392                case 'visitorBottom':
18393                    vm.visitorBottom = vm.widget.parameters[parameter].value === 'true';
18394                    break;
18395            }
18396        }
18397
18398        // Listener
18399        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
18400            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
18401                .then(function (response) {
18402                    for (var parameter in vm.widget.parameters) {
18403                        switch (vm.widget.parameters[parameter].id) {
18404                            case 'visitorBottom':
18405                                vm.widget.parameters[parameter].value = data.visitorBottom.toString();
18406                                vm.visitorBottom = data.visitorBottom;
18407                                break;
18408                        }
18409                    }
18410                    widgets[$scope.widget] = angular.toJson(vm.widget);
18411                })
18412                .catch(function (error) {
18413                    bugsnag.notify(error);
18414                });
18415        });
18416
18417        $scope.$on('$destroy', listener);
18418
18419        //Functions
18420        function initializeSummary() {
18421            var periods = [];
18422
18423            var numberOfPeriods = 3;
18424
18425            if ($localStorage.season.parameters && $localStorage.season.parameters.length > 0) {
18426                numberOfPeriods = parseInt(_.find($localStorage.season.parameters, function (parameter) {
18427                    return parameter.Code === 'PERIODNUMBER'
18428                }).Value);
18429            }
18430
18431            if ($localStorage.solution.sportId == 2 || $localStorage.solution.sportId == 7) {
18432                numberOfPeriods = Math.max(numberOfPeriods, vm.periodId);
18433
18434                for (var i = 1; i <= numberOfPeriods; i++) {
18435                    periods.push({
18436                        number: i,
18437                        regular: true
18438                    });
18439                }
18440            }
18441            else {
18442                for (var i = 1; i <= numberOfPeriods; i++) {
18443                    periods.push({
18444                        number: i,
18445                        regular: true
18446                    });
18447                }
18448
18449                if (vm.periodId >= 5 && vm.periodId <= 8) {
18450                    for (i = 5; i <= vm.periodId; i++) {
18451                        periods.push({
18452                            number: i,
18453                            overtime: true
18454                        });
18455                    }
18456                }
18457
18458                if (vm.periodId === 9) { // Shootout
18459                    periods.push({
18460                        number: 9,
18461                        shootout: true
18462                    });
18463                }
18464            }
18465
18466            vm.teams = {
18467                visitor: {
18468                    name: vm.visitorTeamName,
18469                    logo: vm.visitorTeamAvatar,
18470                    abbreviation: _.find(vm.teamList, function(team) {
18471                        return team.id === vm.visitorTeamId;
18472                    }).abbreviation,
18473                    periods: getPeriodEvents(periods, vm.visitorTeamId)
18474                },
18475                local: {
18476                    name: vm.localTeamName,
18477                    logo: vm.localTeamAvatar,
18478                    abbreviation: _.find(vm.teamList, function(team) {
18479                        return team.id === vm.localTeamId;
18480                    }).abbreviation,
18481                    periods: getPeriodEvents(periods, vm.localTeamId)
18482                }
18483            };
18484
18485            // Get total goals / total shoutout goals.
18486            vm.teams.visitor.total = getTotalGoals(vm.teams.visitor, true);
18487            vm.teams.visitor.shootout = getTotalShootoutGoals(vm.teams.visitor);
18488            
18489            vm.teams.local.total = getTotalGoals(vm.teams.local, false);
18490            vm.teams.local.shootout = getTotalShootoutGoals(vm.teams.local);
18491
18492            if (vm.periodId === 9) {// Calculate the shootout +1 goal.               
18493                vm.teams.visitor.total += vm.teams.visitor.shootout > vm.teams.local.shootout ? 1 : 0;
18494                vm.teams.local.total += vm.teams.local.shootout > vm.teams.visitor.shootout ? 1 : 0;            
18495            }
18496
18497            vm.periods = periods;
18498        }
18499
18500        function getPeriodEvents(periods, teamId) {            
18501            var teamPeriods = angular.fromJson(angular.toJson(periods));
18502
18503            for (var period in teamPeriods) {
18504                var periodGoals = 0;
18505                var events = _.filter(vm.eventList, function (event) {                    
18506                    if (event.periodId == teamPeriods[period].number && event.teamId == teamId) {
18507                        if (event.eventTypeId == statisticService.getSportTeamStatsByType('scorePerio
18507d', vm.sportId)) {
18508                            periodGoals += event.value;
18509                        }
18510
18511                        return (event.eventTypeId === 1 || isShootOutGoal(event));                            
18512                    }
18513
18514                    return false;
18515                });
18516
18517                if (teamPeriods[period].shootout) {
18518                    var count = (_.filter(vm.eventList, function (event) {
18519                        if (event.periodId == teamPeriods[period].number && event.teamId == teamId) {
18520                            return event.eventTypeId === 6;
18521                        }
18522
18523                        return false;
18524                    })).length;
18525                    teamPeriods[period].count = count;
18526                    
18527	            }
18528
18529                teamPeriods[period].goals = events.length + periodGoals;
18530            }
18531    
18532            return teamPeriods
18533        }
18534
18535        function isShootOutGoal(event) {
18536            if (event.eventTypeId === 6) { // Shootout
18537
18538                if (vm.sportId == 1) {
18539                    return event.qualifier === 257;
18540                }
18541                else {
18542                    var goalStatistic = _.find(event.statList, function (statistic) {
18543                        return statistic.statTypeId === 12; // Shootout goal
18544                    });
18545
18546                    if (goalStatistic) {
18547                        return goalStatistic.value === 1;
18548                    } else {
18549                        return true;
18550                    }
18551				}
18552            }
18553
18554            return false;
18555        }
18556
18557        function getTotalGoals(team, isVisitor) {     
18558            if ($localStorage.solution.sportId === 7) {
18559                if (isVisitor) {
18560                    return vm.visitorResult;
18561                }
18562                else {
18563                    return vm.localResult;
18564                }
18565            }
18566
18567            return _.sumBy(team.periods, function(period) {
18568                return period.number != 9 ? period.goals : 0;
18569            });
18570        }
18571
18572        function getTotalShootoutGoals(team) {
18573            return _.sumBy(team.periods, function(period) {
18574                return period.number === 9 ? period.goals : 0;
18575            });
18576        }
18577    }    
18578})();
18579;
18580(function () {
18581    'use strict';
18582
18583    angular
18584        .module('app.directives')
18585        .directive('teamMatchup', teamMatchup)
18586
18587    teamMatchup.$inject = [];
18588
18589    function teamMatchup() {
18590        return {
18591            restrict: 'E',
18592            scope: {                
18593                widget: '='
18594            },
18595            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/team-matchup/team-matchup.tpl.html',
18596            controller: 'TeamMatchupWidgetController',
18597            controllerAs: 'teamMatchup'
18598        };
18599    }
18600})();;
18601(function () {
18602    'use strict';
18603
18604    angular
18605        .module('app.directives')
18606        .controller('GameScoreWidgetController', GameScoreWidgetController);
18607
18608    GameScoreWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$translate', 'StatisticService', 'WebsiteEditorService'];
18609
18610    function GameScoreWidgetController($rootScope, $scope, $localStorage, $translate, statisticService, websiteEditorService) {
18611        var vm = this;
18612
18613        vm = Object.assign(vm, angular.fromJson(__gameDetails__.replace(/[\n\r]+/g, ' ')));
18614        vm.widget = angular.fromJson(widgets[$scope.widget]);
18615        vm.periods = [];
18616        vm.sportId = $localStorage.solution.sportId;
18617        vm.visitorBottom = false;
18618
18619        for (var parameter in vm.widget.parameters) {
18620            switch (vm.widget.parameters[parameter].id) {
18621                case 'visitorBottom':
18622                    vm.visitorBottom = vm.widget.parameters[parameter].value === 'true';
18623                    break;
18624            }
18625        }
18626
18627        initializeSummary();
18628
18629        // Listener
18630        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
18631            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
18632                .then(function (response) {
18633                    for (var parameter in vm.widget.parameters) {
18634                        switch (vm.widget.parameters[parameter].id) {
18635                            case 'visitorBottom':
18636                                vm.widget.parameters[parameter].value = data.visitorBottom.toString();
18637                                vm.visitorBottom = data.visitorBottom;
18638                                break;
18639                        }
18640                    }
18641                    widgets[$scope.widget] = angular.toJson(vm.widget);
18642                    initializeSummary();
18643                })
18644                .catch(function (error) {
18645                    bugsnag.notify(error);
18646                });
18647        });
18648
18649        $scope.$on('$destroy', listener);
18650
18651        vm.getFormatTime = function () {
18652            switch (vm.statusId) {
18653                case 2:
18654                    var periodDuration = parseInt(_.find($localStorage.season.parameters, function (parameter) {
18655                        if ((vm.periodId >= 1) && (vm.periodId <= 4)) {
18656                            return parameter.Code === `PERIOD${vm.periodId}`;
18657                        } else if ((vm.periodId >= 5) && (vm.periodId <= 8)) {
18658                            return parameter.Code === `OVERTIME${vm.periodId}`;
18659                        }
18660                    }).Value);
18661
18662                    return moment(new Date(/*moment(`00:${periodDuration}:00`, 'hh:mm:ss') - */moment(vm.time, 'hh:mm:ss')), 'hh:mm:ss')
18663                        .format('mm:ss'); //moment(vm.time, 'hh:mm:ss').format('LTS').substr(3, 5);
18664            }
18665        };
18666
18667        vm.getFormatDate = function () {
18668            if (!vm.date) {
18669                return '';
18670            }
18671
18672            if (vm.startTime) {
18673                var dateString = vm.date.split('T')[0];
18674                date = moment(dateString + 'T' + vm.startTime);
18675
18676                return date.format($translate.instant('directives.widgets.games.gameScore.labels.datetimeformat'));
18677            }
18678            else {
18679                var date = moment(vm.date);
18680                return date.format($translate.instant('directives.widgets.games.gameScore.labels.dateformat'));
18681            }
18682        }
18683
18684        function initializeSummary() {
18685            var periods = [];
18686
18687            var numberOfPeriods = 3;
18688
18689            if ($localStorage.season.parameters && $localStorage.season.parameters.length > 0) {
18690                numberOfPeriods = parseInt(_.find($localStorage.season.parameters, function (parameter) {
18691                    return parameter.Code === 'PERIODNUMBER'
18692                }).Value);
18693            }
18694
18695            for (var i = 1; i <= numberOfPeriods; i++) {
18696                periods.push({
18697                    number: i,
18698                    regular: true
18699                });
18700            }
18701
18702            if (vm.periodId >= 5 && vm.periodId <= 8) {
18703                for (i = 5; i <= vm.periodId; i++) {
18704                    periods.push({
18705                        number: i,
18706                        overtime: true
18707                    });
18708                }
18709            }
18710
18711            if (vm.periodId === 9) { // Shootout
18712                periods.push({
18713                    number: 9,
18714                    shootout: true
18715                });
18716            }
18717
18718            const local = {
18719                name: vm.localTeamName,
18720                logo: vm.localTeamAvatar,
18721                abbreviation: _.find(vm.teamList, function (team) {
18722                    return team.id === vm.localTeamId;
18723                }).abbreviation,
18724                score: vm.localResult
18725            };
18726
18727            const visitor = {
18728                name: vm.visitorTeamName,
18729                logo: vm.visitorTeamAvatar,
18730                abbreviation: _.find(vm.teamList, function (team) {
18731                    return team.id === vm.visitorTeamId;
18732                }).abbreviation,
18733                score: vm.visitorResult
18734            }
18735
18736            if (vm.visitorBottom) {
18737                vm.teams = [local, visitor];
18738            } else {
18739                vm.teams = [visitor, local];
18740            }
18741
18742        }
18743
18744    }
18745})();
18746;
18747(function () {
18748    'use strict';
18749
18750    angular
18751        .module('app.directives')
18752        .directive('gameScore', gameScore)
18753
18754    gameScore.$inject = [];
18755
18756    function gameScore() {
18757        return {
18758            restrict: 'E',
18759            scope: {                
18760                widget: '='
18761            },
18762            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/game-score/game-score.tpl.html',
18763            controller: 'GameScoreWidgetController',
18764            controllerAs: 'gameScore'
18765        };
18766    }
18767})();;
18768(function () {
18769    'use strict';
18770
18771    angular
18772        .module('app.directives')
18773        .controller('GameNoteWidgetController', GameNoteWidgetController);
18774
18775    GameNoteWidgetController.$inject = ['$rootScope', '$scope', 'WebsiteEditorService'];
18776
18777    function GameNoteWidgetController($rootScope, $scope, websiteEditorService) {
18778        var vm = this;
18779
18780        vm = Object.assign(vm, angular.fromJson(__gameDetails__.replace(/[\n\r]+/g, ' ')));        
18781        vm.widget = angular.fromJson(widgets[$scope.widget]);
18782        console.log(vm.widget);
18783        vm.note = _.get(_.find(vm.properties, { name: 'Comment' }), 'value');
18784
18785        // Set view model parameters.
18786        for (var parameter in vm.widget.parameters) {
18787            switch (vm.widget.parameters[parameter].id) {
18788                case 'title':
18789                    vm.title = vm.widget.parameters[parameter].value;
18790                    break;
18791
18792                case 'showTitle':
18793                    vm.showTitle = vm.widget.parameters[parameter].value === 'true';
18794                    break;
18795
18796                case 'widgetTransparency':
18797                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
18798                    break;
18799
18800                case 'backgroundColor':
18801                    vm.backgroundColor = vm.widget.parameters[parameter].value;
18802                    break;
18803                case 'titleColor':
18804                    vm.titleColor = vm.widget.parameters[parameter].value;
18805                    break;
18806                case 'border':
18807                    vm.border = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
18808                    break;
18809            }
18810        }
18811
18812        vm.getStyle = function () {
18813            var style = {};
18814            if (!vm.widgetTransparency) {
18815                style['background-color'] = vm.backgroundColor;
18816                style['border-color'] = vm.border.color;
18817            }
18818
18819            style['border-width'] = `${vm.border.width}px`;
18820            style['border-color'] = vm.border.color;
18821            style['border-radius'] = `${vm.border.radius}px`;
18822
18823            return style;
18824        }
18825
18826        vm.getTitleStyle = function () {
18827            var style = {};
18828
18829            style['color'] = `${vm.titleColor}`;
18830
18831            return style;
18832        }
18833
18834        // Triggered when parameters are changed.
18835        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
18836            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
18837                .then(function (response) {
18838                    // Save parameters.
18839
18840                    for (var parameter in vm.widget.parameters) {
18841                        switch (vm.widget.parameters[parameter].id) {
18842                            case 'title':
18843                                vm.widget.parameters[parameter].value = data.title;
18844                                vm.title = data.title;
18845                                break;  
18846
18847                            case 'showTitle':
18848                                vm.widget.parameters[parameter].value = data.showTitle.toString();
18849                                vm.showTitle = data.showTitle;
18850                                break;
18851
18852                            case 'widgetTransparency':
18853                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
18854                                vm.widgetTransparency = data.widgetTransparency;
18855                                break;
18856
18857                            case 'backgroundColor':
18858                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
18859                                vm.backgroundColor = data.backgroundColor;
18860                                break;
18861                            case 'titleColor':
18862                                vm.widget.parameters[parameter].value = data.titleColor.toString();
18863                                vm.titleColor = data.titleColor;
18864                                break;
18865                            case 'border':
18866                                vm.widget.parameters[parameter].value = data.border;
18867                                vm.border = angular.fromJson(data.border.replace(/\'/g, '"'));
18868                        }
18869                    }
18870
18871                    // Update the variable.
18872                    widgets[$scope.widget] = angular.toJson(vm.widget);
18873                })
18874                .catch(function (error) {
18875                    bugsnag.notify(error);
18876                });
18877        });
18878
18879        var noteListener = $rootScope.$on(`onNoteChange-${vm.id}`, function (event, note) {
18880            vm.note = note;
18881        })
18882
18883        $scope.$on('$destroy', listener);
18884        $scope.$on('$destroy', noteListener);
18885    }
18886})();
18887;
18888(function () {
18889    'use strict';
18890
18891    angular
18892        .module('app.directives')
18893        .directive('gameNote', gameNote)
18894
18895    gameNote.$inject = [];
18896
18897    function gameNote() {
18898        return {
18899            restrict: 'E',
18900            scope: {                
18901                widget: '='
18902            },
18903            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/games/game-note/game-note.tpl.html',
18904            controller: 'GameNoteWidgetController',
18905            controllerAs: 'gameNote'
18906        };
18907    }
18908})();;
18909(function () {
18910    'use strict';
18911
18912    angular
18913        .module('app.directives')
18914        .controller('GameStatusWidgetController', GameStatusWidgetController);
18915
18916    GameStatusWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$timeout', '$translate', '$filter', 'ScoreboardBaseballService', 'FacilityService', 'GoogleMapService', 'SignalrService'];
18917
18918    function GameStatusWidgetController($rootScope, $scope, $localStorage, $timeout, $translate, $filter, scoreboardBaseballService, facilityService, googleMapService, signalrService) {
18919        var vm = this;
18920        vm.widget = angular.fromJson(widgets[$scope.widget])
18921        vm.isPair = true;
18922        vm.isMobile = false;
18923
18924        vm.clickFacility = function () {
18925            var url = googleMapService.getMapSearchUrl(vm.facility[0].facilityAddress);
18926            window.open(url, "_blank");
18927        }
18928        vm = Object.assign(vm, angular.fromJson(__gameDetails__
18929            .replace(/[\n\r]+/g, ' ')));
18930
18931        var signalrConnection = signalrService.getConnection(signalrService.GROUPS.BaseballGameUpdate(vm.id));
18932
18933        signalrConnection.on(signalrService.EVENTS.BaseballScoreboardUpdate, function (response) {
18934            var gameUpdated = angular.fromJson(response);
18935
18936            if (gameUpdated.gameId == vm.id) {
18937                vm.response = gameUpdated.score;
18938                vm.hasGame = vm.response && true;                
18939                $scope.$apply();                
18940            }
18941        });
18942
18943        vm.getStatusGame = function () {
18944            var gameStatus = '';
18945            switch (vm.sportId) {
18946                // Baseball
18947                case 2:
18948                    if (vm.properties) {
18949                        var gameStatusProperty = _.find(vm.properties, { name: 'GameStatus' });
18950                        if (gameStatusProperty) {
18951                            var gameStatusProperties = _.split(gameStatusProperty.value, '-');
18952                            if (gameStatusProperties) {
18953                                switch (vm.statusId) {
18954                                    case 2:
18955                                        gameStatus = $translate.instant('directives.widgets.scores.labels.' + gameStatusProperties[0]) + ' ' + $filter('ordinal')(gameStatusProperties[1], true) + ' - ' + gameStatusProperties[2] + $translate.instant('directives.widgets.scores.labels.out');
18956                                        break;
18957                                    case 3:
18958                                        gameStatus = $translate.instant('directives.widgets.scores.labels.final');
18959                                        gameStatus += ' ' + gameStatusProperties[1];
18960                                        break;
18961                                }
18962                            }
18963                        }
18964                    }   
18965                    break;
18966                default:
18967                    {
18968                        switch (vm.statusId) {
18969                            case 2:
18970                                gameStatus = $filter('ordinal')(vm.periodId, true) + ' - ' + vm.getFormatTime(vm);
18971                                break;
18972                            case 3:
18973                                gameStatus = $translate.instant('directives.widgets.scores.labels.final');
18974                                if (vm.periodId > 4) {
18975                                    gameStatus += ' / ';
18976                                }
18977                                if (vm.periodId >= 5 && vm.periodId <= 8) {
18978                                    gameStatus += $translate.instant('directives.widgets.scores.labels.overtime');
18979                                }
18980                                if (vm.periodId == 9) {
18981                                    gameStatus += $translate.instant('directives.widgets.scores.labels.shootout');
18982                                }
18983                                break;
18984                        }
18985                    }
18986            }
18987            return gameStatus;
18988        }
18989        vm.gameTime = vm.date.slice(0, 11) + vm.startTime;
18990
18991
18992        vm.getStyle = function (i) {
18993            let style = {};
18994            if (i % 2 != 0) {
18995                style['background-color'] = '#f0f0f0';
18996                vm.isPair = false;
18997            }
18998            else {
18999                style['background-color'] = '#fff';
19000                style['border-bottom'] = '1px solid lightgrey';
19001                vm.isPair = true;
19002            }
19003            return style;
19004        }
19005
19006        vm.getFormatTime = function (score) {
19007            switch (score.statusId) {
19008                case 3:
19009                case 1:
19010                    return moment(score.startTime, 'hh:mm').format('LT');
19011
19012                case 2:
19013                    return moment(score.time, 'hh:mm:ss').format('LTS').substr(3, 5);
19014            }
19015        };
19016
19017        $scope.$on('score:update-gameDetails', function (event, version) {
19018            getScoreboard(version);
19019        })
19020
19021        getScoreboard();
19022        function getScoreboard(version) { 
19023            scoreboardBaseballService.getScoreboardBaseball(__solutionId__, vm.id, version)
19024                .then(function (response) {
19025                    vm.response = response.data.score;
19026                    vm.hasGame = vm.response && true;
19027                })
19028                .catch(function (error) {
19029                    // TODO Bugsnag
19030                    // console.log(error)
19031                });
19032        }
19033
19034        facilityService.getFacilitiesDetailsWithUpdateDate(__solutionId__)
19035            .then(function (response) {
19036                vm.facility = _.filter(response.data.facilities, function (facility) {
19037                    return facility.name === vm.sportCenterName
19038                })
19039            })
19040            .catch(function (error) {
19041                bugsnag.notify(error);
19042            });
19043
19044        vm.getStat = function (teamId, statId, categoryId) {
19045            for (const team of vm.teamList) {
19046                if (team.id === teamId) {
19047                    for (const player of team.players) {
19048                        if (!player.id && player.categoryId === categoryId) {
19049                            var stat = _.find(player.stats, { statTypeId: statId });
19050                            if (stat) {
19051                                return stat.displayValue;
19052                            }
19053                        }
19054                    }
19055                    return "0";
19056                }
19057            }
19058        }
19059    }
19060})();
19061;
19062(function () {
19063    'use strict';
19064
19065    angular
19066        .module('app.directives')
19067        .directive('gameStatus', gameStatus)
19068
19069    gameStatus.$inject = [];
19070
19071    function gameStatus() {
19072        return {
19073            restrict: 'E',
19074            scope: {
19075                widget: '='
19076            },
19077            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/game-status/game-status.tpl.html',
19078            controller: 'GameStatusWidgetController',
19079            controllerAs: 'gameStatus',
19080            link: function (scope, element, attribut, controller) {
19081                scope.$watch(function () {
19082                    if (element.find('.game-status')[0]) {
19083                        return element.find('.game-status')[0].clientWidth
19084                    }
19085                }, function (container) {
19086                    if (container <= 910) {
19087                        controller.isMobile = true;
19088                    }
19089                    else if (container > 910) {
19090                        controller.isMobile = false;
19091                    }
19092                });
19093            }
19094        };
19095    }
19096})();
19097;
19098(function () {
19099    'use strict';
19100
19101    angular
19102        .module('app.directives')
19103        .controller('GameStatusBasketballWidgetController', GameStatusBasketballWidgetController);
19104
19105    GameStatusBasketballWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$timeout', '$translate', '$filter', '$q', 'SeasonService', 'ScoreboardBasketballService', 'FacilityService', 'UrlService', 'GoogleMapService'];
19106
19107    function GameStatusBasketballWidgetController($rootScope, $scope, $localStorage, $timeout, $translate, $filter, $q, seasonService, scoreboardBasketballService, facilityService, urlService, googleMapService) {
19108        var vm = this;
19109        vm.widget = angular.fromJson(widgets[$scope.widget])
19110        vm.isPair = true;
19111        vm.isMobile = false;
19112
19113        vm.url = urlService;
19114
19115        vm.clickFacility = function () {
19116            var url = googleMapService.getMapSearchUrl(vm.facility[0].facilityAddress);
19117            window.open(url, "_blank");
19118        }
19119        vm = Object.assign(vm, angular.fromJson(__gameDetails__
19120            .replace(/[\n\r]+/g, ' ')));
19121
19122        var seasonParametersPromise = seasonService.getSeasonParametersBySeasonId(__solutionId__, vm.seasonId);
19123        var detailsPromise = scoreboardBasketballService.getDetails(__solutionId__, vm.id);
19124        var facilityPromise = facilityService.getFacilitiesDetailsWithUpdateDate(__solutionId__);
19125
19126        $q.all([seasonParametersPromise, detailsPromise, facilityPromise]).then(function (results) {
19127
19128            //season parameters promise
19129
19130            var parameters = results[0];
19131            vm.seasonParameters = parameters.data || [];
19132
19133            //details promise
19134
19135            vm.scoreboardResponse = results[1].data;
19136
19137            vm.localTeamColor = getTeamColor(true);
19138            vm.visitorTeamColor = getTeamColor(false);
19139            vm.localBonusPts = getTeamBonusPts(true);
19140            vm.visitorBonusPts = getTeamBonusPts(false);
19141
19142            vm.hasGame = vm.scoreboardResponse && true;
19143            vm.quarters = []
19144            
19145            vm.periodNumber = parseInt(_.get(_.find(vm.seasonParameters, { Code: 'PERIODNUMBER' }), 'Value'));
19146            vm.periodNumberGame = vm.periodNumber;
19147            vm.useTime = parseInt(_.get(_.find(vm.seasonParameters, { Code: 'USETIME' }), 'Value'));
19148
19149            if (vm.scoreboardResponse.periodId > vm.periodNumber) {
19150                vm.periodNumberGame = vm.scoreboardResponse.periodId;
19151            }
19152
19153            for (var i = 0; i < vm.periodNumberGame; i++) {                
19154                vm.quarters.push({ period: (i + 1), localScore: 0, visitorScore: 0 });                
19155            }
19156
19157            var shootEvents = _.filter(vm.scoreboardResponse.eventList, (event) => { return event.eventtypeid == 13 });
19158
19159            vm.events = _.groupBy(
19160                _.map(shootEvents,
19161                    (event) => {
19162                        var eventDefinition = JSON.parse(event.content);
19163                        if (eventDefinition.type == 'shoot') {
19164                            var shoot = new Shoot(eventDefinition, event.id);
19165                            return shoot;
19166                        }
19167
19168                        return null;
19169
19170                    }), 'period');
19171            _.forEach(vm.events, (event) => {
19172                _.forEach(event, (shot) => {
19173                    if (shot.success == "true") {
19174                        if (shot.teamId == vm.scoreboardResponse.localTeamId) {
19175                            vm.quarters[shot.period - 1].localScore += parseInt(shot.pointsCount)
19176                        } else {
19177                            vm.quarters[shot.period - 1].visitorScore += parseInt(shot.pointsCount)
19178                        }
19179                    }
19180                })
19181            })
19182
19183            //facility promise
19184            vm.facility = _.filter(results[2].data.facilities, function (facility) {
19185                return facility.name === vm.sportCenterName
19186            })
19187        })
19188
19189        vm.getStatusGame = function () {
19190            var gameStatus = '';
19191            switch (vm.sportId) {
19192                case 4:
19193                    {
19194                        switch (vm.statusId) {
19195                            case 2:
19196                                if (vm.periodId > vm.periodNumber) {
19197                                    gameStatus += ($translate.instant('directives.widgets.scores.labels.overtime') + '. ' + (vm.periodId - vm.periodNumber) + ' - ' + vm.getFormatTime(vm));
19198                                } else {
19199                                    gameStatus = $filter('ordinal')(vm.periodId, true) + ' - ' + vm.getFormatTime(vm);
19200                                }
19201                                break;
19202                            case 3:
19203                                gameStatus = $translate.instant('directives.widgets.scores.labels.final');
19204                                if (vm.periodId > vm.periodNumber) {
19205                                    gameStatus += (' / ' + $translate.instant('directives.widgets.scores.labels.overtime') + (vm.periodId - vm.periodNumber));
19206                                } else {
19207                                    gameStatus = $filter('ordinal')(vm.periodId, true) + ' - ' + vm.getFormatTime(vm);
19208                                }
19209                                break;
19210                        }
19211                        break;
19212                    }
19213                default:
19214                    {
19215                        switch (vm.statusId) {
19216                            case 2:
19217                                gameStatus = $filter('ordinal')(vm.periodId, true) + ' - ' + vm.getFormatTime(vm);
19218                                break;
19219                            case 3:
19220                                gameStatus = $translate.instant('directives.widgets.scores.labels.final');
19221                                if (vm.periodId > 4) {
19222                                    gameStatus += ' / ';
19223                                }
19224                                if (vm.periodId >= 5 && vm.periodId <= 8) {
19225                                    gameStatus += $translate.instant('directives.widgets.scores.labels.overtime');
19226                                }
19227                                if (vm.periodId == 9) {
19228                                    gameStatus += $translate.instant('directives.widgets.scores.labels.shootout');
19229                                }
19230                                break;
19231                        }
19232                        break;
19233                    }
19234            }
19235            return gameStatus;
19236        }
19237        vm.gameTime = vm.date.slice(0, 11) + vm.startTime;
19238
19239        vm.getStyle = function (i) {
19240            let style = {};
19241            if (i % 2 != 0) {
19242                style['background-color'] = '#f0f0f0';
19243                vm.isPair = false;
19244            }
19245            else {
19246                style['background-color'] = '#fff';
19247                style['border-bottom'] = '1px solid lightgrey';
19248                vm.isPair = true;
19249            }
19250            return style;
19251        }
19252
19253        vm.getFormatTime = function (score) {
19254            switch (score.statusId) {
19255                case 3:
19256                case 1:
19257                    return moment(score.startTime, 'hh:mm').format('LT');
19258
19259                case 2:
19260                    return moment(score.time, 'hh:mm:ss').format('LTS').substr(3, 5);
19261            }
19262        };
19263
19264        vm.getStat = function (teamId, statId, categoryId) {
19265            for (const team of vm.teamList) {
19266                if (team.id === teamId) {
19267                    for (const player of team.players) {
19268                        if (!player.id && player.categoryId === categoryId) {
19269                            var stat = _.find(player.stats, { statTypeId: statId });
19270                            if (stat) {
19271                                return stat.displayValue;
19272                            }
19273                        }
19274                    }
19275                    return '0';
19276                }
19277            }
19278        }
19279
19280        function Shoot(_event, eventId) {
19281            var self = this;
19282        
19282    angular.extend(self, _event);
19283
19284            self.error = null;
19285            self.id = eventId;
19286
19287            var shooterProperty = _.find(self.properties, { name: 'shooter' });    
19288
19289            self.team = shooterProperty.teamid == vm.scoreboardResponse.teamList[0].id ? vm.scoreboardResponse.teamList[0] : vm.scoreboardResponse.teamList[1];
19290            self.teamId = self.team.id;
19291            self.shooterPlayer = _.find(self.team.players, { id: shooterProperty.id });
19292            self.propertyId = _.get(self.shooterPlayer, 'id');
19293            self.pointsCount = _.get(_.find(self.details, { 'name': 'pointsCount' }), 'value');
19294            self.success = _.get(_.find(self.details, { 'name': 'success' }), 'value');
19295
19296            self.hasError = function () {
19297                if (!self.propertyId) {
19298                    self.error = { type: 'player' }
19299                    return true;
19300                }
19301
19302                if (!vm.teams[self.teamId].playerCollection[self.propertyId]) {
19303                    self.error = { type: 'player' }
19304                    return true;
19305                }
19306
19307                self.error = null;
19308                return false;
19309            }
19310
19311            self.formatEvent = function () {
19312                var eventContent = {};
19313                eventContent.id = self.id;
19314                eventContent.type = 'shoot';
19315                eventContent.period = self.period;
19316                eventContent.time = self.time;
19317
19318                eventContent.details = [];
19319                eventContent.details.push({ name: 'success', value: self.success });
19320                eventContent.details.push({ name: 'pointsCount', value: self.pointsCount });
19321
19322                eventContent.properties = [];
19323                eventContent.properties.push({ id: self.propertyId, name: 'shooter', teamid: self.teamId });
19324
19325                return eventContent;
19326            }
19327
19328            self.timeSetter = function (time) {
19329                if (angular.isDefined(time)) {
19330                    if (time.match(/^\d$/)) {
19331                        time = `0${time}:00`;
19332                    }
19333
19334                    if (time.match(/^\d{4}$/)) {
19335                        time = time.slice(0, 2) + ':' + time.slice(2);
19336                    }
19337
19338                    if (time.match(/^\d{2}:\d{2}$/)) {
19339                        self.time = `00:${time}`;
19340                    }
19341                }
19342
19343                return self.time.slice(-5);
19344            }
19345
19346            self.editMode = false;
19347        } 
19348
19349        function getTeamBonusPts(isLocal) {
19350            var bonusPoints = '0'
19351            if (isLocal) {
19352                var localTeam = _.find(vm.scoreboardResponse.teamList, { name: vm.scoreboardResponse.localTeamName });
19353                if (localTeam) {
19354                    bonusPoints = _.get(_.find(localTeam.teamProperties, { name: 'bonusPts' }), "value");
19355                }
19356            } else {
19357                var visitorTeam = _.find(vm.scoreboardResponse.teamList, { name: vm.scoreboardResponse.visitorTeamName });
19358                if (visitorTeam) {
19359                    bonusPoints = _.get(_.find(visitorTeam.teamProperties, { name: 'bonusPts' }), "value");
19360                }
19361            }
19362            return bonusPoints != null ? bonusPoints : '0';
19363        }
19364
19365        function getTeamColor(isLocal) {
19366            var color = '';
19367            if (isLocal) {
19368                var localTeam = _.find(vm.scoreboardResponse.teamList, { name: vm.scoreboardResponse.localTeamName });
19369                if (localTeam) {
19370                    color = _.get(_.find(localTeam.teamProperties, { name: 'color' }), "value");
19371                }
19372                return color != null ? color : 'black';
19373
19374            } else {
19375                var visitorTeam = _.find(vm.scoreboardResponse.teamList, { name: vm.scoreboardResponse.visitorTeamName });
19376                if (visitorTeam) {
19377                    color = _.get(_.find(visitorTeam.teamProperties, { name: 'color' }), "value");
19378                }
19379                return color != null ? color : 'white';
19380            }
19381        }
19382    }
19383})();
19384;
19385(function () {
19386    'use strict';
19387
19388    angular
19389        .module('app.directives')
19390        .directive('gameStatusBasketball', gameStatusBasketball)
19391
19392    gameStatusBasketball.$inject = [];
19393
19394    function gameStatusBasketball() {
19395        return {
19396            restrict: 'E',
19397            scope: {
19398                widget: '='
19399            },
19400            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/game-status/basketball/game-status-basketball.tpl.html',
19401            controller: 'GameStatusBasketballWidgetController',
19402            controllerAs: 'gameStatusBasketball',
19403            link: function (scope, element, attribut, controller) {
19404                scope.$watch(function () {
19405                    if (element.find('.game-status-baskletball')[0]) {
19406                        return element.find('.game-status-basketball')[0].clientWidth
19407                    }
19408                }, function (container) {
19409                    if (container <= 910) {
19410                        controller.isMobile = true;
19411                    }
19412                    else if (container > 910) {
19413                        controller.isMobile = false;
19414                    }
19415                });
19416            }
19417        };
19418    }
19419})();
19420;
19421(function () {
19422    'use strict';
19423
19424    angular
19425        .module('app.directives')
19426        .controller('GameStatusGenericWidgetController', GameStatusGenericWidgetController);
19427
19428    GameStatusGenericWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$timeout', '$translate', '$filter', '$q', 'SeasonService', 'StatisticService', 'FacilityService', 'UrlService', 'GoogleMapService'];
19429
19430    function GameStatusGenericWidgetController($rootScope, $scope, $localStorage, $timeout, $translate, $filter, $q, seasonService, statisticService, facilityService, urlService, googleMapService) {
19431        var vm = this;
19432        vm.widget = angular.fromJson(widgets[$scope.widget])
19433        vm.isPair = true;
19434        vm.isMobile = false;
19435        vm.bonusPointsStat = { 3: 182 }
19436
19437        vm.url = urlService;
19438
19439        vm.clickFacility = function () {
19440            var url = googleMapService.getMapSearchUrl(vm.facility[0].facilityAddress);
19441            window.open(url, "_blank");
19442        }
19443        vm = Object.assign(vm, angular.fromJson(__gameDetails__
19444            .replace(/[\n\r]+/g, ' ')));
19445
19446        vm.localBonusPts = getTeamBonusPts(true);
19447        vm.visitorBonusPts = getTeamBonusPts(false);
19448
19449        var seasonParametersPromise = seasonService.getSeasonParametersBySeasonId(__solutionId__, vm.seasonId);        
19450        var facilityPromise = facilityService.getFacilitiesDetailsWithUpdateDate(__solutionId__);
19451
19452        $q.all([seasonParametersPromise, facilityPromise]).then(function (results) {
19453
19454            //season parameters promise
19455
19456            var parameters = results[0];
19457            vm.seasonParameters = parameters.data || [];
19458
19459            //details promise
19460
19461            vm.hasGame = true;
19462            vm.quarters = []
19463            
19464            vm.periodNumber = parseInt(_.get(_.find(vm.seasonParameters, { Code: 'PERIODNUMBER' }), 'Value'));
19465            vm.periodNumberGame = vm.periodNumber;
19466            vm.useTime = parseInt(_.get(_.find(vm.seasonParameters, { Code: 'USETIME' }), 'Value'));
19467
19468            if (vm.periodId > vm.periodNumber) {
19469                vm.periodNumberGame = vm.periodId;
19470            }
19471
19472            for (var i = 0; i < vm.periodNumberGame; i++) {                
19473                vm.quarters.push({ period: (i + 1), localScore: 0, visitorScore: 0 });                
19474            }
19475
19476
19477            var teamPeriods = angular.fromJson(angular.toJson(vm.quarters));
19478
19479            for (var period of teamPeriods) {
19480                var periodGoals = 0;
19481                var events = _.filter(vm.eventList, function (event) {
19482                    return event.periodId == period.period && event.eventTypeId == statisticService.getSportTeamStatsByType('scorePerio
19482d', vm.sportId);                    
19483                });
19484
19485                events.forEach(function (event) {
19486                    if (event.teamId == vm.localTeamId) {
19487                        vm.quarters[event.periodId - 1].localScore += event.value;
19488                    }
19489                    else {
19490                        vm.quarters[event.periodId - 1].visitorScore += event.value;
19491					}
19492                })
19493            }
19494
19495            //facility promise
19496            vm.facility = _.filter(results[1].data.facilities, function (facility) {
19497                return facility.name === vm.sportCenterName
19498            })
19499        })
19500
19501        vm.getStatusGame = function () {
19502            var gameStatus = '';
19503            switch (vm.sportId) {
19504                case 4:
19505                    {
19506                        switch (vm.statusId) {
19507                            case 2:
19508                                if (vm.periodId > vm.periodNumber) {
19509                                    gameStatus += ($translate.instant('directives.widgets.scores.labels.overtime') + '. ' + (vm.periodId - vm.periodNumber) + ' - ' + vm.getFormatTime(vm));
19510                                } else {
19511                                    gameStatus = $filter('ordinal')(vm.periodId, true) + ' - ' + vm.getFormatTime(vm);
19512                                }
19513                                break;
19514                            case 3:
19515                                gameStatus = $translate.instant('directives.widgets.scores.labels.final');
19516                                if (vm.periodId > vm.periodNumber) {
19517                                    gameStatus += (' / ' + $translate.instant('directives.widgets.scores.labels.overtime') + (vm.periodId - vm.periodNumber));
19518                                } else {
19519                                    gameStatus = $filter('ordinal')(vm.periodId, true) + ' - ' + vm.getFormatTime(vm);
19520                                }
19521                                break;
19522                        }
19523                        break;
19524                    }
19525                default:
19526                    {
19527                        switch (vm.statusId) {
19528                            case 2:
19529                                gameStatus = $filter('ordinal')(vm.periodId, true) + ' - ' + vm.getFormatTime(vm);
19530                                break;
19531                            case 3:
19532                                gameStatus = $translate.instant('directives.widgets.scores.labels.final');
19533                                if (vm.periodId > 4) {
19534                                    gameStatus += ' / ';
19535                                }
19536                                if (vm.periodId >= 5 && vm.periodId <= 8) {
19537                                    gameStatus += $translate.instant('directives.widgets.scores.labels.overtime');
19538                                }
19539                                if (vm.periodId == 9) {
19540                                    gameStatus += $translate.instant('directives.widgets.scores.labels.shootout');
19541                                }
19542                                break;
19543                        }
19544                        break;
19545                    }
19546            }
19547            return gameStatus;
19548        }
19549
19550        vm.gameTime = vm.date.slice(0, 11) + (vm.startTime ? vm.startTime : '00:00:00');
19551        
19552        vm.getStyle = function (i) {
19553            let style = {};
19554            if (i % 2 != 0) {
19555                style['background-color'] = '#f0f0f0';
19556                vm.isPair = false;
19557            }
19558            else {
19559                style['background-color'] = '#fff';
19560                style['border-bottom'] = '1px solid lightgrey';
19561                vm.isPair = true;
19562            }
19563            return style;
19564        }
19565
19566        vm.getFormatTime = function (score) {
19567            switch (score.statusId) {
19568                case 3:
19569                case 1:
19570                    return moment(score.startTime, 'hh:mm').format('LT');
19571
19572                case 2:
19573                    return moment(score.time, 'hh:mm:ss').format('LTS').substr(3, 5);
19574            }
19575        };
19576        
19577        function getTeamBonusPts(isLocal) {
19578            var bonusPoints = '0'
19579            if (isLocal) {
19580                var localTeam = _.find(vm.teamList, { id: vm.localTeamId });
19581                if (localTeam) {
19582                    bonusPoints = _.get(_.find(localTeam.stats, { statTypeId: vm.bonusPointsStat[vm.sportId] }), "value");
19583                }
19584            } else {
19585                var visitorTeam = _.find(vm.teamList, { id: vm.visitorTeamId });
19586                if (visitorTeam) {
19587                    bonusPoints = _.get(_.find(visitorTeam.stats, { statTypeId: vm.bonusPointsStat[vm.sportId] }), "value");
19588                }
19589            }
19590            return bonusPoints != null ? bonusPoints : '0';
19591        }
19592    }
19593})();
19594;
19595(function () {
19596    'use strict';
19597
19598    angular
19599        .module('app.directives')
19600        .directive('gameStatusGeneric', gameStatusGeneric)
19601
19602    gameStatusGeneric.$inject = [];
19603
19604    function gameStatusGeneric() {
19605        return {
19606            restrict: 'E',
19607            scope: {
19608                widget: '='
19609            },
19610            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/game-status/generic/game-status-generic.tpl.html',
19611            controller: 'GameStatusGenericWidgetController',
19612            controllerAs: 'gameStatusGeneric',
19613            link: function (scope, element, attribut, controller) {
19614                scope.$watch(function () {
19615                    if (element.find('.game-status-generic')[0]) {
19616                        return element.find('.game-status-generic')[0].clientWidth
19617                    }
19618                }, function (container) {
19619                    if (container <= 910) {
19620                        controller.isMobile = true;
19621                    }
19622                    else if (container > 910) {
19623                        controller.isMobile = false;
19624                    }
19625                });
19626            }
19627        };
19628    }
19629})();
19630;
19631(function () {
19632    'use strict';
19633
19634    angular
19635        .module('app.directives')
19636        .controller('LoginWidgetController', LoginWidgetController);
19637
19638    LoginWidgetController.$inject = ['$rootScope', '$scope', '$window', '$location', '$localStorage', 'AuthenticationService'];
19639
19640    function LoginWidgetController($rootScope, $scope, $window, $location, $localStorage, authenticationService) {
19641        var vm = this;
19642        vm.submit = false;
19643        vm.failedValidation = false;
19644        vm.stayConnected = true;
19645        
19646        if ($location.search().uid) {
19647            vm.submit = true;
19648            
19649            authenticationService.loginWithToken($location.search().uid).then(function (response) {
19650                vm.submit = false;
19651                if (response.data.signIn) {
19652                    acceptSignIn(response);
19653                }
19654            }).catch(function (error) {
19655                vm.failedValidation = true;
19656                vm.submit = false;
19657                bugsnag.notify(new Error(error.data.Message));
19658            });
19659        }
19660        else {
19661            vm.isAuthenticated = angular.isDefined($localStorage.__KreezeeSession__);
19662            if (vm.isAuthenticated) {
19663                $window.location.href = '';
19664            }
19665        }
19666
19667        
19668        vm.signIn = function() {            
19669            vm.form.$setSubmitted();
19670
19671            if (vm.form.$valid) {
19672                vm.submit = true;
19673                vm.failedValidation = false;
19674                    
19675                var credential = {
19676                    username: vm.email,
19677                    password: vm.password,
19678                    stayconnected: vm.stayConnected
19679                };
19680
19681                authenticationService.loginSolution(credential, $localStorage.solution.id)
19682                    .then(function(response) {
19683                        vm.submit = false;
19684                        if (response.data.signIn) {
19685                            acceptSignIn(response);
19686                        } else {
19687                            vm.failedValidation = true;
19688                        }
19689                        
19690                    }).catch(function(error) {
19691                        vm.failedValidation = true;
19692                        vm.submit = false;  
19693                        bugsnag.notify(new Error(error.data.Message));                        
19694                    });   
19695            }           
19696        };
19697
19698        function acceptSignIn(response) {
19699            var redirect = '/';
19700
19701            if ($location.search().page) {
19702                redirect += $location.search().page;
19703            }
19704
19705            if ($location.search().redirect) {
19706                redirect += `?section=${$location.search().redirect}`;
19707            }
19708
19709            $localStorage.__KreezeeSession__ = angular.fromJson(response.headers('__KreezeeSession__'));
19710            $window.location.href = redirect;
19711        }
19712
19713    }
19714})();
19715;
19716(function () {
19717    'use strict';
19718
19719    angular
19720        .module('app.directives')
19721        .directive('login', login);
19722
19723    login.$inject = [];
19724
19725    function login() {
19726        return {
19727            restrict: 'E',
19728            scope: {                
19729                widget: '='
19730            },
19731            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/login/login.tpl.html',
19732            controller: 'LoginWidgetController',
19733            controllerAs: 'login'
19734        };
19735    }
19736})();;
19737(function () {
19738    'use strict';
19739
19740    angular
19741        .module('app.directives')
19742        .controller('ImageBoxWidgetController', ImageBoxWidgetController);
19743
19744    ImageBoxWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', 'WebsiteEditorService'];
19745
19746    function ImageBoxWidgetController($rootScope, $scope, $localStorage, websiteEditorService) {
19747        var vm = this;
19748
19749        // Apply website values to view model object.
19750        vm.widget = angular.fromJson(widgets[$scope.widget]);
19751
19752        // Set view model parameters.
19753        for (var parameter in vm.widget.parameters) {
19754            switch (vm.widget.parameters[parameter].id) {
19755                case 'title':
19756                    vm.title = vm.widget.parameters[parameter].value;
19757                    break;
19758
19759                case 'showTitle':
19760                    vm.showTitle = vm.widget.parameters[parameter].value === 'true';
19761                    break;
19762
19763                case 'src':
19764                    if (angular.isJson(vm.widget.parameters[parameter].value)) {
19765                        var src = _.filter(angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"')), function (image) {
19766                            return image.culture == $localStorage.currentLanguage.culture;
19767                        });
19768
19769                        vm.image = {
19770                            url: src[0].value
19771                        };
19772                    } else {
19773                        vm.image = {
19774                            url: vm.widget.parameters[parameter].value
19775                        };
19776                    }
19777                    break;
19778
19779                case 'href':
19780                    if (angular.isJson(vm.widget.parameters[parameter].value)) {
19781                        var href = _.filter(angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"')), function (image) {
19782                            return image.culture == $localStorage.currentLanguage.culture;
19783                        });
19784
19785                        vm.href = href[0].value;
19786                    } else {
19787                        vm.href = vm.widget.parameters[parameter].value;
19788                    }
19789                    break;
19790
19791                case 'openTab':
19792                    vm.openTab = vm.widget.parameters[parameter].value === 'true';
19793                    break;
19794
19795                case 'widgetTransparency':
19796                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
19797                    break;
19798
19799                case 'showMobile':
19800                    vm.showMobile = vm.widget.parameters[parameter].value === 'true';
19801                    break;
19802                case 'border':
19803                    vm.border = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
19804                    break;
19805            }
19806        }
19807
19808        vm.getStyle = function () {
19809            var style = {};
19810            if (!vm.widgetTransparency) {
19811                style['border-color'] = vm.border.color;
19812            }
19813
19814            style['border-width'] = `${vm.border.width}px`;
19815            style['border-color'] = vm.border.color;
19816            style['border-radius'] = `${vm.border.radius}px`;
19817            return style;
19818        }
19819
19820        // Triggered when parameters are changed.
19821        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
19822            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
19823                .then(function (response) {
19824                    // Save parameters.
19825                    for (var parameter in vm.widget.parameters) {
19826                        switch (vm.widget.parameters[parameter].id) {
19827                            case 'title':
19828                                vm.widget.parameters[parameter].value = data.title;
19829                                vm.title = data.title;
19830                                break;
19831
19832                            case 'showTitle':
19833                                vm.widget.parameters[parameter].value = data.showTitle.toString();
19834                                vm.showTitle = data.showTitle;
19835                                break;
19836
19837                            case 'src':
19838                                vm.widget.parameters[parameter].value = data.src;
19839                                vm.image.url = data.src;
19840                                break;
19841
19842                            case 'href':
19843                                vm.widget.parameters[parameter].value = data.href;
19844                                vm.href = data.href;
19845                                break;
19846
19847                            case 'openTab':
19848                                vm.widget.parameters[parameter].value = data.openTab.toString();
19849                                vm.openTab = data.openTab;
19850                                break;
19851
19852                            case 'widgetTransparency':
19853                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
19854                                vm.widgetTransparency = data.widgetTransparency;
19855                                break;
19856
19857                            case 'showMobile':
19858                                vm.widget.parameters[parameter].value = data.showMobile.toString();
19859                                vm.showMobile = data.showMobile;
19860                                break;
19861
19862                            case 'border':
19863                                vm.widget.parameters[parameter].value = data.border;
19864                                vm.border = angular.fromJson(data.border.replace(/\'/g, '"'));
19865                                break;
19866
19867                        }
19868                    }
19869
19870                    // Update the variable.
19871                    widgets[$scope.widget] = angular.toJson(vm.widget);
19872                })
19873                .catch(function (error) {
19874                    bugsnag.notify(error);
19875                });
19876        });
19877
19878        $scope.$on('$destroy', listener);
19879    }
19880})();
19881;
19882(function () {
19883    'use strict';
19884
19885    angular
19886        .module('app.directives')
19887        .directive('imageBox', imageBox)
19888
19889    imageBox.$inject = [];
19890
19891    function imageBox() {
19892        return {
19893            restrict: 'E',
19894            scope: {                
19895                widget: '='
19896            },
19897            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/image/box/image-box.tpl.html',
19898            controller: 'ImageBoxWidgetController',
19899            controllerAs: 'imageBox'
19900        };
19901    }
19902})();;
19903(function () {
19904    'use strict';
19905
19906    angular
19907        .module('app.directives')
19908        .directive('imageBar', imageBar)
19909
19910    imageBar.$inject = ['$timeout'];
19911
19912    function imageBar($timeout) {
19913        return {
19914            restrict: 'E',
19915            scope: {
19916                widget: '='
19917            },
19918            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/image-bar/image-bar.tpl.html',
19919            controller: 'ImageBarWidgetController',
19920            controllerAs: 'imageBar',
19921            link: function (scope, element, attr, controller) {
19922                var vm = controller;
19923                $timeout(function () {
19924                    vm.imageContainer = element.find('div.images-container')
19925                    vm.clickNext = function () {
19926                        let tempRight = element.find('div.images-container').css('right') // Get the 'right' value of images-container
19927                        if (Number(tempRight.replace("px", "")) < 0) { // Checks if the 'right' side is below 0. If so, we can move the images-container by vm.widgetHeight pixels
19928                            vm.currentPosition -= Number(vm.widgetHeight)
19929                            element.find('div.images-container').css('left', vm.currentPosition) // Set the new position
19930                        }
19931                    }
19932
19933                    vm.clickPrev = function () {
19934                        let tempLeft = element.find('div.images-container').css('left')
19935                        if (Number(tempLeft.replace("px", "")) < 0) {
19936                            vm.currentPosition += Number(vm.widgetHeight)
19937                            element.find('div.images-container').css('left', vm.currentPosition)
19938                        }
19939                    }
19940
19941                    vm.resetPosition = function () {
19942                        element.find('div.images-container').css('left', 'initial') // Resets the images-container each time we add/remove images
19943                    }
19944                })
19945            }
19946        };
19947    }
19948})();
19949;
19950(function () {
19951    'use strict';
19952
19953    angular
19954        .module('app.directives')
19955        .controller('ImageBarWidgetController', ImageBarWidgetController);
19956
19957    ImageBarWidgetController.$inject = ['$rootScope', '$scope', 'GameService', 'WebsiteEditorService', '$timeout'];
19958
19959    function ImageBarWidgetController($rootScope, $scope, gameService, websiteEditorService, $timeout) {
19960        var vm = this;
19961        vm.widget = angular.fromJson(widgets[$scope.widget]);
19962        vm.images = [];
19963        vm.currentPosition = 0
19964
19965        // Set view model parameters.
19966        for (var parameter in vm.widget.parameters) {
19967            switch (vm.widget.parameters[parameter].id) {
19968                case 'backgroundColor':
19969                    vm.backgroundColor = vm.widget.parameters[parameter].value
19970                    break;
19971                case 'widgetTransparency':
19972                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
19973                    break;
19974                case 'colorNavigationArrow':
19975                    vm.colorNavigationArrow = vm.widget.parameters[parameter].value;
19976                    break;
19977                case 'widgetHeight':
19978                    vm.widgetHeight = vm.widget.parameters[parameter].value;
19979                    break;
19980                case 'navigation':
19981                    vm.navigation = vm.widget.parameters[parameter].value === 'true';
19982                    break;
19983                case 'multipleImageUpload':
19984                    vm.images = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
19985                    break;
19986                case 'openTab':
19987                    vm.openTab = vm.widget.parameters[parameter].value === 'true';
19988                    break;
19989                case 'showMobile':
19990                    vm.showMobile = vm.widget.parameters[parameter].value === 'true';
19991                    break;
19992            }
19993        }
19994
19995        vm.getStyle = function () {
19996            let style = {};
19997            if (!vm.widgetTransparency) {
19998                style['background-color'] = vm.backgroundColor;
19999            }
20000
20001            if (vm.navigation) {
20002                style['height'] = `${vm.widgetHeight}px`
20003            }
20004            
20005            return style;
20006        }
20007
20008        vm.getNavArrowStyle = function () {
20009            let style = {};
20010            style['color'] = vm.colorNavigationArrow;
20011            return style;
20012        }
20013
20014
20015        // Triggered when parameters are changed.
20016        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
20017            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
20018                .then(function (response) {
20019                    // Save parameters   
20020                    for (var parameter in vm.widget.parameters) {
20021                        switch (vm.widget.parameters[parameter].id) {
20022                            case 'backgroundColor':
20023                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
20024                                vm.backgroundColor = data.backgroundColor;
20025                                break;
20026                            case 'widgetTransparency':
20027                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
20028                                vm.widgetTransparency = data.widgetTransparency;
20029                                break;
20030                            case 'colorNavigationArrow':
20031                                vm.widget.parameters[parameter].value = data.colorNavigationArrow.toString();
20032                                vm.colorNavigationArrow = data.colorNavigationArrow;
20033                                break;
20034                            case 'widgetHeight':
20035                                vm.widget.parameters[parameter].value = data.widgetHeight.toString();
20036                                vm.widgetHeight = data.widgetHeight;
20037                                break;
20038                            case 'multipleImageUpload':
20039                                vm.images = angular.fromJson(data.multipleImageUpload.replace(/\'/g, '"'));
20040                                vm.widget.parameters[parameter].value = data.multipleImageUpload;
20041                                vm.resetPosition()
20042                                break;
20043                            case 'navigation':
20044                                vm.widget.parameters[parameter].value = data.navigation.toString();
20045                                vm.navigation = data.navigation;
20046                                break;
20047                            case 'openTab':
20048                                vm.widget.parameters[parameter].value = data.openTab.toString();
20049                                vm.openTab = data.openTab;
20050                                break;
20051                            case 'showMobile':
20052                                vm.widget.parameters[parameter].value = data.showMobile.toString();
20053                                vm.showMobile = data.showMobile;
20054                                break;
20055
20056                        }
20057                    }
20058                    // Update the variable.
20059                    widgets[$scope.widget] = angular.toJson(vm.widget);
20060                })
20061                .catch(function (error) {
20062                    bugsnag.notify(error);
20063                });
20064        });
20065        $scope.$on('$destroy', listener);
20066    }
20067})();
20068;
20069(function () {
20070    'use strict';
20071
20072    angular
20073        .module('app.directives')
20074        .directive('spacer', spacer)
20075
20076    spacer.$inject = [];
20077
20078    function spacer() {
20079        return {
20080            restrict: 'E',
20081            scope: {
20082                widget: '='
20083            },
20084            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/spacer/spacer.tpl.html',
20085            controller: 'SpacerWidgetController',
20086            controllerAs: 'spacer',
20087        };
20088    }
20089})();
20090;
20091(function () {
20092    'use strict';
20093
20094    angular
20095        .module('app.directives')
20096        .controller('SpacerWidgetController', SpacerWidgetController);
20097
20098    SpacerWidgetController.$inject = ['$rootScope', '$scope', '$window', 'WebsiteEditorService'];
20099
20100    function SpacerWidgetController($rootScope, $scope, $window, websiteEditorService) {
20101        var vm = this;
20102        vm.widget = angular.fromJson(widgets[$scope.widget]);
20103
20104        // Set view model parameters.
20105        for (var parameter in vm.widget.parameters) {
20106            switch (vm.widget.parameters[parameter].id) {
20107                case 'backgroundColor':
20108                    vm.backgroundColor = vm.widget.parameters[parameter].value
20109                    break;
20110                case 'widgetTransparency':
20111                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
20112                    break;
20113                case 'widgetHeight':
20114                    vm.widgetHeight = vm.widget.parameters[parameter].value;
20115                    break;
20116            }
20117        }
20118
20119        vm.isMobile = function () {
20120            return $window.innerWidth <= 575;
20121        }
20122
20123        vm.getStyle = function () {
20124            var style = {};
20125            if (!vm.widgetTransparency) {
20126                style['background-color'] = vm.backgroundColor;
20127            }
20128            style['height'] = `${vm.widgetHeight}px`
20129            return style;
20130        }
20131
20132        // Triggered when parameters are changed.
20133        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
20134            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
20135                .then(function (response) {
20136                    // Save parameters   
20137                    for (var parameter in vm.widget.parameters) {
20138                        switch (vm.widget.parameters[parameter].id) {
20139                            case 'backgroundColor':
20140                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
20141                                vm.backgroundColor = data.backgroundColor;
20142                                break;
20143                            case 'widgetTransparency':
20144                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
20145                                vm.widgetTransparency = data.widgetTransparency;
20146                                break;
20147                            case 'widgetHeight':
20148                                vm.widget.parameters[parameter].value = data.widgetHeight.toString();
20149                                vm.widgetHeight = data.widgetHeight;
20150                                break;
20151                        }
20152                    }
20153                    // Update the variable.
20154                    widgets[$scope.widget] = angular.toJson(vm.widget);
20155                })
20156                .catch(function (error) {
20157                    bugsnag.notify(error);
20158                });
20159        });
20160        $scope.$on('$destroy', listener);
20161    }
20162})();
20163;
20164(function () {
20165    'use strict';
20166
20167    angular
20168        .module('app.directives')
20169        .controller('TextZoneWidgetController', TextZoneWidgetController);
20170
20171    TextZoneWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$sce', 'WebsiteEditorService'];
20172
20173    function TextZoneWidgetController($rootScope, $scope, $localStorage, $sce, websiteEditorService) {
20174        var vm = this;
20175
20176        // Apply website values to view model object.
20177        vm.widget = angular.fromJson(widgets[$scope.widget]);
20178
20179        // Set view model parameters.
20180        for (var parameter in vm.widget.parameters) {
20181            switch (vm.widget.parameters[parameter].id) {
20182                case 'title':
20183                    vm.title = vm.widget.parameters[parameter].value;
20184                    break;
20185
20186                case 'content':
20187                    vm.content = $sce.trustAsHtml(vm.widget.parameters[parameter].value);
20188                    break;
20189
20190                case 'showTitle':
20191                    vm.showTitle = vm.widget.parameters[parameter].value === 'true';
20192                    break;
20193
20194                case 'widgetTransparency':
20195                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
20196                    break;
20197
20198                case 'backgroundColor':
20199                    vm.backgroundColor = vm.widget.parameters[parameter].value;
20200                    break;
20201                case 'border':
20202                    vm.border = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
20203                    break;
20204            }
20205        }
20206
20207        vm.getStyle = function () {
20208            var style = {};
20209            if (!vm.widgetTransparency) {
20210                style['background-color'] = vm.backgroundColor;
20211                style['border-color'] = vm.border.color;
20212            }
20213
20214            style['border-width'] = `${vm.border.width}px`;
20215            style['border-color'] = vm.border.color;
20216            style['border-radius'] = `${vm.border.radius}px`;
20217
20218            return style;
20219        }
20220
20221
20222        // Triggered when parameters are changed.
20223        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {            
20224            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
20225                .then(function (response) {
20226                    // Save parameters.
20227                    
20228                    for (var parameter in vm.widget.parameters) {
20229                        switch (vm.widget.parameters[parameter].id) {
20230                            case 'title':
20231                                vm.widget.parameters[parameter].value = data.title;
20232                                vm.title = data.title;
20233                                break;
20234
20235                            case 'content':                                
20236                                vm.widget.parameters[parameter].value = data.content;
20237                                vm.content = $sce.trustAsHtml(data.content);
20238                                break;
20239
20240                            case 'showTitle':
20241                                vm.widget.parameters[parameter].value = data.showTitle.toString();
20242                                vm.showTitle = data.showTitle;
20243                                break;
20244
20245                            case 'widgetTransparency':                                
20246                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
20247                                vm.widgetTransparency = data.widgetTransparency;                                
20248                                break;
20249
20250                            case 'backgroundColor':
20251                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
20252                                vm.backgroundColor = data.backgroundColor;
20253                                break;
20254
20255                            case 'border':
20256                                vm.widget.parameters[parameter].value = data.border;
20257                                vm.border = angular.fromJson(data.border.replace(/\'/g, '"'));
20258                        }
20259                    }
20260
20261                    // Update the variable.
20262                    widgets[$scope.widget] = angular.toJson(vm.widget);
20263                })
20264                .catch(function (error) {
20265                    bugsnag.notify(error);
20266                });
20267        });
20268
20269        $scope.$on('$destroy', listener);
20270    }
20271})();
20272;
20273(function () {
20274    'use strict';
20275
20276    angular
20277        .module('app.directives')
20278        .directive('textZone', textZone)
20279
20280    textZone.$inject = [];
20281
20282    function textZone() {
20283        return {
20284            restrict: 'E',
20285            scope: {                
20286                widget: '='
20287            },
20288            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/text/zone/text-zone.tpl.html',
20289            controller: 'TextZoneWidgetController',
20290            controllerAs: 'textZone'
20291        };
20292    }
20293})();;
20294(function () {
20295    'use strict';
20296
20297    angular
20298        .module('app.directives')
20299        .controller('CardWidgetController', CardWidgetController);
20300
20301    CardWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$sce', 'WebsiteEditorService', 'TemplateService'];
20302
20303    function CardWidgetController($rootScope, $scope, $localStorage, $sce, websiteEditorService, templateService) {
20304        var vm = this;
20305        var templateList = [];
20306
20307        // Apply website values to view model object.        
20308        vm.widget = angular.fromJson(widgets[$scope.widget]);
20309        vm.hover = false;
20310
20311        // Set view model parameters.
20312        for (var parameter in vm.widget.parameters) {
20313            switch (vm.widget.parameters[parameter].id) {
20314                case 'title':
20315                    vm.title = vm.widget.parameters[parameter].value;
20316                    break;
20317
20318                case 'content':
20319                    vm.content = $sce.trustAsHtml(vm.widget.parameters[parameter].value);
20320                    break;
20321
20322                case 'showTitle':
20323                    vm.showTitle = vm.widget.parameters[parameter].value === 'true';
20324                    break;
20325
20326                case 'widgetTransparency':
20327                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
20328                    break;
20329
20330                case 'backgroundImage':
20331                    vm.backgroundImage = vm.widget.parameters[parameter].value;
20332                    break;
20333
20334                case 'hyperlink':
20335                    vm.hyperlink = vm.widget.parameters[parameter].value;
20336                    break;
20337
20338                case 'backgroundImageHover':
20339                    vm.backgroundImageHover = vm.widget.parameters[parameter].value;
20340                    break;
20341
20342                case 'backgroundColor':
20343                    vm.backgroundColor = vm.widget.parameters[parameter].value;
20344                    break;
20345                case 'border':
20346                    vm.border = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
20347                    break;
20348                case 'template':
20349                    var templateParameter = parameter;
20350                    templateService.getCardWidgetTemplates(__solutionId__).then(function (templates) {
20351                        templateList = [];
20352                        var listProperty = _.get(_.find(vm.widget.parameters[templateParameter].properties, { key: 'list' }), 'value');
20353                        var filteredTemplates = _.filter(templates.data, { type: listProperty });
20354
20355                        filteredTemplates.forEach(function (template) {
20356                            templateList.push(angular.fromJson(template.value))
20357                        })
20358
20359                        vm.template = _.find(templateList, { id: vm.widget.parameters[templateParameter].value });
20360                    });
20361
20362                    break
20363                case 'templateItems':
20364                    vm.templateItems = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\\\\'/g, '\\\"').replace(/\'/g, '"'));
20365                    break;
20366            }
20367        }
20368
20369        vm.getStyle = function () {
20370            var style = {};
20371            if (!vm.widgetTransparency) {
20372                style['background-color'] = vm.backgroundColor;
20373                style['background-size'] = 'cover';
20374                style['background-position'] = 'center';
20375                style['border-color'] = vm.border.color;
20376            }
20377
20378            style['border-width'] = `${vm.border.width}px`;
20379            style['border-color'] = vm.border.color;
20380            style['border-radius'] = `${vm.border.radius}px`;
20381            return style;
20382        }
20383
20384
20385
20386        // Triggered when parameters are changed.
20387        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
20388            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
20389                .then(function (response) {
20390                    // Save parameters                    
20391                    for (var parameter in vm.widget.parameters) {
20392                        switch (vm.widget.parameters[parameter].id) {
20393                            case 'title':
20394                                vm.widget.parameters[parameter].value = data.title;
20395                                vm.title = data.title;
20396                                break;
20397
20398                            case 'content':
20399                                vm.widget.parameters[parameter].value = data.content;
20400                                vm.content = $sce.trustAsHtml(data.content);
20401                                break;
20402
20403                            case 'showTitle':
20404                                vm.widget.parameters[parameter].value = data.showTitle.toString();
20405                                vm.showTitle = data.showTitle;
20406                                break;
20407
20408                            case 'widgetTransparency':
20409                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
20410                                vm.widgetTransparency = data.widgetTransparency;
20411                                break;
20412
20413                            case 'backgroundColor':
20414                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
20415                                vm.backgroundColor = data.backgroundColor;
20416                                break;
20417
20418                            case 'backgroundImage':
20419                                vm.widget.parameters[parameter].value = data.backgroundImage;
20420                                vm.backgroundImage = data.backgroundImage;
20421                                break;
20422
20423                            case 'hyperlink':
20424                                vm.widget.parameters[parameter].value = data.hyperlink;
20425                                vm.hyperlink = data.hyperlink;
20426                                break;
20427
20428                            case 'backgroundImageHover':
20429                                vm.widget.parameters[parameter].value = data.backgroundImageHover;
20430                                vm.backgroundImageHover = data.backgroundImageHover;
20431                                break;
20432
20433                            case 'border':
20434                                vm.widget.parameters[parameter].value = data.border;
20435                                vm.border = angular.fromJson(data.border.replace(/\'/g, '"'));
20436                                break;
20437
20438                            case 'template':
20439                                vm.widget.parameters[parameter].value = data.template;
20440                                vm.template = _.find(templateList, { id: data.template });
20441                                break;
20442
20443                            case 'templateItems':
20444                                vm.widget.parameters[parameter].value = data.templateItems;
20445                                vm.templateItems = angular.fromJson(data.templateItems.replace(/\\\\'/g, '\\\'').replace(/\'/g, '"'));
20446                                break;
20447                        }
20448                    }
20449
20450                    // Update the variable.
20451                    widgets[$scope.widget] = angular.toJson(vm.widget);
20452                })
20453                .catch(function (error) {
20454                    bugsnag.notify(error);
20455                });
20456        });
20457
20458        $scope.$on('$destroy', listener);
20459    }
20460})();
20461;
20462(function () {
20463    'use strict';
20464
20465    angular
20466        .module('app.directives')
20467        .directive('card', card)
20468
20469    card.$inject = [];
20470
20471    function card() {
20472        return {
20473            restrict: 'E',
20474            scope: {
20475                widget: '='
20476            },
20477            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/card/card.tpl.html',
20478            controller: 'CardWidgetController',
20479            controllerAs: 'card',
20480            link: function (scope, element, attr, controller) {
20481                let vm = controller
20482                vm.currentCard = element.find('img.background-image')
20483                vm.currentCardHover = element.find('img.background-image-hover')
20484
20485                vm.getImgStyle = function () {
20486                    if (vm.hover && vm.backgroundImageHover) {
20487                        vm.currentCard.css('opacity', 0)
20488                        vm.currentCardHover.css('opacity', 1)
20489                    } else {
20490                        vm.currentCard.css('opacity', 1)
20491                        vm.currentCardHover.css('opacity', 0)
20492                    }
20493                    if (vm.widgetTransparency) {
20494                        vm.currentCard.css('display', 'none')
20495                        vm.currentCardHover.css('display', 'none')
20496                    }
20497                }
20498            }
20499        };
20500    }
20501})();;
20502(function () {
20503    'use strict';
20504
20505    angular
20506        .module('app.directives')
20507        .controller('CardListWidgetController', CardListWidgetController);
20508
20509    CardListWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$sce', 'WebsiteEditorService', 'TemplateService', 'ListService'];
20510
20511    function CardListWidgetController($rootScope, $scope, $localStorage, $sce, websiteEditorService, templateService, listService) {
20512        var vm = this;
20513        var templateList = [];
20514
20515        // Apply website values to view model object.                
20516        vm.widget = angular.fromJson(widgets[$scope.widget]);
20517        
20518        vm.hover = false;        
20519        vm.filters = [];
20520        vm.selectedFilters = [];
20521        vm.page = 1;
20522        vm.totalPages = 0;
20523
20524        // Set view model parameters.
20525        for (var parameter in vm.widget.parameters) {
20526            switch (vm.widget.parameters[parameter].id) {
20527                case 'title':
20528                    vm.title = vm.widget.parameters[parameter].value;
20529                    break;
20530
20531                case 'content':
20532                    vm.content = $sce.trustAsHtml(vm.widget.parameters[parameter].value);
20533                    break;
20534
20535                case 'showTitle':
20536                    vm.showTitle = vm.widget.parameters[parameter].value === 'true';
20537                    break;
20538
20539                case 'widgetTransparency':
20540                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
20541                    break;
20542
20543                case 'backgroundImage':
20544                    vm.backgroundImage = vm.widget.parameters[parameter].value;
20545                    break;
20546
20547                case 'backgroundColor':
20548                    vm.backgroundColor = vm.widget.parameters[parameter].value;
20549                    break;
20550                case 'border':
20551                    vm.border = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
20552                    break;
20553                case 'template':
20554                    var templateParameter = parameter;                    
20555                    templateService.getCardWidgetTemplates(__solutionId__).then(function (templates) {                        
20556                        templateList = [];
20557                        var listProperty = _.get(_.find(vm.widget.parameters[templateParameter].properties, { key: 'list' }), 'value');                         
20558                        var filteredTemplates = _.filter(templates.data, { type: listProperty });                        
20559                        
20560                        filteredTemplates.forEach(function (template) {
20561                            templateList.push(angular.fromJson(template.value))
20562                        })
20563                        
20564                        vm.template = _.find(templateList, { id: vm.widget.parameters[templateParameter].value });                    
20565                    });
20566                    
20567                    break
20568                case 'templateItems':                    
20569                    vm.templateItems = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\\\\'/g, '\\\"').replace(/\'/g, '"'));
20570                    break;
20571                case 'filters':
20572                    vm.filters = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\\\\'/g, '\\\"').replace(/\'/g, '"'));
20573                    break;
20574                case 'list':
20575                    vm.listId = vm.widget.parameters[parameter].value;
20576                    vm.list = [];                    
20577                    break;
20578                case 'pagesize':
20579                    vm.pagesize = vm.widget.parameters[parameter].value;
20580                    break;
20581                case 'linecount':
20582                    vm.linecount = vm.widget.parameters[parameter].value;
20583                    break;
20584                case 'cardTransparency':
20585                    vm.cardTransparency = vm.widget.parameters[parameter].value === 'true';
20586                    break;
20587                case 'cardBackgroundImage':
20588                    vm.cardBackgroundImage = vm.widget.parameters[parameter].value;
20589                    break;
20590                case 'cardBackgroundImageHover':
20591                    vm.cardBackgroundImageHover = vm.widget.parameters[parameter].value;
20592                    break;
20593                case 'cardBackgroundColor':
20594                    vm.cardBackgroundColor = vm.widget.parameters[parameter].value;
20595                    break;
20596                case 'cardBorder':
20597                    vm.cardBorder = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
20598                    break;
20599            }
20600        }
20601
20602        getItems();        
20603
20604        vm.onFilterChange = function (filters) {            
20605            vm.page = 1;
20606            vm.selectedFilters = filters;
20607            getItems();            
20608        }
20609
20610        vm.onPageChange = function (page) {                    
20611            if (page >= 1 && page <= vm.totalPages && vm.page != page) {
20612                vm.page = page;
20613                getItems();
20614            }
20615        }
20616
20617        vm.getPageRange = function () {
20618            return _.range(Math.max(vm.page - 2, 1), Math.min(vm.page + 3, vm.totalPages + 1))
20619        }
20620
20621        vm.getStyle = function () {
20622            var style = {};
20623            if (!vm.widgetTransparency) {
20624                
20625                style['background-color'] = vm.backgroundColor;
20626                style['background-size'] = 'cover';
20627                style['background-position'] = 'center';
20628                
20629                if (vm.backgroundImage) {                
20630                    style['background-image'] = `url(${vm.backgroundImage})`;
20631                }
20632                
20633                style['border-color'] = vm.border.color;
20634            }   
20635
20636            style['border-width'] = `${vm.border.width}px`;
20637            style['border-color'] = vm.border.color;
20638            style['border-radius'] = `${vm.border.radius}px`;
20639
20640            return style;
20641        }
20642
20643        vm.getCardStyle = function () {            
20644            var style = {};
20645            if (!vm.cardTransparency) {
20646                style['background-color'] = vm.cardBackgroundColor;
20647                style['background-size'] = 'cover';
20648                style['background-position'] = 'center';
20649                style['border-color'] = vm.cardBorder.color;
20650
20651                if (vm.cardBackgroundImage) {
20652                    style['background-image'] = `url(${vm.cardBackgroundImage})`;
20653                }
20654
20655                if (vm.cardBackgroundImageHover && vm.hover) {
20656                    style['background-image'] = `url(${vm.cardBackgroundImageHover})`;
20657                }
20658            }
20659
20660            style['border-width'] = `${vm.cardBorder.width}px`;
20661            style['border-color'] = vm.cardBorder.color;
20662            style['border-radius'] = `${vm.cardBorder.radius}px`;
20663            return style;
20664        }
20665
20666        vm.getImgStyle = function (item, hover) {
20667            var style = {};
20668            var hoverStyle = {};
20669            if (vm.cardTransparency) {
20670                style = { 'display': 'none' };
20671                hoverStyle = { 'display': 'none' };
20672            }
20673            else if (item.hover && vm.cardBackgroundImageHover) {
20674                style = { 'opacity': 0 };
20675                hoverStyle = { 'opacity': 1 };                
20676            } else {
20677                style = { 'opacity': 1 };
20678                hoverStyle = { 'opacity': 0 };
20679            }
20680
20681            if (hover) {
20682                return hoverStyle
20683            }
20684
20685            return style;
20686        }
20687
20688        function getItems() {
20689            if(vm.listId) {            
20690                return listService.getListItems(__solutionId__, vm.listId, vm.page, vm.pagesize, _.filter(vm.selectedFilters, function (filter) { return filter.name !== undefined })).then(function (list) {
20691                    vm.list = list.data.results;
20692                    vm.totalPages = Math.ceil(list.data.totalCount / vm.pagesize);
20693                })
20694            }
20695        }
20696
20697        // Triggered when parameters are changed.
20698        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {                        
20699            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
20700                .then(function (response) {
20701                    // Save parameters                    
20702                    for (var parameter in vm.widget.parameters) {
20703                        switch (vm.widget.parameters[parameter].id) {
20704                            case 'title':
20705                                vm.widget.parameters[parameter].value = data.title;
20706                                vm.title = data.title;
20707                                break;
20708
20709                            case 'content':                                
20710                                vm.widget.parameters[parameter].value = data.content;
20711                                vm.content = $sce.trustAsHtml(data.content);
20712                                break;
20713
20714                            case 'showTitle':
20715                                vm.widget.parameters[parameter].value = data.showTitle.toString();
20716                                vm.showTitle = data.showTitle;
20717                                break;
20718
20719                            case 'widgetTransparency':                                
20720                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
20721                                vm.widgetTransparency = data.widgetTransparency;                                
20722                                break;
20723
20724                            case 'backgroundColor':
20725                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
20726                                vm.backgroundColor = data.backgroundColor;
20727                                break;
20728
20729                            case 'backgroundImage':
20730                                vm.widget.parameters[parameter].value = data.backgroundImage;
20731                                vm.backgroundImage = data.backgroundImage;
20732                                break;
20733
20734                            case 'border':
20735                                vm.widget.parameters[parameter].value = data.border;
20736                                vm.border = angular.fromJson(data.border.replace(/\'/g, '"'));
20737                                break;
20738
20739                            case 'template':                                                              
20740                                vm.widget.parameters[parameter].value = data.template;
20741                                vm.template = _.find(templateList, { id: data.template });                    
20742                                break;
20743
20744                            case 'templateItems':
20745                                vm.widget.parameters[parameter].value = data.templateItems;
20746                                vm.templateItems = angular.fromJson(data.templateItems.replace(/\\\\'/g, '\\\'').replace(/\'/g, '"'));
20747                                break;
20748
20749                            case 'filters':                                
20750                                vm.widget.parameters[parameter].value = data.filters;
20751                                vm.filters = angular.fromJson(data.filters.replace(/\\\\'/g, '\\\"').replace(/\'/g, '"'));
20752                                break
20753
20754                            case 'list':
20755                                vm.widget.parameters[parameter].value = data.list;
20756                                vm.listId = data.list;
20757                                vm.list = {};
20758                                break;
20759
20760                            case 'pagesize':
20761                                vm.widget.parameters[parameter].value = data.pagesize;
20762                                vm.pagesize = data.pagesize;
20763                                break
20764
20765                            case 'linecount':
20766                                vm.widget.parameters[parameter].value = data.linecount;
20767                                vm.linecount = data.linecount;
20768                                break;
20769
20770                            case 'cardTransparency':                                
20771                                vm.widget.parameters[parameter].value = data.cardTransparency.toString();
20772                                vm.cardTransparency = data.cardTransparency;                                
20773                                break;
20774
20775                            case 'cardBackgroundImage':
20776                                vm.widget.parameters[parameter].value = data.cardBackgroundImage;
20777                                vm.cardBackgroundImage = data.cardBackgroundImage;
20778                                break;
20779
20780                            case 'cardBackgroundImageHover':
20781                                vm.widget.parameters[parameter].value = data.cardBackgroundImageHover;
20782                                vm.cardBackgroundImageHover = data.cardBackgroundImageHover;
20783                                break;
20784
20785                            case 'cardBackgroundColor':
20786                                vm.widget.parameters[parameter].value = data.cardBackgroundColor.toString();
20787                                vm.cardBackgroundColor = data.cardBackgroundColor;
20788                                break;
20789
20790                            case 'cardBorder':
20791                                vm.widget.parameters[parameter].value = data.cardBorder;
20792                                vm.cardBorder = angular.fromJson(data.cardBorder.replace(/\'/g, '"'));
20793                                break;
20794                        }                    
20795                    }
20796
20797                    vm.page = 1;
20798                    vm.selectedFilters = [];
20799                    getItems();
20800
20801                    // Update the variable.
20802                    widgets[$scope.widget] = angular.toJson(vm.widget);
20803                })
20804                .catch(function (error) {
20805                    bugsnag.notify(error);
20806                });
20807        });
20808
20809        $scope.$on('$destroy', listener);
20810    }
20811})();
20812;
20813(function () {
20814    'use strict';
20815
20816    angular
20817        .module('app.directives')
20818        .directive('cardList', cardList)
20819
20820    cardList.$inject = [];
20821
20822    function cardList() {
20823        return {
20824            restrict: 'E',
20825            scope: {                
20826                widget: '='
20827            },
20828            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/card-list/card-list.tpl.html',
20829            controller: 'CardListWidgetController',
20830            controllerAs: 'cardList'
20831        };
20832    }
20833})();;
20834(function () {
20835    'use strict';
20836
20837    angular
20838        .module('app.directives')
20839        .controller('CardListFiltersController', CardListFiltersController);
20840
20841    CardListFiltersController.$inject = ['$scope', '$translate', 'ListService'];
20842
20843    function CardListFiltersController($scope, $translate, listService) {
20844        var vm = this;                
20845        vm.fields = [];
20846
20847        getFilters($scope.listId, $scope.filters);
20848
20849        $scope.$watchGroup(['listId', 'filters'], function (values) {
20850            getFilters(values[0], values[1]);
20851        });
20852
20853        vm.filterChange = function (item) {                        
20854            if ($scope.onFilter) {
20855                var filters = _.map(vm.fields, function (field) { return field.filter });
20856                $scope.onFilter(filters);
20857            }
20858        }
20859
20860        vm.searchFilter = function (text, filter) {
20861            filter.filter.name = text;
20862            vm.filterChange();
20863        }
20864
20865        vm.selectFilter = function (item, filter) {            
20866            filter.filter.name = item.Id
20867            vm.filterChange();
20868        }
20869
20870        function getFilters(listId, filters) {
20871            if (listId && filters) {
20872                listService.getFilterOptions(__solutionId__, listId, filters).then(function (response) {
20873                    var filters = response.data;
20874                    vm.fields = _.map(filters, function (filter) {
20875                        var field = {};
20876                        field.filter = { id: filter.id, type: filter.type };
20877                        field.options = [];
20878                        field.name = filter.name;
20879
20880                        if (filter.type == 'select') {
20881                            var options = [];
20882
20883                            field.options = [{ Id: undefined, Name: $translate.instant('directives.widgets.cardList.all') }].concat(_.map(filter.values, function (option) { return { Id: option, Name: option } }));
20884                        }
20885                        return field;
20886                    });
20887                });
20888            }
20889        }
20890    }
20891})();
20892;
20893(function () {
20894    'use strict';
20895
20896    angular
20897        .module('app.directives')
20898        .directive('cardListFilters', cardListFilters)
20899
20900    cardListFilters.$inject = ['$translate', 'ListService', 'GuidService'];
20901
20902    function cardListFilters($translate, listService, guidService) {
20903        return {
20904            restrict: 'E',
20905            scope: {                
20906                filters: '=',
20907                fields: '=',
20908                items: '=',
20909                listId: '=',
20910                onFilter: '=',
20911            },
20912            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/card-list/filters/card-list-filters.tpl.html',
20913            controller: 'CardListFiltersController',
20914            controllerAs: 'cardListFilters',
20915            link: function (scope, element, attributes, controller) {                                           
20916                
20917            }
20918        };
20919    }
20920})();;
20921(function () {
20922    'use strict';
20923
20924    angular
20925        .module('app.directives')
20926        .controller('HtmlWidgetAdminWidgetController', HtmlWidgetAdminWidgetController);
20927
20928    HtmlWidgetAdminWidgetController.$inject = ['$scope', '$rootScope', '$sce', 'WebsiteEditorService'];
20929
20930    function HtmlWidgetAdminWidgetController($scope, $rootScope, $sce, websiteEditorService) {
20931        var vm = this;
20932        vm.widget = angular.fromJson(widgets[$scope.widget]);
20933        vm.config = {};
20934
20935        //On component mount
20936        for (var parameter in vm.widget.parameters) {
20937            switch (vm.widget.parameters[parameter].id) {
20938                case 'html':
20939                    vm.config = angular.fromJson(unescape(vm.widget.parameters[parameter].value));
20940                    vm.html = $sce.trustAsHtml(vm.config.data);
20941                    vm.fixedHeight = vm.config.fixedHeight;
20942                    vm.height = vm.config.height;
20943                    break;
20944            }
20945        }
20946
20947        //Listener
20948        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
20949            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
20950                .then(function () {
20951                    for (var parameter in vm.widget.parameters) {
20952                        switch (vm.widget.parameters[parameter].id) {
20953                            case 'html':
20954                                vm.widget.parameters[parameter].value = data.html;
20955                                vm.config = angular.fromJson(unescape(data.html));
20956                                vm.html = $sce.trustAsHtml(vm.config.data);
20957                                vm.fixedHeight = vm.config.fixedHeight;
20958                                vm.height = vm.config.height;
20959                                break;
20960                        }
20961                    }
20962                    widgets[$scope.widget] = angular.toJson(vm.widget);
20963                })
20964                .catch(function (error) {
20965                    bugsnag.notify(error);
20966                });
20967        });
20968
20969        $scope.$on('$destroy', listener);
20970    }
20971})();
20972;
20973(function () {
20974    'use strict';
20975
20976    angular
20977        .module('app.directives')
20978        .directive('htmlWidgetAdmin', htmlWidgetAdmin)
20979
20980    htmlWidgetAdmin.$inject = [];
20981
20982    function htmlWidgetAdmin() {
20983        return {
20984            restrict: 'E',
20985            scope: {
20986                widget: '='
20987            },
20988            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/html-admin/html-widget-admin.tpl.html',
20989            controller: 'HtmlWidgetAdminWidgetController',
20990            controllerAs: 'htmlWidgetAdmin'
20991        };
20992    }
20993})();;
20994(function () {
20995    'use strict';
20996
20997    angular
20998        .module('app.directives')
20999        .controller('HtmlWidgetWidgetController', HtmlWidgetWidgetController);
21000
21001    HtmlWidgetWidgetController.$inject = ['$scope', '$rootScope', '$sce', 'WebsiteEditorService'];
21002
21003    function HtmlWidgetWidgetController($scope, $rootScope, $sce, websiteEditorService) {
21004        var vm = this;
21005        vm.widget = angular.fromJson(widgets[$scope.widget]);
21006        vm.config = {};
21007
21008        //On component mount
21009        for (var parameter in vm.widget.parameters) {
21010            switch (vm.widget.parameters[parameter].id) {
21011                case 'html':
21012                    vm.config = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\\\\'/g, '\\\"').replace(/\'/g, '"'));
21013                    vm.html = $sce.trustAsHtml(vm.config.data);
21014                    vm.fixedHeight = vm.config.fixedHeight;
21015                    vm.height = vm.config.height;
21016                    break;
21017            }
21018        }
21019
21020        //Listener
21021        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
21022            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
21023                .then(function () {
21024                    for (var parameter in vm.widget.parameters) {
21025                        switch (vm.widget.parameters[parameter].id) {
21026                            case 'html':
21027                                vm.widget.parameters[parameter].value = data.html;
21028                                vm.config = angular.fromJson(data.html.replace(/\\\\'/g, '\\\'').replace(/\'/g, '"'));
21029                                vm.html = $sce.trustAsHtml(vm.config.data);
21030                                vm.fixedHeight = vm.config.fixedHeight;
21031                                vm.height = vm.config.height;
21032                                break;
21033                        }
21034                    }
21035                    widgets[$scope.widget] = angular.toJson(vm.widget);
21036                })
21037                .catch(function (error) {
21038                    bugsnag.notify(error);
21039                });
21040        });
21041
21042        $scope.$on('$destroy', listener);
21043    }
21044})();
21045;
21046(function () {
21047    'use strict';
21048
21049    angular
21050        .module('app.directives')
21051        .directive('htmlWidget', htmlWidget)
21052
21053    htmlWidget.$inject = [];
21054
21055    function htmlWidget() {
21056        return {
21057            restrict: 'E',
21058            scope: {
21059                widget: '='
21060            },
21061            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/html/html-widget.tpl.html',
21062            controller: 'HtmlWidgetWidgetController',
21063            controllerAs: 'htmlWidget'
21064        };
21065    }
21066})();;
21067(function () {
21068    'use strict';
21069
21070    angular
21071        .module('app.directives')
21072        .controller('HtmlWidgetAdminTranslatableController', HtmlWidgetAdminTranslatableController);
21073
21074    HtmlWidgetAdminTranslatableController.$inject = ['$scope', '$rootScope', '$sce', '$localStorage', 'WebsiteEditorService', 'TextService'];
21075
21076    function HtmlWidgetAdminTranslatableController($scope, $rootScope, $sce, $localStorage, websiteEditorService, textService) {
21077        var vm = this;
21078        vm.widget = angular.fromJson(widgets[$scope.widget]);
21079        vm.config = {};
21080
21081        vm.selectedLanguage = angular.isUndefined($localStorage.currentLanguage)
21082            ? __defaultLanguage__
21083            : $localStorage.currentLanguage.culture;
21084
21085        vm.getLocalizedValue = function (array, isHtml) {         
21086            var value = "";
21087            if (array && vm.selectedLanguage) {
21088                if (_.isArray(array)) {
21089
21090                    var localizedText = _.find(array, { culture: vm.selectedLanguage });
21091                    if (localizedText) {
21092                        value = localizedText.value;
21093                    }
21094                    else {
21095                        value = (array[0] || {}).value || "";
21096                    }
21097                }
21098                else {
21099                    value = array;
21100                }
21101            }
21102
21103            if (isHtml) {
21104                return value;
21105            }
21106
21107            return value;
21108        }
21109
21110        //On component mount
21111        for (var parameter in vm.widget.parameters) {
21112            switch (vm.widget.parameters[parameter].id) {
21113                case 'html':
21114                    vm.config = angular.fromJson(unescape(vm.widget.parameters[parameter].value));
21115                    if (vm.config.data) {
21116                        vm.html = angular.fromJson(textService.atob(vm.config.data));
21117                    }
21118                    else {
21119                        vm.html = [];
21120                    }
21121                    vm.fixedHeight = vm.config.fixedHeight;
21122                    vm.height = vm.config.height;
21123                    break;
21124            }
21125        }
21126
21127        //Listener
21128        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
21129                websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
21130                .then(function () {
21131                    for (var parameter in vm.widget.parameters) {
21132                        switch (vm.widget.parameters[parameter].id) {
21133                            case 'html':
21134                                vm.widget.parameters[parameter].value = data.html;
21135                                vm.config = angular.fromJson(unescape(data.html));
21136                                if (vm.config.data) {
21137                                    vm.html = angular.fromJson(textService.atob(vm.config.data));
21138                                }
21139                                else {
21140                                    vm.html = [];
21141                                }
21142                                vm.fixedHeight = vm.config.fixedHeight;
21143                                vm.height = vm.config.height;
21144                                break;
21145                        }
21146                    }
21147                    widgets[$scope.widget] = angular.toJson(vm.widget);
21148                })
21149                .catch(function (error) {
21150                    bugsnag.notify(error);
21151                });
21152        });
21153
21154        $scope.$on('$destroy', listener);
21155    }
21156})();
21157;
21158(function () {
21159    'use strict';
21160
21161    angular
21162        .module('app.directives')
21163        .directive('htmlWidgetAdminTranslatable', htmlWidgetAdminTranslatable)
21164
21165    htmlWidgetAdminTranslatable.$inject = [];
21166
21167    function htmlWidgetAdminTranslatable() {
21168        return {
21169            restrict: 'E',
21170            scope: {
21171                widget: '='
21172            },
21173            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/html-widget-admin-translatable/html-widget-admin-translatable.tpl.html',
21174            controller: 'HtmlWidgetAdminTranslatableController',
21175            controllerAs: 'htmlWidgetAdminTranslatable'
21176        };
21177    }
21178})();
21179;
21180(function () {
21181    'use strict';
21182
21183    angular
21184        .module('app.directives')
21185        .controller('SponsorBoxWidgetController', SponsorBoxWidgetController);
21186
21187    SponsorBoxWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$timeout', 'WebsiteEditorService'];
21188
21189    function SponsorBoxWidgetController($rootScope, $scope, $localStorage, $timeout, websiteEditorService) {
21190        var vm = this;
21191
21192        //State variables -----
21193        vm.widget = angular.fromJson(widgets[$scope.widget]);
21194        vm.images = [];
21195        vm.randomOrder = false;
21196        vm.title = "";
21197        vm.animation = "slide";
21198        vm.showTitle = false;
21199
21200        //Component mount -----
21201        for (var parameter in vm.widget.parameters) {
21202            switch (vm.widget.parameters[parameter].id) {
21203                case 'title':
21204                    vm.title = vm.widget.parameters[parameter].value;
21205                    break;
21206
21207                case 'showTitle':
21208                    vm.showTitle = vm.widget.parameters[parameter].value === 'true';
21209                    break;
21210
21211                case 'imageDuration':
21212                    vm.imageDuration = parseInt(vm.widget.parameters[parameter].value);
21213                    break;
21214
21215                case 'randomOrder':
21216                    vm.randomOrder = vm.widget.parameters[parameter].value === 'true';
21217                    break;
21218
21219                case 'animation':
21220                    vm.animation = vm.widget.parameters[parameter].value;
21221                    break;
21222
21223                case 'multipleImageUpload':
21224                    vm.images = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
21225                    break;
21226            }
21227        }
21228
21229        formatImages();
21230        carousel();
21231
21232        // Listener
21233        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
21234            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
21235                .then(function () {
21236                    for (var parameter in vm.widget.parameters) {
21237                        switch (vm.widget.parameters[parameter].id) {
21238                            case 'title':
21239                                vm.title = data.title;
21240                                vm.widget.parameters[parameter].value = data.title;
21241                                break;
21242
21243                            case 'showTitle':
21244                                vm.showTitle = data.showTitle;
21245                                vm.widget.parameters[parameter].value = data.showTitle.toString();
21246                                break;
21247
21248                            case 'imageDuration':
21249                                vm.imageDuration = parseInt(data.imageDuration);
21250                                vm.widget.parameters[parameter].value = data.imageDuration;
21251                                break;
21252
21253                            case 'randomOrder':
21254                                vm.randomOrder = data.randomOrder;
21255                                vm.widget.parameters[parameter].value = data.randomOrder.toString();
21256                                break;
21257
21258                            case 'animation':
21259                                vm.animation = data.animation;
21260                                vm.widget.parameters[parameter].value = data.animation;
21261                                break;
21262
21263                            case 'multipleImageUpload':
21264                                vm.images = angular.fromJson(data.multipleImageUpload.replace(/\'/g, '"'));
21265                                vm.widget.parameters[parameter].value = data.multipleImageUpload;
21266                                break;
21267                        }
21268                    }
21269                    widgets[$scope.widget] = angular.toJson(vm.widget);
21270                    formatImages();
21271                    setTimeCarousel();
21272                })
21273                .catch(function (error) {
21274                    bugsnag.notify(error);
21275                });
21276        });
21277
21278        $scope.$on('$destroy', listener);
21279
21280        // Helpers
21281        function formatImages() {
21282            if (vm.randomOrder) {
21283                vm.images = _.shuffle(vm.images);
21284            }
21285        }
21286        function carousel() {
21287            $timeout(function () {
21288                vm.logImpression(0); //Log impression on first image
21289                vm.startCarousel(vm.imageDuration * 1000);
21290            }, 2000);
21291        }
21292
21293        function setTimeCarousel() {
21294            vm.pauseCarousel();
21295            $timeout(function () {
21296                vm.startCarousel(vm.imageDuration * 1000);
21297            }, 1000);
21298        }
21299    }
21300})();
21301;
21302(function () {
21303    'use strict';
21304
21305    angular
21306        .module('app.directives')
21307        .directive('sponsorBox', sponsorBox)
21308
21309    sponsorBox.$inject = [];
21310
21311    function sponsorBox() {
21312        return {
21313            restrict: 'E',
21314            scope: {
21315                widget: '='
21316            },
21317            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/image/sponsor/sponsor-box.tpl.html',
21318            controller: 'SponsorBoxWidgetController',
21319            controllerAs: 'sponsorBox',
21320            link: function (scope, element, attr, controller) {
21321                var vm = controller;
21322                vm.currentIndex = 0;
21323
21324                document.addEventListener('scroll', function () {
21325                    if (isInViewport()) {
21326                        vm.logImpression(vm.currentIndex);
21327                    }                
21328                }, {
21329                    passive: true
21330                });
21331
21332                vm.logImpression = function (index) {
21333                    if (vm.images[index] && !vm.images[index].impression && isInViewport()) {
21334                        if (gtag) {                            
21335                            gtag('event', 'impression', {
21336                                'event_category': 'sponsorwidget',
21337                                'event_label': 'impression',
21338                                'event_value': `solutionid:${__solutionId__},imageid:${vm.images[index].id}`
21339                            });
21340                        } else {
21341                            console.log('send', 'event', 'sponsorwidget', 'impression', `solutionid:${__solutionId__},imageid:${vm.images[index].id}`);
21342                        }
21343                        vm.images[index].impression = true;
21344                    }
21345                }
21346
21347                vm.clickSponsor = function (index) {
21348                    if (vm.images.length > index) {
21349                        if (gtag) {
21350                            gtag('event', 'click', {
21351                                'event_category': 'sponsorwidget',
21352                                'event_label': 'click',
21353                                'event_value': `solutionid:${__solutionId__},imageid:${vm.images[index].id}`
21354                            });
21355                        } else {
21356                            console.log('send', 'event', 'sponsorwidget', 'click', `solutionid:${__solutionId__},imageid:${vm.images[index].id}`);
21357                        }
21358                    }
21359                }
21360
21361                vm.startCarousel = function (time) {
21362                    $(`#carousel-${scope.widget}`).carousel({
21363                        interval: time,
21364                        keyboard: false,
21365                        pause: false
21366                    });
21367                    $(`#carousel-${scope.widget}`).on('slide.bs.carousel', function (e, a, b) {
21368                        vm.currentIndex = e.to;
21369                        vm.logImpression(e.to);
21370                    })
21371                }
21372
21373                vm.pauseCarousel = function () {
21374                    $(`#carousel-${scope.widget}`).carousel('dispose');
21375                }
21376
21377                function isInViewport() {
21378                    if (angular.element.find(`#carousel-${scope.widget}`)[0]) {
21379                        const rect = angular.element.find(`#carousel-${scope.widget}`)[0].getBoundingClientRect();
21380                        return (
21381                            rect.top >= 0 &&
21382                            rect.left >= 0 &&
21383                            rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
21384                            rect.right <= (window.innerWidth || document.documentElement.clientWidth)
21385                        );
21386                    }
21387                    return false;
21388                }
21389            }
21390        };
21391    }
21392})();;
21393(function () {
21394    'use strict';
21395
21396    angular
21397        .module('app.directives')
21398        .controller('ImageCarouselWidgetController', ImageCarouselWidgetController);
21399
21400    ImageCarouselWidgetController.$inject = ['$rootScope', '$scope', '$timeout', 'WebsiteEditorService'];
21401
21402    function ImageCarouselWidgetController($rootScope, $scope, $timeout, websiteEditorService) {
21403        var vm = this;
21404
21405        //State variables -----
21406        vm.widget = angular.fromJson(widgets[$scope.widget]);
21407        vm.images = [];
21408        vm.randomOrder = false;
21409        vm.title = "";
21410        vm.animation = "slide";
21411        vm.showTitle = false;
21412
21413        //Component mount -----
21414        for (var parameter in vm.widget.parameters) {
21415            switch (vm.widget.parameters[parameter].id) {
21416                case 'title':
21417                    vm.title = vm.widget.parameters[parameter].value;
21418                    break;
21419
21420                case 'showTitle':
21421                    vm.showTitle = vm.widget.parameters[parameter].value === 'true';
21422                    break;
21423
21424                case 'imageDuration':
21425                    vm.imageDuration = parseInt(vm.widget.parameters[parameter].value);
21426                    break;
21427
21428                case 'randomOrder':
21429                    vm.randomOrder = vm.widget.parameters[parameter].value === 'true';
21430                    break;
21431
21432                case 'animation':
21433                    vm.animation = vm.widget.parameters[parameter].value;
21434                    break;
21435
21436                case 'multipleImageUpload':
21437                    vm.images = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
21438                    break;
21439            }
21440        }
21441
21442        formatImages();
21443        carousel();
21444
21445        // Listener
21446        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
21447            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
21448                .then(function () {
21449                    for (var parameter in vm.widget.parameters) {
21450                        switch (vm.widget.parameters[parameter].id) {
21451                            case 'title':
21452                                vm.title = data.title;
21453                                vm.widget.parameters[parameter].value = data.title;
21454                                break;
21455
21456                            case 'showTitle':
21457                                vm.showTitle = data.showTitle;
21458                                vm.widget.parameters[parameter].value = data.showTitle.toString();
21459                                break;
21460
21461                            case 'imageDuration':
21462                                vm.imageDuration = parseInt(data.imageDuration);
21463                                vm.widget.parameters[parameter].value = data.imageDuration;
21464                                break;
21465
21466                            case 'randomOrder':
21467                                vm.randomOrder = data.randomOrder;
21468                                vm.widget.parameters[parameter].value = data.randomOrder.toString();
21469                                break;
21470
21471                            case 'animation':
21472                                vm.animation = data.animation;
21473                                vm.widget.parameters[parameter].value = data.animation;
21474                                break;
21475
21476                            case 'multipleImageUpload':
21477                                vm.images = angular.fromJson(data.multipleImageUpload.replace(/\'/g, '"'));
21478                                vm.widget.parameters[parameter].value = data.multipleImageUpload;
21479                                break;
21480                        }
21481                    }
21482                    widgets[$scope.widget] = angular.toJson(vm.widget);
21483                    formatImages();
21484                    setTimeCarousel();
21485                })
21486                .catch(function (error) {
21487                    bugsnag.notify(error);
21488                });
21489        });
21490
21491        $scope.$on('$destroy', listener);
21492
21493        // Helpers
21494        function formatImages() {
21495            if (vm.randomOrder) {
21496                vm.images = _.shuffle(vm.images);
21497            }
21498        }
21499        function carousel() {
21500            $timeout(function () {
21501                vm.startCarousel(vm.imageDuration * 1000);
21502            }, 2000);
21503        }
21504
21505        function setTimeCarousel() {
21506            vm.pauseCarousel();
21507            $timeout(function () {
21508                vm.startCarousel(vm.imageDuration * 1000);
21509            }, 1000);
21510        }
21511    }
21512})();
21513;
21514(function () {
21515    'use strict';
21516
21517    angular
21518        .module('app.directives')
21519        .directive('imageCarousel', imageCarousel)
21520
21521    imageCarousel.$inject = [];
21522
21523    function imageCarousel() {
21524        return {
21525            restrict: 'E',
21526            scope: {
21527                widget: '='
21528            },
21529            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/image/carousel/image-carousel.tpl.html',
21530            controller: 'ImageCarouselWidgetController',
21531            controllerAs: 'imageCarousel',
21532            link: function (scope, element, attr, controller) {
21533                var vm = controller;
21534
21535                vm.startCarousel = function (time) {
21536                    $(`#carousel-${scope.widget}`).carousel({
21537                        interval: time,
21538                        keyboard: false,
21539                        pause: false
21540                    });
21541                }
21542
21543                vm.pauseCarousel = function () {
21544                    $(`#carousel-${scope.widget}`).carousel('dispose');
21545                }
21546            }
21547        };
21548    }
21549})();;
21550(function () {
21551    'use strict';
21552
21553    angular
21554        .module('app.directives')
21555        .controller('NewsDetailsWidgetController', NewsDetailsWidgetController);
21556
21557    NewsDetailsWidgetController.$inject = ['$scope', '$sce'];
21558
21559    function NewsDetailsWidgetController($scope, $sce) {
21560        var vm = this;
21561        
21562        // Apply website values to view model object.
21563        vm.widget = angular.fromJson(widgets[$scope.widget]);
21564        
21565        Object.assign(vm, __news__);
21566
21567        vm.text = $sce.trustAsHtml(vm.text.replace(/\\"/g, '"'));
21568    }
21569})();
21570;
21571(function () {
21572    'use strict';
21573
21574    angular
21575        .module('app.directives')
21576        .directive('newsDetails', newsDetails);
21577
21578    newsDetails.$inject = [];
21579
21580    function newsDetails() {
21581        return {
21582            restrict: 'E',
21583            scope: {                
21584                widget: '='
21585            },
21586            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/news/details/news-details.tpl.html',
21587            controller: 'NewsDetailsWidgetController',
21588            controllerAs: 'news',
21589            link: function (scope, element, attribute, controller) {
21590                
21591            }
21592        };
21593    }
21594})();;
21595(function () {
21596    'use strict';
21597
21598    angular
21599        .module('app.directives')
21600        .controller('LatestNewsWidgetController', LatestNewsWidgetController);
21601
21602    LatestNewsWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', 'WebsiteEditorService', 'UrlService', 'NewsService'];
21603
21604    function LatestNewsWidgetController($rootScope, $scope, $localStorage, websiteEditorService, urlService, newsService) {
21605        var vm = this;
21606        vm.url = urlService;
21607        vm.all = [];
21608
21609        // Apply website values to view model object.
21610        vm.widget = angular.fromJson(widgets[$scope.widget]);
21611
21612        // Triggered when parameters are changed.
21613        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function(event, data) {
21614            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
21615                .then(function(response) {
21616                    // Update the news feed.
21617                    getLatestNews(parseInt(data["nbNewsDisplayed"]), data["tags"]);
21618                    
21619                    // Update widget variable.
21620                    var newsDisplayedParam = _.find(vm.widget.parameters, { id: 'nbNewsDisplayed' });
21621                    if (newsDisplayedParam) {
21622                        newsDisplayedParam.value = parseInt(data["nbNewsDisplayed"]);
21623                    }
21624
21625                    var tagsParam = _.find(vm.widget.parameters, { id: 'tags' });
21626                    if (tagsParam) {
21627                        tagsParam.value = data["tags"];
21628                    }
21629
21630                    widgets[$scope.widget] = angular.toJson(vm.widget);
21631                }) 
21632                .catch(function(error) {
21633                    bugsnag.notify(error);
21634                });
21635        });
21636
21637        $scope.$on('$destroy', listener);
21638
21639        // Load the latest news
21640        var nbNewsDisplayedParam = _.get(_.find(vm.widget.parameters, { id: 'nbNewsDisplayed' }), 'value');
21641        var tagsParam = _.get(_.find(vm.widget.parameters, { id: 'tags' }), 'value');
21642        getLatestNews(parseInt(nbNewsDisplayedParam), tagsParam); 
21643
21644        function getLatestNews(nbNewsDisplayed, tags) {        
21645            var tagsList = [];
21646
21647            if (tags) {
21648                tagsList = angular.fromJson(tags.replace(/'/g, '"'));
21649            }
21650
21651            if (tagsList.length > 0) {
21652                newsService.getNewsBySolutionTags(__solutionId__, { page: 1, pageSize: nbNewsDisplayed, culture: $localStorage.currentLanguage.culture, tags: tagsList })
21653                    .then(function (response) {
21654                        vm.all = response.data.Results; // All latest news.
21655                    })
21656                    .catch(function (error) {
21657                        bugsnag.notify(error);
21658                    });            
21659            }
21660            else {
21661                newsService.getNewsBySolutionId(__solutionId__, { page: 1, pageSize: nbNewsDisplayed, culture: $localStorage.currentLanguage.culture })
21662                    .then(function (response) {
21663                        vm.all = response.data.Results; // All latest news.
21664                    })
21665                    .catch(function (error) {
21666                        bugsnag.notify(error);
21667                    });            
21668            }
21669        }
21670    }
21671})();
21672;
21673(function () {
21674    'use strict';
21675
21676    angular
21677        .module('app.directives')
21678        .directive('latestNews', latestNews)
21679
21680    latestNews.$inject = [];
21681
21682    function latestNews() {
21683        return {
21684            restrict: 'E',
21685            scope: {                
21686                widget: '='
21687            },
21688            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/news/latest/latest-news.tpl.html',
21689            controller: 'LatestNewsWidgetController',
21690            controllerAs: 'latestNews'
21691        };
21692    }
21693})();;
21694(function () {
21695    'use strict';
21696
21697    angular
21698        .module('app.directives')
21699        .controller('LatestNewsPremiumWidgetController', LatestNewsPremiumWidgetController);
21700
21701    LatestNewsPremiumWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', 'WebsiteEditorService', 'UrlService', 'NewsService'];
21702
21703    function LatestNewsPremiumWidgetController($rootScope, $scope, $localStorage, websiteEditorService, urlService, newsService) {
21704        var vm = this;
21705        vm.url = urlService;
21706        vm.all = [];
21707
21708        vm.colors = { primary: { background: "#FFFFFF", text: "#000000", title: "#000000" }, secondary: { background: '#000000', text: '#FFFFFF', title: '#FFFFFF' } };
21709        vm.background = { image: '', position: '' }
21710
21711        // Apply website values to view model object.
21712        vm.widget = angular.fromJson(widgets[$scope.widget]);
21713
21714        vm.getStyle = function () {
21715            var style = {};
21716            if (!vm.widgetTransparency) {
21717                style['background-color'] = vm.backgroundColor;
21718                style['border-color'] = vm.border.color;                
21719            }
21720
21721            style['border-width'] = `${vm.border.width}px`;
21722            style['border-color'] = vm.border.color;
21723            style['border-radius'] = `${vm.border.radius}px`;
21724            return style;
21725        }
21726
21727        var tagsParam = [];
21728        for (var parameter in vm.widget.parameters) {
21729            switch (vm.widget.parameters[parameter].id) {
21730                case 'tags':
21731                    tagsParam = vm.widget.parameters[parameter].value;
21732                    break;
21733                case 'widgetTransparency':
21734                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
21735                    break;
21736                case 'backgroundColor':
21737                    vm.backgroundColor = vm.widget.parameters[parameter].value;
21738                    break;
21739                case 'backgroundImage':
21740                    vm.background.image = vm.widget.parameters[parameter].value;
21741                    break;
21742                case 'backgroundImagePosition':
21743                    vm.background.position = vm.widget.parameters[parameter].value;
21744                    break;
21745                case 'titleColor':
21746                    vm.titleColor = vm.widget.parameters[parameter].value;
21747                    break;
21748                case 'border':
21749                    vm.border = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
21750                    break;
21751                case 'primaryBackgroundColor':
21752                    vm.colors.primary.background = vm.widget.parameters[parameter].value;
21753                    break;
21754                case 'primaryTitleColor':
21755                    vm.colors.primary.title = vm.widget.parameters[parameter].value;
21756                    break;
21757                case 'primaryTextColor':
21758                    vm.colors.primary.text = vm.widget.parameters[parameter].value;
21759                    break;
21760                case 'secondaryBackgroundColor':
21761                    vm.colors.secondary.background = vm.widget.parameters[parameter].value;
21762                    break;
21763                case 'secondaryTitleColor':
21764                    vm.colors.secondary.title = vm.widget.parameters[parameter].value;
21765                    break;
21766                case 'secondaryTextColor':
21767                    vm.colors.secondary.text = vm.widget.parameters[parameter].value;
21768                    break;
21769            }
21770        }
21771
21772        // Triggered when parameters are changed.
21773        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function(event, data) {
21774            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
21775                .then(function(response) {
21776                    // Update the news feed.
21777                    getLatestNews(data["tags"]);
21778                    
21779                    var tagsParam = _.find(vm.widget.parameters, { id: 'tags' });
21780                    if (tagsParam) {
21781                        tagsParam.value = data["tags"];
21782                    }
21783
21784                    for (var parameter in vm.widget.parameters) {
21785                        switch (vm.widget.parameters[parameter].id) {                            
21786                            case 'widgetTransparency':
21787                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
21788                                vm.widgetTransparency = data.widgetTransparency;
21789                                break;
21790                            case 'backgroundColor':
21791                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
21792                                vm.backgroundColor = data.backgroundColor;
21793                                break;
21794                            case 'backgroundImage':
21795                                vm.widget.parameters[parameter].value = data.backgroundImage.toString();
21796                                vm.background.image = data.backgroundImage;
21797                                break;
21798                            case 'backgroundImagePosition':
21799                                vm.widget.parameters[parameter].value = data.backgroundImagePosition.toString();
21800                                vm.background.position = data.backgroundImagePosition;
21801                                break;
21802                            case 'titleColor':
21803                                vm.widget.parameters[parameter].value = data.titleColor.toString();
21804                                vm.titleColor = data.titleColor;
21805                                break;
21806                            case 'border':
21807                                vm.widget.parameters[parameter].value = data.border;
21808                                vm.border = angular.fromJson(data.border.replace(/\'/g, '"'));
21809                                break;
21810                            case 'primaryBackgroundColor':
21811                                vm.widget.parameters[parameter].value = data.primaryBackgroundColor.toString();
21812                                vm.colors.primary.background = data.primaryBackgroundColor;
21813                                break;
21814                            case 'primaryTitleColor':
21815                                vm.widget.parameters[parameter].value = data.primaryTitleColor.toString();
21816                                vm.colors.primary.title = data.primaryTitleColor;
21817                                break;
21818                            case 'primaryTextColor':
21819                                vm.widget.parameters[parameter].value = data.primaryTextColor.toString();
21820                                vm.colors.primary.text = data.primaryTextColor;
21821                                break;
21822                            case 'secondaryBackgroundColor':
21823                                vm.widget.parameters[parameter].value = data.secondaryBackgroundColor.toString();
21824                                vm.colors.secondary.background = data.secondaryBackgroundColor;
21825                                break;
21826                            case 'secondaryTitleColor':
21827                                vm.widget.parameters[parameter].value = data.secondaryTitleColor.toString();
21828                                vm.colors.secondary.title = data.secondaryTitleColor;
21829                                break;
21830                            case 'secondaryTextColor':
21831                                vm.widget.parameters[parameter].value = data.secondaryTextColor.toString();
21832                                vm.colors.secondary.text = data.secondaryTextColor;
21833                                break;
21834                        }
21835                    }
21836
21837                    widgets[$scope.widget] = angular.toJson(vm.widget);
21838                }) 
21839                .catch(function(error) {
21840                    bugsnag.notify(error);
21841                });
21842        });
21843
21844        $scope.$on('$destroy', listener);
21845        
21846        getLatestNews(tagsParam); 
21847
21848        function getLatestNews(tags) {        
21849            var tagsList = [];
21850
21851            if (tags) {
21852                tagsList = angular.fromJson(tags.replace(/'/g, '"'));
21853            }
21854
21855            if (tagsList.length > 0) {
21856                newsService.getNewsBySolutionTags(__solutionId__, { page: 1, pageSize: 3, culture: $localStorage.currentLanguage.culture, tags: tagsList })
21857                    .then(function (response) {
21858                        vm.all = response.data.Results; // All latest news.
21859                    })
21860                    .catch(function (error) {
21861                        bugsnag.notify(error);
21862                    });            
21863            }
21864            else {
21865                newsService.getNewsBySolutionId(__solutionId__, { page: 1, pageSize: 3, culture: $localStorage.currentLanguage.culture })
21866                    .then(function (response) {
21867                        vm.all = response.data.Results; // All latest news.
21868                    })
21869                    .catch(function (error) {
21870                        bugsnag.notify(error);
21871                    });            
21872            }
21873        }
21874    }
21875})();
21876;
21877(function () {
21878    'use strict';
21879
21880    angular
21881        .module('app.directives')
21882        .directive('latestNewsPremium', latestNewsPremium)
21883
21884    latestNewsPremium.$inject = [];
21885
21886    function latestNewsPremium() {
21887        return {
21888            restrict: 'E',
21889            scope: {                
21890                widget: '='
21891            },
21892            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/news/latest-premium/latest-news-premium.tpl.html',
21893            controller: 'LatestNewsPremiumWidgetController',
21894            controllerAs: 'latestNewsPremium'
21895        };
21896    }
21897})();;
21898(function () {
21899    'use strict';
21900
21901    angular
21902        .module('app.directives')
21903        .controller('LatestNewPremiumWidgetController', LatestNewPremiumWidgetController);
21904
21905    LatestNewPremiumWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', 'WebsiteEditorService', 'UrlService', 'NewsService'];
21906
21907    function LatestNewPremiumWidgetController($rootScope, $scope, $localStorage, websiteEditorService, urlService, newsService) {
21908        var vm = this;
21909        vm.url = urlService;
21910        vm.news = $scope.news;
21911
21912        vm.getBackgroundStyle = function () {
21913            var style = {};
21914
21915            if ($scope.background && $scope.background.image) {
21916                style['background-image'] = `url(${$scope.background.image})`;
21917                style['background-repeat'] = 'no-repeat';
21918                style['background-position'] = $scope.background.position || 'center center';
21919            }
21920
21921            return style;
21922        }
21923
21924        $scope.$watch('news', function (news) {            
21925            vm.news = news;
21926            if (news) {
21927                vm.clampLead();
21928            }
21929        })
21930    }
21931})();
21932;
21933(function () {
21934    'use strict';
21935
21936    angular
21937        .module('app.directives')
21938        .directive('latestNewPremium', latestNewPremium)
21939
21940    latestNewPremium.$inject = ['$timeout'];
21941
21942    function latestNewPremium($timeout) {
21943        return {
21944            restrict: 'E',
21945            replace: true,
21946            scope: {                
21947                news: '=',
21948                primary: '=',
21949                colors: '=',
21950                background: '=',
21951            },
21952            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/news/latest-premium/latest-new-premium/latest-new-premium.tpl.html',
21953            controller: 'LatestNewPremiumWidgetController',
21954            controllerAs: 'latestNewPremium',
21955
21956            link: function (scope, element, attributes, controller) {
21957                controller.clampLead = function () {
21958                    $timeout(function () { 
21959                        $clamp(element[0].getElementsByClassName('lead')[0], { clamp: 'auto' });
21960                    })
21961                }
21962            }
21963        };
21964    }
21965})();;
21966(function () {
21967    'use strict';
21968
21969    angular
21970        .module('app.directives')
21971        .controller('NewsCarouselWidgetController', NewsCarouselWidgetController);
21972
21973    NewsCarouselWidgetController.$inject = ['$rootScope', '$timeout', '$scope', '$localStorage', 'WebsiteEditorService', 'UrlService', 'NewsService'];
21974
21975    function NewsCarouselWidgetController($rootScope, $timeout, $scope, $localStorage, websiteEditorService, urlService, newsService) {
21976        var vm = this;
21977
21978        //State variables
21979        vm.startedCarousel = false;
21980        vm.url = urlService;
21981        vm.news = [];
21982        vm.imageDuration = 5000;
21983        vm.nbNewsDisplayed = 4;
21984        vm.animation = 'slide';
21985        vm.tags = [];
21986        vm.widget = angular.fromJson(widgets[$scope.widget]);
21987
21988        //Component mount -----
21989        for (var parameter in vm.widget.parameters) {
21990            switch (vm.widget.parameters[parameter].id) {
21991                case 'nbNewsDisplayed':
21992                    vm.nbNewsDisplayed = parseInt(vm.widget.parameters[parameter].value);
21993                    break;
21994
21995                case 'imageDuration':
21996                    vm.imageDuration = parseInt(vm.widget.parameters[parameter].value);
21997                    break;
21998
21999                case 'animation':
22000                    vm.animation = vm.widget.parameters[parameter].value;
22001                    break;
22002
22003                case 'tags':
22004                    vm.tags = angular.fromJson(vm.widget.parameters[parameter].value.replace(/'/g, '"'));
22005                    break;
22006            }
22007        }
22008
22009        getLatestNews();
22010
22011        // Listener
22012        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
22013            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
22014                .then(function () {
22015                    for (var parameter in vm.widget.parameters) {
22016                        switch (vm.widget.parameters[parameter].id) {
22017                            case 'nbNewsDisplayed':
22018                                vm.nbNewsDisplayed = parseInt(data.nbNewsDisplayed);
22019                                vm.widget.parameters[parameter].value = data.nbNewsDisplayed;
22020                                break;
22021
22022                            case 'imageDuration':
22023                                vm.imageDuration = parseInt(data.imageDuration);
22024                                vm.widget.parameters[parameter].value = data.imageDuration;
22025                                break;
22026
22027                            case 'animation':
22028                                vm.animation = data.animation;
22029                                vm.widget.parameters[parameter].value = data.animation;
22030                                break;
22031
22032                            case 'tags':
22033                                vm.tags = angular.fromJson(data.tags.replace(/\'/g, '"'));
22034                                vm.widget.parameters[parameter].value = data.tags;
22035                                break;
22036
22037                        }
22038                    }
22039                    widgets[$scope.widget] = angular.toJson(vm.widget);
22040                    getLatestNews();
22041                })
22042                .catch(function (error) {
22043                    bugsnag.notify(error);
22044                });
22045        });
22046
22047        $scope.$on('$destroy', listener);
22048
22049
22050        // Helpers
22051        function getLatestNews() {
22052            if (vm.tags.length > 0) {
22053                newsService.getNewsBySolutionTags(__solutionId__, { page: 1, pageSize: vm.nbNewsDisplayed, culture: $localStorage.currentLanguage.culture, tags: vm.tags })
22054                    .then(function (response) {
22055                        vm.news = response.data.Results;
22056                        carousel();
22057                    })
22058                    .catch(function (error) {
22059                        bugsnag.notify(error);
22060                    });
22061            }
22062            else {
22063                newsService.getNewsBySolutionId(__solutionId__, { page: 1, pageSize: vm.nbNewsDisplayed, culture: $localStorage.currentLanguage.culture })
22064                    .then(function (response) {
22065                        vm.news = response.data.Results;
22066                        console.log(vm.news);
22067                        carousel();
22068                    })
22069                    .catch(function (error) {
22070                        bugsnag.notify(error);
22071                    });
22072            }
22073        }
22074
22075
22076        function carousel() {
22077            if (vm.startedCarousel) {
22078                vm.pauseCarousel();
22079            } else {
22080                vm.startedCarousel = true;
22081            }
22082            $timeout(function () {
22083                vm.startCarousel(vm.imageDuration * 1000);
22084            }, 1000);
22085        }
22086    }
22087})();
22088;
22089(function () {
22090    'use strict';
22091
22092    angular
22093        .module('app.directives')
22094        .directive('newsCarousel', newsCarousel)
22095
22096    newsCarousel.$inject = [];
22097
22098    function newsCarousel() {
22099        return {
22100            restrict: 'E',
22101            scope: {                
22102                widget: '='
22103            },
22104            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/news/carousel/news-carousel.tpl.html',
22105            controller: 'NewsCarouselWidgetController',
22106            controllerAs: 'newsCarousel',
22107            link: function (scope, element, attr, controller) {
22108                var vm = controller;
22109
22110                vm.startCarousel = function (time) {
22111                    $("#carouselExampleCaptions").carousel({
22112                        interval: time,
22113                        keyboard: false,
22114                        pause: false
22115                    });
22116                }
22117
22118                vm.pauseCarousel = function () {
22119                    $("#carouselExampleCaptions").carousel('dispose');
22120                }
22121            }
22122        };
22123    }
22124})();;
22125(function () {
22126    'use strict';
22127
22128    angular
22129        .module('app.directives')
22130        .controller('NewsListWidgetController', NewsListWidgetController);
22131
22132    NewsListWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', 'WebsiteEditorService', 'UrlService', 'NewsService'];
22133
22134    function NewsListWidgetController($rootScope, $scope, $localStorage, websiteEditorService, urlService, newsService) {
22135        var vm = this;
22136        vm.url = urlService;
22137
22138        // Apply website values to view model object.        
22139        vm.widget = angular.fromJson(widgets[$scope.widget]);
22140
22141        var tagsList = [];
22142        var tags = _.get(_.find(vm.widget.parameters, { id: 'tags' }), 'value');
22143        if (tags) {
22144            tagsList = angular.fromJson(tags.replace(/'/g, '"'));
22145        }
22146
22147        Object.assign(vm, { 
22148            all: {
22149                currentPage: 1, 
22150                pageSize: parseInt(_.get(_.find(vm.widget.parameters, { id: 'nbNewsDisplayedByPage' }), 'value')) || 0, // TODO Create global method to get parameter by name.
22151                tags: tagsList,
22152                totalCount: 0, 
22153                results: [],
22154                clickPage: clickPage,
22155                clickPrevious: clickPrevious,
22156                clickNext: clickNext
22157            }
22158        });
22159
22160        // Triggered when parameters are changed.
22161        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function(event, data) {
22162            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
22163                .then(function (response) {
22164                    vm.all.tags = angular.fromJson(data["tags"].replace(/'/g, '"'));;
22165                    vm.all.pageSize = data["nbNewsDisplayedByPage"];
22166
22167                    // Update the news feed.
22168                    getNews();                    
22169
22170                    // Update widget variable.
22171                    var newsDisplayedParam = _.find(vm.widget.parameters, { id: 'nbNewsDisplayed' });
22172                    if (newsDisplayedParam) {
22173                        newsDisplayedParam.value = parseInt(data["nbNewsDisplayed"]);
22174                    }
22175
22176                    var tagsParam = _.find(vm.widget.parameters, { id: 'tags' });
22177                    if (tagsParam) {
22178                        tagsParam.value = data["tags"];
22179                    }
22180
22181                    widgets[$scope.widget] = angular.toJson(vm.widget);
22182                })
22183                .catch(function (error) {
22184                    bugsnag.notify(error);
22185                });
22186        });
22187
22188        $scope.$on('$destroy', listener);
22189
22190        // Load the news.
22191        getNews(); 
22192
22193        function getNews() {
22194            if (vm.all.tags.length > 0) {
22195                newsService.getNewsBySolutionTags(__solutionId__, { page: vm.all.currentPage, pageSize: vm.all.pageSize, culture: $localStorage.currentLanguage.culture, tags: vm.all.tags })
22196                    .then(function (response) {
22197                        vm.all.results = response.data.Results; // All the news.
22198                        vm.all.totalCount = response.data.TotalCount;
22199                    })
22200                    .catch(function (error) {
22201                        bugsnag.notify(error);
22202                    });
22203            }
22204            else {
22205                newsService.getNewsBySolutionId(__solutionId__, { page: vm.all.currentPage, pageSize: vm.all.pageSize, culture: $localStorage.currentLanguage.culture })
22206                    .then(function (response) {
22207                        vm.all.results = response.data.Results; // All the news.
22208                        vm.all.totalCount = response.data.TotalCount;
22209                    })
22210                    .catch(function (error) {
22211                        bugsnag.notify(error);
22212                    });    
22213            }        
22214        }
22215
22216        function clickPrevious() {
22217            vm.all.currentPage -= 1;
22218
22219            // Get news for the selected page.
22220            getNews();
22221        }
22222
22223        function clickNext() {
22224            vm.all.currentPage += 1;
22225
22226            // Get news for the selected page.
22227            getNews();
22228        }
22229
22230        function clickPage(page) {
22231            vm.all.currentPage = page;
22232
22233            // Get news for the selected page.
22234            getNews();
22235        }
22236    }
22237})();
22238;
22239(function () {
22240    'use strict';
22241
22242    angular
22243        .module('app.directives')
22244        .directive('newsList', newsList);
22245
22246    newsList.$inject = [];
22247
22248    function newsList() {
22249        return {
22250            restrict: 'E',
22251            scope: {                
22252                widget: '='
22253            },
22254            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/news/list/news-list.tpl.html',
22255            controller: 'NewsListWidgetController',
22256            controllerAs: 'news'
22257        };
22258    }
22259})();;
22260(function () {
22261    'use strict';
22262
22263    angular
22264        .module('app.directives')
22265        .controller('PhotoListWidgetController', PhotoListWidgetController);
22266
22267    PhotoListWidgetController.$inject = ['$rootScope', '$scope', 'WebsiteEditorService', 'UrlService', 'PhotoService'];
22268
22269    function PhotoListWidgetController($rootScope, $scope, websiteEditorService, urlService, photoService) {
22270        var vm = this;
22271        vm.url = urlService;
22272        
22273        // Apply website values to view model object.
22274        vm.widget = angular.fromJson(widgets[$scope.widget]);
22275
22276        Object.assign(vm, { 
22277            all: {
22278                currentPage: 1, 
22279                pageSize: parseInt(vm.widget.parameters[0].value), // TODO Create global method to get parameter by name.
22280                totalCount: 0, 
22281                results: [],
22282                clickPage: clickPage,
22283                clickPrevious: clickPrevious,
22284                clickNext: clickNext
22285            }
22286        });        
22287
22288        // Triggered when parameters are changed.
22289        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function(event, data) {
22290            /*websiteEditorService.updatePage(__solutionId__, __pageId__, page, { uuid: vm.widget.uuid, parameters: data })
22291                .then(function(response) {
22292                    // Update the news feed.
22293                    getLatestNews(parseInt(data["nbNewsDisplayed"]));
22294
22295                    // Update widget variable.
22296                    // TODO Improve mechanism.
22297                    vm.widget.parameters[0].value = parseInt(data["nbNewsDisplayed"]);
22298                    widgets[$scope.widget] = angular.toJson(vm.widget);
22299                }) 
22300                .catch(function(error) {
22301                    bugsnag.notify(error);
22302                });*/
22303        });
22304
22305        // Destroy the listener.
22306        $scope.$on('$destroy', listener);
22307
22308        vm.displayPhoto = function(photo) {
22309            vm.photoSelected = photo.Image.AbsoluteUrl;
22310            vm.open();
22311        };
22312
22313        // Load the latest news.
22314        getPhotos(parseInt(vm.widget.parameters[0].value)); 
22315
22316        function getPhotos() {
22317            photoService.getPhotosBySolutionId(__solutionId__, { page: vm.all.currentPage, pageSize: vm.all.pageSize })
22318                .then(function(response) {                                      
22319                    vm.all.results = response.data.Results; // All photos.
22320                    vm.all.totalCount = response.data.TotalCount;
22321                })
22322                .catch(function(error) {
22323                    bugsnag.notify(error);
22324                });            
22325        }
22326
22327        function clickPrevious() {
22328            vm.all.currentPage -= 1;
22329
22330            // Get photos for the selected page.
22331            getPhotos();
22332        }
22333
22334        function clickNext() {
22335            vm.all.currentPage += 1;
22336
22337            // Get photos for the selected page.
22338            getPhotos();
22339        }
22340
22341        function clickPage(page) {
22342            vm.all.currentPage = page;
22343
22344            // Get photos for the selected page.
22345            getPhotos();
22346        }
22347    }
22348})();
22349;
22350(function () {
22351    'use strict';
22352
22353    angular
22354        .module('app.directives')
22355        .directive('photoList', photoList);
22356
22357    photoList.$inject = ['$document'];
22358
22359    function photoList($document) {
22360        return {
22361            restrict: 'E',
22362            scope: {                
22363                widget: '='
22364            },
22365            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/photo/list/photo-list.tpl.html',
22366            controller: 'PhotoListWidgetController',
22367            controllerAs: 'photos',
22368            link: function (scope, element, attribute, controller) {
22369                var vm = controller;
22370                vm.fullscreen = false;
22371
22372                vm.open = function() {
22373                    vm.fullscreen = true;
22374
22375                    $($document[0].body).addClass('overflow-hidden');
22376                };
22377
22378                vm.close = function() {
22379                    vm.fullscreen = false;
22380
22381                    $($document[0].body).removeClass('overflow-hidden');
22382                };
22383            }
22384        };
22385    }
22386})();;
22387(function () {
22388    'use strict';
22389
22390    angular
22391        .module('app.directives')
22392        .controller('PlayerDetailsWidgetController', PlayerDetailsWidgetController);
22393
22394    PlayerDetailsWidgetController.$inject = ['$rootScope', '$scope', '$sce', '$location', '$translate', 'UrlService', 'PositionService', 'WebsiteEditorService'];
22395
22396    function PlayerDetailsWidgetController($rootScope, $scope, $sce, $location, $translate, urlService, positionService, websiteEditorService) {
22397        var vm = this;
22398        var iframecode = '';
22399
22400        //State variables -----
22401        vm.url = urlService;
22402        vm._position = positionService;
22403        vm.embedSrc = `<iframe src="${location.origin}/?iframe=true&pageId=${location.pathname.substring(1)}" width="100%" height="800"></iframe>`;
22404        vm.widget = angular.fromJson(widgets[$scope.widget]);
22405        Object.assign(vm, __player__);
22406        vm.defaultTab = _.find(vm.tabs, { default: true });
22407        vm.otherTabs = _.filter(vm.tabs, { default: false });
22408        vm.tabs.forEach(function (tab) {
22409            tab.content = $sce.trustAsHtml(tab.content);
22410        });
22411        vm.showAge = true;
22412        vm.showHeight = true;
22413        vm.showWeight = true;
22414        vm.showNotes = true;
22415        vm.showBirthday = false;
22416        vm.showCumulativeStatsTab = true;
22417        vm.showGameLogTab = false;
22418
22419        //State functions -----
22420        vm.getAge = function (birthday) {
22421            return birthday !== null
22422                ? moment().diff(birthday, 'years')
22423                : '';
22424        };
22425
22426        vm.getBirthday = function (birthday) {
22427            return birthday !== null ? moment(birthday).format($translate.instant('directives.widgets.player.details.format.birthday')) : '';
22428        }
22429
22430        //On component mount
22431        for (var parameter in vm.widget.parameters) {
22432            switch (vm.widget.parameters[parameter].id) {
22433                case 'showAge':
22434                    vm.showAge = (vm.widget.parameters[parameter].value === 'true');
22435                    break;
22436
22437                case 'showHeight':
22438                    vm.showHeight = (vm.widget.parameters[parameter].value === 'true');
22439                    break;
22440
22441                case 'showWeight':
22442                    vm.showWeight = (vm.widget.parameters[parameter].value === 'true');
22443                    break;
22444
22445                case 'showNotes':
22446                    vm.showNotes = (vm.widget.parameters[parameter].value === 'true');
22447                    break;
22448
22449                case 'showBirthday':
22450                    vm.showBirthday = (vm.widget.parameters[parameter].value === 'true');
22451                    break;
22452
22453                case 'showCumulativeStatsTab':
22454                    vm.showCumulativeStatsTab = (vm.widget.parameters[parameter].value === 'true');
22455                    break;
22456
22457                case 'showGameLogTab':
22458                    vm.showGameLogTab = (vm.widget.parameters[parameter].value === 'true');
22459                    break;
22460
22461                case 'columnsDisplayGameLog':
22462                    vm.columnsGameLogStats = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
22463                    break;
22464            }
22465        }
22466
22467        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
22468            console.log('HERE')
22469            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
22470                .then(function (response) {
22471                    for (var parameter in vm.widget.parameters) {
22472                        switch (vm.widget.parameters[parameter].id) {
22473                            case 'showAge':
22474                                vm.widget.parameters[parameter].value = data.showAge.toString();
22475                                vm.showAge = data.showAge;
22476                                break;
22477
22478                            case 'showHeight':
22479                                vm.widget.parameters[parameter].value = data.showHeight.toString();
22480                                vm.showHeight = data.showHeight;
22481                                break;
22482
22483                            case 'showWeight':
22484                                vm.widget.parameters[parameter].value = data.showWeight.toString();
22485                                vm.showWeight = data.showWeight;
22486                                break;
22487
22488                            case 'showNotes':
22489                                vm.widget.parameters[parameter].value = data.showNotes.toString();
22490                                vm.showNotes = data.showNotes;
22491                                break;
22492
22493                            case 'showBirthday':
22494                                vm.widget.parameters[parameter].value = data.showBirthday.toString();
22495                                vm.showBirthday = data.showBirthday;
22496                                break;
22497
22498                            case 'showCumulativeStatsTab':
22499                                vm.widget.parameters[parameter].value = data.showCumulativeStatsTab.toString();
22500                                vm.showCumulativeStatsTab = data.showCumulativeStatsTab;
22501                                break;
22502                            case 'showGameLogTab':
22503                                vm.widget.parameters[parameter].value = data.showGameLogTab.toString();
22504                                vm.showGameLogTab = data.showGameLogTab;
22505                                break;
22506                            case 'columnsDisplayGameLog':
22507                                vm.widget.parameters[parameter].value = data.columnsDisplayGameLog;
22508                                vm.columnsGameLogStats = angular.fromJson(data.columnsDisplayGameLog.replace(/\'/g, '"'));
22509                                console.log(data);
22510                                break;
22511                        }
22512                    }
22513                    widgets[$scope.widget] = angular.toJson(vm.widget);
22514                })
22515                .catch(function (error) {
22516                    bugsnag.notify(error);
22517                });
22518        });
22519
22520        $scope.$on('$destroy', listener);
22521    }
22522})();
22523;
22524(function () {
22525    'use strict';
22526
22527    angular
22528        .module('app.directives')
22529        .directive('playerDetails', playerDetails);
22530
22531    playerDetails.$inject = [];
22532
22533    function playerDetails() {
22534        return {
22535            restrict: 'E',
22536            scope: { 
22537                widget: '='
22538            },
22539            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/player/detail
22539s/player-details.tpl.html',
22540            controller: 'PlayerDetailsWidgetController',
22541            controllerAs: 'playerDetails'
22542        };
22543    }
22544})();;
22545(function () {
22546    'use strict';
22547
22548    angular
22549        .module('app.directives')
22550        .controller('PlayerAllTimeStatisticsController', PlayerAllTimeStatisticsController);
22551    PlayerAllTimeStatisticsController.$inject = ['$scope', '$localStorage', 'UrlService', 'StatisticService', 'PositionService'];
22552
22553    function PlayerAllTimeStatisticsController($scope, $localStorage, urlService, statisticService, positionService) {
22554        var vm = this;
22555        vm.url = urlService;
22556        vm.category = positionService;
22557        vm.sportId = $localStorage.solution.sportId;
22558        vm.columns = []
22559        vm.categories = {}
22560        Object.assign(vm, __player__);
22561
22562        vm.getColumns = function (catId) {
22563            let columns;
22564            switch (vm.sportId) {
22565                case 1:
22566                    // TODO Move default columns into service
22567                    // TODO Implement columns parameters into the widget.
22568                    columns = Number(catId) === 2
22569                        ? statisticService.getPlayerStatisticColumnsByColumnIds([14, 6, 7, 29, 8, 26, 27, 31])
22570                        : statisticService.getPlayerStatisticColumnsByColumnIds([62, 15, 16, 17, 19, 21, 22, 32, 25, 24, 30, 8]);
22571                    // TODO Initialize column sort / change hardcoded value.
22572                    _.find(columns, function (column) {
22573                        return Number(catId) === 2 ? column.id === 29 : column.id === 32;
22574                    }).sort = 'desc';
22575                    return columns
22576
22577                case 2:
22578                    // TODO Move default columns into service
22579                    // TODO Implement columns parameters into the widget.
22580                    switch (Number(catId)) {
22581                        case 8:
22582                            columns = statisticService.getPlayerStatisticColumnsByColumnIds([96, 97, 98, 100, 99, 94, 127, 95, 101, 116, 93, 117, 91, 92, 114, 126, 103]);
22583                            break;
22584                        case 9:
22585                            columns = statisticService.getPlayerStatisticColumnsByColumnIds([65, 67, 77, 80, 69, 70, 71, 75, 72, 73, 76, 79, 106, 81, 83, 82, 86, 85])
22586                            break;
22587                        case 21:
22588                            columns = statisticService.getPlayerStatisticColumnsByColumnIds([65, 105, 107, 108, 167])
22589                            break;
22590                    }
22591                    // TODO Initialize column sort / change hardcoded value.
22592                    _.find(columns, function (column) {
22593                        switch (Number(catId)) {
22594                            case 8:
22595                                column.id === 100;
22596                                break;
22597                            case 9:
22598                                column.id === 81;
22599                                break;
22600                            case 21:
22601                                column.id === 65;
22602                                break;
22603                        }
22604                        return column;
22605                    }).sort = 'desc';
22606                    return columns
22607
22608
22609                case 4:
22610                    // TODO Move default columns into service
22611                    // TODO Implement columns parameters into the widget.
22612                    columns = statisticService.getPlayerStatisticColumnsByColumnIds([132, 134, 137, 140, 141, 142, 152, 153, 154, 155, 162]);
22613
22614                    // TODO Initialize column sort / change hardcoded value.
22615                    _.find(columns, function (column) {
22616                        return 132;
22617                    }).sort = 'desc';
22618                    return columns
22619
22620                case 6:
22621                    // TODO Move default columns into service
22622                    // TODO Implement columns parameters into the widget.
22623                    columns = statisticService.getPlayerStatisticColumnsBySportId(vm.sportId, Number(catId))
22624
22625                    // TODO Initialize column sort / change hardcoded value.
22626                    _.find(columns, function (column) {
22627                        return Number(catId) === 3 ? column.id === 37 : column.id === 46;
22628                    }).sort = 'desc';
22629                    return columns
22630
22631                case 14:
22632                    // TODO Move default columns into service
22633                    // TODO Implement columns parameters into the widget.
22634                    columns = statisticService.getPlayerStatisticColumnsByColumnIds([53, 54, 55, 60, 57, 56, 58, 59]);
22635                    // TODO Initialize column sort / change hardcoded value.
22636                    _.find(columns, function (column) {
22637                        return column.id === 60;
22638                    }).sort = 'desc';
22639
22640                    return columns
22641            }
22642        }
22643
22644        // TODO Move into service
22645        vm.getStatisticValue = function (player, statisticId) {
22646            if (player.Stats.length > 0) {
22647
22648                var playerStat = _.find(player.Stats, function (statistic) {
22649                    return statistic.StatTypeId === statisticId;
22650                });
22651
22652                if (playerStat) {
22653                    return playerStat.DisplayValue;
22654                }
22655            }
22656            return '0';
22657        };
22658
22659        statisticService.getPlayerAllStatisticsByPlayerId(__solutionId__, vm.id)
22660            .then(function (response) {
22661                //Filtering by categoryId
22662                let categories = _.groupBy(response.data, function (res) {
22663                    return res.CategoryId
22664                })
22665                _.forEach(categories, function (data, catId) {
22666                    let tempTotal = _.filter(data, function (item) {
22667                        return item.SeasonName === null;
22668                    })
22669                    let tempData = _.filter(data, function (item) {
22670                        return item.SeasonName !== null;
22671                    })
22672                    let tempSeasonType = _.groupBy(data, function (item) {
22673                        return item.SeasonType
22674                    })
22675                    vm.categories[catId] = { data: tempData, columns: vm.getColumns(catId), totals: tempTotal, seasonsType: tempSeasonType }
22676                })
22677                vm.hasData = !_.isEmpty(vm.categories);
22678            })
22679
22680            .then(function () {
22681                _.forEach(vm.categories, function (position) {
22682                    _.forEach(position.columns, function (col) {
22683                        vm.columns.push(col)
22684                    })
22685                })
22686            })
22687            .catch(function (error) {
22688                // TODO Bugsnag
22689            });
22690    }
22691})();
22692;
22693(function () {
22694    'use strict';
22695
22696    angular
22697        .module('app.directives')
22698        .directive('playerAllTimeStatistics', playerAllTimeStatistics);
22699
22700    playerAllTimeStatistics.$inject = [];
22701
22702    function playerAllTimeStatistics() {
22703        return {
22704            restrict: 'E',
22705            scope: { 
22706                widget: '='
22707            },
22708            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/player/detail
22708s/all-time-statistics/player-all-time-statistics.tpl.html',
22709            controller: 'PlayerAllTimeStatisticsController',
22710            controllerAs: 'playerAllTimeStatistics'
22711        };
22712    }
22713})();;
22714(function () {
22715    'use strict';
22716
22717    angular
22718        .module('app.directives')
22719        .controller('PlayerGameLogController', PlayerGameLogController);
22720
22721    PlayerGameLogController.$inject = ['$scope', '$localStorage', '$translate', 'UrlService', 'StatisticService', 'PositionService', 'GameService', 'PlayerService'];
22722
22723    function PlayerGameLogController($scope, $localStorage, $translate, urlService, statisticService, positionService, gameService, playerService) {
22724        var vm = this;
22725        var statsSportConfig = {
22726            1: {
22727                2: {
22728                    order: 1,
22729                    stats: [6, 7, 8, 9, 11, 12, 24, 26, 27, 28, 29],
22730                    sort: [29, 'desc']
22731                },
22732                1: {
22733                    order: 2,
22734                    stats: [8, 10, 13, 22, 23, 24, 30],
22735                    sort: [23, 'desc']
22736                }
22737            },
22738            2: {
22739                9: {
22740                    order: 1,
22741                    stats: [66, 67, 68, 69, 70, 71, 72, 73, 77, 75, 78, 79, 80, 81, 82, 83, 86, 85],
22742                    sort: [80, 'desc']
22743                },
22744                8: {
22745                    order: 2,
22746                    stats: [99, 100, 101, 91, 102, 93, 90, 96, 97, 98],
22747                    sort: [100, 'desc']
22748                },
22749            },
22750            6: {
22751                3: {
22752                    order: 1,
22753                    stats: [36, 37, 38, 39, 40, 41, 43, 44],
22754                    sort: [37, 'desc']
22755                },
22756                4: {
22757                    order: 2,
22758                    stats: [46, 47, 48, 49, 50, 64],
22759                    sort: [46, 'desc']
22760                },
22761            },
22762            14: {
22763                16: {
22764                    order: 1,
22765                    stats: [53, 54, 55, 60, 61, 57, 56, 58, 59],
22766                    sort: [60, 'desc']
22767                },                
22768                17: {
22769                    order: 2,
22770                    stats: [53, 54, 55, 60, 61, 57, 56, 58, 59],
22771                    sort: [60, 'desc']
22772                }
22773            }
22774        }
22775        
22776        vm.url = urlService;
22777        vm.position = positionService;
22778        vm.playerService = playerService;
22779        vm.sportId = $localStorage.solution.sportId;
22780        vm.options = {};
22781        vm.playerCategory = {};
22782        vm.isMobile = false;
22783        vm.playerGames = [];
22784        vm.statList = {};
22785        Object.assign(vm, angular.fromJson(__player__));
22786
22787        var gameStatistics = [];
22788
22789        var sportPlayerCategories = statsSportConfig[vm.sportId];
22790        vm.options.seasonId = $localStorage.solution.defaultSeasonId;
22791        getPlayerGames();
22792
22793        $scope.$watch('playerColumns', function () {
22794            buildColumns();
22795        });
22796
22797        vm.showStat = function (column) {
22798            if (vm.isMobile && column.visibleMobile) {
22799                return true;
22800            } else if (!vm.isMobile && column.visibleDesktop) {
22801                return true;
22802            }
22803            return false;
22804        }
22805
22806        vm.getBackgroundStyle = function (i) {
22807            let style = {};
22808            if (i % 2 != 0) {
22809                style['background-color'] = '#f0f0f0';
22810                vm.isPair = false;
22811            }
22812            else {
22813                style['background-color'] = '#fff';
22814                vm.isPair = true;
22815            }
22816            return style;
22817        }
22818
22819
22820        vm.filter = function (filter) {
22821            vm.options.seasonId = filter.season;
22822
22823            getPlayerGames();
22824        };
22825
22826        vm.getStatisticValue = function (game, statisticId) {
22827            vm.statList = game.stats;
22828            if (game.stats.length > 0) {
22829                var playerStat = _.find(game.stats, function (statistic) {
22830                    return statistic.statTypeId === statisticId;
22831                });
22832
22833                if (playerStat) {
22834                    return { value: playerStat.displayValue, class: 'text-center'};
22835                }
22836            }
22837            return { value: '0', class: 'text-center' };
22838        }
22839
22840        vm.sort = function (playerCategory, column) {
22841             //Reset columns sort.
22842            _.forEach(playerCategory.columns, function (_column) {
22843                if (column.stat.name !== "Date" && column.stat.name !== $translate.instant('directives.widgets.player.details.gameLog.labels.team')) {
22844                    if (_column.id !== column.id) {
22845                        _column.sort = '';
22846                    }
22847                }
22848                if (_column.stat.name !== column.stat.name) {
22849                    _column.sort = '';
22850                }
22851            });
22852
22853            if (angular.isUndefined(column.sort)) {
22854                column.sort = 'desc';
22855            } else {
22856                // Toggle sort order.
22857                column.sort = column.sort === 'desc'
22858                    ? column.sort = 'asc'
22859                    : column.sort = 'desc';
22860            }
22861
22862            var games = _.filter(playerCategory.games, function (game) {
22863                return game.stats.length > 0;
22864            });
22865
22866            if (games.length > 0) {
22867                playerCategory.games = _.orderBy(games, function (game) {
22868                    switch (column.stat.name) {
22869                        case "Date":
22870                            return game.date;
22871                        case $translate.instant('directives.widgets.player.details.gameLog.labels.team'):
22872                            return game.opponentTeamName;
22873                        default:
22874                            var statisticValue = vm.getStatisticValue(game, column.id)
22875                            return statisticValue.value;
22876                    }
22877                }, [column.sort]);
22878            }
22879        };
22880
22881        function getPlayerGames() {
22882            vm.playerGames = [];
22883            playerService.getPlayerGameLog(vm.id, vm.options.seasonId)
22884                .then(function (response) {
22885                    var games = response.data;
22886                    _.forEach(games, function (game) {
22887                        vm.playerGames.push(game);
22888                    });
22889                    buildColumns();
22890                    vm.sort(vm.playerCategory, vm.playerCategory.columns[0]);
22891                })
22892                .catch(function (error) {
22893                    bugsnag.notify(error);
22894                });
22895        }
22896
22897        vm.getDate = function (game) {
22898            return game.date !== null ? moment(game.date).format($translate.instant('directives.widgets.player.details.gameLog.format.date')) : '';
22899        }
22900
22901        vm.getOpponentTeam = function (game) {
22902            if (game.isLocal) {
22903                return $translate.instant('directives.widgets.player.details.gameLog.labels.opponentTeamVisitor', { teamName: game.opponentTeamName });
22904            }
22905            else {
22906                return $translate.instant('directives.widgets.player.details.gameLog.labels.opponentTeamLocal', { teamName: game.opponentTeamName });
22907            }
22908        }
22909
22910        function buildColumns() {
22911            var playerCategory = [];
22912            var categoryColumns = $scope.playerColumns[vm.categoryId].map(function (col) {
22913                var stat = statisticService.getPlayerStatisticByStatId(col.id);
22914
22915                return {
22916                    id: col.id,
22917                    visibleDesktop: col.visibleDesktop,
22918                    visibleMobile: col.visibleMobile,
22919                    stat: (stat || {}),
22920                }
22921            });
22922
22923            categoryColumns.unshift({
22924                id: '',
22925                visibleDesktop: true,
22926                visibleMobile: true,
22927                stat: {
22928                    abbreviation: $translate.instant('directives.widgets.player.details.gameLog.labels.team'),
22929                    name: $translate.instant('directives.widgets.player.details.gameLog.labels.team')
22930                },
22931            });
22932            categoryColumns.unshift({
22933                id: '',
22934                visibleDesktop: true,
22935                visibleMobile: true,
22936                stat: { abbreviation: "Date", name: "Date" },
22937            });
22938
22939            var category = {
22940                columns: categoryColumns,
22941                games: vm.playerGames
22942            };
22943
22944            vm.playerCategory = category;
22945        }
22946    }
22947})();
22948;
22949(function () {
22950    'use strict';
22951
22952    angular
22953        .module('app.directives')
22954        .directive('playerGameLog', playerGameLog);
22955
22956    playerGameLog.$inject = [];
22957
22958    function playerGameLog() {
22959        return {
22960            restrict: 'E',
22961            scope: {
22962                widget: '=',
22963                playerColumns: '='
22964            },
22965            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/player/details/game-log/player-game-log.tpl.html',
22966            controller: 'PlayerGameLogController',
22967            controllerAs: 'playerGameLog',
22968            link: function (scope, element, attribut, controller) {
22969                scope.$watch(function () {
22970                    if (element.find('.player-game-log')[0]) {
22971                        return element.find('.player-game-log')[0].clientWidth
22972                    }
22973                }, function (container) {
22974                    if (container <= 800) {
22975                        controller.isMobile = true;
22976                    }
22977                    else if (container > 800) {
22978                        controller.isMobile = false;
22979                    }
22980                });
22981            }
22982        };
22983    }
22984})();;
22985(function () {
22986    'use strict';
22987
22988    angular
22989        .module('app.directives')
22990        .controller('TeamPlayerStatisticsController', TeamPlayerStatisticsController);
22991    TeamPlayerStatisticsController.$inject = ['$scope', '$localStorage', 'UrlService', 'StatisticService', 'PositionService'];
22992
22993    function TeamPlayerStatisticsController($scope, $localStorage, urlService, statisticService, positionService) {
22994        var vm = this;
22995        vm.url = urlService;
22996        vm.category = positionService;
22997        vm.sportId = $localStorage.solution.sportId;
22998        vm.columns = []
22999        vm.categories = {}
23000        Object.assign(vm, __team__);
23001
23002        vm.getColumns = function (catId) {
23003            let columns;
23004            var sportId = $localStorage.solution.sportId;
23005            switch (sportId) {
23006                case 1:
23007                    // TODO Move default columns into service
23008                    // TODO Implement columns parameters into the widget.
23009                    columns = Number(catId) === 2
23010                        ? statisticService.getPlayerStatisticColumnsByColumnIds([14, 6, 7, 29, 8, 26, 27, 31])
23011                        : statisticService.getPlayerStatisticColumnsByColumnIds([62, 15, 16, 17, 19, 21, 22, 32, 25, 24, 30, 8]);
23012                    // TODO Initialize column sort / change hardcoded value.
23013                    _.find(columns, function (column) {
23014                        return Number(catId) === 2 ? column.id === 29 : column.id === 32;
23015                    }).sort = 'desc';
23016                    return columns
23017
23018                case 2:
23019                    // TODO Move default columns into service
23020                    // TODO Implement columns parameters into the widget.
23021                    switch (Number(catId)) {
23022                        case 8:
23023                            columns = statisticService.getPlayerStatisticColumnsByColumnIds([99, 100, 101, 91, 102, 93, 90, 96, 97, 98]);
23024                            break;
23025                        case 9:
23026                            columns = statisticService.getPlayerStatisticColumnsByColumnIds([66, 67, 68, 69, 70, 71, 72, 73, 77, 75, 78, 79, 80, 81, 82, 83, 86, 85
23026])
23027                            break;
23028                        case 21:
23029                            columns = statisticService.getPlayerStatisticColumnsByColumnIds([65, 105, 107, 108])
23030                            break;
23031                    }
23032                    // TODO Initialize column sort / change hardcoded value.
23033                    _.find(columns, function (column) {
23034                        switch (Number(catId)) {
23035                            case 8:
23036                                column.id === 100;
23037                                break;
23038                            case 9:
23039                                column.id === 81;
23040                                break;
23041                            case 21:
23042                                column.id === 65;
23043                                break;
23044                        }
23045                        return column;
23046                    }).sort = 'desc';
23047                    return columns;
23048
23049                case 4:
23050                    // TODO Move default columns into service
23051                    // TODO Implement columns parameters into the widget.
23052                    columns = statisticService.getPlayerStatisticColumnsBySportId(sportId, Number(catId))
23053
23054                    // TODO Initialize column sort / change hardcoded value.
23055                    _.find(columns, function (column) {
23056                        return 60;
23057                    }).sort = 'desc';
23058
23059                    return columns
23060
23061                case 6:
23062                    // TODO Move default columns into service
23063                    // TODO Implement columns parameters into the widget.
23064                    columns = statisticService.getPlayerStatisticColumnsBySportId(sportId, Number(catId))
23065
23066                    // TODO Initialize column sort / change hardcoded value.
23067                    _.find(columns, function (column) {
23068                        return Number(catId) === 3 ? column.id === 37 : column.id === 46;
23069                    }).sort = 'desc';
23070                    return columns
23071
23072                case 14:
23073                    // TODO Move default columns into service
23074                    // TODO Implement columns parameters into the widget.
23075                    columns = statisticService.getPlayerStatisticColumnsBySportId(sportId, Number(catId))
23076
23077                    // TODO Initialize column sort / change hardcoded value.
23078                    _.find(columns, function (column) {
23079                        return 60;
23080                    }).sort = 'desc';
23081
23082                    return columns
23083            }
23084        }
23085
23086        // TODO Move into service
23087        vm.getStatisticValue = function (player, statisticId) {                       
23088            if (player.Stats.length > 0) {                
23089                var playerStat = _.find(player.Stats, function (statistic) {
23090                    return statistic.StatTypeId === statisticId;
23091                });
23092
23093                if (playerStat) {
23094                    return playerStat.DisplayValue;
23095                }
23096            }
23097            return '0';
23098        };
23099
23100        statisticService.getTeamPlayerStatisticsByTeamId(__solutionId__, vm.id)
23101            .then(function (response) {
23102                //Filtering by categoryId
23103                let categories = _.groupBy(response.data, function (res) {
23104                    return res.CategoryId
23105                })
23106                _.forEach(categories, function (data, catId) {
23107                    let tempTotal = _.filter(data, function (item) {
23108                        return item.SeasonName === null;
23109                    })
23110                    let tempData = _.filter(data, function (item) {
23111                        return item.SeasonName !== null;
23112                    })
23113                    let tempSeasonType = _.groupBy(data, function (item) {
23114                        return item.SeasonType
23115                    })
23116                    vm.categories[catId] = { data: tempData, columns: vm.getColumns(catId), totals: tempTotal, seasonsType: tempSeasonType }
23117                })
23118                vm.hasData = !_.isEmpty(vm.categories);
23119            })
23120
23121            .then(function () {
23122                _.forEach(vm.categories, function (position) {
23123                    _.forEach(position.columns, function (col) {
23124                        vm.columns.push(col)
23125                    })
23126                })
23127            })
23128            .catch(function (error) {
23129                // TODO Bugsnag
23130            });
23131    }
23132})();
23133;
23134(function () {
23135    'use strict';
23136
23137    angular
23138        .module('app.directives')
23139        .directive('teamPlayerStatistics', teamPlayerStatistics);
23140
23141    teamPlayerStatistics.$inject = [];
23142
23143    function teamPlayerStatistics() {
23144        return {
23145            restrict: 'E',
23146            scope: { 
23147                widget: '='
23148            },
23149            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/team/detail
23149s/team-statistics/team-statistics.tpl.html',
23150            controller: 'TeamPlayerStatisticsController',
23151            controllerAs: 'teamPlayerStatistics'
23152        };
23153    }
23154})();;
23155(function () {
23156    'use strict';
23157
23158    angular
23159        .module('app.directives')
23160        .controller('PlayerStatisticsController', PlayerStatisticsController);
23161
23162    PlayerStatisticsController.$inject = ['$scope', 'StatisticService'];
23163
23164    function PlayerStatisticsController($scope, statisticService) {
23165        var vm = this;        
23166
23167        /*vm.datatable = {
23168            columns: [
23169                { id:  }
23170            ]
23171        };*/
23172        //playerStatistics
23173        vm.columns = statisticService.getPlayerStatisticColumnsByColumnIds([14, 6, 7, 29, 8, 26, 27, 31]);
23174    }
23175})();
23176;
23177(function () {
23178    'use strict';
23179
23180    angular
23181        .module('app.directives')
23182        .directive('playerStatistics', playerStatistics);
23183
23184    playerStatistics.$inject = [];
23185
23186    function playerStatistics() {
23187        return {
23188            restrict: 'E',
23189            scope: { 
23190                widget: '='
23191            },
23192            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/player/details/statistics/player-statistics.tpl.html',
23193            controller: 'PlayerStatisticsController',
23194            controllerAs: 'playerStatistics'
23195        };
23196    }
23197})();;
23198(function () {
23199    'use strict';
23200
23201    angular
23202        .module('app.directives')
23203        .controller('PlayerListWidgetController', PlayerListWidgetController);
23204
23205    PlayerListWidgetController.$inject = ['$rootScope', '$timeout', '$localStorage', '$scope', '$translate', '$window', 'WebsiteEditorService', 'UrlService', 'PlayerService', 'PositionService'];
23206
23207    function PlayerListWidgetController($rootScope, $timeout, $localStorage, $scope, $translate, $window, websiteEditorService, urlService, playerService, positionService) {
23208        var vm = this;
23209        var searchText;
23210        var sportId = $localStorage.solution.sportId;
23211
23212        //State variables
23213        vm.widget = angular.fromJson(widgets[$scope.widget]);
23214        vm.url = urlService;
23215        vm.position = positionService;
23216        vm.columns = [];
23217
23218        vm.currentPage = 1;
23219        vm.pageSize = 12;
23220        vm.defaultListEmpty = false;
23221        vm.totalCount = 0;
23222        vm.results = [];
23223
23224        vm.positions = [{ Id: 'all', Name: $translate.instant('directives.widgets.player.list.labels.allPositions') }].concat(positionService.getPositions(sportId).map(function (pos) {
23225            return {
23226                Id: pos.id,
23227                Name: pos.text
23228            }
23229        }));
23230
23231        vm.statuses = [
23232            { Id: 'active', Name: $translate.instant('directives.widgets.player.list.status.active') },
23233            { Id: 'all', Name: $translate.instant('directives.widgets.player.list.labels.allStatuses') }
23234        ]
23235
23236        vm.selectedPosition = 'all';
23237        vm.selectedStatus = 'active';
23238
23239        //State functions
23240        vm.search = function (text) {
23241            searchText = text;
23242            getPlayers();
23243        };
23244
23245        vm.getAge = function (birthday) {
23246            return birthday !== null ? moment().diff(birthday, 'years') : '';
23247        };
23248
23249        vm.getBirthday = function (birthday) {
23250            return birthday !== null ? moment(birthday).format($translate.instant('directives.widgets.player.list.format.birthday')) : '';
23251        }
23252
23253        vm.getStatus = playerService.getStatus;
23254
23255        vm.showStat = function (column) {
23256            if (isMobile() && column.visibleMobile) {
23257                return true;
23258            } else if (!isMobile() && column.visibleDesktop) {
23259                return true;
23260            }
23261            return false;
23262        }
23263
23264        vm.selectPosition = function (item) {
23265            vm.currentPage = 1;
23266            vm.selectedPosition = item.Id;
23267            getPlayers();
23268        };
23269
23270        vm.selectStatus = function (item) {
23271            vm.currentPage = 1;
23272            vm.selectedStatus = item.Id;
23273            getPlayers();
23274        }
23275
23276        vm.clickPrevious = function () {
23277            vm.currentPage -= 1;
23278            getPlayers();
23279        }
23280
23281        vm.clickNext = function () {
23282            vm.currentPage += 1;
23283            getPlayers();
23284        }
23285
23286        vm.clickPage = function (page) {
23287            vm.currentPage = page;
23288            getPlayers();
23289        }
23290
23291        //Component mount.
23292        for (var parameter in vm.widget.parameters) {
23293            switch (vm.widget.parameters[parameter].id) {
23294                case 'columnsDisplaySelect':
23295                    var columnsDisplaySelect = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
23296                    buildColumns(columnsDisplaySelect);
23297                    break;
23298                case 'nbPlayersDisplayed':
23299                    vm.pageSize = vm.widget.parameters[parameter].value;
23300                    break;
23301                case 'defaultListEmpty':
23302                    vm.initialDefaultListEmpty = vm.widget.parameters[parameter].value === 'true';
23303                    vm.defaultListEmpty = vm.widget.parameters[parameter].value === 'true';
23304                    break;
23305            }
23306        }
23307
23308        getPlayers();
23309
23310        // Listener
23311        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
23312            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
23313                .then(function () {
23314                    for (var parameter in vm.widget.parameters) {
23315                        switch (vm.widget.parameters[parameter].id) {
23316                            case 'columnsDisplaySelect':
23317                                vm.widget.parameters[parameter].value = data.columnsDisplaySelect;
23318                                var columnsDisplaySelect = angular.fromJson(data.columnsDisplaySelect.replace(/\'/g, '"'));
23319                                buildColumns(columnsDisplaySelect);
23320                                break;
23321                            case 'nbPlayersDisplayed':
23322                                vm.widget.parameters[parameter].value = data.nbPlayersDisplayed;
23323                                vm.pageSize = data.nbPlayersDisplayed;
23324                                break;
23325                            case 'defaultListEmpty':
23326                                vm.widget.parameters[parameter].value = data.defaultListEmpty.toString();
23327                                vm.defaultListEmpty = data.defaultListEmpty;
23328                                vm.initialDefaultListEmpty = data.defaultListEmpty;
23329                                break;
23330                        }
23331                    }
23332                    widgets[$scope.widget] = angular.toJson(vm.widget);
23333                    getPlayers();
23334                })
23335                .catch(function (error) {
23336                    bugsnag.notify(error);
23337                });
23338        });
23339
23340        $scope.$on('$destroy', listener);
23341
23342        //Functions
23343        function buildColumns(columnsToDisplay) {
23344            vm.columns = [];
23345            columnsToDisplay.forEach(function (col) {
23346                var stat = playerService.getPlayerColumn(col.id);
23347                vm.columns.push({
23348                    id: col.id,
23349                    visibleDesktop: col.visibleDesktop,
23350                    visibleMobile: col.visibleMobile,
23351                    name: stat.name
23352                });
23353            });
23354        }
23355
23356        function getPlayers() {
23357            if (vm.selectedPosition === 'all' && !searchText && vm.initialDefaultListEmpty) {
23358                $timeout(function () {
23359                    vm.defaultListEmpty = true;
23360                });
23361            } else {
23362                var options = {
23363                    page: vm.currentPage,
23364                    pageSize: vm.pageSize
23365                };
23366
23367                if (angular.isDefined(searchText)) {
23368                    options.search = searchText; // TODO standardise Team search parameter «searchText»
23369                }
23370
23371                if (angular.isDefined(vm.selectedPosition)) {
23372                    options.positionId = vm.selectedPosition;
23373                }
23374
23375                if (angular.isDefined(vm.selectedStatus) && vm.selectedStatus != "active") {
23376                    options.status = vm.selectedStatus;
23377                }
23378
23379                playerService.getPlayersBySolutionId(__solutionId__, options)
23380                    .then(function (response) {
23381                        vm.results = response.data.Results;
23382                        vm.totalCount = response.data.TotalCount;
23383                        vm.defaultListEmpty = false;
23384                    })
23385                    .catch(function (error) {
23386                        bugsnag.notify(error);
23387                        vm.defaultListEmpty = false;
23388                    });
23389            }
23390        }
23391
23392        function isMobile() {
23393            return $window.innerWidth <= 600;
23394        }
23395    }
23396})();
23397;
23398(function () {
23399    'use strict';
23400
23401    angular
23402        .module('app.directives')
23403        .directive('playerList', playerList);
23404
23405    playerList.$inject = [];
23406
23407    function playerList() {
23408        return {
23409            restrict: 'E',
23410            scope: { 
23411                widget: '='
23412            },
23413            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/player/list/player-list.tpl.html',
23414            controller: 'PlayerListWidgetController',
23415            controllerAs: 'playerList'
23416        };
23417    }
23418})();;
23419(function () {
23420    'use strict';
23421
23422    angular
23423        .module('app.directives')
23424        .controller('PlayerPageWidgetController', PlayerPageWidgetController);
23425
23426    PlayerPageWidgetController.$inject = ['$rootScope', '$scope', 'WebsiteEditorService'];
23427
23428    function PlayerPageWidgetController($rootScope, $scope, websiteEditorService) {
23429        var vm = this;
23430
23431        // Apply website values to view model object.
23432        vm.widget = angular.fromJson(widgets[$scope.widget]);
23433        vm.embedSrc = `<iframe src="${location.origin}/?iframe=true&pageId=${location.pathname.substring(1)}" width="100%" height="950"></iframe>`;
23434    }
23435})();
23436;
23437(function () {
23438    'use strict';
23439
23440    angular
23441        .module('app.directives')
23442        .directive('playerPage', playerPage);
23443
23444    playerPage.$inject = [];
23445
23446    function playerPage() {
23447        return {
23448            restrict: 'E',
23449            scope: {                
23450                widget: '='
23451            },
23452            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/player/page/player-page.tpl.html',
23453            controller: 'PlayerPageWidgetController',
23454            controllerAs: 'playerPage'
23455        };
23456    }
23457})();;
23458(function () {
23459    'use strict';
23460
23461    angular
23462        .module('app.directives')
23463        .controller('GameResultsController', GameResultsController);
23464
23465    GameResultsController.$inject = ['$scope', '$translate', '$filter', 'UrlService'];
23466
23467    function GameResultsController($scope, $translate, $filter, urlService) {
23468        var vm = this;
23469
23470        //State variables
23471        Object.assign(vm, $scope.game);
23472        vm.url = urlService;
23473
23474        vm.messageTypes = {
23475            1: { class: 'important-note' },
23476            2: { class: 'warning-note' },
23477            3: { class: 'message-note' },
23478        }
23479
23480        vm.firstDivision = undefined;
23481        vm.firstDivisionId = undefined;
23482        vm.firstResult = undefined;
23483        vm.firstTeamAvatar = undefined;
23484        vm.firstTeamId = undefined;
23485        vm.firstTeamName = undefined;
23486
23487        vm.secondDivision = undefined;
23488        vm.secondDivisionId = undefined;
23489        vm.secondResult = undefined;
23490        vm.secondTeamAvatar = undefined;
23491        vm.secondTeamId = undefined;
23492        vm.secondTeamName = undefined;
23493
23494        vm.getStatusGame = function () {
23495            var gameStatus = '';
23496            switch (vm.SportId) {
23497                case 2:
23498                    if (vm.Properties) {
23499                        var gameStatusProperty = _.find(vm.Properties, { name: 'GameStatus' });
23500                        if (gameStatusProperty) {
23501                            var gameStatusProperties = _.split(gameStatusProperty.value, '-');
23502                            if (gameStatusProperties) {
23503                                gameStatus = $translate.instant('directives.widgets.scores.labels.' + gameStatusProperties[0]) + ' ' + $filter('ordinal')(gameStatusProperties[1], true) + ' - ' + gameStatusProperties[2] + $translate.instant('directives.widgets.scores.labels.out');
23504                            }
23505                        }
23506                    }
23507                    break;
23508                default:
23509                    {
23510                        gameStatus = $filter('ordinal')(vm.PeriodId, true) + ' - ' + vm.getFormatTime();
23511                    }
23512            }
23513            return gameStatus;
23514        }
23515
23516        //State functions
23517        vm.getFormatTime = function () {
23518            switch (vm.StatusId) {
23519                case 3:
23520                case 1:
23521                    return moment(vm.StartTime, 'hh:mm').format('LT');
23522
23523                case 2:
23524                    return moment(vm.Time, 'hh:mm:ss').format('LTS').substr(3, 5);
23525            }
23526        };
23527
23528        vm.teamSummary = function (teamId, statistics) {
23529            var summary = '';
23530
23531            _.forEach(statistics, function (statistic) {
23532                if (statistic.TeamId === teamId && statistic.StatTypeId === 6) { // 6 = Goal
23533                    if (summary.length === 0) {
23534                        summary = `${statistic.FirstName.charAt(0)}. ${statistic.LastName} (${statistic.Value})`;
23535                    } else {
23536                        summary += `, ${statistic.FirstName.charAt(0)}. ${statistic.LastName} (${statistic.Value})`;
23537                    }
23538                }
23539            });
23540
23541            return summary;
23542        };
23543
23544        //On component mount
23545        setLocalAndVisitorPosition();
23546        $scope.$watch('visitorBottom', function () {
23547            setLocalAndVisitorPosition();
23548        })
23549
23550        function setLocalAndVisitorPosition() {
23551            if ($scope.visitorBottom) {
23552                vm.firstDivision = vm.LocalDivision;
23553                vm.firstDivisionId = vm.LocalDivisionId;
23554                vm.firstResult = vm.LocalResult;
23555                vm.firstTeamAvatar = vm.LocalTeamAvatar;
23556                vm.firstTeamId = vm.LocalTeamId;
23557                vm.firstTeamName = vm.LocalTeamName;
23558
23559                vm.secondDivision = vm.VisitorDivision;
23560                vm.secondDivisionId = vm.VisitorDivisionId;
23561                vm.secondResult = vm.VisitorResult;
23562                vm.secondTeamAvatar = vm.VisitorTeamAvatar;
23563                vm.secondTeamId = vm.VisitorTeamId;
23564                vm.secondTeamName = vm.VisitorTeamName;
23565            } else {
23566                vm.firstDivision = vm.VisitorDivision;
23567                vm.firstDivisionId = vm.VisitorDivisionId;
23568                vm.firstResult = vm.VisitorResult;
23569                vm.firstTeamAvatar = vm.VisitorTeamAvatar;
23570                vm.firstTeamId = vm.VisitorTeamId;
23571                vm.firstTeamName = vm.VisitorTeamName;
23572
23573                vm.secondDivision = vm.LocalDivision;
23574                vm.secondDivisionId = vm.LocalDivisionId;
23575                vm.secondResult = vm.LocalResult;
23576                vm.secondTeamAvatar = vm.LocalTeamAvatar;
23577                vm.secondTeamId = vm.LocalTeamId;
23578                vm.secondTeamName = vm.LocalTeamName;
23579            }
23580        }
23581    }
23582})();
23583;
23584(function () {
23585    'use strict';
23586
23587    angular
23588        .module('app.directives')
23589        .directive('gameResults', gameResults);
23590
23591    gameResults.$inject = [];
23592
23593    function gameResults() {
23594        return {
23595            restrict: 'E',
23596            scope: {                
23597                game: '=',
23598                visitorBottom: '='
23599            },
23600            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/result/list/game/game-results.tpl.html',
23601            controller: 'GameResultsController',
23602            controllerAs: 'gameResults'
23603        };
23604    }
23605})();;
23606(function () {
23607    'use strict';
23608
23609    angular
23610        .module('app.directives')
23611        .controller('ResultListWidgetController', ResultListWidgetController);
23612
23613    ResultListWidgetController.$inject = ['$rootScope', '$scope', 'WebsiteEditorService', 'GameService'];
23614
23615    function ResultListWidgetController($rootScope, $scope, websiteEditorService, gameService) {
23616        var vm = this;
23617
23618        //Local variables
23619        var games;
23620        var currentPageIndex = 1;
23621        const pageSize = 12; // TODO Parameter? Page length
23622        var selectedSeason = null;
23623        var selectedDivision = null;
23624        var selectedFacility = null;
23625        var selectedTeam = null;
23626
23627        //State variables
23628        vm.view;
23629        vm.dateRange;
23630        vm.games = [];
23631        vm.widget = angular.fromJson(widgets[$scope.widget]);
23632        vm.defaultView = 'week';
23633        vm.visitorBottom = false;
23634
23635        //State functions
23636        vm.viewToday = function (dateRange) {
23637            vm.dateRange = dateRange;
23638            var options = {
23639                startDate: moment(dateRange.startDate).format('YYYY-MM-DD HH:mm:ss'),
23640                endDate: moment(dateRange.endDate).format('YYYY-MM-DD HH:mm:ss')
23641            };
23642            currentPageIndex = 1;
23643            getGames(selectedSeason, options);
23644        };
23645
23646        vm.viewChange = function (view, dateRange) {
23647            var options = {};
23648            vm.view = view;
23649            vm.dateRange = dateRange;
23650            if (dateRange !== null) {
23651                options = {
23652                    startDate: moment(dateRange.startDate).format('YYYY-MM-DD HH:mm:ss'),
23653                    endDate: moment(dateRange.endDate).format('YYYY-MM-DD HH:mm:ss')
23654                };
23655            }
23656            currentPageIndex = 1;
23657            getGames(selectedSeason, options);
23658        };
23659
23660        vm.loadMoreGames = function () {
23661            currentPageIndex += 1;
23662            vm.gamesDisplayed = vm.games.slice(0, currentPageIndex * pageSize);
23663        };
23664
23665        vm.filter = function (filter) {
23666            currentPageIndex = 1;
23667
23668            selectedDivision = filter.division;
23669            selectedTeam = filter.team;
23670            selectedFacility = filter.facility;
23671
23672            if (filter.season !== selectedSeason) {
23673                selectedSeason = filter.season;
23674                var options = {};
23675                if (vm.dateRange !== null) {
23676                    options = {
23677                        startDate: moment(vm.dateRange.startDate).format('YYYY-MM-DD HH:mm:ss'),
23678                        endDate: moment(vm.dateRange.endDate).format('YYYY-MM-DD HH:mm:ss')
23679                    };
23680                }
23681                getGames(selectedSeason, options);
23682            } else {
23683                filterLocally();
23684            }
23685        };
23686
23687        //On component mount
23688        for (var parameter in vm.widget.parameters) {
23689            switch (vm.widget.parameters[parameter].id) {
23690                case 'defaultView':
23691                    vm.defaultView = vm.widget.parameters[parameter].value;
23692                    break;
23693                case 'visitorBottom':
23694                    vm.visitorBottom = (vm.widget.parameters[parameter].value === 'true');
23695                    break;
23696            }
23697        }
23698
23699        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
23700            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
23701                .then(function (response) {
23702                    for (var parameter in vm.widget.parameters) {
23703                        switch (vm.widget.parameters[parameter].id) {
23704                            case 'defaultView':
23705                                vm.widget.parameters[parameter].value = data.defaultView;
23706                                vm.defaultView = data.defaultView;
23707                                break;
23708                            case 'visitorBottom':
23709                                vm.widget.parameters[parameter].value = data.visitorBottom.toString();
23710                                vm.visitorBottom = data.visitorBottom;
23711                                break;
23712                        }
23713                    }
23714                    currentPageIndex = 1;
23715                    filterLocally();
23716                    widgets[$scope.widget] = angular.toJson(vm.widget);
23717                })
23718                .catch(function (error) {
23719                    bugsnag.notify(error);
23720                });
23721        });
23722
23723        $scope.$on('$destroy', listener);
23724
23725        // API calls
23726        function getGames(seasonId, options) {
23727            if (seasonId) {
23728                gameService.getGamesBySeasonId(__solutionId__, seasonId, options)
23729                    .then(function (response) {
23730                        games = response.data.Results;
23731                        vm.games = response.data.Results;
23732                        filterLocally();
23733                    })
23734                    .catch(function (error) {
23735                        bugsnag.notify(error);
23736                    });
23737            }
23738        }
23739
23740        // Helper functions
23741        function filterLocally() {
23742            vm.games = [];
23743            _.forEach(games, function (game) {
23744                if (selectedDivision === 'general' || selectedDivision === 'divisions' || game.LocalDivisionId == selectedDivision || game.VisitorDivisionId == selectedDivision) {
23745                    if (selectedFacility === 'all' || game.SportCenterId == selectedFacility) {
23746                        if (selectedTeam === 'all' || game.LocalTeamId == selectedTeam || game.VisitorTeamId == selectedTeam) {
23747                            vm.games.push(game);
23748                        }
23749                    }
23750                }
23751            });
23752            vm.gamesDisplayed = vm.games.length > pageSize
23753                ? vm.games.slice(0, currentPageIndex * pageSize)
23754                : vm.games;
23755        }
23756    }
23757})();
23758;
23759(function () {
23760    'use strict';
23761
23762    angular
23763        .module('app.directives')
23764        .directive('resultList', resultList);
23765
23766    resultList.$inject = ['$window'];
23767
23768    function resultList($window) {
23769        return {
23770            restrict: 'E',
23771            scope: {                
23772                widget: '='
23773            },
23774            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/result/list/result-list.tpl.html',
23775            controller: 'ResultListWidgetController',
23776            controllerAs: 'resultList'
23777        };
23778    }
23779})();;
23780(function () {
23781    'use strict';
23782
23783    angular
23784        .module('app.directives')
23785        .controller('ScheduleActionsWidgetController', ScheduleActionsWidgetController);
23786
23787    ScheduleActionsWidgetController.$inject = ['$scope'];
23788
23789    function ScheduleActionsWidgetController($scope) {
23790        var vm = this;
23791        /*vm.views = ['day', '3days', 'week', 'month', 'season'];
23792        vm.selected = 'week'; // TODO Get a value from parameter / local or session storage.
23793        
23794        vm.today = function() {
23795            if (typeof $scope.today == 'function') {                        
23796                $scope.today();
23797            }
23798        };
23799
23800        vm.change = function(view) {
23801            if (vm.selected !== view) {
23802                vm.selected = view;
23803
23804                if (typeof $scope.change == 'function') {                        
23805                    $scope.change({ view: vm.selected });
23806                }
23807            }            
23808        };*/
23809    }
23810})();
23811;
23812(function () {
23813    'use strict';
23814
23815    angular
23816        .module('app.directives')
23817        .directive('scheduleActions', scheduleActions);
23818
23819    scheduleActions.$inject = [];
23820
23821    function scheduleActions() {
23822        return {
23823            restrict: 'E',
23824            scope: {                
23825
23826            },
23827            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/schedule/actions/schedule-actions.tpl.html',
23828            controller: 'ScheduleActionsWidgetController',
23829            controllerAs: 'scheduleActions'
23830        };
23831    }
23832})();;
23833(function () {
23834    'use strict';
23835
23836    angular
23837        .module('app.directives')
23838        .controller('ScheduleFiltersWidgetController', ScheduleFiltersWidgetController);
23839
23840    ScheduleFiltersWidgetController.$inject = ['$scope', '$localStorage', 'SeasonService', 'DivisionService', 'TeamService', 'FacilityService'];
23841
23842    function ScheduleFiltersWidgetController($scope, $localStorage, seasonService, divisionService, teamService, facilityService) {
23843        var vm = this;
23844        var teams;
23845        var defaultSeasonId = $localStorage.solution.defaultSeasonId;
23846        vm.seasons = [];
23847        vm.seasonSelected = undefined;
23848        vm.divisions = [];
23849        vm.divisionSelected = undefined;
23850        vm.teams = [];
23851        vm.teamSelected = undefined;
23852        vm.facilities = [];
23853        vm.facilitySelected = undefined;
23854
23855        // Get seasons from the current solution.
23856        seasonService.getSeasonsBySolutionId(__solutionId__)
23857            .then(function(response) {
23858                // Transform data before adding to dropdown.
23859                response.data.forEach(function(season) {
23860                    if (defaultSeasonId === season.Id) {
23861                        vm.seasonSelected = season.Id;
23862                        vm.seasons.unshift(season);
23863                    } else {
23864                        vm.seasons.push(season);
23865                    }            
23866                });                
23867            })
23868            .catch(function(error) {
23869                bugsnag.notify(error);
23870            });
23871
23872        // Get divisions from the current season.
23873        divisionService.getDivisionsBySeasonId(__solutionId__, defaultSeasonId)
23874            .then(function(response) {
23875                response.data.forEach(function(division) {
23876                    // Display the parent level only.
23877                    if (angular.isUndefinedOrNull(division.ParentId)) {
23878                        vm.divisions.push(division);
23879                    }                    
23880                });                
23881            })
23882            .catch(function(error) {
23883                bugsnag.notify(error);
23884            });
23885
23886        // Get active teams from the current solution.
23887        teamService.getTeamsBySolutionId(__solutionId__)
23888            .then(function(response) {
23889                // Transform data before adding to dropdown.
23890                response.data.results.forEach(function(team) {
23891                    vm.teams.push({
23892                        Id: team.id,
23893                        Name: team.fullName,
23894                        division: {
23895                            id: team.divisionId,
23896                            name: team.division
23897                        }
23898                    });                    
23899                });                
23900
23901                teams = vm.teams; // Keep local backup of data.
23902
23903                if (angular.isDefined($scope.team)) {
23904                    vm.teamSelected = $scope.team.id;
23905
23906                    if (typeof $scope.teamChange == 'function') {                        
23907                        $scope.teamChange({ teamId: $scope.team.id });
23908                    }
23909                }
23910            })
23911            .catch(function(error) {
23912                bugsnag.notify(error);
23913            });
23914
23915        // Get facilities from the current solution.
23916        facilityService.getFacilitiesBySolutionId(__solutionId__)
23917            .then(function (response) {
23918                vm.facilities = response.data;                
23919            })
23920            .catch(function(error) {
23921                bugsnag.notify(error);
23922            });
23923
23924        vm.seasonChange = function(item) {
23925            vm.seasonSelected = item.Id;
23926            if (typeof $scope.seasonChange == 'function') {                        
23927                $scope.seasonChange({ seasonId: item.Id });
23928            }
23929        };
23930
23931        vm.divisionChange = function(division) {
23932            vm.divisionSelected = division.Id;
23933
23934            // Filter the teams displayed from teams list backup.
23935            vm.teams = _.filter(teams, function(team) {
23936                return team.division.id === division.Id
23937            });
23938
23939            // Raise the division id to filter the schedule.
23940            if (typeof $scope.divisionChange == 'function') {                        
23941                $scope.divisionChange({ divisionId: division.Id });
23942            }
23943        };
23944
23945        vm.teamChange = function(item) {
23946            vm.teamSelected = item.Id;
23947            if (typeof $scope.teamChange == 'function') {                        
23948                $scope.teamChange({ teamId: item.Id });
23949            }
23950        };
23951
23952        vm.facilityChange = function(item) {
23953            vm.facilitySelected = item.Id;                     
23954            if (typeof $scope.facilityChange == 'function') {   
23955                $scope.facilityChange({ facilityId: item.Id });
23956            }
23957        };
23958    }
23959})();
23960;
23961(function () {
23962    'use strict';
23963
23964    angular
23965        .module('app.directives')
23966        .directive('scheduleFilters', scheduleFilters);
23967
23968    scheduleFilters.$inject = [];
23969
23970    function scheduleFilters() {
23971        return {
23972            restrict: 'E',
23973            scope: {      
23974                team: '=',          
23975                seasonChange: '&',
23976                divisionChange: '&',
23977                teamChange: '&',
23978                facilityChange: '&'
23979            },
23980            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/schedule/filters/schedule-filters.tpl.html',
23981            controller: 'ScheduleFiltersWidgetController',
23982            controllerAs: 'scheduleFilters'
23983        };
23984    }
23985})();;
23986(function () {
23987    'use strict';
23988
23989    angular
23990        .module('app.directives')
23991        .controller('ScheduleGameWidgetController', ScheduleGameWidgetController);
23992
23993    ScheduleGameWidgetController.$inject = ['$scope', '$translate', '$filter', 'UrlService', 'GoogleMapService'];
23994
23995    function ScheduleGameWidgetController($scope, $translate, $filter, urlService, googleMapService) {
23996        var vm = this;
23997
23998        //State variables
23999        Object.assign(vm, $scope.game);
24000        vm.solutionId = __solutionId__;
24001        vm.url = urlService;
24002        vm.messageTypes = {
24003            1: { class: 'important-note' },
24004            2: { class: 'warning-note' },
24005            3: { class: 'message-note' },
24006        }
24007                
24008        vm.firstDivision = undefined;
24009        vm.firstDivisionId = undefined;
24010        vm.firstResult = undefined;
24011        vm.firstTeamAvatar = undefined;
24012        vm.firstTeamId = undefined;
24013        vm.firstTeamName = undefined;
24014
24015        vm.secondDivision = undefined;
24016        vm.secondDivisionId = undefined;
24017        vm.secondResult = undefined;
24018        vm.secondTeamAvatar = undefined;
24019        vm.secondTeamId = undefined;
24020        vm.secondTeamName = undefined;
24021
24022        vm.gameType = _.get(_.find(vm.Properties, { name: 'GameType' }), 'value');
24023
24024        vm.clickFacility = function () {
24025            if ($scope.facility && $scope.facility.facilityAddress) {
24026                var url = googleMapService.getMapSearchUrl($scope.facility.facilityAddress);
24027                window.open(url, "_blank");                
24028            }
24029        }
24030
24031        vm.getStatusGame = function () {
24032            var gameStatus = '';
24033            switch (vm.SportId) {
24034                // Baseball
24035                case 2:
24036                    if (vm.Properties) {
24037                        var gameStatusProperty = _.find(vm.Properties, { name: 'GameStatus' });
24038                        if (gameStatusProperty) {
24039                            var gameStatusProperties = _.split(gameStatusProperty.value, '-');
24040                            
24041                            if (gameStatusProperties) {
24042                                switch (vm.StatusId) {
24043                                    case 2:
24044                                        gameStatus = $translate.instant('directives.widgets.scores.labels.' + gameStatusProperties[0]) + ' ' + $filter('ordinal')(gameStatusProperties[1], true) + ' - ' + gameStatusProperties[2] + $translate.instant('directives.widgets.scores.labels.out');
24045                                        break;
24046                                    case 3:
24047                                        gameStatus = $translate.instant('directives.widgets.scores.labels.final');
24048                                        gameStatus = gameStatus + ' ' + gameStatusProperties[1];
24049                                        break;
24050                                }
24051                            }
24052                        }
24053                    }
24054                    break;
24055                default:
24056                    {
24057                        switch (vm.StatusId) {
24058                            case 2:
24059                                gameStatus = $filter('ordinal')(vm.PeriodId, true);
24060                                if (vm.IsUseTime) {
24061                                    gameStatus += ' - ' + vm.getFormatTime(vm);
24062                                }
24063                                break;
24064                            case 3:
24065                                gameStatus = $translate.instant('directives.widgets.scores.labels.final');
24066                                if (vm.PeriodId > 4) {
24067                                    gameStatus += ' / ';
24068                                }
24069                                if (vm.PeriodId >= 5 && vm.PeriodId <= 8) {
24070                                    gameStatus += $translate.instant('directives.widgets.scores.labels.overtime');
24071                                }
24072                                if (vm.PeriodId == 9) {
24073                                    gameStatus += $translate.instant('directives.widgets.scores.labels.shootout');
24074                                }
24075                                break;
24076                        }
24077                    }
24078            }
24079            return gameStatus;
24080        }
24081        
24082        //State functions
24083        vm.getFormatTime = function(score) {
24084            switch (score.StatusId) {
24085                case 3:
24086                case 1:
24087                    return moment(score.StartTime, 'hh:mm').format('LT');
24088                    
24089                case 2:
24090                    return moment(score.Time, 'hh:mm:ss').format('LTS').substr(3, 5);
24091            }
24092        };
24093
24094        
24095        vm.getFormatStartTime = function(startTime) {
24096            return moment(startTime, 'hh:mm').format('LT');            
24097        };
24098
24099        //On component mount
24100        setLocalAndVisitorPosition();
24101        $scope.$watch('visitorRight', function() {
24102            setLocalAndVisitorPosition();
24103        })
24104
24105        function setLocalAndVisitorPosition() {
24106            if ($scope.visitorRight) {
24107                vm.firstDivision =  vm.LocalDivision;
24108                vm.firstDivisionId =  vm.LocalDivisionId;
24109                vm.firstResult =  vm.LocalResult;
24110                vm.firstTeamAvatar = vm.LocalTeamId ? vm.LocalTeamAvatar : $translate.instant('directives.widgets.schedule.game.labels.tbdImage');
24111                vm.firstTeamId =  vm.LocalTeamId;
24112                vm.firstTeamName =  vm.LocalTeamName;
24113    
24114                vm.secondDivision =  vm.VisitorDivision;
24115                vm.secondDivisionId =  vm.VisitorDivisionId;
24116                vm.secondResult =  vm.VisitorResult;
24117                vm.secondTeamAvatar = vm.VisitorTeamId ? vm.VisitorTeamAvatar : $translate.instant('directives.widgets.schedule.game.labels.tbdImage');
24118                vm.secondTeamId =  vm.VisitorTeamId;
24119                vm.secondTeamName =  vm.VisitorTeamName;
24120            } else {
24121                vm.firstDivision =  vm.VisitorDivision;
24122                vm.firstDivisionId =  vm.VisitorDivisionId;
24123                vm.firstResult =  vm.VisitorResult;
24124                vm.firstTeamAvatar = vm.VisitorTeamId ? vm.VisitorTeamAvatar : $translate.instant('directives.widgets.schedule.game.labels.tbdImage');
24125                vm.firstTeamId =  vm.VisitorTeamId;
24126                vm.firstTeamName =  vm.VisitorTeamName;
24127    
24128                vm.secondDivision =  vm.LocalDivision;
24129                vm.secondDivisionId =  vm.LocalDivisionId;
24130                vm.secondResult =  vm.LocalResult;
24131                vm.secondTeamAvatar = vm.LocalTeamId ? vm.LocalTeamAvatar : $translate.instant('directives.widgets.schedule.game.labels.tbdImage');
24132                vm.secondTeamId =  vm.LocalTeamId;
24133                vm.secondTeamName =  vm.LocalTeamName;
24134            }
24135        }
24136    }
24137})();
24138;
24139(function () {
24140    'use strict';
24141
24142    angular
24143        .module('app.directives')
24144        .directive('scheduleGame', scheduleGame);
24145
24146    scheduleGame.$inject = [];
24147
24148    function scheduleGame() {
24149        return {
24150            restrict: 'E',
24151            scope: {                
24152                game: '=',
24153                visitorRight: '=',
24154                showFollow: '=',
24155                facility: '='
24156            },
24157            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/schedule/game/schedule-game.tpl.html',
24158            controller: 'ScheduleGameWidgetController',
24159            controllerAs: 'scheduleGame'
24160        };
24161    }
24162})();;
24163(function () {
24164    'use strict';
24165
24166    angular
24167        .module('app.directives')
24168        .controller('ScheduleEventWidgetController', ScheduleEventWidgetController);
24169
24170    ScheduleEventWidgetController.$inject = ['$scope', 'UrlService'];
24171
24172    function ScheduleEventWidgetController($scope, urlService) {
24173        var vm = this;
24174
24175        //State variables
24176        Object.assign(vm, $scope.event);
24177        vm.solutionId = __solutionId__;
24178        vm.url = urlService;
24179        
24180        //State functions
24181        vm.getFormatTime = function(score) {
24182            switch (score.StatusId) {
24183                case 3:
24184                case 1:
24185                    return moment(score.StartTime, 'hh:mm').format('LT');
24186                    
24187                case 2:
24188                    return moment(score.Time, 'hh:mm:ss').format('LTS').substr(3, 5);
24189            }
24190        };
24191
24192        vm.getFormatStartTime = function(startTime) {
24193            return moment(startTime, 'hh:mm').format('LT');            
24194        };
24195
24196    }
24197})();
24198;
24199(function () {
24200    'use strict';
24201
24202    angular
24203        .module('app.directives')
24204        .directive('scheduleEvent', scheduleEvent);
24205
24206    scheduleEvent.$inject = [];
24207
24208    function scheduleEvent() {
24209        return {
24210            restrict: 'E',
24211            scope: {                
24212                event: '=',
24213                visitorRight: '='
24214            },
24215            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/schedule/event/schedule-event.tpl.html',
24216            controller: 'ScheduleEventWidgetController',
24217            controllerAs: 'scheduleEvent'
24218        };
24219    }
24220})();;
24221(function () {
24222    'use strict';
24223
24224    angular
24225        .module('app.directives')
24226        .controller('ScheduleNavigationWidgetController', ScheduleNavigationWidgetController);
24227
24228    ScheduleNavigationWidgetController.$inject = ['$scope'];
24229
24230    function ScheduleNavigationWidgetController($scope) {
24231        var vm = this;
24232        var currentView;
24233        vm.tabs = [];
24234
24235        $scope.$watch('view', function (newValue, oldValue) {
24236            currentView = newValue;
24237
24238            renderTabs(newValue);
24239        });
24240
24241        $scope.$watch('dateRange', function (newValue, oldValue) {
24242            renderTabs(currentView);
24243        });
24244
24245        vm.click = function(tab) {
24246            var dateRange;
24247
24248            // TODO Move into service Schedule
24249            switch ($scope.view) {
24250                case 'day':
24251                    dateRange = getDateRange('day', tab.date); // TODO Eventually, add possibility to pass custom date.
24252                    break;
24253
24254                case '3days':
24255                    dateRange = get3DaysRange(tab.date);
24256                    break;
24257
24258                case 'week':
24259                    dateRange = getDateRange('isoWeek', tab.date); // TODO Eventually, add possibility to pass custom date.
24260                    break;
24261
24262                case 'month':
24263                    dateRange = getDateRange('month', tab.date); // TODO Eventually, add possibility to pass custom date.
24264                    break;
24265            }  
24266
24267            $scope.change({ view: $scope.view, dateRange: dateRange });
24268        };
24269
24270        function renderTabs(view) {
24271            // TODO Create function
24272            var tabs = [];
24273            var previousDate;
24274            var nextDate;
24275
24276            switch (view) {
24277                case 'day':
24278                    // Previous day
24279                    previousDate = moment($scope.dateRange.date).subtract(1, 'day').toDate();
24280                    tabs.push({
24281                        text: moment(previousDate).format('LL'),
24282                        date: previousDate
24283                    });
24284
24285                    // Current day
24286                    tabs.push({
24287                        text: moment($scope.dateRange.date).format('LL'),
24288                        date: $scope.dateRange.date
24289                    })
24290
24291                    // Next day
24292                    nextDate = moment($scope.dateRange.date).add(1, 'day').toDate();
24293                    tabs.push({
24294                        text: moment(nextDate).format('LL'),
24295                        date: nextDate
24296                    });
24297                    break;
24298
24299                case '3days':
24300                    // Previous 3 days
24301                    previousDate = moment($scope.dateRange.date).subtract(3, 'day').toDate();
24302                    tabs.push({
24303                        text: moment(previousDate).format('LL'),
24304                        date: previousDate
24305                    });
24306
24307                    // Current 3 days
24308                    tabs.push({
24309                        text: moment($scope.dateRange.date).format('LL'),
24310                        date: $scope.dateRange.date
24311                    })
24312
24313                    // Next 3 days
24314                    nextDate = moment($scope.dateRange.date).add(3, 'day').toDate();
24315                    tabs.push({
24316                        text: moment(nextDate).format('LL'),
24317                        date: nextDate
24318                    });
24319                    break;
24320
24321                case 'week':
24322                    // Previous week
24323                    previousDate = moment($scope.dateRange.startDate).subtract(1, 'week').toDate();
24324                    tabs.push({
24325                        text: momen
24325t(previousDate).format('LL'),
24326                        date: previousDate
24327                    });
24328
24329                    // Current week
24330                    tabs.push({
24331                        text: moment($scope.dateRange.startDate).format('LL'),
24332                        date: $scope.dateRange.date
24333                    })
24334
24335                    // Next week
24336                    nextDate = moment($scope.dateRange.startDate).add(1, 'week').toDate();
24337                    tabs.push({
24338                        text: moment(nextDate).format('LL'),
24339                        date: nextDate
24340                    });
24341                    break;
24342
24343                case 'month':
24344                    // Previous month
24345                    previousDate = moment($scope.dateRange.date).subtract(1, 'month').toDate();
24346                    tabs.push({
24347                        text: moment(previousDate).format('MMMM YYYY'),
24348                        date: previousDate
24349                    });
24350
24351                    // Current month
24352                    tabs.push({
24353                        text: moment($scope.dateRange.date).format('MMMM YYYY'),
24354                        date: $scope.dateRange.date
24355                    })
24356
24357                    // Next month
24358                    nextDate = moment($scope.dateRange.date).add(1, 'month').toDate();
24359                    tabs.push({
24360                        text: moment(nextDate).format('MMMM YYYY'),
24361                        date: nextDate
24362                    });
24363                    break;
24364
24365                case 'season':
24366                    console.log('Not implemented yet!');
24367                    break;
24368            }
24369            vm.tabs = tabs;
24370        }
24371
24372        function getDateRange(type, date) {
24373            return { 
24374                date: date,
24375                startDate: moment(date).startOf(type).toDate(), 
24376                endDate: moment(date).endOf(type).toDate() 
24377            };
24378        }
24379
24380        function get3DaysRange(date) {
24381            return { 
24382                date: date,
24383                startDate: moment(date).subtract(1, 'day').startOf('day').toDate(), 
24384                endDate: moment(date).add(1, 'day').endOf('day').toDate() 
24385            };
24386        }
24387    }
24388})();
24389;
24390(function () {
24391    'use strict';
24392
24393    angular
24394        .module('app.directives')
24395        .directive('scheduleNavigation', scheduleNavigation);
24396
24397    scheduleNavigation.$inject = [];
24398
24399    function scheduleNavigation() {
24400        return {
24401            restrict: 'E',
24402            scope: {      
24403                dateRange: '=',          
24404                view: '=',
24405                change: '&'
24406            },
24407            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/schedule/navigation/schedule-navigation.tpl.html',
24408            controller: 'ScheduleNavigationWidgetController',
24409            controllerAs: 'scheduleNavigation'
24410        };
24411    }
24412})();;
24413(function () {
24414    'use strict';
24415
24416    angular
24417        .module('app.directives')
24418        .controller('ScheduleViewsWidgetController', ScheduleViewsWidgetController);
24419
24420    ScheduleViewsWidgetController.$inject = ['$scope'];
24421
24422    function ScheduleViewsWidgetController($scope) {
24423        var vm = this;
24424        vm.defaultView = $scope.defaultView;
24425        vm.selected = vm.defaultView;
24426        
24427        $scope.$watch('defaultView', function(newValue, oldValue) {
24428            vm.defaultView = newValue;
24429            vm.change(vm.defaultView);
24430        })
24431
24432        vm.views = [
24433            { value: 'day', class: 'd-block d-sm-none', text: 'dayAbbr' },
24434            { value: '3days', class: 'd-block d-sm-none', text: '3daysAbbr' },
24435            { value: 'week', class: 'd-block d-sm-none', text: 'weekAbbr' },
24436            { value: 'month', class: 'd-block d-sm-none', text: 'monthAbbr' },
24437            { value: 'season', class: 'd-block d-sm-none', text: 'seasonAbbr' },
24438
24439            { value: 'day', class: 'd-none d-sm-block', text: 'day' },
24440            { value: '3days', class: 'd-none d-sm-block', text: '3days' },
24441            { value: 'week', class: 'd-none d-sm-block', text: 'week' },
24442            { value: 'month', class: 'd-none d-sm-block', text: 'month' },
24443            { value: 'season', class: 'd-none d-sm-block', text: 'season' }
24444        ];
24445
24446        vm.today = function () {
24447            if (typeof $scope.today == 'function') {
24448                $scope.today({ dateRange: getDateRange('day', new Date()) });
24449            }
24450        };
24451
24452        vm.change = function (view) {
24453            if (vm.selected !== view || vm.selected == vm.defaultView) {
24454                vm.selected = view;
24455
24456                if (typeof $scope.change == 'function') {
24457                    var dateRange = null;
24458
24459                    switch (view) {
24460                        case 'day':
24461                            dateRange = getDateRange('day', new Date()); // TODO Eventually, add possibility to pass custom date.
24462                            break;
24463
24464                        case '3days':
24465                            dateRange = get3DaysRange(new Date());
24466                            break;
24467
24468                        case 'week':
24469                            dateRange = getDateRange('isoWeek', new Date()); // TODO Eventually, add possibility to pass custom date.
24470                            break;
24471
24472                        case 'month':
24473                            dateRange = getDateRange('month', new Date()); // TODO Eventually, add possibility to pass custom date.
24474                            break;
24475                    }
24476
24477                    $scope.change({ view: vm.selected, dateRange: dateRange });
24478                }
24479            }
24480        };
24481
24482        // Initialize the schedule view with default view.
24483        vm.change(vm.defaultView);
24484
24485        function getDateRange(type, date) {
24486            return {
24487                date: date,
24488                startDate: moment(date).startOf(type).toDate(),
24489                endDate: moment(date).endOf(type).toDate()
24490            };
24491        }
24492
24493        function get3DaysRange(date) {
24494            return {
24495                date: date,
24496                startDate: moment(date).subtract(1, 'day').startOf('day').toDate(),
24497                endDate: moment(date).add(1, 'day').endOf('day').toDate()
24498            };
24499        }
24500    }
24501})();
24502;
24503(function () {
24504    'use strict';
24505
24506    angular
24507        .module('app.directives')
24508        .directive('scheduleViews', scheduleViews);
24509
24510    scheduleViews.$inject = [];
24511
24512    function scheduleViews() {
24513        return {
24514            restrict: 'E',
24515            scope: {
24516                change: '&',
24517                today: '&',
24518                widget: '=',
24519                defaultView: "="
24520            },
24521            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/schedule/views/schedule-views.tpl.html',
24522            controller: 'ScheduleViewsWidgetController',
24523            controllerAs: 'scheduleViews'
24524        };
24525    }
24526})();;
24527(function () {
24528    'use strict';
24529
24530    angular
24531        .module('app.directives')
24532        .controller('ScheduleWidgetController', ScheduleWidgetController);
24533
24534    ScheduleWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$window', 'WebsiteEditorService', 'ScheduleService'];
24535
24536    function ScheduleWidgetController($rootScope, $scope, $localStorage, $window, websiteEditorService, scheduleService) {
24537        var vm = this;
24538
24539        //State variables
24540        vm.widget = angular.fromJson(widgets[$scope.widget]);
24541
24542        vm.parameters = {
24543            pageSize: 20,
24544            defaultView: $scope.defaultScheduleTab,
24545            visitorRight: false
24546        };
24547        vm.season = undefined;
24548        vm.division = undefined;
24549        vm.container = undefined;
24550        vm.divisions = undefined;
24551        vm.team = 'all';
24552        vm.facility = 'all';
24553        vm.dateRange = undefined;
24554        vm.teamDefined = false;
24555        vm.view = undefined;
24556
24557        //State functions
24558        vm.viewToday = function (dateRange) {
24559            vm.dateRange = dateRange;
24560        };
24561
24562        vm.viewChange = function (view, dateRange) {
24563            vm.dateRange = dateRange;
24564            vm.view = view;
24565        };
24566
24567        vm.filter = function (filter) {
24568            vm.season = filter.season;
24569            vm.division = filter.division;
24570            vm.container = filter.container;
24571            vm.team = filter.team;
24572            vm.facility = filter.facility;
24573            vm.divisions = filter.divisions;
24574            if (angular.isDefined($scope.team)) {
24575                vm.team = $scope.team.id;
24576                vm.division = 'divisions';
24577            }
24578        };
24579
24580        vm.filterTeam = function (filter) {
24581            vm.season = filter.season;
24582            vm.division = filter.division;
24583            vm.team = filter.team;
24584            vm.facility = filter.facility;
24585            vm.container = filter.container;
24586            vm.divisions = filter.divisions;
24587            if (angular.isDefined($scope.team)) {
24588                vm.team = $scope.team.id;
24589                vm.division = 'divisions';
24590            }
24591        };
24592
24593        vm.printSchedule = function () {
24594            var calendarSheetUrl = '/handlers/CalendarSheet.ashx?solutionId=' + __solutionId__;
24595
24596            if (vm.view == 'season') {
24597                calendarSheetUrl += '&seasonId=' + vm.season;
24598            } else {
24599                var startDate = moment(vm.dateRange.startDate).format('YYYY-MM-DD HH:mm:ss');
24600                var endDate = moment(vm.dateRange.endDate).format('YYYY-MM-DD HH:mm:ss');
24601
24602                if (startDate) {
24603                    calendarSheetUrl += '&startDate=' + startDate;
24604                }
24605
24606                if (endDate) {
24607                    calendarSheetUrl += '&endDate=' + endDate;
24608                }
24609            }
24610
24611            if (vm.team && vm.team != 'all') {
24612                calendarSheetUrl += '&teamId=' + vm.team;
24613            }
24614
24615            if (vm.facility && vm.facility != 'all') {
24616                calendarSheetUrl += '&sportCenterId=' + vm.facility;
24617            }
24618
24619            $window.open(calendarSheetUrl, '_blank');
24620        }
24621
24622        //On component mount
24623        if (angular.isDefined($scope.team)) {
24624            vm.teamDefined = true;
24625            const configuration = $localStorage.solution.configs.find((config) => {
24626                return config.code === 'DEFAULTTEAMCALENDARMODE';
24627            });
24628            if (configuration) {
24629                vm.parameters.defaultView = configuration.value;
24630            }
24631        }
24632
24633        if ($scope.widget) {
24634            for (var parameter in vm.widget.parameters) {
24635                switch (vm.widget.parameters[parameter].id) {
24636                    case 'defaultTeamsDisplayed':
24637                        vm.parameters.pageSize = vm.widget.parameters[parameter].value;
24638                        break;
24639                    case 'defaultView':
24640                        vm.parameters.defaultView = vm.widget.parameters[parameter].value;
24641                        break;
24642                    case 'visitorRight':
24643                        vm.parameters.visitorRight = (vm.widget.parameters[parameter].value === 'true');
24644                        break;
24645                }
24646            }
24647        }
24648
24649        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
24650            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
24651                .then(function (response) {
24652                    for (var parameter in vm.widget.parameters) {
24653                        switch (vm.widget.parameters[parameter].id) {
24654                            case 'defaultTeamsDisplayed':
24655                                vm.widget.parameters[parameter].value = data.defaultTeamsDisplayed;
24656                                vm.parameters.pageSize = data.defaultTeamsDisplayed;
24657                                break;
24658                            case 'defaultView':
24659                                vm.widget.parameters[parameter].value = data.defaultView;
24660                                vm.parameters.defaultView = data.defaultView;
24661                                break;
24662                            case 'visitorRight':
24663                                vm.widget.parameters[parameter].value = data.visitorRight.toString();
24664                                vm.parameters.visitorRight = data.visitorRight;
24665                                break;
24666                        }
24667                    }
24668                    widgets[$scope.widget] = angular.toJson(vm.widget);
24669                })
24670                .catch(function (error) {
24671                    bugsnag.notify(error);
24672                });
24673        });
24674
24675        $scope.$on('$destroy', listener);
24676    }
24677})();
24678;
24679(function () {
24680    'use strict';
24681
24682    angular
24683        .module('app.directives')
24684        .directive('schedule', schedule);
24685
24686    schedule.$inject = [];
24687
24688    function schedule() {
24689        return {
24690            restrict: 'E',
24691            scope: {        
24692                team: '=',
24693                defaultScheduleTab: '=',
24694                widget: '='
24695            },
24696            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/schedule/schedule.tpl.html',
24697            controller: 'ScheduleWidgetController',
24698            controllerAs: 'schedule'
24699        };
24700    }
24701})();;
24702(function () {
24703    'use strict';
24704
24705    angular
24706        .module('app.directives')
24707        .controller('SchedulePageWidgetController', SchedulePageWidgetController);
24708
24709    SchedulePageWidgetController.$inject = ['$rootScope', '$scope', 'WebsiteEditorService'];
24710
24711    function SchedulePageWidgetController($rootScope, $scope, websiteEditorService) {
24712        var vm = this;
24713
24714        // Apply website values to view model object.
24715        vm.widget = angular.fromJson(widgets[$scope.widget]);
24716
24717        vm.embedSrc = `<iframe src="${location.origin}/?iframe=true&pageId=${location.pathname.substring(1)}" width="100%" height="800"></iframe>`; 
24718    }
24719})();
24720;
24721(function () {
24722    'use strict';
24723
24724    angular
24725        .module('app.directives')
24726        .directive('schedulePage', schedulePage);
24727
24728    schedulePage.$inject = [];
24729
24730    function schedulePage() {
24731        return {
24732            restrict: 'E',
24733            scope: {                
24734                widget: '='
24735            },
24736            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/schedule/page/schedule-page.tpl.html',
24737            controller: 'SchedulePageWidgetController',
24738            controllerAs: 'schedulePage'
24739        };
24740    }
24741})();;
24742(function () {
24743    'use strict';
24744
24745    angular
24746        .module('app.directives')
24747        .controller('ScheduleListWidgetController', ScheduleListWidgetController);
24748
24749    ScheduleListWidgetController.$inject = ['$scope', 'ScheduleService', 'SolutionService', 'FacilityService', 'GoogleMapService'];
24750
24751    function ScheduleListWidgetController($scope, scheduleService, solutionService, facilityService, googleMapService) {
24752        var vm = this;
24753
24754        //Local variables
24755        var games;
24756        var currentPageIndex = 1;
24757
24758        //State
24759        vm.games = [];
24760        vm.gamesDisplayed = undefined;
24761        vm.showFollowButton = true;
24762        vm.facilities = [];
24763
24764        //State functions
24765        vm.loadMoreGames = function () {
24766            currentPageIndex += 1;
24767            vm.gamesDisplayed = vm.games.slice(0, currentPageIndex * $scope.parameters.pageSize);
24768        };
24769
24770        vm.viewChange = function (view, dateRange) {
24771            $scope.view = view;
24772            $scope.dateRange = dateRange;
24773        };
24774
24775        solutionService.getSolutionById(__solutionId__).then(function (result) {
24776            var configs = result.data.configs;
24777            var hideFollowConfig = _.find(configs, { code: 'HIDESCHEDULEFOLLOWBUTTON' });
24778            if (hideFollowConfig) {
24779                vm.showFollowButton = hideFollowConfig.value != '1';
24780            }
24781        })
24782
24783        facilityService.getFacilitiesDetailsBySolutionId(__solutionId__)
24784            .then(function (response) {
24785                vm.facilities = response.data;
24786            })
24787            .catch(function (error) {
24788                bugsnag.notify(error);
24789            });
24790
24791        vm.getFacility = function (facility) {
24792            if (facility) {
24793                return _.find(vm.facilities, { id: facility });
24794            }
24795
24796            return null;
24797        }
24798
24799        //Watchers
24800        $scope.$watch('dateRange', function () {
24801            currentPageIndex = 1;
24802            if ($scope.dateRange) {
24803                vm.options = {
24804                    startDate: moment($scope.dateRange.startDate).format('YYYY-MM-DD HH:mm:ss'),
24805                    endDate: moment($scope.dateRange.endDate).format('YYYY-MM-DD HH:mm:ss')
24806                };
24807            } else {
24808                vm.options = {};
24809            }
24810            getSchedule();
24811        }, true);
24812
24813        $scope.$watch('[season, division, team, facility, divisions, container]', function () {                 
24814            currentPageIndex = 1;
24815            getSchedule();
24816        });
24817
24818        $scope.$watch('parameters', function () {
24819            currentPageIndex = 1;
24820            filterLocally();
24821        }, true);
24822
24823        // Helper Functions
24824        function getSchedule() {                       
24825            if ($scope.season === 'all') {            
24826                var options = _.cloneDeep(vm.options);
24827                
24828                if ($scope.container) {
24829                    options.masterSeasonId = $scope.container;
24830                }
24831
24832                scheduleService.getScheduleBySolutionId(__solutionId__, options)
24833                    .then(function (response) {
24834                        games = response.data;
24835                        filterLocally();
24836                    })
24837                    .catch(function (error) {
24838                        bugsnag.notify(error);
24839                    });
24840            } else if ($scope.season) {
24841                scheduleService.getScheduleBySeasonId(__solutionId__, $scope.season, vm.options)
24842                    .then(function (response) {
24843                        games = response.data;
24844                        filterLocally();
24845                    })
24846                    .catch(function (error) {
24847                        bugsnag.notify(error);
24848                    });
24849            }
24850        }
24851
24852        function filterLocally() {
24853            vm.games = [];
24854            _.forEach(games, function (game) {
24855                if (divisionDone(game) && ($scope.facility === 'all' || game.SportCenterId == $scope.facility)) {
24856                    if ($scope.team === 'all' || game.LocalTeamId == $scope.team || game.VisitorTeamId == $scope.team || game.TeamList.find(t => t.Id === $scope.team)) {
24857                        vm.games.push(game);
24858                    }
24859                }
24860            });
24861            vm.gamesDisplayed = vm.games.length > $scope.parameters.pageSize
24862                ? vm.games.slice(0, currentPageIndex * $scope.parameters.pageSize)
24863                : vm.games;
24864        }
24865
24866        function divisionDone(game) {
24867            var divisionsFilter = _.filter($scope.divisions, function (division) { return division.Id == $scope.division || division.ParentId == $scope.division });
24868
24869            var divisionDone = $scope.division === 'general' ||
24870                $scope.division === 'divisions' ||
24871                (_.find(divisionsFilter, { Id: game.LocalDivisionId }) !== undefined) ||
24872                (_.find(divisionsFilter, { Id: game.VisitorDivisionId }) !== undefined);
24873
24874            if (divisionDone != true && game.DivisionList !== null && game.DivisionList.length > 0) {
24875                var resultDivisions = _.intersectionWith(divisionsFilter, game.DivisionList, function (filterDivision, gameDivision) { return filterDivision.Id == gameDivision.Id });
24876                divisionDone = resultDivisions !== null && resultDivisions.length > 0;
24877            }
24878
24879            return divisionDone;
24880        }
24881    }
24882})();;
24883(function () {
24884    'use strict';
24885
24886    angular
24887        .module('app.directives')
24888        .directive('scheduleList', scheduleList)
24889
24890    scheduleList.$inject = [];
24891
24892    function scheduleList() {
24893        return {
24894            restrict: 'E',
24895            scope: {
24896                container: '=',
24897                parameters: '=',
24898                season: '=',
24899                division: '=',
24900                divisions: '=',
24901                team: '=',
24902                facility: '=',
24903                dateRange: '=',
24904                view: '='
24905            },
24906            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/schedule/list/schedule-list.tpl.html',
24907            controller: 'ScheduleListWidgetController',
24908            controllerAs: 'scheduleList'
24909        };
24910    }
24911})();;
24912(function () {
24913    'use strict';
24914
24915    angular
24916        .module('app.directives')
24917        .controller('ScoresWidgetController', ScoresWidgetController);
24918
24919    ScoresWidgetController.$inject = ['$rootScope', '$scope', '$document', '$interval', '$localStorage', 'GameService', 'WebsiteEditorService', 'SignalrService'];
24920
24921    function ScoresWidgetController($rootScope, $scope, $document, $interval, $localStorage, gameService, websiteEditorService, signalrService) {
24922        var vm = this;
24923
24924        //State variables
24925        vm.visitorBottom = false;
24926        vm.maxGame = 30;
24927        vm.currentPosition = 0;
24928        vm.startingPositionFound = false;
24929        vm.delayDay = 30;
24930        vm.widget = getScoresWidget();
24931
24932        if ($localStorage && $localStorage.solution && $localStorage.solution.sportId == 2) {
24933            var signalrConnection = signalrService.getConnection(signalrService.GROUPS.GamebarUpdate(__solutionId__));
24934
24935            signalrConnection.on(signalrService.EVENTS.GameUpdate, function (response) {
24936                var gameUpdated = angular.fromJson(response);
24937
24938                var index = _.findIndex(vm.allScores, { Id: gameUpdated.Id });
24939                if (index > -1) {
24940                    vm.allScores.splice(index, 1, gameUpdated);            
24941                    $scope.$apply();
24942                }
24943            });
24944        }
24945        
24946        //On component mount
24947        for (var parameter in vm.widget.parameters) {
24948            switch (vm.widget.parameters[parameter].id) {
24949                case 'visitorBottom':
24950                    vm.visitorBottom = (vm.widget.parameters[parameter].value === 'true');
24951                    break;
24952                case 'maxGame':
24953                    vm.maxGame = parseInt(vm.widget.parameters[parameter].value);
24954                    break;
24955                case 'delayDay':
24956                    vm.delayDay = parseInt(vm.widget.parameters[parameter].value);
24957                    break;
24958                case 'details':
24959                    vm.details = vm.widget.parameters[parameter].value;
24960                    break;
24961
24962            }
24963        }
24964
24965        getScores();
24966
24967        //Listener
24968        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
24969            for (var parameter in vm.widget.parameters) {
24970                switch (vm.widget.parameters[parameter].id) {
24971                    case 'visitorBottom':
24972                        vm.widget.parameters[parameter].value = data.visitorBottom.toString();
24973                        vm.visitorBottom = data.visitorBottom;
24974                        break;
24975                    case 'maxGame':
24976                        vm.widget.parameters[parameter].value = data.maxGame;
24977                        vm.maxGame = data.maxGame;
24978                        break;
24979                    case 'delayDay':
24980                        vm.widget.parameters[parameter].value = data.delayDay;
24981                        vm.delayDay = data.delayDay;
24982                        break;
24983                    case 'details':
24984                        vm.widget.parameters[parameter].value = data.details;
24985                        vm.details = data.details
24986                }
24987            }
24988            websiteEditorService.updateWebsite(__solutionId__, website)  
24989            .then(function() {
24990                vm.currentPosition = 0;
24991                vm.allScores = [];
24992                getScores();
24993                widgets[$scope.widget] = angular.toJson(vm.widget);
24994            }) 
24995            .catch(function(error) {
24996                bugsnag.notify(error);
24997            });          
24998        });
24999
25000        $scope.$on('$destroy', listener);
25001
25002
25003        //var scoresVisible = true;
25004        //var scoresShouldUpdate = false;
25005
25006        //$document[0].addEventListener("visibilitychange", () => {
25007        //    if ($document[0].hidden) {
25008        //        scoresVisible = false;                
25009        //    } else {                
25010        //        scoresVisible = true;
25011
25012        //        if (scoresShouldUpdate) {
25013        //            getScores();
25014        //        }
25015        //    }
25016        //});
25017
25018        //$interval(function () {
25019        //    if (scoresVisible) {
25020        //        getScores()
25021        //    }
25022        //    else {
25023        //        scoresShouldUpdate = true;
25024        //    }
25025        //}, 30000)
25026
25027        //Helpers
25028        function getScores() {
25029            gameService.getGamesBySolutionId(__solutionId__, { maxGame: vm.maxGame, delayDay: vm.delayDay }) // TODO Parameters
25030                .then(function (results) {
25031                    vm.allScores = results.data;
25032                })
25033                .catch(function (error) {
25034                    bugsnag.notify(error);
25035                });
25036        }
25037
25038        function getScoresWidget() {
25039            const widget = website.widgets.find(function(w) {
25040                return w.id === 'scores';
25041            });
25042            return angular.fromJson(widget);
25043        }
25044    }
25045})();
25046;
25047(function () {
25048    'use strict';
25049
25050    angular
25051        .module('app.directives')
25052        .directive('scores', scores);
25053
25054    scores.$inject = ['$window'];
25055
25056    function scores($window) {
25057        return {
25058            restrict: 'E',
25059            scope: {
25060                widget: '='
25061            },
25062            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/scores/scores.tpl.html',
25063            controller: 'ScoresWidgetController',
25064            controllerAs: 'scores',
25065            link: function (scope, element, attribute, controller) {
25066                var vm = controller;
25067                var translationValue = 500;
25068
25069                vm.clickPrevious = function () {
25070                    // Get the bargame element.
25071                    var bargame = element.find('div.bargame');
25072
25073                    // Calculate the new left position.
25074                    vm.currentPosition = vm.currentPosition + translationValue < 0
25075                        ? vm.currentPosition + translationValue
25076                        : 0;
25077
25078                    bargame.css({ left: `${vm.currentPosition}px` }); // TODO Use template
25079                };
25080
25081                vm.clickNext = function () {
25082                    // Get the bargame element.
25083                    var bargame = element.find('div.bargame');
25084
25085                    // Calculate the maximum left bound
25086                    var leftBound = (bargame.width() - $window.innerWidth) * -1;
25087
25088                    // Calculate the new left position.
25089                    vm.currentPosition = vm.currentPosition - translationValue > leftBound
25090                        ? vm.currentPosition - translationValue
25091                        : leftBound - 112;
25092
25093                    // Set the Css attribute.
25094                    bargame.css({ left: `${vm.currentPosition}px` });
25095                };
25096
25097                vm.getStartingDate = function ($index, date) {                    
25098                    var today = new Date();
25099                    var month = today.getMonth();
25100                    var day = today.getDate();
25101                    var year = today.getFullYear();
25102
25103                    today = new Date(year, month, day);
25104
25105                    //var startingDate = element.find('li.starting-date.bargame');
25106
25107                    if (vm.startingPositionFound === false && today <=new Date(date))  {
25108                        // Get the bargame element.
25109                        var bargame = element.find('div.bargame');
25110
25111                        // Get the starting position.
25112                        var startingPosition = element.find('li.date')[$index];
25113
25114                        // Set the current position.
25115                        vm.currentPosition = startingPosition.offsetLeft * -1;
25116                        vm.startingPositionFound = true;
25117
25118                        // Set the Css attribute.
25119                        bargame.css({ left: `${vm.currentPosition}px` });
25120
25121                        return true;
25122                    }
25123
25124                    return false;
25125                }
25126            }
25127        };
25128    }
25129})();;
25130(function () {
25131    'use strict';
25132
25133    angular
25134        .module('app.directives')
25135        .controller('ScoresGameWidgetController', ScoresGameWidgetController);
25136
25137    ScoresGameWidgetController.$inject = ['$scope', '$filter', '$translate', 'UrlService','ScoreboardBaseballService'];
25138
25139    function ScoresGameWidgetController($scope, $filter, $translate, urlService, scoreboardBaseballService) {
25140		var vm = this;
25141		
25142        //State variables
25143		Object.assign(vm, $scope.score);
25144        vm.url = urlService;
25145        vm.messageTypes = {
25146            1: { class: 'important-note' },
25147            2: { class: 'warning-note' },
25148            3: { class: 'message-note' },
25149        }
25150
25151        vm.firstDivision = undefined;
25152        vm.firstDivisionId = undefined;
25153        vm.firstResult = undefined;
25154        vm.firstTeamAvatar = undefined;
25155        vm.firstTeamId = undefined;
25156        vm.firstTeamName = undefined;
25157        vm.firstPitcher = undefined;
25158
25159        vm.secondDivision = undefined;
25160        vm.secondDivisionId = undefined;
25161        vm.secondResult = undefined;
25162        vm.secondTeamAvatar = undefined;
25163        vm.secondTeamId = undefined;
25164		vm.secondTeamName = undefined;
25165        vm.secondPitcher = undefined;
25166
25167        vm.gameType = _.get(_.find(vm.Properties, { name: 'GameType' }), 'value');
25168
25169        function getDetailsToShow() {
25170            switch ($scope.details) {
25171                case 'starterPitcher':
25172                    scoreboardBaseballService.getLineupBaseball(__solutionId__, vm.Id)
25173                    .then(function(response){
25174                        if (response.data.teams.length > 0) {
25175                            _.forEach(response.data.teams, function (team) {
25176                                let player = _.find(team.positions, { playerPosition: 'pitcher' })
25177                                if (player) {
25178                                    if (player.teamId === vm.firstTeamId) {
25179                                        vm.firstPitcher = player.playerName
25180                                    } else {
25181                                        vm.secondPitcher = player.playerName
25182                                    }
25183                                }
25184                            })
25185                        }
25186                        vm.detailsToShow = {
25187                            local: vm.secondPitcher,
25188                            visitor: vm.firstPitcher
25189                        }
25190                    })
25191                    break;
25192
25193                case 'nothing':
25194                    vm.detailsToShow = {
25195                        local:'',
25196                        visitor:''
25197                    }
25198                    break;
25199
25200                case 'division':
25201                default:
25202                    vm.detailsToShow = {
25203                        local: vm.secondDivision,
25204                        visitor: vm.firstDivision
25205                    }
25206                    break;
25207            }
25208        }
25209		
25210        vm.getStatusGame = function () {
25211            var gameStatus = '';
25212            switch ($scope.score.SportId) {
25213                // Baseball
25214                case 2:
25215                    if ($scope.score.Properties) {
25216                        var gameStatusProperty = _.find($scope.score.Properties, { name: 'GameStatus' });
25217                        if (gameStatusProperty) {
25218                            var gameStatusProperties = _.split(gameStatusProperty.value, '-');
25219                            if (gameStatusProperties) {
25220                                switch ($scope.score.StatusId) {
25221                                    case 2:
25222                                        gameStatus = $translate.instant('directives.widgets.scores.labels.' + gameStatusProperties[0]) + ' ' + $filter('ordinal')(gameStatusProperties[1], true) + ' - ' + gameStatusProperties[2] + $translate.instant('directives.widgets.scores.labels.out');
25223                                        break;
25224                                    case 3:
25225                                        gameStatus = $translate.instant('directives.widgets.scores.labels.final');
25226                                        gameStatus += ' ' + gameStatusProperties[1];
25227                                        break;
25228                                }
25229                            }
25230                        }
25231                    }
25232                    break;
25233                default:
25234                    {
25235                        switch ($scope.score.StatusId) {
25236                            case 2:
25237                                if ($scope.score.PeriodId >= 5 && $scope.score.PeriodId <= 8) {
25238                                    gameStatus += $translate.instant('directives.widgets.scores.labels.overtime');
25239                                }
25240                                else if ($scope.score.PeriodId == 9) {
25241                                    gameStatus += $translate.instant('directives.widgets.scores.labels.shootout');
25242                                }
25243                                else {
25244                                    gameStatus = $filter('ordinal')($scope.score.PeriodId, true)
25245                                    if ($scope.score.IsUseTime) {
25246                                        gameStatus += ' - ' + vm.getFormatTime();
25247                                    }
25248                                }
25249                                break;
25250                            case 3:
25251                                gameStatus = $translate.instant('directives.widgets.scores.labels.final');
25252                                if ($scope.score.PeriodId > 4) {
25253                                    gameStatus += ' / ';
25254                                }
25255                                if ($scope.score.PeriodId >= 5 && $scope.score.PeriodId <= 8) {
25256                                    gameStatus += $translate.instant('directives.widgets.scores.labels.overtime');
25257                                }
25258                                if ($scope.score.PeriodId == 9) {
25259                                    gameStatus += $translate.instant('directives.widgets.scores.labels.shootout');
25260                                }
25261                                break;
25262                        }
25263                    }
25264            }
25265            return gameStatus;
25266        }
25267
25268        //State functions
25269        // TODO Move into service
25270        vm.getFormatTime = function() {
25271            switch ($scope.score.StatusId) {
25272                case 1:
25273                    return moment($scope.score.StartTime, 'hh:mm').format('LT');
25274                    
25275                case 2:
25276                    return moment($scope.score.Time, 'hh:mm:ss').format('LTS').substr(3, 5);
25277            }
25278        };
25279		
25280		//On component mount
25281        setLocalAndVisitorPosition();
25282        $scope.$watch('visitorBottom', function() {
25283            setLocalAndVisitorPosition();
25284            getDetailsToShow();
25285        })
25286
25287        function setLocalAndVisitorPosition() {
25288            if ($scope.visitorBottom) {
25289                vm.firstDivision =  vm.LocalDivision;
25290                vm.firstDivisionId =  vm.LocalDivisionId;
25291                vm.firstResult =  vm.LocalResult;
25292                vm.firstTeamAvatar = vm.LocalTeamId ? vm.LocalTeamAvatar : $translate.instant('directives.widgets.schedule.game.labels.tbdImage');
25293                vm.firstTeamId =  vm.LocalTeamId;
25294                vm.firstTeamName = vm.LocalTeamId ? vm.LocalTeamName : $translate.instant('directives.widgets.schedule.game.labels.tbdName');
25295    
25296                vm.secondDivision =  vm.VisitorDivision;
25297                vm.secondDivisionId =  vm.VisitorDivisionId;
25298                vm.secondResult =  vm.VisitorResult;
25299                vm.secondTeamAvatar = vm.VisitorTeamId ? vm.VisitorTeamAvatar : $translate.instant('directives.widgets.schedule.game.labels.tbdImage');
25300                vm.secondTeamId =  vm.VisitorTeamId;
25301                vm.secondTeamName = vm.VisitorTeamId ? vm.VisitorTeamName : $translate.instant('directives.widgets.schedule.game.labels.tbdName');
25302            } else {
25303                vm.firstDivision =  vm.VisitorDivision;
25304                vm.firstDivisionId =  vm.VisitorDivisionId;
25305                vm.firstResult =  vm.VisitorResult;
25306                vm.firstTeamAvatar = vm.VisitorTeamId ? vm.VisitorTeamAvatar : $translate.instant('directives.widgets.schedule.game.labels.tbdImage');
25307                vm.firstTeamId =  vm.VisitorTeamId;
25308                vm.firstTeamName = vm.VisitorTeamId ? vm.VisitorTeamName : $translate.instant('directives.widgets.schedule.game.labels.tbdName');
25309    
25310                vm.secondDivision =  vm.LocalDivision;
25311                vm.secondDivisionId =  vm.LocalDivisionId;
25312                vm.secondResult =  vm.LocalResult;
25313                vm.secondTeamAvatar = vm.LocalTeamId ? vm.LocalTeamAvatar : $translate.instant('directives.widgets.schedule.game.labels.tbdImage');
25314                vm.secondTeamId =  vm.LocalTeamId;
25315                vm.secondTeamName = vm.LocalTeamId ? vm.LocalTeamName : $translate.instant('directives.widgets.schedule.game.labels.tbdName');
25316            }
25317        }
25318
25319    }
25320})();
25321;
25322(function () {
25323    'use strict';
25324
25325    angular
25326        .module('app.directives')
25327        .directive('scoresGame', scoresGame);
25328
25329    scoresGame.$inject = [];
25330
25331    function scoresGame() {
25332        return {
25333            restrict: 'E',
25334            scope: {                
25335				score: '=',
25336				visitorBottom: '=',
25337                details: '='
25338            },
25339            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/scores/scores-game/scores-game.tpl.html',
25340            controller: 'ScoresGameWidgetController',
25341            controllerAs: 'scoresGame'
25342        };
25343    }
25344})();;
25345(function () {
25346    'use strict';
25347
25348    angular
25349        .module('app.directives')
25350        .controller('FacebookSocialPagePluginController', FacebookSocialPagePluginController);
25351
25352    FacebookSocialPagePluginController.$inject = [];
25353
25354    function FacebookSocialPagePluginController() {
25355         
25356    }
25357})();
25358;
25359(function () {
25360    'use strict';
25361
25362    angular
25363        .module('app.directives')
25364        .directive('facebookSocialPagePlugin', facebookSocialPagePlugin)
25365
25366    facebookSocialPagePlugin.$inject = [];
25367
25368    function facebookSocialPagePlugin() {
25369        return {
25370            restrict: 'E',
25371            scope: {                
25372                widget: '='
25373            },
25374            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/social-medias/facebook/page/facebook-social-page-plugin.tpl.html'
25375        };
25376    }
25377})();;
25378(function () {
25379    'use strict';
25380
25381    angular
25382        .module('app.directives')
25383        .directive('fbPage', fbPage)
25384
25385    fbPage.$inject = ['$rootScope', 'WebsiteEditorService'];
25386
25387    function fbPage($rootScope, websiteEditorService) {
25388        return {
25389            restrict: 'C',
25390            link: function(scope, element) { 
25391                var widgetToRender = angular.fromJson(widgets[scope.widget]);
25392
25393                // Set view model parameters.
25394                for(var parameter in widgetToRender.parameters) {
25395                    switch (widgetToRender.parameters[parameter].id) {
25396                        case 'facebookUrl':  
25397                            element[0].dataset.href = widgetToRender.parameters[parameter].value;                                   
25398                            break;
25399                    }
25400                }  
25401
25402                var listener = $rootScope.$on(`onParametersChange-${scope.widget}`, function(event, data) {
25403                    websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: scope.widget, parameters: data })
25404                        .then(function() {
25405                            // Save parameters.
25406                            for (var parameter in widgetToRender.parameters) {
25407                                switch (widgetToRender.parameters[parameter].id) {
25408                                    case 'facebookUrl':
25409                                        element[0].dataset.href = data['facebookUrl'];
25410
25411                                        // Recreacte the Facebook Page plugin.
25412                                        FB.XFBML.parse(element.parent()[0]);                                        
25413                                        break;
25414                                }
25415                            }                                                        
25416                        }) 
25417                        .catch(function(error) {
25418                            bugsnag.notify(error);
25419                        });
25420                });
25421
25422                scope.$on('$destroy', listener);
25423
25424                return angular.isDefined(FB) && FB !== null ? FB.XFBML.parse(element.parent()[0]) : void 0;
25425            }
25426        };
25427    }
25428})();;
25429(function () {
25430    'use strict';
25431
25432    angular
25433        .module('app.directives')
25434        .directive('socialMedias', socialMedias)
25435
25436    socialMedias.$inject = ['$compile'];
25437
25438    function socialMedias($compile) {
25439        return {
25440            restrict: 'E',
25441            scope: {                
25442                widget: '='
25443            },
25444            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/social-medias/social-medias.tpl.html',
25445            controller: 'SocialMediasWidgetController',
25446            controllerAs: 'socialMedias',
25447            link: function (scope, element, attributes, controller) {
25448                var vm = controller;
25449
25450                vm.refresh = function() {
25451                    //scope.$destroy();
25452
25453                    // Remove the actual ngTweet wrapper.
25454                    var ngTweetWrapper = element.find('.ngtweet-wrapper');
25455                    ngTweetWrapper.remove();
25456
25457                    // Add a twitter timeline.
25458                    var twitter = element.find('div.twitter');
25459                    var twitterTimeline = $compile('<twitter-timeline><a class="twitter-timeline" href="{{ socialMedias.getTwitterUrl() }}">...</a></twitter-timeline>')(scope);
25460                    twitter.append(twitterTimeline);                    
25461                };
25462            }
25463        };
25464    }
25465})();;
25466(function () {
25467    'use strict';
25468
25469    angular
25470        .module('app.directives')
25471        .controller('SocialMediasWidgetController', SocialMediasWidgetController);
25472
25473    SocialMediasWidgetController.$inject = ['$rootScope', '$scope', 'WebsiteEditorService'];
25474
25475    function SocialMediasWidgetController($rootScope, $scope, websiteEditorService) {
25476        var vm = this;
25477
25478        var widgetDefinition = angular.fromJson(widgets[$scope.widget]);
25479
25480        // Set view model parameters.
25481        for(var parameter in widgetDefinition.parameters) {
25482            switch (widgetDefinition.parameters[parameter].id) {
25483                case 'twitterUsername':  
25484                    vm.twitter = {
25485                        username: widgetDefinition.parameters[parameter].value
25486                    };                 
25487                    break;
25488                case 'facebookUrl':  
25489                    vm.facebook = {
25490                        url: widgetDefinition.parameters[parameter].value
25491                    };                 
25492                    break;
25493            }
25494        }
25495
25496        vm.getTwitterUrl = function() {
25497            return `https://twitter.com/${vm.twitter.username}`;
25498        };
25499
25500        // Triggered when parameters are changed.        
25501        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function(event, data) {
25502            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: $scope.widget, parameters: data })
25503                .then(function() {
25504                    // Save parameters.
25505                    for (var parameter in widgetDefinition.parameters) {
25506                        switch (widgetDefinition.parameters[parameter].id) {                    
25507                            case 'twitterUsername':   
25508                                widgetDefinition.parameters[parameter].value = data.twitterUsername;
25509                                vm.twitter = {
25510                                    username: data.twitterUsername
25511                                };
25512
25513                                // TODO Destroy the ngTweet.
25514                                vm.refresh();
25515                                break;
25516                            case 'facebookUrl':
25517                                widgetDefinition.parameters[parameter].value = data.facebookUrl;
25518                                vm.facebook = {
25519                                    url: data.facebookUrl
25520                                };                                     
25521                                break;
25522                        }
25523                    }            
25524
25525                    // Update the variable.
25526                    widgets[$scope.widget] = angular.toJson(widgetDefinition);                                                    
25527                }) 
25528                .catch(function(error) {
25529                    bugsnag.notify(error);
25530                });            
25531        });
25532
25533        $scope.$on('$destroy', listener);        
25534    }
25535})();
25536;
25537(function () {
25538    'use strict';
25539
25540    angular
25541        .module('app.directives')
25542        .controller('SocialMediaIconsWidgetController', SocialMediaIconsWidgetController);
25543
25544    SocialMediaIconsWidgetController.$inject = ['$rootScope', '$scope', 'WebsiteEditorService'];
25545
25546    function SocialMediaIconsWidgetController($rootScope, $scope, websiteEditorService) {
25547        var vm = this;
25548
25549        // Apply website values to view model object.
25550        vm.widget = angular.fromJson(widgets[$scope.widget]);
25551
25552        // Triggered when parameters are changed.        
25553        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
25554            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
25555                .then(function (response) {
25556                    // Save parameters.
25557                    for (var parameter in vm.widget.parameters) {
25558                        switch (vm.widget.parameters[parameter].id) {
25559                            case 'facebookPage':
25560                                vm.widget.parameters[parameter].value = data.facebookPage;
25561                                break;
25562
25563                            case 'twitterPage':
25564                                vm.widget.parameters[parameter].value = data.twitterPage;
25565                                break;
25566
25567                            case 'instagramPage':
25568                                vm.widget.parameters[parameter].value = data.instagramPage;
25569                                break;
25570
25571                            case 'youtubePage':
25572                                vm.widget.parameters[parameter].value = data.youtubePage;
25573                                break;
25574                        }
25575                    }
25576
25577                    // Build the list of social medias.
25578                    buildSocialMediasList();
25579
25580                    // Update the variable.
25581                    widgets[$scope.widget] = angular.toJson(vm.widget);
25582                })
25583                .catch(function (error) {
25584                    bugsnag.notify(error);
25585                });
25586        });
25587
25588        $scope.$on('$destroy', listener);
25589
25590        // Build the list of social medias.
25591        buildSocialMediasList();
25592
25593        function buildSocialMediasList() {
25594            vm.all = [];
25595
25596            // Set view model parameters.
25597            for (var parameter in vm.widget.parameters) {
25598                switch (vm.widget.parameters[parameter].id) {
25599                    case 'facebookPage':
25600                        if (vm.widget.parameters[parameter].value.length > 0) {
25601                            vm.all.push({
25602                                name: 'Facebook',
25603                                url: vm.widget.parameters[parameter].value,
25604                                class: 'mdi-facebook'
25605                            });
25606                        }
25607                        break;
25608
25609                    case 'twitterPage':
25610                        if (vm.widget.parameters[parameter].value.length > 0) {
25611                            vm.all.push({
25612                                name: 'Twitter',
25613                                url: vm.widget.parameters[parameter].value,
25614                                class: 'mdi-twitter'
25615                            });
25616                        }
25617                        break;
25618
25619                    case 'instagramPage':
25620                        if (vm.widget.parameters[parameter].value.length > 0) {
25621                            vm.all.push({
25622                                name: 'Instagram',
25623                                url: vm.widget.parameters[parameter].value,
25624                                class: 'mdi-instagram'
25625                            });
25626                        }
25627                        break;
25628
25629                    case 'youtubePage':
25630                        if (vm.widget.parameters[parameter].value.length > 0) {
25631                            vm.all.push({
25632                                name: 'YouTube',
25633                                url: vm.widget.parameters[parameter].value,
25634                                class: 'mdi-youtube'
25635                            });
25636                        }
25637                        break;
25638                }
25639            }
25640        }
25641    }
25642})();
25643;
25644(function () {
25645    'use strict';
25646
25647    angular
25648        .module('app.directives')
25649        .directive('socialMediaIcons', socialMediaIcons)
25650
25651    socialMediaIcons.$inject = [];
25652
25653    function socialMediaIcons($compile) {
25654        return {
25655            restrict: 'E',
25656            scope: {                
25657                widget: '='
25658            },
25659            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/social-medias/icons/social-media-icons.tpl.html',
25660            controller: 'SocialMediaIconsWidgetController',
25661            controllerAs: 'socialMediaIcons'
25662        };
25663    }
25664})();;
25665(function () {
25666    'use strict';
25667
25668    angular
25669        .module('app.directives')
25670        .controller('SocialMediasPremiumWidgetController', SocialMediasPremiumWidgetController);
25671
25672    SocialMediasPremiumWidgetController.$inject = ['$rootScope', '$scope', 'WebsiteEditorService', 'SocialMediaService'];
25673
25674    function SocialMediasPremiumWidgetController($rootScope, $scope, websiteEditorService, socialMediaService) {
25675        var vm = this;
25676        
25677        vm.widget = angular.fromJson(widgets[$scope.widget]);
25678        vm.tiktokAccount = null;
25679        vm.instagramAccount = null;
25680        vm.facebookAccount = null;
25681        vm.posts = [];
25682        vm.colors = { spacer: "#000000", icons: "#000000", text: "#000000" };
25683
25684        vm.getStyle = function () {
25685            var style = {};
25686            if (!vm.widgetTransparency) {
25687                style['background-color'] = vm.backgroundColor;
25688                style['background-size'] = 'cover';
25689                style['background-position'] = 'center';
25690                style['border-color'] = vm.border.color;
25691            }
25692
25693            style['border-width'] = `${vm.border.width}px`;
25694            style['border-color'] = vm.border.color;
25695            style['border-radius'] = `${vm.border.radius}px`;
25696            return style;
25697        }
25698
25699        // Set view model parameters.
25700        for (var parameter in vm.widget.parameters) {
25701            switch (vm.widget.parameters[parameter].id) {
25702                case 'tiktokAccount':
25703                    vm.tiktokAccount = vm.widget.parameters[parameter].value;
25704                    break;
25705                case 'instagramAccount':
25706                    vm.instagramAccount = vm.widget.parameters[parameter].value;
25707                    break;
25708                case 'facebookAccount':
25709                    vm.facebookAccount = vm.widget.parameters[parameter].value;
25710                    break;
25711                case 'facebookPage':
25712                    vm.facebookPage = vm.widget.parameters[parameter].value;
25713                    break;
25714                case 'widgetTransparency':
25715                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
25716                    break;
25717                case 'backgroundColor':
25718                    vm.backgroundColor = vm.widget.parameters[parameter].value;
25719                    break;
25720                case 'border':
25721                    vm.border = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
25722                    break;
25723                case 'spacerColor':
25724                    vm.colors.spacer = vm.widget.parameters[parameter].value;
25725                    break;
25726                case 'iconsColor':
25727                    vm.colors.icons = vm.widget.parameters[parameter].value;
25728                    break;
25729                case 'textColor':
25730                    vm.colors.text = vm.widget.parameters[parameter].value;
25731                    break;
25732            }
25733        }
25734
25735        getSocialMedias();
25736
25737        // Triggered when parameters are changed.
25738        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
25739            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
25740                .then(function (response) {
25741                    // Save parameters.
25742
25743                    for (var parameter in vm.widget.parameters) {
25744                        switch (vm.widget.parameters[parameter].id) {
25745                            case 'tiktokAccount':
25746                                vm.widget.parameters[parameter].value = data.tiktokAccount;
25747                                vm.tiktokAccount = data.tiktokAccount;
25748                                break;
25749                            case 'instagramAccount':
25750                                vm.widget.parameters[parameter].value = data.instagramAccount;
25751                                vm.instagramAccount = data.instagramAccount;
25752                                break;
25753                            case 'facebookAccount':
25754                                vm.widget.parameters[parameter].value = data.facebookAccount;
25755                                vm.facebookAccount = data.facebookAccount;
25756                                break;
25757                            case 'facebookPage':
25758                                vm.widget.parameters[parameter].value = data.facebookPage;
25759                                vm.facebookPage = data.facebookPage;
25760                                break;
25761                            case 'widgetTransparency':
25762                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
25763                                vm.widgetTransparency = data.widgetTransparency;
25764                                break;
25765                            case 'backgroundColor':
25766                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
25767                                vm.backgroundColor = data.backgroundColor;
25768                                break;
25769                            case 'border':
25770                                vm.widget.parameters[parameter].value = data.border;
25771                                vm.border = angular.fromJson(data.border.replace(/\'/g, '"'));
25772                                break;
25773                            case 'spacerColor':
25774                                vm.widget.parameters[parameter].value = data.spacerColor.toString();
25775                                vm.colors.spacer = data.spacerColor;
25776                                break;
25777                            case 'iconsColor':
25778                                vm.widget.parameters[parameter].value = data.iconsColor.toString();
25779                                vm.colors.icons = data.iconsColor;
25780                                break;
25781                            case 'textColor':
25782                                vm.widget.parameters[parameter].value = data.textColor.toString();
25783                                vm.colors.text = data.textColor;
25784                                break;
25785                        }
25786                    }
25787
25788                    // Update the variable.
25789                    widgets[$scope.widget] = angular.toJson(vm.widget);
25790
25791                    getSocialMedias();
25792                })
25793                .catch(function (error) {
25794                    bugsnag.notify(error);
25795                });
25796        });
25797
25798        function getSocialMedias() {
25799            var socialMedia = [];
25800
25801            if (vm.facebookAccount && vm.facebookPage) {
25802                socialMedia.push(`${vm.facebookAccount}_${vm.facebookPage}`)
25803            }
25804
25805            if (vm.tiktokAccount)
25806                socialMedia.push(vm.tiktokAccount);
25807
25808            if (vm.instagramAccount)
25809                socialMedia.push(vm.instagramAccount);
25810
25811            if (socialMedia.length > 0) {
25812                socialMediaService.getLatestPosts(__solutionId__, socialMedia).then(function (response) {
25813                    vm.posts = response.data;
25814                });
25815            }
25816        }
25817    }
25818})();
25819;
25820(function () {
25821    'use strict';
25822
25823    angular
25824        .module('app.directives')
25825        .directive('socialMediasPremium', socialMediasPremium)
25826
25827    socialMediasPremium.$inject = ['$compile'];
25828
25829    function socialMediasPremium($compile) {
25830        return {
25831            restrict: 'E',
25832            scope: {                
25833                widget: '='
25834            },
25835            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/social-medias-premium/social-medias-premium.tpl.html',
25836            controller: 'SocialMediasPremiumWidgetController',
25837            controllerAs: 'socialMediasPremium',
25838            link: function (scope, element, attributes, controller) {
25839                var vm = controller;
25840              
25841            }
25842        };
25843    }
25844})();;
25845(function () {
25846    'use strict';
25847
25848    angular
25849        .module('app.directives')
25850        .controller('SocialMediaPremiumWidgetController', SocialMediaPremiumWidgetController);
25851
25852    SocialMediaPremiumWidgetController.$inject = ['$rootScope', '$scope', 'WebsiteEditorService', 'SocialMediaService'];
25853
25854    function SocialMediaPremiumWidgetController($rootScope, $scope, websiteEditorService, socialMediaService) {
25855        var vm = this;
25856        vm.truncate = _.truncate;
25857    }
25858})();
25859;
25860(function () {
25861    'use strict';
25862
25863    angular
25864        .module('app.directives')
25865        .directive('socialMediaPremium', socialMediaPremium)
25866
25867    socialMediaPremium.$inject = ['$compile'];
25868
25869    function socialMediaPremium($compile) {
25870        return {
25871            restrict: 'E',
25872            scope: {                
25873                socialMedia: '=',
25874                colors: '='
25875            },
25876            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/social-medias-premium/social-media-premium/social-media-premium.tpl.html',
25877            controller: 'SocialMediaPremiumWidgetController',
25878            controllerAs: 'socialMediaPremium',
25879            link: function (scope, element, attributes, controller) {
25880                var vm = controller;
25881              
25882            }
25883        };
25884    }
25885})();;
25886(function () {
25887    'use strict';
25888
25889    angular
25890        .module('app.directives')
25891        .controller('StatisticsWidgetController', StatisticsWidgetController);
25892
25893    StatisticsWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$translate', 'HashService', 'WebsiteEditorService'];
25894
25895    function StatisticsWidgetController($rootScope, $scope, $localStorage, $translate, hashService, websiteEditorService) {
25896        //State variables ----------
25897        var vm = this;
25898
25899        vm.tabs = hashService.STATISTICS_TABS;
25900        vm.selectedDirectly = false;
25901        vm.activeTab = vm.tabs.LEADERS;
25902        vm.sportId = $localStorage.solution.sportId;
25903        vm.showGoalies = false;
25904        vm.showLeaders = false;
25905        vm.showPlayers = false;
25906        vm.showSuspensions = false;
25907        vm.showTeams = false;
25908        vm.showPitchers = false;
25909        vm.showDefense = false;
25910        vm.embedSrc = `<iframe src="${location.origin}/?iframe=true&pageId=${location.pathname.substring(1)}" width="100%" height="800"></iframe>`;
25911
25912        // TODO Get stats to displayed.
25913        // TODO => widget...
25914        // TODO Get parameter of the widget....
25915        vm.widget = angular.fromJson(widgets[$scope.widget]);
25916
25917        // Default value (temp)
25918        vm.nbPlayersDisplayedPerPage = 12;
25919        vm.nbGoalersDisplayedPerPage = 12;
25920
25921        //State functions ----------
25922        vm.clickTab = function (tab) {
25923            vm.selectedDirectly = true;
25924            vm.activeTab = vm.tabs[tab];
25925            hashService.setParams({ tab: vm.tabs[tab] }, true);
25926        }
25927
25928        vm.isActive = function (tab) {
25929            return vm.activeTab === vm.tabs[tab];
25930        }
25931
25932        // Set view model parameters.
25933        for (var parameter in vm.widget.parameters) {
25934            switch (vm.widget.parameters[parameter].id) {
25935                case 'showPlayers':
25936                    vm.showPlayers = (vm.widget.parameters[parameter].value === 'true');
25937                    break;
25938                case 'showLeaders':
25939                    vm.showLeaders = (vm.widget.parameters[parameter].value === 'true');
25940                    break;
25941                case 'showTeams':
25942                    vm.showTeams = (vm.widget.parameters[parameter].value === 'true');
25943                    break;
25944                case 'showGoalies':
25945                    vm.showGoalies = (vm.widget.parameters[parameter].value === 'true');
25946                    break;
25947                case 'showPitchers':                    
25948                    vm.showPitchers = (vm.widget.parameters[parameter].value === 'true');
25949                    break;
25950                case 'showDefense':
25951                    vm.showDefense = (vm.widget.parameters[parameter].value === 'true');
25952                    break;
25953                case 'showSuspensions':
25954                    vm.showSuspensions = (vm.widget.parameters[parameter].value === 'true');
25955                    break;
25956                case 'nbPlayersDisplayedPerPage':
25957                    vm.nbPlayersDisplayedPerPage = vm.widget.parameters[parameter].value;
25958                    break;
25959                case 'nbGoalersDisplayedPerPage':
25960                    vm.nbGoalersDisplayedPerPage = vm.widget.parameters[parameter].value;
25961                    break;
25962                case 'columnsDisplaySelectPlayers':
25963                    vm.playersColumns = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
25964                    break;
25965                case 'columnsDisplaySelectGoalies':
25966                    vm.goaliesColumns = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
25967                    break;
25968                case 'columnsDisplaySelectTeams':
25969                    vm.teamsColumns = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
25970                    break;
25971                case 'columnsDisplaySelectPitchers':
25972                    vm.pitchersColumns = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
25973                    break;
25974                case 'columnsDisplaySelectDefense':
25975                    vm.defenseColumns = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
25976                    break;
25977            }
25978
25979        }
25980
25981        setDefaultActiveTab();
25982
25983        //On component mount ----------
25984        locationChange();
25985
25986        //Listeners ----------
25987
25988        /*
25989        Trigger locationChange() when tab changed
25990        */
25991        $scope.$on('$locationChangeSuccess', function (event, newUrl, oldUrl) {
25992            if (hashService.hasStatisticsTabsChanged(newUrl, oldUrl)) {
25993                locationChange();
25994            }
25995        });
25996
25997        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
25998            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
25999                .then(function (response) {
26000                    for (var parameter in vm.widget.parameters) {
26001                        switch (vm.widget.parameters[parameter].id) {
26002                            case 'showPlayers':
26003                                vm.widget.parameters[parameter].value = data.showPlayers.toString();
26004                                vm.showPlayers = data.showPlayers;
26005                                break;
26006                            case 'showLeaders':
26007                                vm.widget.parameters[parameter].value = data.showLeaders.toString();
26008                                vm.showLeaders = data.showLeaders;
26009                                break;
26010                            case 'showTeams':
26011                                vm.widget.parameters[parameter].value = data.showTeams.toString();
26012                                vm.showTeams = data.showTeams;
26013                                break;
26014                            case 'showGoalies':
26015                                vm.widget.parameters[parameter].value = data.showGoalies.toString();
26016                                vm.showGoalies = data.showGoalies;
26017                                break;
26018                            case 'showPitchers':
26019                                vm.widget.parameters[parameter].value = data.showPitchers.toString();
26020                                vm.showPitchers = data.showPitchers;
26021                                break;
26022                            case 'showDefense':
26023                                vm.widget.parameters[parameter].value = data.showDefense.toString();
26024                                vm.showDefense = data.showDefense;
26025                                break;
26026                            case 'showSuspensions':
26027                                vm.widget.parameters[parameter].value = data.showSuspensions.toString();
26028                                vm.showSuspensions = data.showSuspensions;
26029                                break;
26030                            case 'columnsDisplaySelectTeams':
26031                                vm.widget.parameters[parameter].value = data.columnsDisplaySelectTeams;
26032                                vm.teamsColumns= angular.fromJson(data.columnsDisplaySelectTeams.replace(/\'/g, '"'));
26033                                break;
26034                            case 'columnsDisplaySelectPlayers':
26035                                vm.widget.parameters[parameter].value = data.columnsDisplaySelectPlayers;
26036                                vm.playersColumns = angular.fromJson(data.columnsDisplaySelectPlayers.replace(/\'/g, '"'));
26037                                break;
26038                            case 'columnsDisplaySelectGoalies':
26039                                vm.widget.parameters[parameter].value = data.columnsDisplaySelectGoalies;
26040                                vm.goaliesColumns = angular.fromJson(data.columnsDisplaySelectGoalies.replace(/\'/g, '"'));
26041                                break;
26042                            case 'columnsDisplaySelectPitchers':
26043                                vm.widget.parameters[parameter].value = data.columnsDisplaySelectPitchers;
26044                                vm.pitchersColumns = angular.fromJson(data.columnsDisplaySelectPitchers.replace(/\'/g, '"'));
26045                                break;
26046                            case 'columnsDisplaySelectDefense':
26047                                vm.widget.parameters[parameter].value = data.columnsDisplaySelectDefense;
26048                                vm.defenseColumns = angular.fromJson(data.columnsDisplaySelectDefense.replace(/\'/g, '"'));
26049                                break;
26050
26051                        }
26052                    }
26053                    widgets[$scope.widget] = angular.toJson(vm.widget);
26054                })
26055                .catch(function (error) {
26056                    bugsnag.notify(error);
26057                });
26058        });
26059
26060
26061        $scope.$on('$destroy', listener);
26062
26063        function setDefaultActiveTab() {
26064            if (vm.showLeaders) {
26065                vm.activeTab = vm.tabs.LEADERS;
26066            }
26067            else if (vm.showTeams) {
26068                vm.activeTab = vm.tabs.TEAMS;
26069            }
26070            else if (vm.showPlayers) {
26071                vm.activeTab = vm.tabs.PLAYERS;
26072            }
26073            else if (vm.showGoalies) {
26074                vm.activeTab = vm.tabs.GOALIES;
26075            }
26076            else if (vm.showSuspensions) {
26077                vm.activeTab = vm.tabs.SUSPENSIONS;
26078            }
26079        }
26080
26081        function locationChange() {
26082            if (!vm.selectedDirectly) {
26083                const filtersUrl = hashService.getParams();
26084
26085                const activeKey = Object.keys(vm.tabs).find(function (tab) {
26086                    return vm.tabs[tab] === filtersUrl.tab;
26087                })
26088
26089                if (activeKey) {
26090                    vm.activeTab = vm.tabs[activeKey];
26091                } else {
26092                    setDefaultActiveTab();
26093                }
26094            }
26095            vm.selectedDirectly = false;
26096        }
26097    }
26098})();
26099;
26100(function () {
26101    'use strict';
26102
26103    angular
26104        .module('app.directives')
26105        .directive('statistics', statistics)
26106
26107    statistics.$inject = [];
26108
26109    function statistics() {
26110        return {
26111            restrict: 'E',
26112            scope: {                
26113                widget: '='
26114            },
26115            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/statistics.tpl.html',
26116            controller: 'StatisticsWidgetController',
26117            controllerAs: 'statistics'
26118        };
26119    }
26120})();;
26121(function () {
26122    'use strict';
26123
26124    angular
26125        .module('app.directives')
26126        .controller('LeadersViewWidgetController', LeadersViewWidgetController);
26127
26128    LeadersViewWidgetController.$inject = ['$scope', '$localStorage', 'StatisticService'];
26129
26130    function LeadersViewWidgetController($scope, $localStorage, statisticService) {
26131        var vm = this;
26132        vm.options = {};
26133        vm.playerStatistics = [];
26134        vm.goalieStatistics = [];
26135        vm.sportId = $localStorage.solution.sportId;
26136
26137        $scope.$watch('[season, division]', function () {
26138            if ($scope.season && $scope.division) {
26139                vm.options = {
26140                    seasonTypeId: 1, //filter.calendar,
26141                    seasonId: $scope.season
26142                };
26143
26144                if ($scope.division !== 'general' && $scope.division !== 'divisions') {
26145                    // Set the division identifier.
26146                    vm.options.divisionId = $scope.division;
26147                } else {
26148                    // Remove the property from options.
26149                    delete vm.options.divisionId;
26150                }
26151                // Update leaders list.
26152                getLeaders();
26153            }
26154        });
26155
26156        function getLeaders() {
26157            // Get players statistics. 
26158            switch (vm.sportId) {
26159                case 1:
26160                    vm.options.statisticIds = [29, 6, 7, 31, 8];
26161                    break;
26162
26163                case 2:
26164                    vm.options.statisticIds = [81, 77, 80, 69, 70, 71, 75, 79, 83, 82];
26165                    break;
26166
26167                case 4:
26168                    vm.options.statisticIds = [133, 157, 139, 146];
26169                    break;
26170
26171                case 6:
26172                    vm.options.statisticIds = [37, 38, 39, 40];
26173                    break;
26174            }
26175
26176
26177            // Players
26178            statisticService.getPlayerLeadersByStatisticId(__solutionId__, vm.options)
26179                .then(function (response) {
26180                    vm.playerStatistics = [];
26181                    _.forEach(response.data, function (statistic) {
26182                        vm.playerStatistics.push({
26183                            id: statistic.StatTypeId,
26184                            name: statisticService.getPlayerStatisticByStatId(statistic.StatTypeId).name,
26185                            players: formatValues(statistic.StatTypeId, statistic.Players
26185)
26186                        });
26187                    });
26188                })
26189                .catch(function (error) {
26190                    bugsnag.notify(error);
26191                });
26192
26193            switch (vm.sportId) {
26194                case 1: // Get goaltender statistics
26195                    vm.options.statisticIds = [15, 25, 30, 32];
26196                    break;
26197
26198                case 2: // Get pitcher statistics
26199                    vm.options.statisticIds = [96, 100, 98, 126, 91];
26200                    break;
26201
26202                case 6: //Get goalkeeper statistics
26203                    vm.options.statisticIds = [46];
26204                    break;
26205            }
26206
26207            if (vm.sportId !== 4) {
26208                statisticService.getPlayerLeadersByStatisticId(__solutionId__, vm.options)
26209                    .then(function (response) {
26210                        vm.goalieStatistics = [];
26211
26212                        _.forEach(response.data, function (statistic) {
26213                            vm.goalieStatistics.push({
26214                                id: statistic.StatTypeId,
26215                                name: statisticService.getPlayerStatisticByStatId(statistic.StatTypeId).name,
26216                                players: formatValues(statistic.StatTypeId, statistic.Players)
26217                            });
26218                        });
26219                    })
26220                    .catch(function (error) {
26221                        bugsnag.notify(error);
26222                    });
26223            }
26224        }
26225
26226        function formatValues(statisticId, players) {
26227            switch (statisticId) {
26228                case 30: // Save Percentage
26229                    _.forEach(players, function (player) {
26230                        player.Value = parseFloat(player.Value / 1000).toFixed(3);
26231                    });
26232                    break;
26233
26234                case 31: // Points per game
26235                case 32: // Points per game
26236                    _.forEach(players, function (player) {
26237                        player.Value = parseFloat(player.Value / 100).toFixed(2);
26238                    });
26239                    break;
26240            }
26241
26242            return players;
26243        }
26244    }
26245})();
26246;
26247(function () {
26248    'use strict';
26249
26250    angular
26251        .module('app.directives')
26252        .directive('leadersView', leadersView)
26253
26254    leadersView.$inject = [];
26255
26256    function leadersView() {
26257        return {
26258            restrict: 'E',
26259            scope: {
26260                season: '=',
26261                division: '='
26262            },
26263            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/leaders/view/leaders-view.tpl.html',
26264            controller: 'LeadersViewWidgetController',
26265            controllerAs: 'leadersView'
26266        };
26267    }
26268})();;
26269(function () {
26270    'use strict';
26271
26272    angular
26273        .module('app.directives')
26274        .controller('LeaderController', LeaderController);
26275
26276    LeaderController.$inject = ['$rootScope', '$scope', 'UrlService'];
26277
26278    function LeaderController($rootScope, $scope, urlService) {
26279        var vm = this;
26280        vm.url = urlService;
26281        
26282        vm.playerSelected = $scope.players[0]; // Initialize the leader as the one selected. 
26283
26284        var listener = $rootScope.$on(`${$scope.statisticId}`, function(e, args) {
26285            //debugger;
26286            vm.playerSelected = $scope.players[parseInt(args)];
26287            $scope.$apply();
26288        });
26289
26290        $scope.$on('$destroy', listener);
26291    }
26292})();;
26293(function () {
26294    'use strict';
26295
26296    angular
26297        .module('app.directives')
26298        .directive('leader', leader)
26299
26300    leader.$inject = [];
26301
26302    function leader() {
26303        return {
26304            restrict: 'E',
26305            scope: {               
26306                players: '=',
26307                statisticId: '='                
26308            },
26309            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/leaders/leader/leader.tpl.html',
26310            controller: 'LeaderController',
26311            controllerAs: 'leader'
26312        };
26313    }
26314})();;
26315(function () {
26316    'use strict';
26317
26318    angular
26319        .module('app.directives')
26320        .controller('LeaderListController', LeaderListController);
26321
26322    LeaderListController.$inject = ['$scope'];
26323
26324    function LeaderListController($scope) {
26325        var vm = this;                
26326        vm.players = $scope.players;
26327        vm.playerSelected = vm.players[0]; // Initialize the selected player.
26328    }
26329})();
26330;
26331(function () {
26332    'use strict';
26333
26334    angular
26335        .module('app.directives')
26336        .directive('leaderList', leaderList)
26337
26338    leaderList.$inject = ['$rootScope'];
26339
26340    function leaderList(rootScope) {
26341        return {
26342            restrict: 'E',
26343            scope: {                
26344                players: '=',
26345                statisticId: '='
26346            },
26347            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/leaders/list/leader-list.tpl.html',
26348            controller: 'LeaderListController',
26349            controllerAs: 'leaderList',
26350            link: function(scope, element, attr, controller) {
26351                var vm = controller;
26352                var maxBound = 0;
26353                var minBound = 0;
26354                var gaugeStep = 80;
26355                if (scope.players && scope.players.length > 0) {
26356                    maxBound = scope.players[0].DisplayValue;
26357                    minBound = scope.players[scope.players.length - 1].DisplayValue;
26358                    gaugeStep = 80 / (maxBound - minBound); // 80 = 80% 
26359                }
26360
26361                vm.getStatisticGaugeValue = function(value) {
26362                    if (value === maxBound) {
26363                        return '100%';
26364                    } else if (value === minBound) {
26365                        return '20%';
26366                    } else {
26367                        var gaugeValue = (gaugeStep * (value - minBound)) + 20;
26368                        return  `${gaugeValue}%`;
26369                    }
26370                };
26371
26372                angular.element(function () {
26373                    var playerElements = element.find('li.player');                                    
26374                    playerElements.on('mouseover', selectPlayer);                                                                           
26375                });
26376
26377                function selectPlayer(e) {
26378                    // Clear «active» class.
26379                    var playerElements = element.find('li.player');
26380                    _.forEach(playerElements, function(playerElements) {
26381                        playerElements.classList.remove('active');
26382                    });
26383
26384                    // Set «active» class name.
26385                    e.currentTarget.classList.add('active');
26386
26387                    // hrow event with the selected player.
26388                    vm.playerSelected = scope.players[parseInt(e.currentTarget.attributes.id.value)];
26389
26390                    // Emit the index of the selected element.
26391                    rootScope.$emit(`${scope.statisticId}`, e.currentTarget.attributes.id.value);
26392                }
26393            }
26394        };
26395    }
26396})();;
26397(function () {
26398    'use strict';
26399
26400    angular
26401        .module('app.directives')
26402        .controller('LeadersWidgetController', LeadersWidgetController);
26403
26404    LeadersWidgetController.$inject = ['$scope'];
26405
26406    function LeadersWidgetController($scope) {
26407        var vm = this;
26408        vm.season = undefined;
26409        vm.division = undefined;
26410
26411        vm.filter = function(filter) {
26412            vm.season = filter.season;
26413            vm.division = filter.division;
26414        };
26415    }
26416})();
26417;
26418(function () {
26419    'use strict';
26420
26421    angular
26422        .module('app.directives')
26423        .directive('leaders', leaders)
26424
26425    leaders.$inject = [];
26426
26427    function leaders() {
26428        return {
26429            restrict: 'E',
26430            scope: {                
26431                widget: '=',
26432            },
26433            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/leaders/leaders.tpl.html',
26434            controller: 'LeadersWidgetController',
26435            controllerAs: 'leaders'
26436        };
26437    }
26438})();;
26439(function () {
26440    'use strict';
26441
26442    angular
26443        .module('app.directives')
26444        .controller('GoalerStatisticsController', GoalerStatisticsController);
26445
26446    GoalerStatisticsController.$inject = ['$scope', '$translate'];
26447
26448    function GoalerStatisticsController($scope, $translate) {
26449        var vm = this;        
26450        vm.season = undefined;
26451        vm.division = undefined;
26452        vm.startDate = undefined;
26453        vm.endDate = undefined;
26454        vm.prependSeasons = [
26455            { Id: 'career-regular', Name: $translate.instant('directives.widgets.statistics.filters.season.careerRegularSeason') },
26456            { Id: 'career-playoffs', Name: $translate.instant('directives.widgets.statistics.filters.season.careerPlayoffs') },
26457            { Id: 'career-total', Name: $translate.instant('directives.widgets.statistics.filters.season.careerTotal') }
26458        ]
26459
26460        vm.applyMoreFilters = function (filter) {
26461            vm.season = filter.season;
26462            vm.division = filter.division;
26463            vm.startDate = filter.startDate;
26464            vm.endDate = filter.endDate;
26465        };
26466
26467        vm.filter = function(filter) {            
26468            vm.season = filter.season;
26469            vm.division = filter.division;
26470        };
26471    }
26472})();
26473;
26474(function () {
26475    'use strict';
26476
26477    angular
26478        .module('app.directives')
26479        .directive('goalerStatistics', goalerStatistics)
26480
26481    goalerStatistics.$inject = [];
26482
26483    function goalerStatistics() {
26484        return {
26485            restrict: 'E',
26486            scope: {                
26487                pageSize: '=',
26488                columns: '=',
26489            },
26490            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/goaler/goaler-statistics.tpl.html',
26491            controller: 'GoalerStatisticsController',
26492            controllerAs: 'goalerStatistics'
26493        };
26494    }
26495})();;
26496(function () {
26497    'use strict';
26498
26499    angular
26500        .module('app.directives')
26501        .controller('GoalerStatisticsViewWidgetController', GoalerStatisticsViewWidgetController);
26502
26503    GoalerStatisticsViewWidgetController.$inject = ['$scope', '$localStorage', '$window', 'UrlService', 'StatisticService'];
26504
26505    function GoalerStatisticsViewWidgetController($scope, $localStorage, $window, urlService, statisticService) {
26506        var vm = this;
26507        vm.url = urlService;
26508        vm.columns = undefined;
26509        vm.options = undefined;
26510        vm.sportId = $localStorage.solution.sportId;
26511
26512        buildColumns($scope.columns);
26513
26514        vm.showStat = function (column) {
26515            if (isMobile() && column.visibleMobile) {
26516                return true;
26517            } else if (!isMobile() && column.visibleDesktop) {
26518                return true;
26519            }
26520            return false;
26521        }
26522
26523        //Watchers
26524        $scope.$watch('[season, division]', function () {
26525            if ($scope.season && $scope.division) {
26526                vm.appliedFilters = false;
26527                clearMoreFilters();
26528
26529                if ($scope.season == "career-regular") {
26530                    vm.options.seasonId = null;
26531                    vm.options.seasonTypeId = 1;
26532                }
26533                else if ($scope.season == "career-playoffs") {
26534                    vm.options.seasonId = null;
26535                    vm.options.seasonTypeId = 2;
26536                }
26537                else if ($scope.season == "career-total") {
26538                    vm.options.seasonId = null;
26539                    vm.options.seasonTypeId = null;
26540                }
26541                else {
26542                    vm.options.seasonId = $scope.season;
26543                }
26544
26545                if ($scope.division !== 'general' && $scope.division !== 'divisions') {
26546                    // Set the division identifier.
26547                    vm.options.divisionId = $scope.division;
26548                } else {
26549                    // Remove the property from options.
26550                    delete vm.options.divisionId;
26551                }
26552
26553                // Update goaler statistics list.
26554                getGoalerStatistics();
26555            }
26556        });
26557
26558        $scope.$watch('[startDate, endDate]', function (newValue, oldValue) {            
26559            if ($scope.startDate && $scope.endDate) {
26560                vm.appliedFilters = true;
26561                vm.options.seasonId = $scope.season;
26562                vm.options.startDate = $scope.startDate;
26563                vm.options.endDate = $scope.endDate;
26564
26565                if ($scope.division !== 'general' && $scope.division !== 'divisions') {
26566                    // Set the division identifier.
26567                    vm.options.divisionId = $scope.division;
26568                } else {
26569                    // Remove the property from options.
26570                    delete vm.options.divisionId;
26571                }
26572
26573                // Update player statistics list.
26574                getGoalerStatistics();
26575            } else if (oldValue[0] || oldValue[1]) {
26576                vm.appliedFilters = false;
26577                vm.options.startDate = undefined;
26578                vm.options.endDate = undefined;
26579                getGoalerStatistics();
26580            }
26581        });
26582
26583        $scope.$watch('columns', function (columns) {
26584            buildColumns(columns);
26585        })
26586
26587        //Component mount
26588        switch (vm.sportId) {
26589            case 1:
26590                // TODO Initialize column sort / change hardcoded value.
26591                _.find(vm.columns, function (column) {
26592                    return column.id === 32;
26593                }).sort = 'asc';
26594
26595                vm.options = {
26596                    page: 1,
26597                    pageSize: $scope.pageSize,
26598                    sortOrder: 'asc',
26599                    sortStatId: 32,
26600                    positionType: 1
26601                };
26602                break;
26603
26604            case 6:
26605                // TODO Initialize column sort / change hardcoded value.
26606                _.find(vm.columns, function (column) {
26607                    return column.id === 46;
26608                }).sort = 'desc';
26609
26610                vm.options = {
26611                    page: 1,
26612                    pageSize: $scope.pageSize,
26613                    sortOrder: 'desc',
26614                    sortStatId: 46,
26615                    positionType: 4
26616                };
26617                break;
26618
26619            case 14:
26620                // TODO Initialize column sort / change hardcoded value.
26621                _.find(vm.columns, function (column) {
26622                    return column.id === 60;
26623                }).sort = 'desc';
26624
26625                vm.options = {
26626                    page: 1,
26627                    pageSize: $scope.pageSize,
26628                    sortOrder: 'desc',
26629                    sortStatId: 60,
26630                    positionType: 17
26631                };
26632                break;
26633
26634        }
26635
26636        //State functions
26637        vm.getStatisticValue = function (player, statisticId) {
26638            if (player.Stats.length > 0) {
26639
26640                var playerStat = _.find(player.Stats, function (statistic) {
26641                    return statistic.StatTypeId === statisticId;
26642                });
26643
26644                if (playerStat) {
26645                    return playerStat.DisplayValue;
26646                }
26647            }
26648
26649            return '0';
26650        };
26651
26652        vm.sort = function (column) {
26653            // Reset columns sort.
26654            _.forEach(vm.columns, function (_column) {
26655                if (_column.id !== column.id) {
26656                    _column.sort = '';
26657                }
26658            });
26659
26660            if (angular.isUndefined(column.sort)) {
26661                column.sort = 'desc';
26662                vm.options.sortOrder = column.sort;
26663            } else {
26664                // Toggle sort order.
26665                column.sort = column.sort === 'desc'
26666                    ? column.sort = 'asc'
26667                    : column.sort = 'desc';
26668
26669                vm.options.sortOrder = column.sort;
26669
26670            }
26671
26672            // Set the sort statistic id.
26673            vm.options.sortStatId = column.id;
26674
26675            // Update goaler statistics list.
26676            getGoalerStatistics();
26677        };
26678
26679        vm.clickPage = function (page) {
26680            // Set the page number.
26681            vm.options.page = page;
26682
26683            // Update goaler statistics list.
26684            getGoalerStatistics();
26685        };
26686
26687        vm.clickPrevious = function () {
26688            // Decrement the page number.
26689            vm.options.page -= 1;
26690
26691            // Update goaler statistics list.
26692            getGoalerStatistics();
26693        };
26694
26695        vm.clickNext = function () {
26696            // Increment the page number.
26697            vm.options.page += 1;
26698
26699            // Update goaler statistics list.
26700            getGoalerStatistics();
26701        };
26702
26703        //Helper functions
26704        function getGoalerStatistics() {
26705            if (vm.appliedFilters) {
26706                statisticService.getPlayerStatisticsDateRangeBySolutionId(__solutionId__, vm.options)
26707                    .then(function (response) {
26708                        // Get the total count of goalers.
26709                        vm.totalCount = response.data.TotalCount;
26710                        vm.goalers = response.data.Results; // All goalers.
26711                    })
26712                    .catch(function (error) {
26713                        // TODO Bugsnag
26714                    });
26715            } else {
26716                statisticService.getPlayerStatisticsBySolutionId(__solutionId__, vm.options)
26717                    .then(function (response) {
26718                        // Get the total count of goalers.
26719                        vm.totalCount = response.data.TotalCount;
26720
26721                        vm.goalers = response.data.Results;
26722                    })
26723                    .catch(function (error) {
26724                        // TODO Bugsnag
26725                    });
26726            }
26727        }
26728
26729        function clearMoreFilters() {
26730            delete vm.options.startDate;
26731            delete vm.options.endDate;
26732        }
26733
26734        // TODO Move somewhere in a service...
26735        function isMobile() {
26736            return $window.innerWidth <= 575;
26737        }
26738
26739        function buildColumns(columnsToDisplay) {
26740            vm.columns = [];
26741            columnsToDisplay.forEach(function (col) {
26742                var stat = statisticService.getPlayerStatisticByStatId(col.id);
26743                if (stat) {
26744                    vm.columns.push({
26745                        id: col.id,
26746                        visibleDesktop: col.visibleDesktop,
26747                        visibleMobile: col.visibleMobile,
26748                        name: stat.name,
26749                        abbreviation: stat.abbreviation
26750                    })
26751                }
26752            });
26753        }
26754    }
26755})();
26756;
26757(function () {
26758    'use strict';
26759
26760    angular
26761        .module('app.directives')
26762        .directive('goalerStatisticsView', goalerStatisticsView)
26763
26764    goalerStatisticsView.$inject = [];
26765
26766    function goalerStatisticsView() {
26767        return {
26768            restrict: 'E',
26769            scope: {
26770                season: '=',
26771                division: '=',
26772                startDate: '=',
26773                endDate: '=',
26774                pageSize: '=',
26775                columns: '=',
26776            },
26777            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/goaler/view/goaler-statistics-view.tpl.html',
26778            controller: 'GoalerStatisticsViewWidgetController',
26779            controllerAs: 'goalerStatisticsView'
26780        };
26781    }
26782})();;
26783(function () {
26784    'use strict';
26785
26786    angular
26787        .module('app.directives')
26788        .controller('PitcherStatisticsController', PitcherStatisticsController);
26789
26790    PitcherStatisticsController.$inject = ['$scope', '$translate'];
26791
26792    function PitcherStatisticsController($scope, $translate) {
26793        var vm = this;        
26794        vm.season = undefined;
26795        vm.division = undefined;
26796        vm.startDate = undefined;
26797        vm.endDate = undefined;
26798        vm.prependSeasons = [
26799            { Id: 'career-regular', Name: $translate.instant('directives.widgets.statistics.filters.season.careerRegularSeason') },
26800            { Id: 'career-playoffs', Name: $translate.instant('directives.widgets.statistics.filters.season.careerPlayoffs') },
26801            { Id: 'career-total', Name: $translate.instant('directives.widgets.statistics.filters.season.careerTotal') }
26802        ]
26803
26804        vm.applyMoreFilters = function (filter) {
26805            vm.season = filter.season;
26806            vm.division = filter.division;
26807            vm.startDate = filter.startDate;
26808            vm.endDate = filter.endDate;
26809        };
26810
26811        vm.filter = function(filter) {            
26812            vm.season = filter.season;
26813            vm.division = filter.division;
26814        };
26815        
26816    }
26817})();
26818;
26819(function () {
26820    'use strict';
26821
26822    angular
26823        .module('app.directives')
26824        .directive('pitcherStatistics', pitcherStatistics)
26825
26826    pitcherStatistics.$inject = [];
26827
26828    function pitcherStatistics() {
26829        return {
26830            restrict: 'E',
26831            scope: {                
26832                widget: '=',
26833                columns: '=',
26834            },
26835            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/pitcher/pitcher-statistics.tpl.html',
26836            controller: 'PitcherStatisticsController',
26837            controllerAs: 'pitcherStatistics'
26838        };
26839    }
26840})();;
26841(function () {
26842    'use strict';
26843
26844    angular
26845        .module('app.directives')
26846        .controller('PitcherStatisticsViewWidgetController', PitcherStatisticsViewWidgetController);
26847
26848    PitcherStatisticsViewWidgetController.$inject = ['$scope', '$window', 'UrlService', 'StatisticService'];
26849
26850    function PitcherStatisticsViewWidgetController($scope, $window, urlService, statisticService) {
26851        var vm = this;
26852        vm.url = urlService;
26853
26854        buildColumns($scope.columns);
26855
26856        vm.showStat = function (column) {
26857            if (isMobile() && column.visibleMobile) {
26858                return true;
26859            } else if (!isMobile() && column.visibleDesktop) {
26860                return true;
26861            }
26862            return false;
26863        }
26864
26865        // TODO Initialize column sort / change hardcoded value.
26866        _.find(vm.columns, function (column) {
26867            return column.id === 100;
26868        }).sort = 'asc';
26869
26870        vm.options = {
26871            page: 1,
26872            pageSize: 10,
26873            sortOrder: 'asc',
26874            sortStatId: 100,
26875            positionType: 8
26876        };
26877
26878        //Watchers
26879        $scope.$watch('[season, division]', function () {
26880            if ($scope.season && $scope.division) {
26881                vm.appliedFilters = false;
26882                clearMoreFilters();
26883
26884                if ($scope.season == "career-regular") {
26885                    vm.options.seasonId = null;
26886                    vm.options.seasonTypeId = 1;
26887                }
26888                else if ($scope.season == "career-playoffs") {
26889                    vm.options.seasonId = null;
26890                    vm.options.seasonTypeId = 2;
26891                }
26892                else if ($scope.season == "career-total") {
26893                    vm.options.seasonId = null;
26894                    vm.options.seasonTypeId = null;
26895                }
26896                else {
26897                    vm.options.seasonId = $scope.season;
26898                }
26899
26900                if ($scope.division !== 'general' && $scope.division !== 'divisions') {
26901                    // Set the division identifier.
26902                    vm.options.divisionId = $scope.division;
26903                } else {
26904                    // Remove the property from options.
26905                    delete vm.options.divisionId;
26906                }
26907
26908                // Update pitcher statistics list.
26909                getPitcherStatistics();
26910            }
26911        });
26912        
26913        $scope.$watch('[startDate, endDate]', function (newValue, oldValue) {
26914            if ($scope.startDate && $scope.endDate) {
26915                vm.appliedFilters = true;
26916                vm.options.seasonId = $scope.season;
26917                vm.options.startDate = $scope.startDate;
26918                vm.options.endDate = $scope.endDate;
26919
26920                if ($scope.division !== 'general' && $scope.division !== 'divisions') {
26921                    // Set the division identifier.
26922                    vm.options.divisionId = $scope.division;
26923                } else {
26924                    // Remove the property from options.
26925                    delete vm.options.divisionId;
26926                }
26927
26928                // Update player statistics list.
26929                getPitcherStatistics();
26930            } else if (oldValue[0] || oldValue[1]) {
26931                vm.appliedFilters = false;
26932                vm.options.startDate = undefined;
26933                vm.options.endDate = undefined;
26934                getPitcherStatistics();
26935            }
26936        });
26937
26938        $scope.$watch('columns', function (columns) {
26939            buildColumns(columns);
26940        })
26941
26942        //State functions
26943        // TODO Move into service
26944        vm.getStatisticValue = function (player, statisticId) {
26945            if (player.Stats.length > 0) {
26946
26947                var playerStat = _.find(player.Stats, function (statistic) {
26948                    return statistic.StatTypeId === statisticId;
26949                });
26950
26951                if (playerStat) {
26952                    return playerStat.DisplayValue;
26953                }
26954            }
26955
26956            return '0';
26957        };
26958
26959        vm.sort = function (column) {
26960            // Reset columns sort.
26961            _.forEach(vm.columns, function (_column) {
26962                if (_column.id !== column.id) {
26963                    _column.sort = '';
26964                }
26965            });
26966
26967            if (angular.isUndefined(column.sort)) {
26968                column.sort = 'desc';
26969                vm.options.sortOrder = column.sort;
26970            } else {
26971                // Toggle sort order.
26972                column.sort = column.sort === 'desc'
26973                    ? column.sort = 'asc'
26974                    : column.sort = 'desc';
26975
26976                vm.options.sortOrder = column.sort;
26977            }
26978
26979            // Set the sort statistic id.
26980            vm.options.sortStatId = column.id;
26981
26982            // Update pitcher statistics list.
26983            getPitcherStatistics();
26984        };
26985
26986        vm.clickPage = function (page) {
26987            // Set the page number.
26988            vm.options.page = page;
26989
26990            // Update pitcher statistics list.
26991            getPitcherStatistics();
26992        };
26993
26994        vm.clickPrevious = function () {
26995            // Decrement the page number.
26996            vm.options.page -= 1;
26997
26998            // Update pitcher statistics list.
26999            getPitcherStatistics();
27000        };
27001
27002        vm.clickNext = function () {
27003            // Increment the page number.
27004            vm.options.page += 1;
27005
27006            // Update pitcher statistics list.
27007            getPitcherStatistics();
27008        };
27009        
27010        function clearMoreFilters() {
27011            delete vm.options.startDate;
27012            delete vm.options.endDate;
27013        }
27014
27015        //Helpers
27016        function getPitcherStatistics() {
27017            if(vm.appliedFilters){
27018                statisticService.getPlayerStatisticsDateRangeBySolutionId(__solutionId__, vm.options)
27019                    .then(function (response) {
27020                        // Get the total count of players.
27021                        vm.totalCount = response.data.TotalCount;
27022                        vm.pitchers = response.data.Results; // All pitchers
27023                    })
27024                    .catch(function (error) {
27025                        // TODO Bugsnag
27026                    });
27027            
27028            }else{
27029                statisticService.getPlayerStatisticsBySolutionId(__solutionId__, vm.options)
27030                    .then(function (response) {
27031                        // Get the total count of pitchers.
27032                        vm.totalCount = response.data.TotalCount;
27033                        vm.pitchers = response.data.Results; // All pitchers
27034                        
27035                    })
27036                    .catch(function (error) {
27037                        // TODO Bugsnag
27038                    });
27039            
27040            }
27041        }
27042
27043        function isMobile() {
27044            return $window.innerWidth <= 575;
27045        }
27046
27047        function buildColumns(columnsToDisplay) {
27048            console.log(columnsToDisplay);
27049            vm.columns = [];
27050            columnsToDisplay.forEach(function (col) {
27051                var stat = statisticService.getPlayerStatisticByStatId(col.id);
27052                if (stat) {
27053                    vm.columns.push({
27054                        id: col.id,
27055                        visibleDesktop: col.visibleDesktop,
27056                        visibleMobile: col.visibleMobile,
27057                        name: stat.name,
27058                        abbreviation: stat.abbreviation
27059                    })
27060                }
27061            });
27062        }
27063    }
27064})();
27065;
27066(function () {
27067    'use strict';
27068
27069    angular
27070        .module('app.directives')
27071        .directive('pitcherStatisticsView', pitcherStatisticsView)
27072
27073    pitcherStatisticsView.$inject = [];
27074
27075    function pitcherStatisticsView() {
27076        return {
27077            restrict: 'E',
27078            scope: {
27079                season: '=',
27080                division: '=',
27081                startDate: '=',
27082                endDate: '=',
27083                columns: '=',
27084            },
27085            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/pitcher/view/pitcher-statistics-view.tpl.html',
27086            controller: 'PitcherStatisticsViewWidgetController',
27087            controllerAs: 'pitcherStatisticsView'
27088        };
27089    }
27090})();;
27091(function () {
27092    'use strict';
27093
27094    angular
27095        .module('app.directives')
27096        .controller('DefenseStatisticsController', DefenseStatisticsController);
27097
27098    DefenseStatisticsController.$inject = ['$scope', '$translate'];
27099
27100    function DefenseStatisticsController($scope, $translate) {
27101        var vm = this;        
27102        vm.season = undefined;
27103        vm.division = undefined;
27104        vm.startDate = undefined;
27105        vm.endDate = undefined;
27106        vm.prependSeasons = [
27107            { Id: 'career-regular', Name: $translate.instant('directives.widgets.statistics.filters.season.careerRegularSeason') },
27108            { Id: 'career-playoffs', Name: $translate.instant('directives.widgets.statistics.filters.season.careerPlayoffs') },
27109            { Id: 'career-total', Name: $translate.instant('directives.widgets.statistics.filters.season.careerTotal') }
27110        ]
27111
27112        vm.applyMoreFilters = function (filter) {
27113            vm.season = filter.season;
27114            vm.division = filter.division;
27115            vm.startDate = filter.startDate;
27116            vm.endDate = filter.endDate;
27117        };
27118        vm.filter = function(filter) {            
27119            vm.season = filter.season;
27120            vm.division = filter.division;
27121        };
27122        
27123    }
27124})();
27125;
27126(function () {
27127    'use strict';
27128
27129    angular
27130        .module('app.directives')
27131        .directive('defenseStatistics', defenseStatistics)
27132
27133    defenseStatistics.$inject = [];
27134
27135    function defenseStatistics() {
27136        return {
27137            restrict: 'E',
27138            scope: {                
27139                widget: '=',
27140                columns: '='
27141            },
27142            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/defense/defense-statistics.tpl.html',
27143            controller: 'DefenseStatisticsController',
27144            controllerAs: 'defenseStatistics'
27145        };
27146    }
27147})();;
27148(function () {
27149    'use strict';
27150
27151    angular
27152        .module('app.directives')
27153        .controller('DefenseStatisticsViewWidgetController', DefenseStatisticsViewWidgetController);
27154
27155    DefenseStatisticsViewWidgetController.$inject = ['$scope', '$window', 'UrlService', 'StatisticService'];
27156
27157    function DefenseStatisticsViewWidgetController($scope, $window, urlService, statisticService) {
27158        var vm = this;
27159        vm.url = urlService;
27160
27161        buildColumns($scope.columns);
27162
27163        vm.showStat = function (column) {
27164            if (isMobile() && column.visibleMobile) {
27165                return true;
27166            } else if (!isMobile() && column.visibleDesktop) {
27167                return true;
27168            }
27169            return false;
27170        }
27171
27172        // TODO Initialize column sort / change hardcoded value.
27173        _.find(vm.columns, function (column) {
27174            return column.id === 65;
27175        }).sort = 'asc';
27176
27177        vm.options = {
27178            page: 1,
27179            pageSize: 10,
27180            sortOrder: 'asc',
27181            sortStatId: 100,
27182            positionType: 21
27183        };
27184
27185        //Watchers
27186        $scope.$watch('[season, division]', function () {
27187            if ($scope.season && $scope.division) {
27188                vm.appliedFilters = false;
27189                clearMoreFilters();
27190
27191                if ($scope.season == "career-regular") {
27192                    vm.options.seasonId = null;
27193                    vm.options.seasonTypeId = 1;
27194                }
27195                else if ($scope.season == "career-playoffs") {
27196                    vm.options.seasonId = null;
27197                    vm.options.seasonTypeId = 2;
27198                }
27199                else if ($scope.season == "career-total") {
27200                    vm.options.seasonId = null;
27201                    vm.options.seasonTypeId = null;
27202                }
27203                else {
27204                    vm.options.seasonId = $scope.season;
27205                }
27206
27207                if ($scope.division !== 'general' && $scope.division !== 'divisions') {
27208                    // Set the division identifier.
27209                    vm.options.divisionId = $scope.division;
27210                } else {
27211                    // Remove the property from options.
27212                    delete vm.options.divisionId;
27213                }
27214
27215                // Update defense statistics list.
27216                getDefenseStatistics();
27217            }
27218        });
27219
27220        $scope.$watch('[startDate, endDate]', function (newValue, oldValue) {
27221            if ($scope.startDate && $scope.endDate) {
27222                vm.appliedFilters = true;
27223                vm.options.seasonId = $scope.season;
27224                vm.options.startDate = $scope.startDate;
27225                vm.options.endDate = $scope.endDate;
27226
27227                if ($scope.division !== 'general' && $scope.division !== 'divisions') {
27228                    // Set the division identifier.
27229                    vm.options.divisionId = $scope.division;
27230                } else {
27231                    // Remove the property from options.
27232                    delete vm.options.divisionId;
27233                }
27234
27235                // Update player statistics list.
27236                getDefenseStatistics();
27237            } else if (oldValue[0] || oldValue[1]) {
27238                vm.appliedFilters = false;
27239                vm.options.startDate = undefined;
27240                vm.options.endDate = undefined;
27241                getDefenseStatistics();
27242            }
27243        });
27244
27245        $scope.$watch('columns', function (columns) {
27246            buildColumns(columns);
27247        })
27248
27249        //State functions
27250        // TODO Move into service
27251        vm.getStatisticValue = function (player, statisticId) {
27252            if (player.Stats.length > 0) {
27253
27254                var playerStat = _.find(player.Stats, function (statistic) {
27255                    return statistic.StatTypeId === statisticId;
27256                });
27257
27258                if (playerStat) {
27259                    return playerStat.DisplayValue;
27260                }
27261            }
27262
27263            return '0';
27264        };
27265
27266        vm.sort = function (column) {
27267            // Reset columns sort.
27268            _.forEach(vm.columns, function (_column) {
27269                if (_column.id !== column.id) {
27270                    _column.sort = '';
27271                }
27272            });
27273
27274            if (angular.isUndefined(column.sort)) {
27275                column.sort = 'desc';
27276                vm.options.sortOrder = column.sort;
27277            } else {
27278                // Toggle sort order.
27279                column.sort = column.sort === 'desc'
27280                    ? column.sort = 'asc'
27281                    : column.sort = 'desc';
27282
27283                vm.options.sortOrder = column.sort;
27284            }
27285
27286            // Set the sort statistic id.
27287            vm.options.sortStatId = column.id;
27288
27289            // Update defense statistics list.
27290            getDefenseStatistics();
27291        };
27292
27293        vm.clickPage = function (page) {
27294            // Set the page number.
27295            vm.options.page = page;
27296
27297            // Update defense statistics list.
27298            getDefenseStatistics();
27299        };
27300
27301        vm.clickPrevious = function () {
27302            // Decrement the page number.
27303            vm.options.page -= 1;
27304
27305            // Update defense statistics list.
27306            getDefenseStatistics();
27307        };
27308
27309        vm.clickNext = function () {
27310            // Increment the page number.
27311            vm.options.page += 1;
27312
27313            // Update defense statistics list.
27314            getDefenseStatistics();
27315        };
27316
27317        function clearMoreFilters() {
27318            delete vm.options.startDate;
27319            delete vm.options.endDate;
27320        }
27321
27322        //Helpers
27323        function getDefenseStatistics() {
27324            if(vm.appliedFilters){
27325                statisticService.getPlayerStatisticsDateRangeBySolutionId(__solutionId__, vm.options)
27326                .then(function (response) {
27327                    // Get the total count of defensers.
27328                    vm.totalCount = response.data.TotalCount;
27329                    
27330                    vm.defense = response.data.Results; // All defense
27331                })
27332                .catch(function (error) {
27333                    // TODO Bugsnag
27334                });
27335            }else{
27336                statisticService.getPlayerStatisticsBySolutionId(__solutionId__, vm.options)
27337                .then(function (response) {
27338                    // Get the total count of defensers.
27339                    vm.totalCount = response.data.TotalCount;
27340                    
27341                    vm.defense = response.data.Results; // All defense
27342                })
27343                .catch(function (error) {
27344                    // TODO Bugsnag
27345                });
27346            }
27347        }
27348
27349        function isMobile() {
27350            return $window.innerWidth <= 575;
27351        }
27352
27353        function buildColumns(columnsToDisplay) {
27354            console.log(columnsToDisplay);
27355            vm.columns = [];
27356            columnsToDisplay.forEach(function (col) {              
27357                var stat = statisticService.getPlayerStatisticByStatId(col.id);
27358                if (stat) {
27359                    vm.columns.push({
27360                        id: col.id,
27361                        visibleDesktop: col.visibleDesktop,
27362                        visibleMobile: col.visibleMobile,
27363                        name: stat.name,
27364                        abbreviation: stat.abbreviation
27365                    })
27366                }
27367            });
27368        }
27369    }
27370})();
27371;
27372(function () {
27373    'use strict';
27374
27375    angular
27376        .module('app.directives')
27377        .directive('defenseStatisticsView', defenseStatisticsView)
27378
27379    defenseStatisticsView.$inject = [];
27380
27381    function defenseStatisticsView() {
27382        return {
27383            restrict: 'E',
27384            scope: {
27385                season: '=',
27386                division: '=',
27387                startDate: '=',
27388                endDate: '=',
27389                columns: '='
27390            },
27391            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/defense/view/defense-statistics-view.tpl.html',
27392            controller: 'DefenseStatisticsViewWidgetController',
27393            controllerAs: 'defenseStatisticsView'
27394        };
27395    }
27396})();;
27397(function () {
27398    'use strict';
27399
27400    angular
27401        .module('app.directives')
27402        .controller('PlayerStatisticsController', PlayerStatisticsController);
27403
27404    PlayerStatisticsController.$inject = ['$scope', '$translate'];
27405
27406    function PlayerStatisticsController($scope, $translate) {
27407        var vm = this;
27408        vm.season = undefined;
27409        vm.division = undefined;
27410        vm.startDate = undefined;
27411        vm.endDate = undefined;
27412        vm.prependSeasons = [
27413            { Id: 'career-regular', Name: $translate.instant('directives.widgets.statistics.filters.season.careerRegularSeason') },
27414            { Id: 'career-playoffs', Name: $translate.instant('directives.widgets.statistics.filters.season.careerPlayoffs') },
27415            { Id: 'career-total', Name: $translate.instant('directives.widgets.statistics.filters.season.careerTotal') }
27416        ]
27417
27418        vm.applyMoreFilters = function (filter) {
27419            vm.season = filter.season;
27420            vm.division = filter.division;
27421            vm.startDate = filter.startDate;
27422            vm.endDate = filter.endDate;
27423        };
27424
27425        vm.filter = function (filter) {
27426            vm.season = filter.season;
27427            vm.division = filter.division;
27428        };
27429    }
27430})();
27431;
27432(function () {
27433    'use strict';
27434
27435    angular
27436        .module('app.directives')
27437        .directive('playersStatistics', playersStatistics)
27438
27439    playersStatistics.$inject = [];
27440
27441    function playersStatistics() {
27442        return {
27443            restrict: 'E',
27444            scope: {                
27445                pageSize: '=',
27446                columns: '=',
27447            },
27448            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/player/player-statistics.tpl.html',
27449            controller: 'PlayerStatisticsController',
27450            controllerAs: 'playerStatistics'
27451        };
27452    }
27453})();;
27454(function () {
27455    'use strict';
27456
27457    angular
27458        .module('app.directives')
27459        .controller('PlayerStatisticsViewWidgetController', PlayerStatisticsViewWidgetController);
27460
27461    PlayerStatisticsViewWidgetController.$inject = ['$scope', '$window', '$localStorage', 'UrlService', 'PositionService', 'StatisticService'];
27462
27463    function PlayerStatisticsViewWidgetController($scope, $window, $localStorage, urlService, positionService, statisticService) {
27464        var vm = this;
27465        vm.url = urlService;
27466        vm.position = positionService;
27467        vm.sportId = $localStorage.solution.sportId;
27468        vm.appliedFilters = false;
27469        vm.columns = undefined;
27470        vm.options = undefined;
27471
27472        buildColumns($scope.columns);
27473
27474        vm.showStat = function (column) {
27475            if (isMobile() && column.visibleMobile) {
27476                return true;
27477            } else if (!isMobile() && column.visibleDesktop) {
27478                return true;
27479            }
27480            return false;
27481        }
27482
27483        //Watchers
27484        $scope.$watch('[season, division]', function () {
27485            if ($scope.season && $scope.division) {
27486                vm.appliedFilters = false;
27487                clearMoreFilters();
27488
27489                if ($scope.season == "career-regular") {
27490                    vm.options.seasonId = null;
27491                    vm.options.seasonTypeId = 1;
27492                }
27493                else if ($scope.season == "career-playoffs") {
27494                    vm.options.seasonId = null;
27495                    vm.options.seasonTypeId = 2;
27496                }
27497                else if ($scope.season == "career-total") {
27498                    vm.options.seasonId = null;
27499                    vm.options.seasonTypeId = null;
27500                }
27501                else {
27502                    vm.options.seasonId = $scope.season;
27503                }
27504
27505
27506                if ($scope.division !== 'general' && $scope.division !== 'divisions') {
27507                    // Set the division identifier.
27508                    vm.options.divisionId = $scope.division;
27509                } else {
27510                    // Remove the property from options.
27511                    delete vm.options.divisionId;
27512                }
27513
27514                // Update player statistics list.
27515                getPlayerStatistics();
27516            }
27517        });
27518
27519        $scope.$watch('[startDate, endDate]', function (newValue, oldValue) {
27520            if ($scope.startDate && $scope.endDate) {
27521                vm.appliedFilters = true;
27522                vm.options.seasonId = $scope.season;
27523                vm.options.startDate = $scope.startDate;
27524                vm.options.endDate = $scope.endDate;
27525
27526                if ($scope.division !== 'general' && $scope.division !== 'divisions') {
27527                    // Set the division identifier.
27528                    vm.options.divisionId = $scope.division;
27529                } else {
27530                    // Remove the property from options.
27531                    delete vm.options.divisionId;
27532                }
27533
27534                // Update player statistics list.
27535                getPlayerStatistics();
27536            } else if (oldValue[0] || oldValue[1]) {
27537                vm.appliedFilters = false;
27538                vm.options.startDate = undefined;
27539                vm.options.endDate = undefined;
27540                getPlayerStatistics();
27541            }
27542        });
27543
27544        $scope.$watch('columns', function (columns) {
27545            buildColumns(columns);
27546        })
27547
27548        //Component mount
27549        switch ($localStorage.solution.sportId) {
27550            case 1:
27551                // TODO Initialize column sort / change hardcoded value.
27552                _.find(vm.columns, function (column) {
27553                    return column.id === 29;
27554                }).sort = 'desc';
27555
27556                vm.options = {
27557                    page: 1,
27558                    pageSize: $scope.pageSize,
27559                    sortOrder: 'desc',
27560                    sortStatId: 29,
27561                    positionType: 2
27562                };
27563                break;
27564
27565            case 2:
27566                _.find(vm.columns, function (column) {
27567                    return column.id === 81;
27568                }).sort = 'desc';
27569
27570                vm.options = {
27571                    page: 1,
27572                    pageSize: $scope.pageSize,
27573                    sortOrder: 'desc',
27574                    sortStatId: 81,
27575                    positionType: 9
27576                };
27577                break;
27578            case 4:
27579                // TODO Initialize column sort / change hardcoded value.
27580                _.find(vm.columns, function (column) {
27581                    return column.id === 128;
27582                }).sort = 'desc';
27583
27584                vm.options = {
27585                    page: 1,
27586                    pageSize: $scope.pageSize,
27587                    sortOrder: 'desc',
27588                    sortStatId: 128,
27589                    positionType: 10
27590                };
27591                break;
27592            case 6:
27593                // TODO Initialize column sort / change hardcoded value.
27594                _.find(vm.columns, function (column) {
27595                    return column.id === 37;
27596                }).sort = 'desc';
27597
27598                vm.options = {
27599                    page: 1,
27600                    pageSize: $scope.pageSize,
27601                    sortOrder: 'desc',
27602                    sortStatId: 37,
27603                    positionType: 3
27604                };
27605                break;
27606            case 14:
27607                // TODO Initialize column sort / change hardcoded value.
27608                _.find(vm.columns, function (column) {
27609                    return column.id === 60;
27610                }).sort = 'desc';
27611
27612                vm.options = {
27613                    page: 1,
27614                    pageSize: $scope.pageSize,
27615                    sortOrder: 'desc',
27616                    sortStatId: 60,
27617                    positionType: 16
27618                };
27619                break;
27620        }
27621
27622
27623        //State functions
27624        vm.getStatisticValue = function (player, statisticId) {
27625            if (player.Stats.length > 0) {
27626
27627                var playerStat = _.find(player.Stats, function (statistic) {
27628                    return statistic.StatTypeId === statisticId;
27629                });
27630
27631                if (playerStat) {
27632                    return playerStat.DisplayValue;
27633                }
27634            }
27635
27636            return '0';
27637        };
27638
27639        vm.sort = function (column) {
27640            // Reset columns sort.
27641            _.forEach(vm.columns, function (_column) {
27642                if (_column.id !== column.id) {
27643                    _column.sort = '';
27644                }
27645            });
27646
27647            if (angular.isUndefined(column.sort)) {
27648                column.sort = 'desc';
27649                vm.options.sortOrder = column.sort;
27650            } else {
27651                // Toggle sort order.
27652                column.sort = column.sort === 'desc'
27653                    ? column.sort = 'asc'
27654                    : column.sort = 'desc';
27655
27656                vm.options.sortOrder = column.sort;
27657            }
27658
27659            // Set the sort statistic id.
27660            vm.options.sortStatId = column.id;
27661
27662            // Update player statistics list.
27663            getPlayerStatistics();
27664        };
27665
27666        vm.clickPage = function (page) {
27667            // Set the page number.
27668            vm.options.page = page;
27669
27670            // Update player statistics list.
27671            getPlayerStatistics();
27672        };
27673
27674        vm.clickPrevious = function () {
27675            // Decrement the page number.
27676            vm.options.page -= 1;
27677
27678            // Update player statistics list.
27679            getPlayerStatistics();
27680        };
27681
27682        vm.clickNext = function () {
27683            // Increment the page number.
27684            vm.options.page += 1;
27685
27686            // Update player statistics list.
27687            getPlayerStatistics();
27688        };
27689
27690        //Helpers
27691        function getPlayerStatistics() {
27692            if (vm.appliedFilters) {
27693                statisticService.getPlayerStatisticsDateRangeBySolutionId(__solutionId__, vm.options)
27694                    .then(function (response) {
27695                        // Get the total count of players.
27696                        vm.totalCount = response.data.TotalCount;
27697                        vm.players = response.data.Results; // All players.
27698                    })
27699                    .catch(function (error) {
27700                        // TODO Bugsnag
27701                    });
27702            } else {
27703                statisticService.getPlayerStatisticsBySolutionId(__solutionId__, vm.options)
27704                    .then(function (response) {
27705                        // Get the total count of players.
27706                        vm.totalCount = response.data.TotalCount;
27707
27708                        vm.players = response.data.Results; // All players.
27709                    })
27710                    .catch(function (error) {
27711                        // TODO Bugsnag
27712                    });
27713            }
27714        }
27715
27716        function clearMoreFilters() {
27717            delete vm.options.startDate;
27718            delete vm.options.endDate;
27719        }
27720
27721        // TODO Move somewhere in a service...
27722        function isMobile() {
27723            return $window.innerWidth <= 575;
27724        }
27725
27726        function buildColumns(columnsToDisplay) {
27727            vm.columns = []; 
27728            columnsToDisplay.forEach(function (col) {
27729                var stat = statisticService.getPlayerStatisticByStatId(col.id);
27730                if (stat) {
27731                    vm.columns.push({
27732                        id: col.id,
27733                        visibleDesktop: col.visibleDesktop,
27734                        visibleMobile: col.visibleMobile,
27735                        name: stat.name,
27736                        abbreviation: stat.abbreviation
27737                    })
27738                }
27739            });
27740        }
27741    }
27742})();
27743;
27744(function () {
27745    'use strict';
27746
27747    angular
27748        .module('app.directives')
27749        .directive('playerStatisticsView', playerStatisticsView)
27750
27751    playerStatisticsView.$inject = [];
27752
27753    function playerStatisticsView() {
27754        return {
27755            restrict: 'E',
27756            scope: {
27757                season: '=',
27758                division: '=',
27759                startDate: '=',
27760                endDate: '=',
27761                pageSize: '=',
27762                columns: '='
27763            },
27764            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/player/view/player-statistics-view.tpl.html',
27765            controller: 'PlayerStatisticsViewWidgetController',
27766            controllerAs: 'playerStatisticsView'
27767        };
27768    }
27769})();;
27770(function () {
27771    'use strict';
27772
27773    angular
27774        .module('app.directives')
27775        .controller('SuspensionStatisticsController', SuspensionStatisticsController);
27776
27777    SuspensionStatisticsController.$inject = ['$scope'];
27778
27779    function SuspensionStatisticsController($scope) {
27780        var vm = this;   
27781        vm.season = undefined;
27782        vm.division = undefined;     
27783
27784        vm.filter = function(filter) {            
27785            vm.season = filter.season;
27786            vm.division = filter.division;
27787        };
27788    }
27789})();
27790;
27791(function () {
27792    'use strict';
27793
27794    angular
27795        .module('app.directives')
27796        .directive('suspensionStatistics', suspensionStatistics)
27797
27798    suspensionStatistics.$inject = [];
27799
27800    function suspensionStatistics() {
27801        return {
27802            restrict: 'E',
27803            scope: {                
27804                widget: '='
27805            },
27806            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/suspension/su
27806spension-statistics.tpl.html',
27807            controller: 'SuspensionStatisticsController',
27808            controllerAs: 'suspensionStatistics'
27809        };
27810    }
27811})();;
27812(function () {
27813    'use strict';
27814
27815    angular
27816        .module('app.directives')
27817        .controller('SuspensionStatisticsViewWidgetController', SuspensionStatisticsViewWidgetController);
27818
27819    SuspensionStatisticsViewWidgetController.$inject = ['$scope', 'UrlService', 'SuspensionService'];
27820
27821    function SuspensionStatisticsViewWidgetController($scope, urlService, suspensionService) {
27822        var vm = this;
27823        vm.url = urlService;
27824        vm.options = {
27825            page: 1,
27826            pageSize: 10,
27827            sortOrder: 'asc',
27828            sortStatId: 32,
27829            positionType: 1
27830        };
27831
27832        //Watchers
27833        $scope.$watch('[season, division]', function () {
27834            if ($scope.season && $scope.division) {
27835                vm.options.seasonId = $scope.season;
27836
27837                if ($scope.division !== 'general' && $scope.division !== 'divisions') {
27838                    // Set the division identifier.
27839                    vm.options.divisionId = $scope.division;
27840                } else {
27841                    // Remove the property from options.
27842                    delete vm.options.divisionId;
27843                }
27844
27845                // Update goaler statistics list.
27846                getSuspensions();
27847            }
27848        });
27849
27850
27851        //State functions
27852        vm.sort = function (column) {
27853            // Reset columns sort.
27854            _.forEach(vm.columns, function (_column) {
27855                if (_column.id !== column.id) {
27856                    _column.sort = '';
27857                }
27858            });
27859
27860            if (angular.isUndefined(column.sort)) {
27861                column.sort = 'desc';
27862                vm.options.sortOrder = column.sort;
27863            } else {
27864                // Toggle sort order.
27865                column.sort = column.sort === 'desc'
27866                    ? column.sort = 'asc'
27867                    : column.sort = 'desc';
27868
27869                vm.options.sortOrder = column.sort;
27870            }
27871
27872            // Set the sort statistic id.
27873            //vm.options.sortStatId = column.id;
27874
27875            // Update suspension statistics list.
27876            getSuspensions();
27877        };
27878
27879        vm.clickPage = function (page) {
27880            // Set the page number.
27881            vm.options.page = page;
27882
27883            // Update suspension statistics list.
27884            getSuspensions();
27885        };
27886
27887        vm.clickPrevious = function () {
27888            // Decrement the page number.
27889            vm.options.page -= 1;
27890
27891            // Update suspension statistics list.
27892            getSuspensions();
27893        };
27894
27895        vm.clickNext = function () {
27896            // Increment the page number.
27897            vm.options.page += 1;
27898
27899            // Update suspension statistics list.
27900            getSuspensions();
27901        };
27902
27903        //Helpers
27904        function getSuspensions() {
27905            suspensionService.getSuspensionsBySolutionId(__solutionId__, vm.options)
27906                .then(function (response) {
27907                    // Get the total count of suspensions.
27908                    vm.totalCount = response.data.TotalCount;
27909
27910                    vm.suspensions = response.data.Results; // All suspensions.
27911                })
27912                .catch(function (error) {
27913                    // TODO Bugsnag
27914                });
27915        }
27916    }
27917})();
27918;
27919(function () {
27920    'use strict';
27921
27922    angular
27923        .module('app.directives')
27924        .directive('suspensionStatisticsView', suspensionStatisticsView)
27925
27926    suspensionStatisticsView.$inject = [];
27927
27928    function suspensionStatisticsView() {
27929        return {
27930            restrict: 'E',
27931            scope: {
27932                season: '=',
27933                division: '='
27934            },
27935            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/suspension/view/suspension-statistics-view.tpl.html',
27936            controller: 'SuspensionStatisticsViewWidgetController',
27937            controllerAs: 'suspensionStatisticsView'
27938        };
27939    }
27940})();;
27941(function () {
27942    'use strict';
27943
27944    angular
27945        .module('app.directives')
27946        .controller('TeamStatisticsController', TeamStatisticsController);
27947
27948    TeamStatisticsController.$inject = ['$scope'];
27949
27950    function TeamStatisticsController($scope) {
27951        var vm = this;
27952        vm.season = undefined;
27953        vm.division = undefined;
27954
27955        vm.filter = function(filter) {
27956            vm.season = filter.season;
27957            vm.division = filter.division;
27958        };
27959    }
27960})();
27961;
27962(function () {
27963    'use strict';
27964
27965    angular
27966        .module('app.directives')
27967        .directive('teamStatistics', teamStatistics)
27968
27969    teamStatistics.$inject = [];
27970
27971    function teamStatistics() {
27972        return {
27973            restrict: 'E',
27974            scope: {                
27975                widget: '=',
27976                columns: '='
27977            },
27978            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/team/team-statistics.tpl.html',
27979            controller: 'TeamStatisticsController',
27980            controllerAs: 'teamStatistics'
27981        };
27982    }
27983})();;
27984(function () {
27985    'use strict';
27986
27987    angular
27988        .module('app.directives')
27989        .controller('TeamStatisticsViewWidgetController', TeamStatisticsViewWidgetController);
27990
27991    TeamStatisticsViewWidgetController.$inject = ['$scope', '$window', '$localStorage', 'UrlService', 'StatisticService'];
27992
27993    function TeamStatisticsViewWidgetController($scope, $window, $localStorage, urlService, statisticService) {
27994        var vm = this;
27995        vm.url = urlService;
27996        vm.sportId = $localStorage.solution.sportId;
27997        vm.options = undefined;
27998
27999        buildColumns($scope.columns);
28000
28001        vm.showStat = function (column) {
28002            if (isMobile() && column.visibleMobile) {
28003                return true;
28004            } else if (!isMobile() && column.visibleDesktop) {
28005                return true;
28006            }
28007            return false;
28008        }
28009
28010        //Watch for filter changes
28011        $scope.$watch('[season, division]', function () {
28012            if ($scope.season && $scope.division) {
28013                vm.options.seasonId = $scope.season;
28014
28015                if ($scope.division !== 'general' && $scope.division !== 'divisions') {
28016                    // Set the division identifier.
28017                    vm.options.divisionId = $scope.division;
28018                } else {
28019                    // Remove the property from options.
28020                    delete vm.options.divisionId;
28021                }
28022
28023                // Update team statistics list.
28024                getTeamStatistics();
28025            }
28026        });
28027
28028        $scope.$watch('columns', function (columns) {
28029            buildColumns(columns);
28030        })
28031
28032        //Component mount
28033        switch ($localStorage.solution.sportId) {
28034            case 1:
28035                // TODO Initialize column sort / change hardcoded value.
28036                _.find(vm.columns, function (column) {
28037                    return column.id === 15;
28038                }).sort = 'desc';
28039
28040                vm.options = {
28041                    page: 1,
28042                    pageSize: 10,
28043                    sortOrder: 'desc',
28044                    sortStatId: 15
28045                };
28046                break;
28047
28048            case 2:              
28049                // TODO Initialize column sort / change hardcoded value.
28050                _.find(vm.columns, function (column) {
28051                    return column.id === 57;
28052                }).sort = 'desc';
28053
28054                vm.options = {
28055                    page: 1,
28056                    pageSize: 10,
28057                    sortOrder: 'desc',
28058                    sortStatId: 57
28059                };
28060                break;
28061
28062            case 4:
28063                // TODO Initialize column sort / change hardcoded value.
28064                _.find(vm.columns, function (column) {
28065                    return column.id === 75;
28066                }).sort = 'desc';
28067
28068                vm.options = {
28069                    page: 1,
28070                    pageSize: 10,
28071                    sortOrder: 'desc',
28072                    sortStatId: 75
28073                };
28074                break;
28075
28076            case 6:
28077                // TODO Initialize column sort / change hardcoded value.
28078                _.find(vm.columns, function (column) {
28079                    return column.id === 42;
28080                }).sort = 'desc';
28081
28082                vm.options = {
28083                    page: 1,
28084                    pageSize: 10,
28085                    sortOrder: 'desc',
28086                    sortStatId: 42
28087                };
28088                break;
28089
28090            case 14:
28091                // TODO Initialize column sort / change hardcoded value.
28092                _.find(vm.columns, function (column) {
28093                    return column.id === 152;
28094                }).sort = 'desc';
28095
28096                vm.options = {
28097                    page: 1,
28098                    pageSize: 10,
28099                    sortOrder: 'desc',
28100                    sortStatId: 152
28101                };
28102                break;
28103        }
28104
28105        //State functions
28106        // TODO Move into service
28107        vm.getStatisticValue = function (team, statisticId) {
28108            return _.find(team.stats, function (statistic) {
28109                return statistic.statTypeId === statisticId;
28110            }).displayValue;
28111        };
28112
28113        vm.sort = function (column) {
28114            // Reset columns sort.
28115            _.forEach(vm.columns, function (_column) {
28116                if (_column.id !== column.id) {
28117                    _column.sort = '';
28118                }
28119            });
28120
28121            if (angular.isUndefined(column.sort)) {
28122                column.sort = 'desc';
28123                vm.options.sortOrder = column.sort;
28124            } else {
28125                // Toggle sort order.
28126                column.sort = column.sort === 'desc'
28127                    ? column.sort = 'asc'
28128                    : column.sort = 'desc';
28129
28130                vm.options.sortOrder = column.sort;
28131            }
28132
28133            // Set the sort statistic id.
28134            vm.options.sortStatId = column.id;
28135
28136            // Update team statistics list.
28137            getTeamStatistics();
28138        };
28139
28140        vm.clickPage = function (page) {
28141            // Set the page number.
28142            vm.options.page = page;
28143
28144            // Update team statistics list.
28145            getTeamStatistics();
28146        };
28147
28148        vm.clickPrevious = function () {
28149            // Decrement the page number.
28150            vm.options.page -= 1;
28151
28152            // Update team statistics list.
28153            getTeamStatistics();
28154        };
28155
28156        vm.clickNext = function () {
28157            // Increment the page number.
28158            vm.options.page += 1;
28159
28160            // Update team statistics list.
28161            getTeamStatistics();
28162        };
28163
28164        //Helpers
28165        function getTeamStatistics() {
28166            statisticService.getTeamStatisticsBySolutionId(__solutionId__, vm.options)
28167                .then(function (response) {
28168                    // Get the total count of goalers.
28169                    vm.totalCount = response.data.totalCount;
28170
28171                    vm.teams = _.forEach(response.data.results, function (team) {
28172                        _.forEach(team.stats, function (statistic) {
28173                            statistic.Value = statistic.displayValue;
28174                        })
28175                    }); // All goalers.
28176                })
28177                .catch(function (error) {
28178                    // TODO Bugsnag
28179                });
28180        }
28181
28182        // TODO Move somewhere in a service...
28183        function isMobile() {
28184            return $window.innerWidth <= 575;
28185        }
28186
28187        function buildColumns(columnsToDisplay) {
28188            vm.columns = [];
28189            columnsToDisplay.forEach(function (col) {
28190                var stat = statisticService.getTeamStatisticByStatId(col.id);
28191                if (stat) {
28192                    vm.columns.push({
28193                        id: col.id,
28194                        visibleDesktop: col.visibleDesktop,
28195                        visibleMobile: col.visibleMobile,
28196                        name: stat.name,
28197                        abbreviation: stat.abbreviation
28198                    })
28199                }
28200            });
28201        }
28202    }
28203})();
28204;
28205(function () {
28206    'use strict';
28207
28208    angular
28209        .module('app.directives')
28210        .directive('teamStatisticsView', teamStatisticsView)
28211
28212    teamStatisticsView.$inject = [];
28213
28214    function teamStatisticsView() {
28215        return {
28216            restrict: 'E',
28217            scope: {
28218                season: '=',
28219                division: '=',
28220                columns: '=',
28221            },
28222            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/team/view/team-statistics-view.tpl.html?version=1',
28223            controller: 'TeamStatisticsViewWidgetController',
28224            controllerAs: 'teamStatisticsView'
28225        };
28226    }
28227})();;
28228(function () {
28229    'use strict';
28230
28231    angular
28232        .module('app.directives')
28233        .controller('PlayerLeadersWidgetController', PlayerLeadersWidgetController);
28234
28235    PlayerLeadersWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', 'UrlService', 'PositionService', 'SeasonService', 'StatisticService', 'WebsiteEditorService', 'TranslationService'];
28236
28237    function PlayerLeadersWidgetController($rootScope, $scope, $localStorage, urlService, positionService, seasonService, statisticService, websiteEditorService, translationService) {
28238        var vm = this;
28239
28240        //State variables
28241        vm.translation = translationService;
28242        vm.widget = angular.fromJson(widgets[$scope.widget]);
28243        vm.url = urlService;
28244        vm.position = positionService;
28245
28246        vm.seasonId = undefined;
28247        vm.showPlayers = false;
28248        vm.nbPlayersDisplayed = 0;
28249        vm.playerStatisticDisplayed = 0;
28250        vm.playerPositionType = 2;
28251        vm.showGoaltenders = 0;
28252        vm.nbGoaltendersDisplayed = 0;
28253        vm.goaltenderPositionType = 1;
28254        vm.goaltenderStatisticDisplayed = 0;
28255        vm.showPlayerAvatars = true;
28256
28257        //State functions
28258        vm.getStatisticValue = function (player, statisticId) {
28259            if (player.Stats.length > 0) {
28260
28261                var playerStat = _.find(player.Stats, function (statistic) {
28262                    return statistic.StatTypeId === statisticId;
28263                });
28264
28265                if (playerStat) {
28266                    return playerStat.DisplayValue;
28267                }
28268            }
28269            return 'N/A';
28270        };
28271
28272        //On component mount
28273        for (var parameter in vm.widget.parameters) {
28274            switch (vm.widget.parameters[parameter].id) {
28275                case 'seasonId':
28276                    vm.seasonId = vm.widget.parameters[parameter].value;
28277                    break;
28278                case 'showPlayers':
28279                    vm.showPlayers = vm.widget.parameters[parameter].value === 'true';
28280                    break;
28281                case 'nbPlayersDisplayed':
28282                    vm.nbPlayersDisplayed = vm.widget.parameters[parameter].value;
28283                    break;
28284                case 'playerStatisticDisplayed':
28285                    vm.playerPositionType = getProperties(vm.widget.parameters[parameter].properties).categoryId;
28286                    vm.playerStatisticDisplayed = statisticService.getPlayerStatisticByStatId(parseInt(vm.widget.parameters[parameter].value));
28287                    break;
28288                case 'showGoaltenders':
28289                    vm.showGoaltenders = vm.widget.parameters[parameter].value === 'true';
28290                    break;
28291                case 'nbGoaltendersDisplayed':
28292                    vm.nbGoaltendersDisplayed = vm.widget.parameters[parameter].value;
28293                    break;
28294                case 'goaltenderStatisticDisplayed':
28295                    vm.goaltenderPositionType = getProperties(vm.widget.parameters[parameter].properties).categoryId;
28296                    vm.goaltenderStatisticDisplayed = statisticService.getPlayerStatisticByStatId(parseInt(vm.widget.parameters[parameter].value));
28297                    break;
28298
28299                case 'showPlayerAvatars':
28300                    vm.showPlayerAvatars = vm.widget.parameters[parameter].value === 'true';
28301                    break;
28302
28303            }
28304        }
28305
28306        if (!$localStorage.solution.defaultSeasonId) {
28307			solutionService.getSolutionById(__solutionId__)
28308				.then(function (response) {
28309					$localStorage.solution = response.data;
28310					getAllStats();
28311				})
28312				.catch(function (error) {
28313					bugsnag.notify(error);
28314				});
28315		} else {
28316			getAllStats();
28317		}
28318
28319        // Listener
28320        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
28321            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
28322                .then(function (response) {
28323                    for (var parameter in vm.widget.parameters) {
28324                        switch (vm.widget.parameters[parameter].id) {
28325                            case 'seasonId':
28326                                vm.widget.parameters[parameter].value = data.seasonId;
28327                                vm.seasonId = data.seasonId;
28328                                break;
28329                            case 'showPlayers':
28330                                vm.widget.parameters[parameter].value = data.showPlayers.toString();
28331                                vm.showPlayers = data.showPlayers;
28332                                break;
28333                            case 'nbPlayersDisplayed':
28334                                vm.widget.parameters[parameter].value = data.nbPlayersDisplayed;
28335                                vm.nbPlayersDisplayed = data.nbPlayersDisplayed;
28336                                break;
28337                            case 'playerStatisticDisplayed':
28338                                vm.widget.parameters[parameter].value = data.playerStatisticDisplayed;
28339                                vm.playerStatisticDisplayed = statisticService.getPlayerStatisticByStatId(parseInt(data.playerStatisticDisplayed));
28340                                break;
28341                            case 'showGoaltenders':
28342                                vm.widget.parameters[parameter].value = data.showGoaltenders.toString();
28343                                vm.showGoaltenders = data.showGoaltenders;
28344                                break;
28345                            case 'nbGoaltendersDisplayed':
28346                                vm.widget.parameters[parameter].value = data.nbGoaltendersDisplayed;
28347                                vm.nbGoaltendersDisplayed = data.nbGoaltendersDisplayed;
28348                                break;
28349                            case 'goaltenderStatisticDisplayed':
28350                                vm.widget.parameters[parameter].value = data.goaltenderStatisticDisplayed;
28351                                vm.goaltenderStatisticDisplayed = statisticService.getPlayerStatisticByStatId(parseInt(data.goaltenderStatisticDisplayed));
28352                                break;
28353
28354                            case 'showPlayerAvatars':
28355                                vm.widget.parameters[parameter].value = data.showPlayerAvatars.toString();
28356                                vm.showPlayerAvatars = data.showPlayerAvatars;
28357                                break;
28358                        }
28359                    }
28360                    widgets[$scope.widget] = angular.toJson(vm.widget);
28361                    getAllStats();
28362                })
28363                .catch(function (error) {
28364                    bugsnag.notify(error);
28365                });
28366        });
28367
28368        $scope.$on('$destroy', listener);
28369
28370        //Functionss
28371        function getAllStats() {
28372            if (vm.seasonId === 'default') {
28373				vm.seasonId = $localStorage.solution.defaultSeasonId.toString();
28374			}
28375            if (vm.showPlayers) {
28376                getPlayerLeaders({
28377                    page: 1,
28378                    pageSize: vm.nbPlayersDisplayed,
28379                    sortOrder: 'desc',
28380                    sortStatId: vm.playerStatisticDisplayed.id,
28381                    positionType: vm.playerPositionType,
28382                    seasonId: vm.seasonId
28383                });
28384            }
28385            if (vm.showGoaltenders) {
28386                getGoaltenderLeaders({
28387                    page: 1,
28388                    pageSize: vm.nbGoaltendersDisplayed,
28389                    sortOrder: 'desc',
28390                    sortStatId: vm.goaltenderStatisticDisplayed.id,
28391                    positionType: vm.goaltenderPositionType,
28392                    seasonId: vm.seasonId
28393                });
28394            }
28395        }
28396
28397        function getPlayerLeaders(options) {
28398            statisticService.getPlayerStatisticsBySolutionId(__solutionId__, options)
28399                .then(function (response) {
28400                    vm.players = response.data.Results;
28401                })
28402                .catch(function (error) {
28403                    bugsnag.notify(error);
28404                });
28405        }
28406
28407        function getGoaltenderLeaders(options) {
28408            statisticService.getPlayerStatisticsBySolutionId(__solutionId__, options)
28409                .then(function (response) {
28410                    vm.goaltenders = _.forEach(response.data.Results, function (goaler) {
28411                        _.forEach(goaler.Stats, function (statistic) {
28412                            statistic.Value = formatValues(statistic.StatTypeId, statistic.Value);
28413                        });
28414                    });                  
28415                })
28416                .catch(function (error) {
28417                    bugsnag.notify(error);
28418                });
28419        }
28420
28421        function formatValues(statisticId, value) {
28422            switch (statisticId) {
28423                case 30: // Save Percentage
28424                    return parseFloat(value / 1000).toFixed(3);
28425
28426                case 31: // Points per game
28427                case 32: // Points per game
28428                    return parseFloat(value / 100).toFixed(2);
28429
28430                default:
28431                    return value;
28432            }
28433        }
28434
28435        function getProperties(properties) {
28436            var obj = {};
28437            if (properties) {
28438                properties.forEach(function (item) {
28439                    obj[item.key] = item.value;
28440                });
28441            }
28442            return obj;
28443        }
28444    }
28445})();
28446;
28447(function () {
28448    'use strict';
28449
28450    angular
28451        .module('app.directives')
28452        .directive('playerLeaders', playerLeaders);
28453
28454    playerLeaders.$inject = [];
28455
28456    function playerLeaders() {
28457        return {
28458            restrict: 'E',
28459            scope: {                
28460                widget: '='
28461            },
28462            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/statistics/players/leaders/player-leaders.tpl.html',
28463            controller: 'PlayerLeadersWidgetController',
28464            controllerAs: 'playerLeaders'
28465        };
28466    }
28467})();;
28468(function () {
28469    'use strict';
28470
28471    angular
28472        .module('app.directives')
28473        .controller('SuspensionListWidgetController', SuspensionListWidgetController);
28474
28475        SuspensionListWidgetController.$inject = ['$rootScope', '$scope', 'UrlService', 'SuspensionService'];
28476
28477    function SuspensionListWidgetController($rootScope, $scope, urlService, suspensionService) {
28478        var vm = this;        
28479        vm.url = urlService;
28480
28481        // Apply website values to view model object.
28482        vm.widget = angular.fromJson(widgets[$scope.widget]);
28483
28484        Object.assign(vm, { 
28485            all: {
28486                totalCount: 0, 
28487                results: [],
28488                clickPage: clickPage,
28489                clickPrevious: clickPrevious,
28490                clickNext: clickNext
28491            }
28492        });  
28493
28494        vm.options = {
28495            page: 1,
28496            pageSize: 10
28497        };
28498
28499        vm.filter = function(filter) {            
28500            vm.options.seasonId = filter.season;
28501
28502            if (filter.division !== 'general' && filter.division !== 'divisions') {
28503                // Set the division identifier.
28504                vm.options.divisionId = filter.division;
28505            } else {
28506                // Remove the property from options.
28507                delete vm.options.divisionId; 
28508            }
28509
28510            // Update goaler statistics list.
28511            getSuspensions();
28512        };        
28513
28514        function clickPage(page) {
28515            // Set the page number.
28516            vm.options.page = page; 
28517
28518            // Update suspension statistics list.
28519            getSuspensions();
28520        }
28521
28522        function clickPrevious() {
28523            // Decrement the page number.
28524            vm.options.page -= 1; 
28525
28526            // Update suspension statistics list.
28527            getSuspensions();
28528        }
28529
28530        function clickNext(){
28531            // Increment the page number.
28532            vm.options.page += 1; 
28533
28534            // Update suspension statistics list.
28535            getSuspensions();
28536        }
28537
28538        function getSuspensions() {
28539            suspensionService.getSuspensionsBySolutionId(__solutionId__, vm.options)
28540                .then(function(response) {
28541                    vm.all.results = response.data.Results; // All suspensions.
28542                    vm.all.totalCount = response.data.TotalCount;
28543                })
28544                .catch(function(error) {
28545                    // TODO Bugsnag
28546                });
28547        }
28548    }
28549})();
28550;
28551(function () {
28552    'use strict';
28553
28554    angular
28555        .module('app.directives')
28556        .directive('suspensionList', suspensionList)
28557
28558    suspensionList.$inject = [];
28559
28560    function suspensionList() {
28561        return {
28562            restrict: 'E',
28563            scope: {                
28564                widget: '='
28565            },
28566            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/suspension/list/suspension-list.tpl.html',
28567            controller: 'SuspensionListWidgetController',
28568            controllerAs: 'suspensionList'
28569        };
28570    }
28571})();;
28572(function () {
28573    'use strict';
28574
28575    angular
28576        .module('app.directives')
28577        .controller('TeamDetailsWidgetController', TeamDetailsWidgetController);
28578
28579    TeamDetailsWidgetController.$inject = ['$rootScope', '$scope', '$sce', '$localStorage', 'TeamService', 'WebsiteEditorService', 'PositionService'];
28580
28581    function TeamDetailsWidgetController($rootScope, $scope, $sce, $localStorage, teamService, websiteEditorService, positionService) {
28582        var vm = this;
28583
28584        // State variables
28585        vm.widget = angular.fromJson(widgets[$scope.widget]);                
28586        Object.assign(vm, __team__);
28587
28588        vm.embedSrc = `<iframe src="${location.origin}/?iframe=true&pageId=${location.pathname.substring(1)}" width="100%" height="800"></iframe>`;
28589        vm.tabs.forEach(function (tab) {
28590            tab.content = $sce.trustAsHtml(tab.content);
28591        })        
28592        vm.defaultTab = _.find(vm.tabs, { default: true });
28593        vm.otherTabs = _.filter(vm.tabs, { default: false });
28594        vm.columnsLineup = [];
28595        vm.activeTab = 'allTimeStatistics';
28596        vm.activeScheduleTab = 'week';
28597        vm.position = positionService;
28598        vm.total = (_.filter(vm.players, { 'lineupStatus': 1 }) || []).length;
28599        console.log(vm.total);
28600
28601
28602        vm.normalTabs = [
28603            { 'id': 'allTimeStatistics', 'label': 'directives.widgets.team.details.tabs.allTimeStatistics' },
28604            { 'id': 'schedule', 'label': 'directives.widgets.team.details.tabs.schedule' },
28605            { 'id': 'lineup', 'label': 'directives.widgets.team.details.tabs.lineup' },
28606            { 'id': 'teamStatistics', 'label': 'directives.widgets.team.details.tabs.teamStatistics', visible: $localStorage.solution.sportId == 2 },
28607            { 'id': 'playersStatistics', 'label': 'directives.widgets.team.details.tabs.playersStatistics' },
28608            { 'id': 'staff', 'label': 'directives.widgets.team.details.tabs.staff' }
28609        ]; //Should be the same id/labels as properties of the widget parameter
28610
28611
28612        //State functions
28613        vm.clickTab = function (tab) {
28614            vm.activeTab = tab;
28615        }
28616        
28617        vm.isTabActive = function (id) {
28618            return vm.activeTab === id;
28619        }
28620        
28621        //Component mount.
28622        teamService.getTeamLineupById(__solutionId__, vm.id)
28623            .then(function (response) {
28624                vm.playerCategories = response.data; // Get all player categories.
28625            })
28626            .catch(function (error) {
28627                bugsnag.notify(error);
28628            });
28629
28630        for (var parameter in vm.widget.parameters) {
28631            switch (vm.widget.parameters[parameter].id) {
28632                case 'columnsDisplaySelect':
28633                    vm.columnsLineup = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
28634                    break;
28635                case 'defaultTab':
28636                    vm.activeTab = vm.widget.parameters[parameter].value;
28637                    formatNormalTabs();
28638                    break;
28639                case 'defaultScheduleTab':
28640                    vm.activeScheduleTab = vm.widget.parameters[parameter].value;
28641                    break;
28642                case 'columnsDisplayPlayersStatsSelect':
28643                    vm.columnsPlayerStats = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
28644                    break;
28645            }
28646        }
28647        
28648        if (vm.defaultTab) {
28649            vm.activeTab = vm.defaultTab.id;
28650        }
28651
28652        // Listener
28653        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
28654            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
28655                .then(function () {
28656                    for (var parameter in vm.widget.parameters) {
28657                        switch (vm.widget.parameters[parameter].id) {
28658                            case 'columnsDisplaySelect':
28659                                vm.widget.parameters[parameter].value = data.columnsDisplaySelect;
28660                                vm.columnsLineup = angular.fromJson(data.columnsDisplaySelect.replace(/\'/g, '"'));
28661                                break;
28662                            case 'defaultTab':
28663                                vm.widget.parameters[parameter].value = data.defaultTab;
28664                                vm.activeTab = data.defaultTab;
28665                                formatNormalTabs();
28666                                break;
28667                            case 'defaultScheduleTab':
28668                                vm.widget.parameters[parameter].value = data.defaultScheduleTab;
28669                                vm.activeScheduleTab = data.defaultScheduleTab;
28670                                break;
28671                            case 'columnsDisplayPlayersStatsSelect':
28672                                vm.widget.parameters[parameter].value = data.columnsDisplayPlayersStatsSelect;
28673                                vm.columnsPlayerStats= angular.fromJson(data.columnsDisplayPlayersStatsSelect.replace(/\'/g, '"'));
28674                                break;
28675
28676                        }
28677                    }
28678                    widgets[$scope.widget] = angular.toJson(vm.widget);
28679                })
28680                .catch(function (error) {
28681                    bugsnag.notify(error);
28682                });
28683        });
28684
28685        $scope.$on('$destroy', listener);
28686
28687        function formatNormalTabs() {
28688            var defaultTab = _.filter(vm.normalTabs, { id: vm.activeTab });
28689            var otherTabs = _.filter(vm.normalTabs, function (normalTab) {
28690                return normalTab.id !== vm.activeTab;
28691            });
28692            vm.normalTabs = defaultTab.concat(otherTabs);
28693        }
28694    }
28695})();
28696;
28697(function () {
28698    'use strict';
28699
28700    angular
28701        .module('app.directives')
28702        .directive('teamDetails', teamDetails);
28703
28704    teamDetails.$inject = [];
28705
28706    function teamDetails() {
28707        return {
28708            restrict: 'E',
28709            scope: {                
28710                widget: '='
28711            },
28712            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/team/details/team-details.tpl.html',
28713            controller: 'TeamDetailsWidgetController',
28714            controllerAs: 'team'
28715        };
28716    }
28717})();;
28718(function () {
28719    'use strict';
28720
28721    angular
28722        .module('app.directives')
28723        .controller('TeamAllTimeStatisticsController', TeamAllTimeStatisticsController);
28724
28725    TeamAllTimeStatisticsController.$inject = ['$scope', '$localStorage', 'UrlService', 'StatisticService'];
28726
28727    function TeamAllTimeStatisticsController($scope, $localStorage, urlService, statisticService) {
28728        var vm = this;
28729        vm.url = urlService;
28730
28731        Object.assign(vm, angular.fromJson(__team__));
28732        vm.sportId = $localStorage.solution.sportId;
28733        switch (vm.sportId) {
28734            case 1:
28735                // TODO Move default columns into service
28736                // TODO Implement columns parameters into the widget.
28737                vm.columns = statisticService.getTeamStatisticColumnsByColumnIds([5, 6, 7, 8, 9, 10, 15, 1, 2, 3, 4, 16, 13]);
28738                // TODO Initialize column sort / change hardcoded value.
28739                _.find(vm.columns, function (column) {
28740                    return column.id === 15;
28741                }).sort = 'desc';
28742                break;
28743
28744            case 2:
28745                // TODO Move default columns into service
28746                // TODO Implement columns parameters into the widget.
28747                vm.columns = statisticService.getTeamStatisticColumnsByColumnIds([55, 56, 57, 58, 73, 60, 61]);
28748                // TODO Initialize column sort / change hardcoded value.
28749                _.find(vm.columns, function (column) {
28750                    return column.id === 57;
28751                }).sort = 'desc';
28752                break;
28753            case 4:
28754                // TODO Move default columns into service
28755                // TODO Implement columns parameters into the widget.
28756                vm.columns = statisticService.getTeamStatisticColumnsByColumnIds([75, 76, 77, 78, 79, 80, 81, 81, 83, 195]);
28757                // TODO Initialize column sort / change hardcoded value.
28758                _.find(vm.columns, function (column) {
28759                    return column.id === 75;
28760                }).sort = 'desc';
28761                break;
28762            case 6: // TODO Move default columns into service
28763                // TODO Implement columns parameters into the widget.
28764                vm.columns = statisticService.getTeamStatisticColumnsByColumnIds([38, 39, 40, 41, 42, 50, 48, 49]);
28765                // TODO Initialize column sort / change hardcoded value.
28766                _.find(vm.columns, function (column) {
28767                    return column.id === 39;
28768                }).sort = 'desc';
28769                break;
28770
28771            case 14: // TODO Move default columns into service
28772                // TODO Implement columns parameters into the widget.
28773                vm.columns = statisticService.getTeamStatisticColumnsByColumnIds([148, 149, 150, 151, 174, 153, 154, 155]);
28774                // TODO Initialize column sort / change hardcoded value.
28775                _.find(vm.columns, function (column) {
28776                    return column.id === 149;
28777                }).sort = 'desc';
28778                break;                
28779
28780        }
28781
28782
28783        // TODO Move into service
28784        vm.getStatisticValue = function (team, statisticId) {
28785            return _.find(team.Stats, function (statistic) {
28786                return statistic.StatTypeId === statisticId;
28787            }).DisplayValue;
28788        };
28789
28790
28791        statisticService.getTeamAllStatisticsByTeamId(__solutionId__, vm.id)
28792            .then(function (response) {
28793
28794                //REGULAR SEASON
28795                vm.regularSeasons = _.filter(response.data, function (season) {
28796                    return season.SeasonTypeId === 1;
28797                });
28798                if (vm.regularSeasons.length > 0) {
28799                    vm.regularSeasonsTotalData = (_.filter(response.data, function (season) {
28800                        return season.SeasonName === null && season.SeasonTypeId === 1;
28801                    }))[0];
28802                    vm.regularSeasons.splice(vm.regularSeasons.indexOf(vm.regularSeasonsTotalData), 1)
28803                    // Clone the columns array.
28804                    vm.regularSeasonsTotal = angular.fromJson(angular.toJson(vm.columns));
28805                    vm.regularSeasonsTotalStats = []
28806                    _.forEach(vm.regularSeasonsTotal, function (column) {
28807                        _.forEach(vm.regularSeasonsTotalData.Stats, function (total) {
28808                            if (column.id === total.StatTypeId) { vm.regularSeasonsTotalStats.push(total) }
28809                        })
28810                    })
28811                }
28812
28813                //PLAYOFFS
28814                vm.playoffs = _.filter(response.data, function (season) {
28815                    return season.SeasonTypeId === 2 || season.SeasonTypeId === 8;
28816                });
28817                if (vm.playoffs.length > 0) {
28818                    vm.playoffsTotalData = (_.filter(response.data, function (season) {
28819                        return season.SeasonName === null && season.SeasonTypeId === 2 || season.SeasonTypeId === 8;
28820                    }))[0];
28821                    vm.playoffs.splice(vm.playoffs.indexOf(vm.playoffsTotalData), 1)
28822                    // Clone the columns array.
28823                    vm.playoffsTotal = angular.fromJson(angular.toJson(vm.columns));
28824                    vm.playoffsTotalStats = []
28825                    _.forEach(vm.playoffsTotal, function (column) {
28826                        _.forEach(vm.playoffsTotalData.Stats, function (total) {
28827                            if (column.id === total.StatTypeId) { vm.playoffsTotalStats.push(total) }
28828                        })
28829                    })
28830                }
28831
28832                //PRESEASONS
28833
28834                vm.preSeasons = _.filter(response.data, function (season) {
28835                    return season.SeasonTypeId === 3;
28836                });
28837                if (vm.preSeasons.length > 0) {
28838                    vm.preSeasonsTotalData = _.filter(response.data, function (season) {
28839                        return season.SeasonName === null && season.SeasonTypeId === 3;
28840                    })[0];
28841                    vm.preSeasons.splice(vm.preSeasons.indexOf(vm.preSeasonsTotalData), 1)
28842                    // Clone the columns array.
28843                    vm.preSeasonsTotal = angular.fromJson(angular.toJson(vm.columns));
28844                    vm.preSeasonsTotalStats = []
28845                    _.forEach(vm.preSeasonsTotal, function (column) {
28846                        _.forEach(vm.preSeasonsTotalData.Stats, function (total) {
28847                            if (column.id === total.StatTypeId) { vm.preSeasonsTotalStats.push(total) }
28848                        })
28849                    })
28850                }
28851
28852                //CHAMPIONSHIPS
28853                vm.championships = _.filter(response.data, function (season) {
28854                    return season.SeasonTypeId === 4
28855                });
28856                if (vm.championships.length > 0) {
28857                    vm.championshipsTotalData = _.filter(response.data, function (season) {
28858                        return season.SeasonName === null && season.SeasonTypeId === 4
28859                    })[0];
28860                    vm.championships.splice(vm.championships.indexOf(vm.championshipsTotalData), 1)
28861                    // Clone the columns array.
28862                    vm.championshipsTotal = angular.fromJson(angular.toJson(vm.columns));
28863                    vm.championshipsTotalStats = []
28864                    _.forEach(vm.championshipsTotal, function (column) {
28865                        _.forEach(vm.championshipsTotalData.Stats, function (total) {
28866                            if (column.id === total.StatTypeId) { vm.championshipsTotalStats.push(total) }
28867                        })
28868                    })
28869                }
28870                //TOURNAMENTS
28871                vm.tournaments = _.filter(response.data, function (season) {
28872                    return season.SeasonTypeId === 5
28873                });
28874                if (vm.tournaments.length > 0) {
28875                    vm.tournamentsTotalData = _.filter(response.data, function (season) {
28876                        return season.SeasonName === null && season.SeasonTypeId === 5
28877                    })[0];
28878                    vm.tournaments.splice(vm.tournaments.indexOf(vm.tournamentsTotalData), 1)
28879                    // Clone the columns array.
28880                    vm.tournamentsTotal = angular.fromJson(angular.toJson(vm.columns));
28881                    vm.tournamentsTotalStats = []
28882                    _.forEach(vm.tournamentsTotal, function (column) {
28883                        _.forEach(vm.tournamentsTotalData.Stats, function (total) {
28884                            if (column.id === total.StatTypeId) { vm.tournamentsTotalStats.push(total) }
28885                        })
28886                    })
28887                }
28888                // SINGLE ELIMINATION TOURNAMENTS
28889                vm.singleElimTournaments = _.filter(response.data, function (season) {
28890                    return season.SeasonTypeId === 6;
28891                });
28892                if (vm.singleElimTournaments.length > 0) {
28893                    vm.singleElimTournamentsTotalData = _.filter(response.data, function (season) {
28894                        return season.SeasonName === null && season.SeasonTypeId === 6
28895                    })[0];
28896                    vm.singleElimTournaments.splice(vm.singleElimTournaments.indexOf(vm.singleElimTournamentsTotalData), 1)
28897                    // Clone the columns array.
28898                    vm.singleElimTournamentsTotal = angular.fromJson(angular.toJson(vm.columns));
28899                    vm.singleElimTournamentsTotalStats = []
28900                    _.forEach(vm.singleElimTournamentsTotal, function (column) {
28901                        _.forEach(vm.singleElimTournamentsTotalData.Stats, function (total) {
28902                            if (column.id === total.StatTypeId) { vm.singleElimTournamentsTotalStats.push(total) }
28903                        })
28904                    })
28905                }
28906                //PLAYOFFS ROUNDS
28907                vm.playoffsRounds = _.filter(response.data, function (season) {
28908                    return season.SeasonTypeId === 7;
28909                });
28910                if (vm.playoffsRounds.length > 0) {
28911                    vm.playoffsRoundsTotalData = _.filter(response.data, function (season) {
28912                        return season.SeasonName === null && season.SeasonTypeId === 7;
28913                    })[0];
28914                    vm.playoffsRounds.splice(vm.playoffsRounds.indexOf(vm.playoffsRoundsTotalData), 1)
28915                    // Clone the columns array.
28916                    vm.playoffsRoundsTotal = angular.fromJson(angular.toJson(vm.columns));
28917                    vm.playoffsRoundsTotalStats = []
28918                    _.forEach(vm.playoffsRoundsTotal, function (column) {
28919                        _.forEach(vm.playoffsRoundsTotalData.Stats, function (total) {
28920                            if (column.id === total.StatTypeId) { vm.playoffsRoundsTotalStats.push(total) }
28921                        })
28922                    })
28923                }
28924            })
28925            .catch(function (error) {
28926                // TODO Bugsnag
28927            });
28928    }
28929})();
28930;
28931(function () {
28932    'use strict';
28933
28934    angular
28935        .module('app.directives')
28936        .directive('teamAllTimeStatistics', teamAllTimeStatistics);
28937
28938    teamAllTimeStatistics.$inject = [];
28939
28940    function teamAllTimeStatistics() {
28941        return {
28942            restrict: 'E',
28943            scope: { 
28944                widget: '='
28945            },
28946            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/team/detail
28946s/all-time-statistics/team-all-time-statistics.tpl.html',
28947            controller: 'TeamAllTimeStatisticsController',
28948            controllerAs: 'teamAllTimeStatistics'
28949        };
28950    }
28951})();;
28952
28953(function () {
28954	'use strict';
28955
28956	angular
28957		.module('app.directives')
28958		.controller('FiltersTeamController', FiltersTeamController);
28959
28960	FiltersTeamController.$inject = ['$scope', '$translate', '$localStorage', 'SeasonService', 'DivisionService', 'ContainerService', 'TeamService', 'FacilityService', 'HashService'];
28961
28962	function FiltersTeamController($scope, $translate, $localStorage, seasonService, divisionService, containerService, teamService, facilityService, hashService) {
28963		var vm = this;
28964		// State variables
28965		vm.filters = {
28966			container: undefined,
28967			season: 'all',
28968			facility: 'all'
28969		}
28970
28971		vm.containers = undefined;
28972		vm.seasons = [{ Id: 'all', Name: $translate.instant('directives.widgets.team.details.filtersTeam.labels.allseasons') }];
28973		vm.facilities = [{ Id: 'all', Name: $translate.instant('directives.widgets.team.details.filtersTeam.labels.allfacilities') }];
28974
28975		// State functions
28976		vm.selectContainer = function (item) {
28977			vm.filters.container = item.Id;
28978			vm.filters.facility = 'all';
28979			if (!item.Id || item.Id === 0) {
28980				getSeasons();
28981			} else {
28982				getSeasonsByContainerId(vm.filters.container);
28983			}
28984		};
28985
28986		vm.selectSeason = function (item) {
28987			vm.filters.season = item.Id;
28988			vm.filters.facility = 'all';
28989			change();
28990		};
28991
28992		vm.selectFacility = function (item) {
28993			vm.filters.facility = item.Id;
28994			change();
28995		}
28996
28997		// Component mount
28998		getContainers();
28999		getFacilities();
29000
29001		// API calls
29002		function getContainers() {
29003			containerService.getContainersBySolutionId(__solutionId__)
29004				.then(function (response) {
29005					if (response.data.containers && response.data.containers.length > 0) {
29006						vm.containers = [{ Id: 0, Name: $translate.instant('directives.widgets.team.details.filtersTeam.labels.allyears') }]
29007						vm.containers = vm.containers.concat(response.data.containers);
29008						vm.filters.container = response.data.defaultcontainerid ? response.data.defaultcontainerid : 0;
29009
29010
29011						if (vm.filters.container == 0) {
29012							getSeasons(response.data.defaultseasonid);
29013						} else {
29014							getSeasonsByContainerId(vm.filters.container);
29015						}
29016					} else {
29017						getSeasons(response.data.defaultseasonid);
29018					}
29019				})
29020				.catch(function (error) {
29021					bugsnag.notify(error);
29022				});
29023		}
29024
29025		function getSeasonsByContainerId(defaultContainerId) {
29026			seasonService.getSeasonsByContainerId(__solutionId__, defaultContainerId)
29027				.then(function (response) {
29028					vm.seasons = vm.seasons.concat(response.data.seasons);
29029					vm.filters.season = 'all';
29030					change();
29031				})
29032				.catch(function (error) {
29033					bugsnag.notify(error);
29034				});
29035		}
29036
29037		function getSeasons(defaultSeasonId) {
29038			seasonService.getSeasonsBySolutionId(__solutionId__)
29039				.then(function (response) {
29040					vm.seasons = response.data;
29041					vm.filters.season = defaultSeasonId ? defaultSeasonId : $localStorage.solution.defaultSeasonId.toString();
29042					change();
29043				})
29044				.catch(function (error) {
29045					bugsnag.notify(error);
29046				});
29047		}
29048
29049		function getFacilities() {
29050				facilityService.getFacilitiesBySolutionId(__solutionId__)
29051					.then(function (response) {
29052						vm.facilities = vm.facilities.concat(response.data);
29053					})
29054					.catch(function (error) {
29055						bugsnag.notify(error);
29056					});
29057			
29058		}
29059
29060		function change() {
29061			if (typeof $scope.change == 'function') {
29062				$scope.change({
29063					filter: {
29064						season: vm.filters.season,
29065						facility: vm.filters.facility,
29066						container: vm.filters.container
29067					}
29068				});
29069			}
29070		}
29071	}
29072})();;
29073(function () {
29074    'use strict';
29075
29076    angular
29077        .module('app.directives')
29078        .directive('filtersTeam', filtersTeam);
29079
29080    filtersTeam.$inject = [];
29081
29082    function filtersTeam() {
29083        return {
29084            restrict: 'E',
29085            replace: true,
29086            scope: {
29087                change: '&'
29088            },
29089            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/team/detail
29089s/filters-team/filters-team.tpl.html',
29090            controller: 'FiltersTeamController',
29091            controllerAs: 'filtersTeam',
29092            link: function (scope) {
29093                
29094            }
29095        };
29096    }
29097})();;
29098(function () {
29099    'use strict';
29100
29101    angular
29102        .module('app.directives')
29103        .controller('TeamLineupWidgetController', TeamLineupWidgetController);
29104
29105    TeamLineupWidgetController.$inject = ['$scope', '$translate', '$window', 'UrlService', 'PlayerService', 'PositionService'];
29106
29107    function TeamLineupWidgetController($scope, $translate, $window, urlService, playerService, positionService) {
29108        var vm = this;   
29109
29110        vm.url = urlService;       
29111        vm.player = playerService;
29112        vm.position = positionService;
29113        vm.columns = [];
29114        vm.getStatus = playerService.getStatus;
29115        vm.teamId = $scope.teamId
29116        vm.players = $scope.players;
29117
29118        vm.getAge = function (birthday) {
29119            return birthday !== null ? moment().diff(birthday, 'years') : '';
29120        };
29121
29122        vm.getBirthday = function (birthday) {
29123            return birthday !== null ? moment(birthday).format($translate.instant('directives.widgets.team.details.lineup.format.birthday')) : '';
29124        }
29125
29126        vm.getPlayerType = function (type) {
29127            return type !== null ? $translate.instant(playerService.getPlayerType(type)) : 'test';
29128        }
29129
29130        vm.showStat = function (column) {
29131            if (isMobile() && column.visibleMobile) {
29132                return true;
29133            } else if (!isMobile() && column.visibleDesktop) {
29134                return true;
29135            }
29136            return false;
29137        }
29138
29139        vm.sort = function (column) {
29140            // Reset columns sort.
29141            _.forEach(vm.columns, function (_column) {
29142                if (_column.id !== column.id) {
29143                    _column.sort = '';
29144                }
29145            });
29146
29147            if (angular.isUndefined(column.sort)) {
29148                column.sort = 'desc';
29149            } else {
29150                // Toggle sort order.
29151                column.sort = column.sort === 'desc'
29152                    ? column.sort = 'asc'
29153                    : column.sort = 'desc';
29154            }            
29155
29156            if (vm.players.length > 0) {
29157                vm.players = _.orderBy(vm.players, [function (player) {
29158                    switch (column.id) {
29159                        case 1:                            
29160                            return player.Number ? parseInt(player.Number) : Infinity;
29161                        case 2:
29162                            return _.kebabCase(player.Name);
29163                        case 3:
29164                            return positionService.getPosition(player.Position, 'abbreviation');
29165                        case 4:
29166                            return _.kebabCase(player.TeamName);
29167                        case 5:
29168                            return player.Birthday ? parseInt(vm.getAge(player.Birthday)) : -1;
29169                        case 6:
29170                            var height = -1;
29171                            if (player.Height) {
29172                                var numbers = _.kebabCase(player.Height).split('-');
29173                                height = parseInt(numbers[0] + _.padStart(numbers[1] || '0', 2, '0'));
29174                            }
29175
29176                            return height;                            
29177                        case 7:
29178                            return player.Weight ? parseInt(player.Weight) : -1;
29179                        case 8:
29180                        case 14:
29181                            return _.kebabCase(player.Level);
29182                        case 9:
29183                            return player.Birthday ? moment(player.Birthday).unix() : Number.NEGATIVE_INFINITY;
29184                        case 10:
29185                            return _.kebabCase(vm.getStatus(player.LineupStatus));
29186                        case 11:
29187                            return _.kebabCase(vm.getPlayerType(player.PlayerStatus));
29188                    }
29189                }, function (player) { return _.kebabCase(player.LastName); }], [column.sort, 'asc']);
29190            }
29191        };
29192
29193        buildColumns($scope.columns);
29194        vm.columns[0].sort = 'desc';
29195        vm.sort(vm.columns[0]);
29196
29197        $scope.$watch('columns', function () {
29198            buildColumns($scope.columns);
29199            vm.columns[0].sort = 'desc';
29200            vm.sort(vm.columns[0]);
29201        });
29202
29203        function buildColumns(columnsToDisplay) {
29204            vm.columns = [];
29205            columnsToDisplay.forEach(function (col) {
29206                var stat = playerService.getPlayerColumn(col.id);
29207                vm.columns.push({
29208                    id: col.id,
29209                    visibleDesktop: col.visibleDesktop,
29210                    visibleMobile: col.visibleMobile,
29211                    name: stat.name
29212                });
29213            });
29214        }
29215
29216        function isMobile() {
29217            return $window.innerWidth <= 600;
29218        }
29219    }
29220})();
29221;
29222(function () {
29223    'use strict';
29224
29225    angular
29226        .module('app.directives')
29227        .directive('teamLineup', teamLineup);
29228
29229    teamLineup.$inject = [];
29230
29231    function teamLineup() {
29232        return {
29233            restrict: 'E',
29234            scope: {               
29235                players: '=',
29236                columns: '=',
29237                teamId:'='
29238            },
29239            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/team/details/lineup/team-lineup.tpl.html',
29240            controller: 'TeamLineupWidgetController',
29241            controllerAs: 'teamLineup'
29242        };
29243    }
29244})();;
29245(function () {
29246    'use strict';
29247
29248    angular
29249        .module('app.directives')
29250        .controller('TeamPlayersStatisticsController', TeamPlayersStatisticsController);
29251
29252    TeamPlayersStatisticsController.$inject = ['$scope', '$localStorage', '$translate', 'UrlService', 'PositionService', 'PlayerService', 'StatisticService'];
29253
29254    function TeamPlayersStatisticsController($scope, $localStorage, $translate, urlService, positionService, playerService, statisticService) {
29255        var vm = this;
29256        var statsSportConfig = {
29257            1: {
29258                2: {
29259                    order: 1,
29260                    stats: [14, 6, 7, 29, 8, 26, 27, 28, 31],
29261                    sort: [29, 'desc']
29262                },
29263                1: {
29264                    order: 2,
29265                    stats: [62, 15, 16, 17, 19, 21, 22, 32, 25, 24, 30, 8],
29266                    sort: [15, 'desc']
29267                }
29268            },
29269            3: {
29270                22: {
29271                    order: 1,
29272                    stats: [165],
29273                    sort: [165, 'desc']
29274				}
29275			},
29276            2: {
29277                9: {
29278                    order: 1,
29279                    stats: [65, 67, 77, 80, 69, 70, 71, 75, 72, 73, 76, 79, 106, 81, 83, 82, 86, 85],
29280                    sort: [81, 'desc']
29281                },
29282                8: {
29283                    order: 2,
29284                    stats: [99, 100, 101, 91, 102, 93, 90, 96, 97, 98],
29285                    sort: [100, 'asc']
29286                },
29287            },
29288            4: {
29289                10: {
29290                    order: 1,
29291                    stats: [128, 131, 133, 136, 139, 142, 146, 157, 149, 150, 151, 156],
29292                    sort: [128, 'desc']
29293                },
29294            },
29295            6: {
29296                3: {
29297                    order: 1,
29298                    stats: [36, 37, 38, 39, 40, 41, 43, 44],
29299                    sort: [37, 'desc']
29300                },
29301                4: {
29302                    order: 2,
29303                    stats: [46, 47, 48, 49, 50],
29304                    sort: [46, 'desc']
29305                },
29306            },
29307            14: {
29308                16: {
29309                    order: 1,
29310                    stats: [53, 54, 55, 60, 61, 57, 56, 58, 59],
29311                    sort: [60, 'desc']
29312                },                
29313                17: {
29314                    order: 2,
29315                    stats: [53, 54, 55, 60, 61, 57, 56, 58, 59],
29316                    sort: [60, 'desc']
29317                }
29318            }
29319        }
29320
29321        vm.url = urlService;
29322        vm.position = positionService;
29323        vm.playerService = playerService;
29324        vm.options = {};
29325        vm.columns = [[], []];
29326        vm.sportId = $localStorage.solution.sportId;
29327        vm.playerCategories = [];
29328        vm.isMobile = false;
29329        vm.startsWith = _.startsWith;
29330
29331        var sportPlayerCategories = statsSportConfig[vm.sportId];
29332        $scope.$watch('playerColumns', function () {
29333            buildColumns();
29334            getStatistics();
29335        });
29336
29337        vm.showStat = function (column) {            
29338            if (vm.isMobile && column.visibleMobile) {
29339                return true;
29340            } else if (!vm.isMobile && column.visibleDesktop) {
29341                return true;
29342            }
29343            return false;
29344        }
29345
29346        vm.getBackgroundStyle = function (i) {
29347            let style = {};
29348            if (i % 2 != 0) {
29349                style['background-color'] = '#f0f0f0';
29350                vm.backgroundColor = '#f0f0f0';
29351                vm.isPair = false;
29352            }
29353            else {
29354                style['background-color'] = '#fff';
29355                vm.backgroundColor = '#fff';
29356                vm.isPair = true;
29357            }
29358            return style;
29359        }
29360
29361        vm.getBirthday = function (birthday) {
29362            return birthday !== null ? moment(birthday).format($translate.instant('directives.widgets.team.details.lineup.format.birthday')) : '';
29363        }
29364
29365        Object.assign(vm, angular.fromJson(__team__));
29366
29367        vm.filter = function (filter) {
29368            vm.options.seasonId = filter.season;
29369
29370            getStatistics();
29371        };
29372
29373
29374        vm.getStatisticValue = function (player, statisticId) {
29375            if (_.startsWith(statisticId, 'player')) {
29376                var playerParamId = _.parseInt(statisticId.match(/^player(\d+)$/)[1]);
29377                switch (playerParamId) {
29378                    case 1:
29379                        return { value: player.Number, class: 'text-center', sortValue: _.parseInt(player.Number) };
29380                    case 2:
29381                        return { value: player.Name, class: 'text-nowrap sticky-col', sortValue: _.kebabCase(player.Name), url: vm.url.getPlayerUrl(player.Name, player.Id) };
29382                    case 3:
29383                        return { value: positionService.getPosition(player.Position, 'abbreviation'), class: 'text-center'};
29384                    case 4:
29385                        return { value: player.TeamName, class: 'text-nowrap', sortValue: _.kebabCase(player.TeamName), url: vm.url.getTeamUrl(player.TeamName, vm.id)};
29386                    case 5:
29387                        return { value: playerService.getAge(player.Birthday), class: 'text-center' };
29388                    case 6:
29389                        return { value: player.Height, class: 'text-center' };
29390                    case 7:
29391                        return { value: player.Weight, class: 'text-center' };
29392                    case 8:
29393                    case 13:
29394                    case 14:
29395                        return { value: player.Level, sortValue: _.kebabCase(player.Level), class: 'text-center' };
29396                    case 9:
29397                        return { value: vm.getBirthday(player.Birthday), class: 'text-center' };
29398                    case 10:
29399                        return { value: $translate.instant(playerService.getStatus(player.LineupStatus)), class: 'text-center' };
29400                    case 11:
29401                        return { value: $translate.instant(playerService.getPlayerType(player.PlayerStatus)), sortValue: _.kebabCase(player.Type), class: 'text-center' }
29402                }
29403
29404                return { value: '', class: 'text-center' };
29405            }
29406            else {
29407                if (player.Stats.length > 0) {
29408                    var playerStat = _.find(player.Stats, function (statistic) {
29409                        return statistic.StatTypeId === statisticId;
29410                    });
29411
29412                    if (playerStat) {
29413                        return { value: playerStat.DisplayValue, class: 'text-center', sortValue: playerStat.Value };
29414                    }
29415                }
29416
29417                return { value: '0', class: 'text-center' };
29418            }
29419        };
29420
29421        vm.sort = function (playerCategory, column) {
29422            // Reset columns sort.
29423            _.forEach(playerCategory.columns, function (_column) {
29424                if (_column.id !== column.id) {
29425                    _column.sort = '';
29426                }
29427            });
29428
29429            if (angular.isUndefined(column.sort)) {
29430                column.sort = 'desc';
29431            } else {
29432                // Toggle sort order.
29433                column.sort = column.sort === 'desc'
29434                    ? column.sort = 'asc'
29435                    : column.sort = 'desc';
29436            }
29437
29438            var players = _.filter(playerCategory.players, function (player) {
29439                return player.Stats.length > 0;
29440            });
29441
29442            if (players.length > 0) {
29443                playerCategory.players = _.orderBy(players, function (player) {
29444                    var statisticValue = vm.getStatisticValue(player, column.id)
29445                    return statisticValue.sortValue || statisticValue.value;
29446                }, [column.sort]);
29447            }
29448        };
29449
29450        function getStatistics() {
29451            statisticService.getPlayersStatisticsByTeamId(__solutionId__, vm.id, vm.options)
29452                .then(function (response) {
29453                    // Get all player categories.
29454                    var categories = response.data.PlayersCategories;
29455                                        
29456                    _.forEach(categories, function (category) {
29457                        var playerCategory = _.find(vm.playerCategories, { id: category.Id });
29458                        if (playerCategory) {
29459                            var sort = sportPlayerCategories[playerCategory.id].sort;
29460
29461                            var players = _.filter(category.Players, function (player) {
29462                                return player.Stats.length >= 0;
29463                            });
29464                            playerCategory.players = []
29465                            if (players.length > 0) {                            
29466                                // Get index of sorted column
29467                                var index = _.findIndex(players[0].Stats, function (statistic) {
29468                                    return statistic.StatTypeId === _.find(playerCategory.columns, function (column) { return column.sort; }).id;
29469                                });
29470
29471                                _.find(playerCategory.columns, function (column) {
29472                                    return column.id === sort[0];
29473                                }).sort = sort[1];
29474
29475                                playerCategory.players = _.orderBy(players, function (player) {
29476                                    return player.Stats[index].Value;
29477                                }, [sort[1]]);
29478                            }
29479                        }
29480                    })
29481
29482
29483                })
29484                .catch(function (error) {
29485                    // TODO Bugsnag
29486                });
29487        }
29488
29489        function buildColumns() {
29490            var playerCategories = [];
29491            _.forEach(sportPlayerCategories, function (value, key) {
29492                var categoryColumns = $scope.playerColumns[key].map(function (col) {
29493                    if (_.startsWith(col.id, 'player')) {                        
29494                        var stat = playerService.getPlayerColumn(_.parseInt(col.id.match(/^player(\d+)$/)[1]));
29495                    }
29496                    else {
29497                        var stat = statisticService.getPlayerStatisticByStatId(col.id);
29498                    }
29499                    
29500                    return {
29501                        id: col.id,
29502                        visibleDesktop: col.visibleDesktop,
29503                        visibleMobile: col.visibleMobile,
29504                        stat: (stat || {}),
29505                    }
29506                });
29507
29508                var category = {
29509                    id: _.parseInt(key),
29510                    columns: categoryColumns,
29511                    players: [],
29512                    order: value.order
29513                };
29514
29515                _.find(category.columns, function (column) {
29516                    return column.id === value.sort[0];
29517                }).sort = value.sort[1];
29518                playerCategories.push(category);
29519            });
29520
29521            vm.playerCategories = playerCategories;
29522        }
29523    }
29524})();
29525;
29526(function () {
29527    'use strict';
29528
29529    angular
29530        .module('app.directives')
29531        .directive('teamPlayersStatistics', teamPlayersStatistics);
29532
29533    teamPlayersStatistics.$inject = [];
29534
29535    function teamPlayersStatistics() {
29536        return {
29537            restrict: 'E',
29538            scope: {               
29539                widget: '=',
29540                playerColumns: '='
29541            },
29542            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/team/detail
29542s/players-statistics/team-players-statistics.tpl.html',
29543            controller: 'TeamPlayersStatisticsController',
29544            controllerAs: 'teamPlayersStatistics'
29545        };
29546    }
29547})();;
29548(function () {
29549    'use strict';
29550
29551    angular
29552        .module('app.directives')
29553        .controller('TeamStaffWidgetController', TeamStaffWidgetController);
29554
29555    TeamStaffWidgetController.$inject = ['$scope', 'PositionService', 'StaffService'];
29556
29557    function TeamStaffWidgetController($scope, positionService, staffService) {
29558        var vm = this;    
29559
29560        vm.position = positionService;
29561        vm.staff = staffService;
29562
29563        Object.assign(vm, angular.fromJson(__team__)); 
29564        
29565        staffService.getStaffByTeamId(vm.id)
29566            .then(function(response) {
29567                vm.staff = response.data; // All the staff from the team.
29568            })
29569            .catch(function(error) {
29570                bugsnag.notify(error);
29571            });
29572    }
29573})();
29574;
29575(function () {
29576    'use strict';
29577
29578    angular
29579        .module('app.directives')
29580        .directive('teamStaff', teamStaff);
29581
29582    teamStaff.$inject = [];
29583
29584    function teamStaff() {
29585        return {
29586            restrict: 'E',
29587            scope: {               
29588                players: '='
29589            },
29590            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/team/detail
29590s/staff/team-staff.tpl.html',
29591            controller: 'TeamStaffWidgetController',
29592            controllerAs: 'teamStaff'
29593        };
29594    }
29595})();;
29596(function () {
29597    'use strict';
29598
29599    angular
29600        .module('app.directives')
29601        .controller('TeamLeadersWidgetController', TeamLeadersWidgetController);
29602
29603    TeamLeadersWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', 'UrlService', 'DivisionService', 'StatisticService', '$translate', 'WebsiteEditorService', 'SolutionService'];
29604
29605    function TeamLeadersWidgetController($rootScope, $scope, $localStorage, urlService, divisionService, statisticService, $translate, websiteEditorService, solutionService) {
29606        var vm = this;
29607        vm.url = urlService;
29608        vm.options = {
29609            page: 1,
29610            pageSize: 10000,
29611            seasonId: $localStorage.solution.defaultSeasonId,
29612            sortStatId: 15,
29613            sortOrder: 'desc',
29614            automatedStats: false
29615        };
29616
29617        // Get parameters of the widget.
29618        vm.widget = angular.fromJson(widgets[$scope.widget]);
29619
29620        var section = null
29621            
29622        for (var i = 0; i < page.rows.length && !section; i++) {
29623            var row = page.rows[i];
29624            section = _.find(row.sections, { uuid: $scope.section });
29625        }
29626
29627        vm.section = section;
29628        vm.nbTeamsDisplayed = undefined;
29629
29630        vm.columnsToDisplay = [5, 6, 7, 8, 10, 12, 15];
29631
29632        switch ($localStorage.solution.sportId) {
29633            case 1: // Hockey
29634                var section = null;
29635
29636                vm.options.sortStatId = 15;
29637                vm.options.sortOrder = 'desc';
29638                vm.columnsToDisplay = [5, 6, 7, 8, 15]; 
29639
29640                if ((vm.section.md || vm.section.sm) > 4) {
29641                    vm.columnsToDisplay = [5, 6, 7, 8, 10, 12, 15];
29642                }
29643
29644                break;
29645
29646            case 2: // Baseball
29647                vm.options.sortStatId = 73;
29648                vm.options.sortOrder = 'desc';
29649                vm.columnsToDisplay = [55, 56, 57, 73];
29650                break;
29651
29652            case 3: //Football
29653                vm.options.sortStatId = 68;
29654                vm.options.sortOrder = 'desc';
29655                vm.columnsToDisplay = [64, 65, 66, 67, 68];
29656                break;
29657
29658            case 4: // Basketball
29659                vm.options.sortStatId = 79;
29660                vm.options.sortOrder = 'desc';
29661                vm.columnsToDisplay = [75, 76, 77, 78, 79];
29662                break;
29663
29664            case 6: // Soccer
29665                vm.options.sortStatId = 42;
29666                vm.options.sortOrder = 'desc';
29667                vm.columnsToDisplay = [38, 39, 40, 41, 42];
29668                break;
29669
29670            case 7: // Volleyball
29671                vm.options.sortStatId = 88;
29672                vm.options.sortOrder = 'desc';
29673                vm.columnsToDisplay = [84, 85, 86, 87, 88];
29674                break;
29675        }
29676
29677        $scope.$watch(function () { return vm.section.md }, function (width) {
29678            switch ($localStorage.solution.sportId) {
29679                case 1:
29680                    if ((vm.section.md || vm.section.sm) > 4) {
29681                        vm.columnsToDisplay = [5, 6, 7, 8, 10, 12, 15];
29682                        vm.columns = statisticService.getTeamStatisticColumnsByColumnIds(vm.columnsToDisplay);
29683                    }
29684                    else {
29685                        vm.columnsToDisplay = [5, 6, 7, 8, 15];
29686                        vm.columns = statisticService.getTeamStatisticColumnsByColumnIds(vm.columnsToDisplay);
29687                    }
29688                    break;
29689            }
29690        })
29691
29692        // Set view model parameters.
29693        for (var parameter in vm.widget.parameters) {
29694            switch (vm.widget.parameters[parameter].id) {
29695                case 'seasonDivisionId':
29696                    if(vm.widget.parameters[parameter].value === 'default'){
29697                        vm.options.seasonId = $localStorage.solution.defaultSeasonId.toString()
29698                        vm.options.defaultDivision = 'divisions'
29699                        vm.selectedDivision = vm.options.defaultDivision
29700                    } else {
29701                        vm.options.defaultDivision = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"')).division
29702                        vm.options.seasonId = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"')).season
29703                        vm.selectedDivision = vm.options.defaultDivision
29704                    }
29705                    break;
29706
29707                case 'nbTeamsDisplayed':                    
29708                    vm.nbTeamsDisplayed = vm.widget.parameters[parameter].value;
29709                    break;
29710            }
29711        }
29712
29713        // Triggered when parameters are changed.
29714        //TODO Probably better to switch to a service...
29715        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
29716            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
29717                .then(function (response) {
29718                    // Save parameters.
29719                    for (var parameter in vm.widget.parameters) {
29720                        switch (vm.widget.parameters[parameter].id) {
29721                            case 'seasonDivisionId':
29722                                vm.widget.parameters[parameter].value = data.seasonDivisionId
29723                                vm.options.defaultDivision = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"')).division
29724                                vm.options.seasonId = angular.fromJson(data.seasonDivisionId.replace(/\'/g, '"')).season
29725                                vm.selectedDivision = vm.options.defaultDivision
29726                                break;
29727
29728                            case 'nbTeamsDisplayed':
29729                                vm.widget.parameters[parameter].value = data.nbTeamsDisplayed;
29730                                vm.nbTeamsDisplayed = data.nbTeamsDisplayed;
29731                                break;
29732                        }
29733                    }
29734                    // Update the variable.
29735                    widgets[$scope.widget] = angular.toJson(vm.widget);
29736                    getDivisions();
29737                })
29738                .catch(function (error) {
29739                    bugsnag.notify(error);
29740                });
29741        });
29742
29743        $scope.$on('$destroy', listener);
29744
29745        // TODO Get sport id
29746        // TODO Move default columns into service
29747        // TODO Implement columns parameters into the widget.
29748        vm.columns = statisticService.getTeamStatisticColumnsByColumnIds(vm.columnsToDisplay);
29749        // TODO Initialize column sort / change hardcoded value.
29750        _.find(vm.columns, function (column) {
29751            return column.id === vm.options.sortStatId;
29752        }).sort = vm.options.sortOrder;
29753
29754        vm.showDivisions = function (division) {
29755            return (!isNaN(division.Id) && division.Id === parseInt(vm.selectedDivision)) ||
29756                (vm.selectedDivision === 'divisions' && !isNaN(division.Id));
29757        }
29758
29759        vm.getStatisticValue = function (team, statisticId) {
29760            return _.find(team.stats, function (statistic) {
29761                return statistic.statTypeId === statisticId;
29762            }).displayValue;
29763        };
29764
29765        if (!$localStorage.solution.defaultSeasonId) {
29766            solutionService.getSolutionById(__solutionId__)
29767                .then(function (response) {
29768                    $localStorage.solution = response.data;
29769                    getDivisions();
29770                })
29771                .catch(function (error) {
29772                    bugsnag.notify(error);
29773                });
29774        } else {
29775            getDivisions();
29776        }
29777
29778        function getDivisions() {
29779            if (vm.options.seasonId === 'default') {
29780                vm.options.seasonId = $localStorage.solution.defaultSeasonId.toString();
29781            }
29782            divisionService.getDivisionsBySeasonId(__solutionId__, vm.options.seasonId)
29783                .then(function (response) {
29784                    vm.seasonNotSet = true;
29785                    vm.teams = new Array(5);
29786
29787                    if (response.data.length <= 1) {
29788                        vm.divisions = [
29789                            { Id: 'general', Name: $translate.instant('directives.widgets.team.standings.labels.general') }
29790                        ];
29791                        vm.selectedDivision = 'general';
29792                    } else {
29793                        vm.divisions = [
29794                            { Id: 'general', Name: $translate.instant('directives.widgets.team.standings.labels.general') },
29795                            { Id: 'divisions', Name: $translate.instant('directives.widgets.team.standings.labels.divisions') }
29796                        ];
29797                        Array.prototype.push.apply(vm.divisions, response.data);
29798                        // vm.selectedDivision = response.data[0].Id; // Select the first division
29799                    }
29800
29801                    getStatistics();
29802                })
29803                .catch(function (error) {
29804                    bugsnag.notify(error);
29805                });
29806        }
29807
29808        function getStatistics() {
29809            // TODO Should be by season Id
29810            statisticService.getTeamStatisticsBySolutionId(__solutionId__, vm.options)
29811                .then(function (response) {
29812                    if (!angular.isUndefinedOrNull(response.data.results)) {
29813                        vm.seasonNotSet = false;
29814                        // Get all the teams from the statistics.
29815                        vm.teams = response.data.results;
29816                        // Fill divisions with teams.
29817                        _.forEach(vm.divisions, function (division) {
29818                            division.teams = [];
29819                            division.divisions = [];
29820
29821                            _.forEach(vm.teams, function (team) {
29822                                if (team.divisionId === division.Id) {
29823                                    if (angular.isUndefined(division.teams)) {
29824                                        division.teams = [];
29825                                    }
29826
29827                                    division.teams.push(team);
29828                                }
29829                            })
29830
29831                            var parentDivision = _.find(vm.divisions, { Id: division.ParentId });
29832                            if (parentDivision) {
29833                                parentDivision.divisions.push(division);
29834                            }
29835                        });
29836                    } else {
29837                        // Season is not ready.
29838                        vm.seasonNotSet = true;
29839
29840                        // Set empty teams array.
29841                        vm.teams = new Array(5);
29842                    }
29843                })
29844                .catch(function (error) {
29845                    bugsnag.notify(error);
29846                });
29847        }
29848
29849        vm.selectDivision = function (item) {
29850            vm.selectedDivision = item.Id;
29851        };
29852
29853        /*vm.getStatisticValue = function(player, statisticId) {
29854            return _.find(player.Stats, function(statistic) {
29855                return statistic.StatTypeId === statisticId;
29856            }).Value;
29857        };
29858        
29859        seasonService.getSeasonsBySolutionId(__solutionId__, { active: true })
29860            .then(function(response) {
29861                vm.options = {
29862                    page: 1,
29863                    pageSize: vm.nbGoaltendersDisplayed,
29864                    sortOrder: 'desc',
29865                    sortStatId: vm.playerStatisticDisplayed,        
29866                    positionType: 2,
29867                    seasonId: seasonId //response.data.Id
29868                };
29869
29870                // Display player leaders.
29871                getPlayerLeaders();
29872
29873                vm.options = {
29874                    page: 1,
29875                    pageSize: vm.nbGoaltendersDisplayed,
29876                    sortOrder: 'asc', // TODO Depending the stat request...
29877                    sortStatId: vm.goaltenderStatisticDisplayed,        
29878                    positionType: 1,
29879                    seasonId: seasonId //response.data.Id
29880                };
29881
29882                // Display goaltender leaders.
29883                getGoaltenderLeaders();
29884            })
29885            .catch(function(error) {
29886
29887            });
29888        //getPlayers(parseInt(widgetDefinition.parameters[0].value)); // TODO Need method to get paramaters by name.
29889
29890        /*function getPlayers(nbPlayersDisplayed) {
29891            // TODO Replace slice with REST call.
29892            vm.allPlayers = players.slice(0, nbPlayersDisplayed);
29893        }*/
29894
29895        /*function getPlayerLeaders() {
29896            statisticService.getPlayerStatisticsBySolutionId(__solutionId__, vm.options)
29897                .then(function(response) {
29898                    // Get the total count of players.
29899                    //vm.totalCount = response.data.TotalCount;
29900
29901                    vm.players = response.data.Results; // All players.
29902                })
29903                .catch(function(error) {
29904                    // TODO Bugsnag
29905                });
29906        }
29907
29908        function getGoaltenderLeaders() {
29909            statisticService.getPlayerStatisticsBySolutionId(__solutionId__, vm.options)
29910                .then(function(response) {
29911                    vm.goaltenders = _.forEach(response.data.Results, function(goaler) {
29912                        _.forEach(goaler.Stats, function(statistic) {
29913                            statistic.Value = formatValues(statistic.StatTypeId, statistic.Value);
29914                        });
29915                    }); // All goaltenders.                    
29916                })
29917                .catch(function(error) {
29918                    // TODO Bugsnag
29919                });
29920        }
29921
29922        function formatValues(statisticId, value) {
29923            switch (statisticId) {
29924                case 30: // Save Percentage
29925                    return parseFloat(value / 1000).toFixed(3);
29926
29927                case 31: // Points per game
29928                case 32: // Points per game
29929                    return parseFloat(value / 100).toFixed(2);
29930
29931                default:
29932                    return value;
29933            }
29934        }*/
29935    }
29936})();
29937;
29938(function () {
29939    'use strict';
29940
29941    angular
29942        .module('app.directives')
29943        .directive('teamLeaders', teamLeaders);
29944
29945    teamLeaders.$inject = [];
29946
29947    function teamLeaders() {
29948        return {
29949            restrict: 'E',
29950            scope: {      
29951                section: '=',
29952                widget: '=',
29953            },
29954            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/team/leaders/team-leaders.tpl.html?version=1',
29955            controller: 'TeamLeadersWidgetController',
29956            controllerAs: 'teamLeaders'
29957        };
29958    }
29959})();;
29960(function () {
29961    'use strict';
29962
29963    angular
29964        .module('app.directives')
29965        .controller('TeamLeadersDivisionWidgetController', TeamLeadersDivisionWidgetController);
29966
29967    TeamLeadersDivisionWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', 'UrlService', 'DivisionService', 'StatisticService', '$translate', 'WebsiteEditorService', 'SolutionService'];
29968
29969    function TeamLeadersDivisionWidgetController($rootScope, $scope, $localStorage, urlService, divisionService, statisticService, $translate, websiteEditorService, solutionService) {
29970        var vm = this;
29971        vm.url = urlService;
29972        console.log($scope);
29973
29974        vm.getStatisticValue = function (team, statisticId) {
29975            return _.find(team.stats, function (statistic) {
29976                return statistic.statTypeId === statisticId;
29977            }).displayValue;
29978        };
29979
29980    }
29981})();   
29982    ;
29983(function () {
29984    'use strict';
29985
29986    angular
29987        .module('app.directives')
29988        .directive('teamLeadersDivision', teamLeadersDivision);
29989
29990    teamLeadersDivision.$inject = [];
29991
29992    function teamLeadersDivision() {
29993        return {
29994            restrict: 'E',
29995            scope: {      
29996                division: '=',
29997                level: '=',
29998                columns: '=',
29999                selectedDivision: '=',
30000                nbTeamsDisplayed: '='
30001            },
30002            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/team/leaders/team-leaders-division.tpl.html?version=1',
30003            controller: 'TeamLeadersDivisionWidgetController',
30004            controllerAs: 'teamLeadersDivision'
30005        };
30006    }
30007})();;
30008(function () {
30009    'use strict';
30010
30011    angular
30012        .module('app.directives')
30013        .controller('TeamHeadToHeadWidgetController', TeamHeadToHeadWidgetController);
30014
30015    TeamHeadToHeadWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', 'UrlService', 'DivisionService', 'StatisticService', '$translate', 'WebsiteEditorService', 'SolutionService', 'TeamService'];
30016
30017    function TeamHeadToHeadWidgetController($rootScope, $scope, $localStorage, urlService, divisionService, statisticService, $translate, websiteEditorService, solutionService, teamService) {
30018        var vm = this;
30019        vm.widget = angular.fromJson(widgets[$scope.widget]);
30020        vm.url = urlService;
30021        vm.options = {};
30022        vm.parameters = {};
30023        vm.teams = [];
30024        vm.teamsStats = [];
30025        vm.columns = [];
30026        vm.statList = [];
30027        vm.isMobile = false;
30028        Object.assign(vm, angular.fromJson(__team__));
30029
30030        //Component Mount
30031        for (var parameter in vm.widget.parameters) {
30032            switch (vm.widget.parameters[parameter].id) {
30033                case 'columnsDisplaySelect':
30034                    vm.parameters.columnsDisplaySelect = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
30035                    break;
30036            }
30037        }
30038
30039        vm.seasonId = $localStorage.solution.defaultSeasonId;
30040
30041        buildColumns();
30042
30043        // Listener
30044        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
30045            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
30046                .then(function () {
30047                    for (var parameter in vm.widget.parameters) {
30048                        switch (vm.widget.parameters[parameter].id) {
30049                            case 'columnsDisplaySelect':
30050                                vm.widget.parameters[parameter].value = data.columnsDisplaySelect;
30051                                vm.parameters.columnsDisplaySelect = angular.fromJson(data.columnsDisplaySelect.replace(/\'/g, '"'));
30052                                break;
30053                        }
30054                    }
30055                    widgets[$scope.widget] = angular.toJson(vm.widget);
30056                    buildColumns();
30057                })
30058                .catch(function (error) {
30059                    bugsnag.notify(error);
30060                });
30061        });
30062
30063        $scope.$on('$destroy', listener);
30064
30065        vm.getBackgroundStyle = function (i) {
30066            let style = {};
30067            if (i % 2 != 0) {
30068                style['background-color'] = '#f0f0f0';
30069                vm.isPair = false;
30070            }
30071            else {
30072                style['background-color'] = '#fff';
30073                vm.isPair = true;
30074            }
30075            return style;
30076        }
30077
30078        vm.showStat = function (column) {
30079            if (vm.isMobile && column.visibleMobile) {
30080                return true;
30081            } else if (!vm.isMobile && column.visibleDesktop) {
30082                return true;
30083            }
30084            return false;
30085        }
30086
30087        vm.filter = function (filter) {
30088            vm.seasonId = filter.season;
30089            vm.options.divisionId = filter.division;
30090            getTeams();
30091        };
30092
30093        vm.sort = function (column) {
30094            //Reset columns sort.
30095            _.forEach(vm.columns, function (_column) {
30096                
30097                if (_column.id !== column.id) {
30098                    _column.sort = '';
30099                    
30100                }
30101                if (_column.name !== column.name) {
30102                    _column.sort = '';
30103                }
30104            });
30105
30106            if (angular.isUndefined(column.sort)) {
30107                column.sort = 'asc';
30108            } else {
30109                // Toggle sort order.
30110                column.sort = column.sort === 'desc'
30111                    ? column.sort = 'asc'
30112                    : column.sort = 'desc';
30113            }
30114
30115            vm.teams = _.orderBy(vm.teams, function (team) {
30116                switch (column.id) {
30117                    case "":
30118                        return _.kebabCase(team.name);
30119                    default:
30120                        var statisticValue = vm.getStatisticValue(team , column.id)
30121                        return statisticValue.value;
30122                }
30123            }, [column.sort]);
30124        };
30125
30126        function getTeams() {
30127            vm.teams = [];
30128            teamService.getTeamsBySeasonId(__solutionId__, vm.seasonId)
30129                .then(function (response) {
30130                    _.forEach(response.data, function (team) {
30131                        if (team.id !== vm.id) {
30132                            if (team.divisionId == vm.options.divisionId || vm.options.divisionId == "divisions") {
30133                                vm.teams.push(team);                            
30134                            }
30135                        }
30136                    });
30137                    getStats();
30138                })
30139                .catch(function (error) {
30140                    bugsnag.notify(error);
30141                });
30142        }
30143
30144        function getStats() {
30145            vm.teamsStats = [];
30146            statisticService.getSummarizedTeamStatisticsBySolutionId(__solutionId__, vm.id, vm.seasonId)
30147                .then(function (response) {
30148                    vm.teamsStats = response.data;
30149                })
30150                .catch(function (error) {
30151                    bugsnag.notify(error);
30152                });
30153        }
30154
30155        vm.getStatisticValue = function (team, statisticId) {
30156            vm.statList = team.stats;
30157            var teamPlayedAgainst = _.find(vm.teamsStats, function (otherTeam) {
30158                return otherTeam.id === team.id;
30159            });
30160            if (teamPlayedAgainst) {
30161
30162                if (teamPlayedAgainst.stats.length > 0) {
30163                    var playerStat = _.find(teamPlayedAgainst.stats, function (statistic) {
30164                        return statistic.statTypeId === statisticId;
30165                    });
30166
30167                    if (playerStat) {
30168                        return { value: playerStat.displayValue, class: 'text-center' };
30169                    }
30170                }
30171            }
30172            return { value: '0', class: 'text-center' };
30173        }
30174
30175        function buildColumns() {
30176            vm.columns = [];
30177            _.forEach(vm.parameters.columnsDisplaySelect, function (col) {
30178                var stat = statisticService.getTeamStatisticByStatId(col.id);
30179                vm.columns.push({
30180                    id: col.id,
30181                    visibleDesktop: col.visibleDesktop,
30182                    visibleMobile: col.visibleMobile,
30183                    name: stat.name,
30184                    abbreviation: stat.abbreviation
30185                })
30186            });
30187            vm.columns.unshift({
30188                id: '',
30189                visibleDesktop: true,
30190                visibleMobile: true,
30191                abbreviation: $translate.instant('directives.widgets.team.headToHead.columns.team'),
30192                name: $translate.instant('directives.widgets.team.headToHead.columns.team')
30193            });
30194        }     
30195    }
30196})();
30197;
30198(function () {
30199    'use strict';
30200
30201    angular
30202        .module('app.directives')
30203        .directive('teamHeadToHead', teamHeadToHead);
30204
30205    teamHeadToHead.$inject = [];
30206
30207    function teamHeadToHead() {
30208        return {
30209            restrict: 'E',
30210            scope: {      
30211                widget: '=',
30212                season: '=',
30213                division: '=',
30214                parameters: '=',
30215                divisions: '='
30216            },
30217            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/team/head-to-head/team-head-to-head.tpl.html?version=1',
30218            controller: 'TeamHeadToHeadWidgetController',
30219            controllerAs: 'teamHeadToHead'
30220        };
30221    }
30222})();;
30223(function () {
30224    'use strict';
30225
30226    angular
30227        .module('app.directives')
30228        .controller('TeamListWidgetController', TeamListWidgetController);
30229
30230    TeamListWidgetController.$inject = ['$rootScope', '$timeout', '$scope', '$translate', '$localStorage', 'WebsiteEditorService', 'UrlService', 'TeamService', 'DivisionService', 'SeasonService'];
30231
30232    function TeamListWidgetController($rootScope, $timeout, $scope, $translate, $localStorage, websiteEditorService, urlService, teamService, divisionService, seasonService) {
30233        var vm = this;
30234
30235        // State variables definition ----------
30236        vm.widget = angular.fromJson(widgets[$scope.widget]);
30237        vm.defaultListEmpty = false;
30238        vm.initialDefaultListEmpty = false;
30239        vm.url = urlService;
30240        vm.page = 1;
30241        vm.pageSize = 12;
30242        vm.searchText = "";
30243        vm.divisionId = undefined;
30244        vm.seasonId = undefined;
30245        vm.results = [];
30246        vm.totalCount = 0;
30247        vm.isFirstCall = true;
30248        vm.defaultSeason = undefined;
30249        vm.embedSrc = `<iframe src="${location.origin}/?iframe=true&pageId=${location.pathname.substring(1)}" width="100%" height="950"></iframe>`;
30250        
30251        //Component mount.
30252        for (var parameter in vm.widget.parameters) {
30253            switch (vm.widget.parameters[parameter].id) {
30254                case 'defaultListEmpty':
30255                    vm.initialDefaultListEmpty = vm.widget.parameters[parameter].value === 'true';
30256                    vm.defaultListEmpty = vm.widget.parameters[parameter].value === 'true';
30257                    break;
30258            }
30259        }
30260
30261        // Listener
30262        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
30263            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
30264                .then(function () {
30265                    for (var parameter in vm.widget.parameters) {
30266                        switch (vm.widget.parameters[parameter].id) {
30267                            case 'defaultListEmpty':
30268                                vm.widget.parameters[parameter].value = data.defaultListEmpty.toString();
30269                                vm.defaultListEmpty = data.defaultListEmpty;
30270                                vm.initialDefaultListEmpty = data.defaultListEmpty;
30271                                break;
30272                        }
30273                    }
30274                    widgets[$scope.widget] = angular.toJson(vm.widget);
30275                    vm.page = 1;
30276                    vm.isFirstCall = true;
30277                    getTeams();
30278                })
30279                .catch(function (error) {
30280                    bugsnag.notify(error);
30281                });
30282        });
30283
30284        $scope.$on('$destroy', listener);
30285
30286        // State methods ----------
30287        vm.filter = function (filter) {
30288            vm.searchText = filter.searchText;
30289            vm.divisionId = filter.division;
30290            vm.seasonId = filter.season;
30291            vm.page = 1;
30292            getTeams();
30293        }
30294
30295        function getTeams() {
30296            if (vm.isFirstCall) {
30297                vm.defaultSeason = vm.seasonId;
30298                vm.isFirstCall = false;
30299            }
30300            
30301            if (!vm.searchText && vm.divisionId === 'divisions' && vm.seasonId == vm.defaultSeason && vm.initialDefaultListEmpty) {
30302                $timeout(function () {
30303                    vm.defaultListEmpty = true;
30304                });
30305            } else {
30306                var options = {
30307                    page: vm.page,
30308                    pageSize: vm.pageSize
30309                };
30310
30311                if (angular.isDefined(vm.searchText)) {
30312                    options.searchText = vm.searchText;
30313                }
30314
30315                if (angular.isDefined(vm.divisionId) && vm.divisionId !== "divisions" && vm.divisionId !== "general") {
30316                    options.divisionId = vm.divisionId;
30317                }
30318
30319                if (angular.isDefined(vm.seasonId)&& vm.seasonId !== "all") { 
30320                    options.seasonId = vm.seasonId;
30321                }
30322                teamService.getTeamsBySolutionIdWithOptions(__solutionId__, options)
30323                    .then(function (response) {
30324                        var teamsResult = [];
30325                        response.data.results.forEach(function (team) {
30326                            teamsResult.push({
30327                                Id: team.id,
30328                                Name: team.name,
30329                                Avatar: team.avatar,
30330                                Abbreviation: team.abbreviation,
30331                                Division: team.division
30332                            });
30333                        });
30334                        vm.results = teamsResult;
30335                        vm.totalCount = response.data.totalCount;
30336                        vm.defaultListEmpty = false;
30337                    })
30338                    .catch(function (error) {
30339                        bugsnag.notify(error);
30340                        vm.defaultListEmpty = false;
30341                    });
30342            }
30343        }
30344
30345        vm.clickPage = function (page) {
30346            vm.page = page;
30347            getTeams();
30348        };
30349
30350        vm.clickPrevious = function () {
30351            vm.page -= 1;
30352            getTeams();
30353        };
30354
30355        vm.clickNext = function () {
30356            vm.page += 1;
30357            getTeams();
30358        };
30359    }
30360})();
30361;
30362(function () {
30363    'use strict';
30364
30365    angular
30366        .module('app.directives')
30367        .directive('teamList', teamList);
30368
30369    teamList.$inject = [];
30370
30371    function teamList() {
30372        return {
30373            restrict: 'E',
30374            scope: {                
30375                widget: '='
30376            },
30377            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/team/list/team-list.tpl.html',
30378            controller: 'TeamListWidgetController',
30379            controllerAs: 'teamList'
30380        };
30381    }
30382})();;
30383(function () {
30384    'use strict';
30385
30386    angular
30387        .module('app.directives')
30388        .controller('TeamStandingsWidgetController', TeamStandingsWidgetController);
30389
30390    TeamStandingsWidgetController.$inject = ['$rootScope', '$scope', 'WebsiteEditorService'];
30391
30392    function TeamStandingsWidgetController($rootScope, $scope, websiteEditorService) {
30393        var vm = this;
30394
30395        //State variables
30396        vm.widget = angular.fromJson(widgets[$scope.widget]);        
30397        vm.embedSrc = `<iframe src="${location.origin}/?iframe=true&pageId=${location.pathname.substring(1)}" width="100%" height="800"></iframe>`;
30398        vm.parameters = {};
30399        vm.season = undefined;
30400        vm.division = undefined;
30401        vm.divisions = undefined;
30402        vm.container = undefined;
30403
30404        //Component mount.
30405        for (var parameter in vm.widget.parameters) {
30406            switch (vm.widget.parameters[parameter].id) {
30407                case 'columnsDisplaySelect':
30408                    vm.parameters.columnsDisplaySelect = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
30409                    break;
30410                
30411                case 'sortDirection':
30412                    vm.parameters.sortOrder = vm.widget.parameters[parameter].value;
30413                    break;
30414
30415                case 'sortStat':
30416                    vm.parameters.sortStatId = vm.widget.parameters[parameter].value;
30417                    break;
30418            }
30419        }
30420
30421        // Listener
30422        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
30423            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
30424                .then(function () {
30425                    for (var parameter in vm.widget.parameters) {
30426                        switch (vm.widget.parameters[parameter].id) {
30427                            case 'columnsDisplaySelect':
30428                                vm.widget.parameters[parameter].value = data.columnsDisplaySelect;
30429                                vm.parameters.columnsDisplaySelect = angular.fromJson(data.columnsDisplaySelect.replace(/\'/g, '"'));
30430                                break;
30431                            
30432                            case 'sortDirection':
30433                                vm.widget.parameters[parameter].value = data.sortDirection;
30434                                vm.parameters.sortOrder = data.sortDirection;
30435                                break;
30436            
30437                            case 'sortStat':
30438                                vm.widget.parameters[parameter].value = data.sortStat;
30439                                vm.parameters.sortStatId = data.sortStat;
30440                                break;
30441                        }
30442                    }
30443                    widgets[$scope.widget] = angular.toJson(vm.widget);
30444                })
30445                .catch(function (error) {
30446                    bugsnag.notify(error);
30447                });
30448        });
30449
30450        $scope.$on('$destroy', listener);
30451
30452        //State functions
30453        vm.filter = function (filter) {
30454            vm.divisions = filter.divisions;
30455            vm.division = filter.division;
30456            vm.season = filter.season;
30457            vm.container = filter.container;
30458        }
30459
30460    }
30461})();
30462;
30463(function () {
30464    'use strict';
30465
30466    angular
30467        .module('app.directives')
30468        .directive('teamStandings', teamStandings);
30469
30470    teamStandings.$inject = [];
30471
30472    function teamStandings() {
30473        return {
30474            restrict: 'E',
30475            scope: {                
30476                widget: '='
30477            },
30478            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/team/standings/team-standings.tpl.html',
30479            controller: 'TeamStandingsWidgetController',
30480            controllerAs: 'teamStandings'
30481        };
30482    }
30483})();;
30484(function () {
30485    'use strict';
30486
30487    angular
30488        .module('app.directives')
30489        .controller('TeamStandingsTableWidgetController', TeamStandingsTableWidgetController);
30490
30491    TeamStandingsTableWidgetController.$inject = ['$scope', '$window', '$localStorage', 'UrlService', 'StatisticService'];
30492
30493    function TeamStandingsTableWidgetController($scope, $window, $localStorage, urlService, statisticService) {
30494        var vm = this;
30495
30496        //State variables
30497        vm.url = urlService;
30498        vm.options = {
30499            page: 1,
30500            pageSize: 10000,
30501            sortStatId: null,
30502            sortOrder: null,
30503            automatedStats: false,
30504            seasonId: $localStorage.solution.defaultSeasonId.toString()
30505        };
30506        vm.columns = [];
30507        vm.divisionsToShow = undefined;
30508
30509        //Component mount.
30510        buildColumns($scope.parameters.columnsDisplaySelect);
30511        vm.options.sortOrder = $scope.parameters.sortOrder;
30512        vm.options.sortStatId = $scope.parameters.sortStatId;
30513        formatColumns();
30514
30515        // Listener
30516        $scope.$watch('parameters', function () {
30517            buildColumns($scope.parameters.columnsDisplaySelect);
30518            vm.options.sortOrder = $scope.parameters.sortOrder;
30519            vm.options.sortStatId = $scope.parameters.sortStatId;
30520            formatColumns();
30521            getStatistics();
30522        }, true);
30523
30524        $scope.$watch('[season, division]', function () {
30525            vm.options.seasonId = $scope.season;
30526            getStatistics();
30527        })
30528
30529        vm.sort = function (column) {
30530            // Reset columns sort.
30531            _.forEach(vm.columns, function (_column) {
30532                if (_column.id !== column.id) {
30533                    _column.sort = '';
30534                }
30535            });
30536
30537            if (angular.isUndefined(column.sort)) {
30538                column.sort = 'desc';
30539            } else {
30540                // Toggle sort order.
30541                column.sort = column.sort === 'desc'
30542                    ? column.sort = 'asc'
30543                    : column.sort = 'desc';
30544            }
30545
30546            // Get the statistics order by column selected.
30547            vm.options.sortStatId = column.id;
30548            vm.options.sortOrder = column.sort;
30549            getStatistics();
30550        };
30551
30552        vm.getStatisticValue = function (team, statisticId) {
30553            try {
30554                return _.find(team.stats, function (statistic) {
30555                    return statistic.statTypeId === statisticId;
30556                }).displayValue;
30557            }
30558            catch (error) {
30559                return 0;
30560            }
30561        };
30562
30563        vm.showStat = function (column) {            
30564            if (isMobile() && column.visibleMobile) {
30565                return true;
30566            } else if (!isMobile() && column.visibleDesktop) {
30567                return true;
30568            }
30569            return false;
30570        }
30571
30572        //Functions
30573        function formatColumns() {
30574            vm.columns.forEach(function (col) {
30575                if (col.id == vm.options.sortStatId) {
30576                    col.sort = vm.options.sortOrder;
30577                }
30578            })
30579        }
30580
30581        function buildColumns(columnsToDisplay) {
30582            vm.columns = [];
30583            columnsToDisplay.forEach(function (col) {
30584                var stat = statisticService.getTeamStatisticByStatId(col.id);
30585                vm.columns.push({
30586                    id: col.id,
30587                    visibleDesktop: col.visibleDesktop,
30588                    visibleMobile: col.visibleMobile,
30589                    name: stat.name,
30590                    abbreviation: stat.abbreviation
30591                })
30592            });
30593        }
30594
30595        function formatDivisionsToShow() {
30596            vm.divisionsToShow = [];
30597
30598            if ($scope.division === 'container') {
30599                const newdivisions = [];
30600                var seasons = null;
30601                _.forEach($scope.divisions, function (division) {
30602                    if (division.Id === 'general') {
30603                        seasons = _.groupBy(division.teams, 'seasonId');
30604                    }
30605                });
30606                _.forEach(seasons, function (season) {
30607                    var division = {};
30608                    division.id = season[0].id;
30609                    division.Name = season[0].seasonName;
30610                    division.teams = season;
30611                    newdivisions.push(division);
30612                });
30613                vm.divisionsToShow = newdivisions;
30614            }
30615            else if ($scope.division === 'general') {
30616                _.forEach($scope.divisions, function (division) {
30617                    if (division.Id === 'general') {
30618                        vm.divisionsToShow = [division];
30619                    }
30620                });
30621            } else {
30622                const newdivisions = [];
30623                _.forEach($scope.divisions, function (division) {
30624                    if (division.Id != 'general' && division.Id != 'divisions') {
30625                        if (!division.ParentId && $scope.division === 'divisions' || $scope.division == division.Id) {
30626                            newdivisions.push(division);
30627                        }
30628                    }
30629                });
30630                _.forEach(newdivisions, function (newdivision) {
30631                    newdivision.divisions = [];
30632                    _.forEach($scope.divisions, function (division) {
30633                        if (division.ParentId && division.ParentId === newdivision.Id) {
30634                            newdivision.divisions.push(division);
30635                        }
30636                    });
30637                });
30638                vm.divisionsToShow = newdivisions;
30639            }
30640        }
30641
30642        function getStatistics() {
30643            if ($scope.season === 'all') {
30644                vm.options.masterSeasonId = $scope.container;
30645                vm.options.seasonId = 0;
30646                $scope.division = 'container'
30647            }
30648
30649            // TODO Should be by season Id
30650            if ($scope.season) {
30651                statisticService.getTeamStatisticsBySolutionId(__solutionId__, vm.options)
30652                    .then(function (response) {
30653                        vm.teams = response.data.results;
30654                        // Fill divisions with teams.
30655                        _.forEach($scope.divisions, function (division) {
30656                            division.divisions = [];
30657                            division.teams = [];
30658                            _.forEach(vm.teams, function (team) {
30659                                if (team.divisionId === division.Id || division.Id === 'general') {
30660                                    division.teams.push(team);
30661                                }
30662                            })
30663
30664                            var parentDivision = _.find($scope.divisions, { Id: division.ParentId });
30665                            if (parentDivision) {
30666                                parentDivision.divisions.push(division);
30667                            }
30668
30669                        });
30670
30671                        formatDivisionsToShow();
30672                    })
30673                    .catch(function (error) {
30674                        bugsnag.notify(error);
30675                    });
30676            }
30677        }
30678
30679        function isMobile() {
30680            return $window.innerWidth <= 600;
30681        }
30682    }
30683})();
30684;
30685(function () {
30686    'use strict';
30687
30688    angular
30689        .module('app.directives')
30690        .directive('teamStandingsTable', teamStandingsTable)
30691
30692    teamStandingsTable.$inject = [];
30693
30694    function teamStandingsTable() {
30695        return {
30696            restrict: 'E',
30697            scope: {
30698                container: '=',
30699                season: '=',
30700                division: '=',
30701                parameters: '=',
30702                divisions: '='
30703            },
30704            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/team/standings/table/team-standings-table.tpl.html?version=1',
30705            controller: 'TeamStandingsTableWidgetController',
30706            controllerAs: 'teamStandingsTable'
30707        };
30708    }
30709})();;
30710(function () {
30711    'use strict';
30712
30713    angular
30714        .module('app.directives')
30715        .controller('TeamStandingsDivisionWidgetController', TeamStandingsDivisionWidgetController);
30716
30717    TeamStandingsDivisionWidgetController.$inject = ['$rootScope', '$scope', 'UrlService'];
30718
30719    function TeamStandingsDivisionWidgetController($rootScope, $scope, urlService) {
30720        var vm = this;
30721
30722        vm.url = urlService;
30723    }
30724})();
30725;
30726(function () {
30727    'use strict';
30728
30729    angular
30730        .module('app.directives')
30731        .directive('teamStandingsDivision', teamStandingsDivision);
30732
30733    teamStandingsDivision.$inject = [];
30734
30735    function teamStandingsDivision() {
30736        return {
30737            restrict: 'E',
30738            scope: {       
30739                divisions: '=',
30740                columns: '=',
30741                sort: '=',
30742                getStatisticValue: '=',
30743                showStat: '=',
30744                level: '='
30745            },
30746            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/team/standings/division/team-standings-division.tpl.html',
30747            controller: 'TeamStandingsDivisionWidgetController',
30748            controllerAs: 'teamStandingsDivision'
30749        };
30750    }
30751})();;
30752(function () {
30753    'use strict';
30754
30755    angular
30756        .module('app.directives')
30757        .controller('TeamStandingsMultipleSeasonsWidgetController', TeamStandingsMultipleSeasonsWidgetController);
30758
30759    TeamStandingsMultipleSeasonsWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$window', '$translate', 'StatisticService', 'DivisionService', 'WebsiteEditorService'];
30760
30761    function TeamStandingsMultipleSeasonsWidgetController($rootScope, $scope, $localStorage, $window, $translate, statisticService, divisionService, websiteEditorService) {
30762        var vm = this;
30763
30764        //State variables
30765        vm.widget = angular.fromJson(widgets[$scope.widget]);
30766
30767        vm.options = {
30768            sortStatId: 15,
30769            sortOrder: 'DESC',
30770            block: 'current'
30771        };
30772       
30773        //Component mount.
30774        for (var parameter in vm.widget.parameters) {
30775            switch (vm.widget.parameters[parameter].id) {
30776                case 'sortDirection':
30777                    vm.options.sortOrder = vm.widget.parameters[parameter].value;
30778                    break;
30779
30780                case 'sortStat':
30781                    vm.options.sortStatId = vm.widget.parameters[parameter].value;
30782                    break;
30783
30784                case 'sortBlock':
30785                    vm.options.block = vm.widget.parameters[parameter].value;
30786                    break;
30787
30788                case 'secondBlock':
30789                    vm.secondBlock = vm.widget.parameters[parameter].value === 'true';
30790                    break;
30791
30792                case 'thirdBlock':
30793                    vm.thirdBlock = vm.widget.parameters[parameter].value === 'true';
30794                    break;
30795
30796                case 'nameBlock1':
30797                    vm.nameBlock1 = vm.widget.parameters[parameter].value;
30798                    break;
30799
30800                case 'nameBlock1fr':
30801                    vm.nameBlock1fr = vm.widget.parameters[parameter].value;
30802                    break;
30803
30804                case 'seasonsBlock1':
30805                    vm.seasonsBlock1 = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
30806                    break;
30807
30808                case "tieBreakersBlock1":
30809                    vm.tieBreakersBlock1 = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
30810                    break;
30811
30812                case 'columnsDisplaySelectBlock1':
30813                    vm.columnsDisplaySelectBlock1 = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
30814                    break;
30815
30816                case 'nameBlock2':
30817                    vm.nameBlock2 = vm.widget.parameters[parameter].value;
30818                    break;
30819
30820                case 'nameBlock2fr':
30821                    vm.nameBlock2fr = vm.widget.parameters[parameter].value;
30822                    break;
30823
30824                case 'seasonsBlock2':
30825                    vm.seasonsBlock2 = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));;
30826                    break;
30827
30828                case "tieBreakersBlock2":
30829                    vm.tieBreakersBlock2 = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
30830                    break;
30831
30832                case 'columnsDisplaySelectBlock2':
30833                    vm.columnsDisplaySelectBlock2 = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
30834                    break;
30835
30836                case 'nameBlock3':
30837                    vm.nameBlock3 = vm.widget.parameters[parameter].value;
30838                    break;
30839
30840                case 'nameBlock3fr':
30841                    vm.nameBlock3fr = vm.widget.parameters[parameter].value;
30842                    break;
30843
30844                case "tieBreakersBlock3":
30845                    vm.tieBreakersBlock3 = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
30846                    break;
30847
30848                case 'columnsDisplaySelectBlock3':
30849                    vm.columnsDisplaySelectBlock3 = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
30850                    break;
30851            }
30852        }
30853
30854        // Listener
30855        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
30856            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
30857                .then(function () {
30858                    for (var parameter in vm.widget.parameters) {
30859                        switch (vm.widget.parameters[parameter].id) {
30860
30861                            case 'sortDirection':
30862                                vm.widget.parameters[parameter].value = data.sortDirection;
30863                                vm.options.sortOrder = data.sortDirection;
30864                                break;
30865
30866                            case 'sortStat':
30867                                vm.widget.parameters[parameter].value = data.sortStat;
30868                                vm.options.sortStatId = data.sortStat;
30869                                break;
30870
30871                            case 'sortBlock':
30872                                vm.widget.parameters[parameter].value = data.sortBlock;
30873                                vm.options.block = data.sortBlock;
30874                                break;
30875
30876                            case 'secondBlock':
30877                                vm.widget.parameters[parameter].value = data.secondBlock.toString();
30878                                vm.secondBlock = data.secondBlock;
30879                                break;
30880
30881                            case 'thirdBlock':
30882                                vm.widget.parameters[parameter].value = data.thirdBlock.toString();
30883                                vm.thirdBlock = data.thirdBlock;
30884                                break;
30885
30886                            case 'nameBlock1':
30887                                vm.widget.parameters[parameter].value = data.nameBlock1;
30888                                vm.nameBlock1 = data.nameBlock1;
30889                                break;
30890
30891                            case 'nameBlock1fr':
30892                                vm.widget.parameters[parameter].value = data.nameBlock1fr;
30893                                vm.nameBlock1fr = data.nameBlock1fr;
30894                                break;
30895
30896                            case 'seasonsBlock1':
30897                                vm.widget.parameters[parameter].value = data.seasonsBlock1;
30898                                vm.seasonsBlock1 = angular.fromJson(data.seasonsBlock1.replace(/\'/g, '"'));
30899                                break;
30900
30901                            case 'tieBreakersBlock1':
30902                                vm.widget.parameters[parameter].value = data.tieBreakersBlock1;
30903                                vm.tieBreakersBlock1 = angular.fromJson(data.tieBreakersBlock1.replace(/\'/g, '"'));
30904                                break;
30905
30906                            case 'columnsDisplaySelectBlock1':
30907                                vm.widget.parameters[parameter].value = data.columnsDisplaySelectBlock1;
30908                                vm.columnsDisplaySelectBlock1 = angular.fromJson(data.columnsDisplaySelectBlock1.replace(/\'/g, '"'));
30909                                break;
30910
30911                            case 'nameBlock2':
30912                                vm.widget.parameters[parameter].value = data.nameBlock2;
30913                                vm.nameBlock2 = data.nameBlock2;
30914                                break;
30915
30916                            case 'nameBlock2fr':
30917                                vm.widget.parameters[parameter].value = data.nameBlock2fr;
30918                                vm.nameBlock2fr = data.nameBlock2fr;
30919                                break;
30920
30921                            case 'seasonsBlock2':
30922                                vm.widget.parameters[parameter].value = data.seasonsBlock2;
30923                                vm.seasonsBlock2 = angular.fromJson(data.seasonsBlock2.replace(/\'/g, '"'));
30924                                break;
30925
30926                            case 'tieBreakersBlock2':
30927                                vm.widget.parameters[parameter].value = data.tieBreakersBlock2;
30928                                vm.tieBreakersBlock2 = angular.fromJson(data.tieBreakersBlock2.replace(/\'/g, '"'));
30929                                break;
30930
30931                            case 'columnsDisplaySelectBlock2':
30932                                vm.widget.parameters[parameter].value = data.columnsDisplaySelectBlock2;
30933                                vm.columnsDisplaySelectBlock2 = angular.fromJson(data.columnsDisplaySelectBlock2.replace(/\'/g, '"'));
30934                                break;
30935
30936                            case 'nameBlock3':
30937                                vm.widget.parameters[parameter].value = data.nameBlock3;
30938                                vm.nameBlock3 = data.nameBlock3;
30939                                break;
30940
30941                            case 'nameBlock3fr':
30942                                vm.widget.parameters[parameter].value = data.nameBlock3fr;
30943                                vm.nameBlock3fr = data.nameBlock3fr;
30944                                break;
30945
30946                            case 'tieBreakersBlock3':
30947                                vm.widget.parameters[parameter].value = data.tieBreakersBlock3;
30948                                vm.tieBreakersBlock3 = angular.fromJson(data.tieBreakersBlock3.replace(/\'/g, '"'));
30949                                break;
30950
30951                            case 'columnsDisplaySelectBlock3':
30952                                vm.widget.parameters[parameter].value = data.columnsDisplaySelectBlock3;
30953                                vm.columnsDisplaySelectBlock3 = angular.fromJson(data.columnsDisplaySelectBlock3.replace(/\'/g, '"'));
30954                                break;
30955                            
30956                        }
30957                    }
30958
30959                    vm.columns = buildColumns(vm.columnsDisplaySelectBlock1);
30960                    vm.columnsMultiSeasons = buildColumns(vm.columnsDisplaySelectBlock2);
30961                    vm.columnsTotal = buildColumns(vm.columnsDisplaySelectBlock3);
30962
30963                    formatColumns();
30964                    getStatistics();
30965                    widgets[$scope.widget] = angular.toJson(vm.widget);
30966                })
30967                .catch(function (error) {
30968                    bugsnag.notify(error);
30969                });
30970        });
30971
30972        vm.columns = [];
30973        vm.divisionsToShow = undefined;
30974
30975        //Component mount.
30976        vm.columns = buildColumns(vm.columnsDisplaySelectBlock1);
30977        vm.columnsMultiSeasons = buildColumns(vm.columnsDisplaySelectBlock2);
30978        vm.columnsTotal = buildColumns(vm.columnsDisplaySelectBlock3);
30979
30980        formatColumns();
30981        
30982        vm.sort = function (column, block) {
30983            // Reset columns sort.
30984            _.forEach(vm.columns, function (_column) {
30985                if (_column.id !== column.id) {
30986                    _column.sort = '';
30987                }
30988            });
30989            _.forEach(vm.columnsMultiSeasons, function (_column) {
30990                if (_column.id !== column.id) {
30991                    _column.sort = '';
30992                }
30993            });
30994            _.forEach(vm.columnsTotal, function (_column) {
30995                if (_column.id !== column.id) {
30996                    _column.sort = '';
30997                }
30998            });
30999
31000            if (angular.isUndefined(column.sort)) {
31001                column.sort = 'desc';
31002            } else {
31003                // Toggle sort order.
31004                column.sort = column.sort === 'desc'
31005                    ? column.sort = 'asc'
31006                    : column.sort = 'desc';
31007            }
31008
31009            // Get the statistics order by column selected.
31010            vm.options.sortStatId = column.id;
31011            vm.options.sortOrder = column.sort;
31012            vm.options.block = block;
31013            
31014            getStatistics();
31015        };
31016
31017        vm.getLabel = function (block) {
31018            var language = $translate.use();
31019            var propertyName = `nameBlock${block}`;
31020            if (language.contains('fr')) {
31021                propertyName += 'fr';
31022            }
31023
31024            return vm[propertyName];
31025		}
31026
31027        vm.getStatisticValue = function (team, statisticId, block )   {
31028            try {
31029                var array = team.currentStats;
31030                if (block == 'multiSeason') {
31031                    array = team.mutliSeasonStats;
31032                }
31033                else if (block == 'total') {
31034                    array = team.totalStats;
31035                }
31036
31037                return _.find(array, function (statistic) {
31038                    return statistic.statTypeId === statisticId;
31039                }).displayValue;
31040            }
31041            catch (error) {
31042                return 0;
31043            }
31044        };
31045
31046        vm.showStat = function (column) {
31047            if (isMobile() && column.visibleMobile) {
31048                return true;
31049            } else if (!isMobile() && column.visibleDesktop) {
31050                return true;
31051            }
31052            return false;
31053        }
31054
31055        //Functions
31056        function formatColumns() {
31057            var columns = [];
31058            switch (vm.options.block) {
31059                case 'current':
31060                    columns = vm.columns;
31061                    break;
31062                case 'multiSeason':
31063                    columns = vm.columnsMultiSeasons;
31064                    break;
31065                case 'total':
31066                    columns = vm.columnsTotal;
31067			}
31068            
31069            columns.forEach(function (col) {
31070                if (col.id == vm.options.sortStatId) {
31071                    col.sort = vm.options.sortOrder;
31072                }
31073            })
31074            
31075        }
31076
31077        function buildColumns(columnsToDisplay) {
31078            var columns = [];
31079            columnsToDisplay.forEach(function (col) {
31080                var stat = statisticService.getTeamStatisticByStatId(col.id);
31081                columns.push({
31082                    id: col.id,
31083                    visibleDesktop: col.visibleDesktop,
31084                    visibleMobile: col.visibleMobile,
31085                    name: stat.name,
31086                    abbreviation: stat.abbreviation
31087                })
31088            });
31089
31090            return columns;
31091        }
31092
31093        function formatDivisionsToShow() {
31094            vm.divisionsToShow = [];
31095            if (vm.divisions.length > 1) {
31096                const newdivisions = [];
31097                _.forEach(vm.divisions, function (division) {
31098                    if (division.id != 'general' && division.id != 'divisions') {
31099                        if (!division.parentId) {
31100                            newdivisions.push(division);
31101                        }
31102                    }
31103                });
31104                _.forEach(newdivisions, function (newdivision) {
31105                    newdivision.divisions = [];
31106                    _.forEach(vm.divisions, function (division) {
31107                        if (division.parentId && division.parentId === newdivision.id) {
31108                            newdivision.divisions.push(division);
31109                        }
31110                    });
31111                });
31112                vm.divisionsToShow = newdivisions;
31113            }
31114            else {
31115                _.forEach(vm.divisions, function (division) {
31116                    if (division.id === 'general') {
31117                        vm.divisionsToShow = [division];
31118                    }
31119                });
31120			}
31121        }
31122
31123        getStatistics();
31124        function getStatistics() {
31125            if ($scope.season === 'all') {
31126                vm.options.masterSeasonId = $scope.container;
31127                vm.options.seasonId = 0;
31128                $scope.division = 'container'
31129            }
31130
31131            var leaderboardSettings = {};
31132            leaderboardSettings.bloc = vm.options.block ;
31133            leaderboardSettings.currentSeasonList = vm.seasonsBlock1 || [];
31134            leaderboardSettings.multiSeasonList = vm.seasonsBlock2 || [];
31135
31136            switch (leaderboardSettings.bloc) {
31137                case 'current':
31138                    leaderboardSettings.tieBreakersStats = vm.tieBreakersBlock1;
31139                    break;
31140                case 'multiSeason':
31141                    leaderboardSettings.tieBreakersStats = vm.tieBreakersBlock2;
31142                    break;
31143                case 'total':
31144                    leaderboardSettings.tieBreakersStats = vm.tieBreakersBlock3;
31145                    break;            
31146            }
31147
31148            var order = 2;
31149            leaderboardSettings.tieBreakersStats.forEach(function (tieBreakerStat) {
31150                tieBreakerStat.order = order++;
31151            })
31152
31153            if (vm.seasonsBlock1.length > 0 && (vm.seasonsBlock2.length > 0 || !vm.showPast)) {
31154
31155                statisticService.getTeamLeadersBySolutionId(__solutionId__, leaderboardSettings, vm.options)
31156                    .then(function (response) {
31157                        vm.teams = response.data.teamLeader;
31158                        vm.divisions = [
31159                            { id: 'general', name: $translate.instant('directives.widgets.team.standings.labels.general') },
31160                        ];
31161                        vm.divisions = vm.divisions.concat(response.data.divisions);
31162
31163                        // Fill divisions with teams.
31164                        _.forEach(vm.divisions, function (division) {
31165                            division.divisions = [];
31166                            division.teams = [];
31167                            _.forEach(vm.teams, function (team) {
31168                                if (team.divisionId === division.id || division.id === 'general') {
31169                                    division.teams.push(team);
31170                                }
31171                            })
31172
31173                            var parentDivision = _.find(vm.divisions, { id: division.parentId });
31174                            if (parentDivision) {
31175                                parentDivision.divisions.push(division);
31176                            }
31177                        });
31178
31179                        formatDivisionsToShow();
31180                    })
31181                    .catch(function (error) {
31182                        bugsnag.notify(error);
31183                    });
31184                /*}*/
31185            }
31186        }
31187
31188        function isMobile() {
31189            return $window.innerWidth <= 600;
31190        }
31191
31192
31193        $scope.$on('$destroy', listener);
31194
31195    }
31196})();
31197;
31198(function () {
31199    'use strict';
31200
31201    angular
31202        .module('app.directives')
31203        .directive('teamStandingsMultipleSeasons', teamStandingsMultipleSeasons);
31204
31205    teamStandingsMultipleSeasons.$inject = [];
31206
31207    function teamStandingsMultipleSeasons() {
31208        return {
31209            restrict: 'E',
31210            scope: {                
31211                widget: '='
31212            },
31213            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/team/standings-multiple-seasons/team-standings-multiple-seasons.tpl.html',
31214            controller: 'TeamStandingsMultipleSeasonsWidgetController',
31215            controllerAs: 'teamStandingsMultipleSeasons'
31216        };
31217    }
31218})();;
31219(function () {
31220    'use strict';
31221
31222    angular
31223        .module('app.directives')
31224        .controller('TeamStandingsMultipleSeasonsDivisionWidgetController', TeamStandingsMultipleSeasonsDivisionWidgetController);
31225
31226    TeamStandingsMultipleSeasonsDivisionWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', 'UrlService'];
31227
31228    function TeamStandingsMultipleSeasonsDivisionWidgetController($rootScope, $scope, $localStorage, urlService) {
31229        var vm = this;
31230        //State variables
31231        vm.url = urlService;
31232        
31233        vm.columnsLength = function(columns) {
31234            return columns.filter(function (column) { return $scope.showStat(column) }).length;
31235		}
31236    }
31237})();
31238;
31239(function () {
31240    'use strict';
31241
31242    angular
31243        .module('app.directives')
31244        .directive('teamStandingsMultipleSeasonsDivision', teamStandingsMultipleSeasonsDivision);
31245
31246    teamStandingsMultipleSeasonsDivision.$inject = [];
31247
31248    function teamStandingsMultipleSeasonsDivision() {
31249        return {
31250            restrict: 'E',
31251            scope: {       
31252                divisions: '=',
31253                columns: '=',
31254                columnsMultiSeasons: '=',
31255                columnsTotal: '=',
31256                seasonLabel: '=',
31257                multiSeasonsLabel: '=',
31258                totalLabel: '=',
31259                sort: '=',
31260                getStatisticValue: '=',
31261                showStat: '=',
31262                level: '=',
31263                seasonId: '=',
31264                showTotal: '=',
31265                showPast: '='
31266            },
31267            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/team/standings-multiple-seasons/division/team-standings-multiple-seasons-division.tpl.html',
31268            controller: 'TeamStandingsMultipleSeasonsDivisionWidgetController',
31269            controllerAs: 'teamStandingsMultipleSeasonsDivision'
31270        };
31271    }
31272})();;
31273(function () {
31274    'use strict';
31275
31276    angular
31277        .module('app.directives')
31278        .controller('VideoListWidgetController', VideoListWidgetController);
31279
31280    VideoListWidgetController.$inject = ['$rootScope', '$scope', 'WebsiteEditorService', 'UrlService', 'VideoService'];
31281
31282    function VideoListWidgetController($rootScope, $scope, websiteEditorService, urlService, videoService) {
31283        var vm = this;
31284        vm.url = urlService;
31285        
31286        // Apply website values to view model object.
31287        vm.widget = angular.fromJson(widgets[$scope.widget]);
31288
31289        Object.assign(vm, { 
31290            all: {
31291                currentPage: 1, 
31292                pageSize: parseInt(vm.widget.parameters[0].value), // TODO Create global method to get parameter by name.
31293                totalCount: 0, 
31294                results: [],
31295                clickPage: clickPage,
31296                clickPrevious: clickPrevious,
31297                clickNext: clickNext
31298            }
31299        });        
31300
31301        // Triggered when parameters are changed.
31302        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function(event, data) {
31303            /*websiteEditorService.updatePage(__solutionId__, __pageId__, page, { uuid: vm.widget.uuid, parameters: data })
31304                .then(function(response) {
31305                    // Update the news feed.
31306                    getLatestNews(parseInt(data["nbNewsDisplayed"]));
31307
31308                    // Update widget variable.
31309                    // TODO Improve mechanism.
31310                    vm.widget.parameters[0].value = parseInt(data["nbNewsDisplayed"]);
31311                    widgets[$scope.widget] = angular.toJson(vm.widget);
31312                }) 
31313                .catch(function(error) {
31314                    bugsnag.notify(error);
31315                });*/
31316        });
31317
31318        $scope.$on('$destroy', listener);
31319
31320        // Load the latest news.
31321        getVideos(parseInt(vm.widget.parameters[0].value)); 
31322
31323        function getVideos() {
31324            videoService.getVideosBySolutionId(__solutionId__, { page: vm.all.currentPage, pageSize: vm.all.pageSize })
31325                .then(function(response) {                                      
31326                    vm.all.results = response.data.Results; // All videos.
31327                    vm.all.totalCount = response.data.TotalCount;
31328                })
31329                .catch(function(error) {
31330                    bugsnag.notify(error);
31331                });            
31332        }
31333
31334        function clickPrevious() {
31335            vm.all.currentPage -= 1;
31336
31337            // Get videos for the selected page.
31338            getVideos();
31339        }
31340
31341        function clickNext() {
31342            vm.all.currentPage += 1;
31343
31344            // Get videos for the selected page.
31345            getVideos();
31346        }
31347
31348        function clickPage(page) {
31349            vm.all.currentPage = page;
31350
31351            // Get videos for the selected page.
31352            getVideos();
31353        }
31354    }
31355})();
31356;
31357(function () {
31358    'use strict';
31359
31360    angular
31361        .module('app.directives')
31362        .directive('videoList', videoList);
31363
31364    videoList.$inject = [];
31365
31366    function videoList() {
31367        return {
31368            restrict: 'E',
31369            scope: {                
31370                widget: '='
31371            },
31372            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/video/list/video-list.tpl.html',
31373            controller: 'VideoListWidgetController',
31374            controllerAs: 'videos'
31375        };
31376    }
31377})();;
31378(function () {
31379    'use strict';
31380
31381    angular
31382        .module('app.directives')
31383        .controller('VideoPlayerWidgetController', VideoPlayerWidgetController);
31384
31385    VideoPlayerWidgetController.$inject = ['$scope'];
31386
31387    function VideoPlayerWidgetController($scope) {
31388        var vm = this;
31389        
31390        // Apply website values to view model object.
31391        vm.widget = angular.fromJson(widgets[$scope.widget]);
31392        
31393        Object.assign(vm, angular.fromJson(__video__
31394                                            .replace(/[\n\r]+/g, ' ')
31395                                            .replace(/\s{2,}/g,' ')
31396                                            .replace(/^\s+|\s+$/,''))); 
31397    }
31398})();
31399;
31400(function () {
31401    'use strict';
31402
31403    angular
31404        .module('app.directives')
31405        .directive('videoPlayer', videoPlayer);
31406
31407    videoPlayer.$inject = ['UrlService'];
31408
31409    function videoPlayer(urlService) {
31410        return {
31411            restrict: 'E',
31412            scope: {                
31413                widget: '='
31414            },
31415            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/video/player/video-player.tpl.html',
31416            controller: 'VideoPlayerWidgetController',
31417            controllerAs: 'video',
31418            link: function (scope, element, attribute, controller) {
31419                var vm = controller;
31420                var videoPlayer = $('.video');
31421
31422                // Calculate the size (with 16:9 ratio).
31423                vm.width = videoPlayer.width();
31424                vm.height = vm.width * (9 / 16);
31425
31426                // Load embed video player.
31427                loadEmbedVideo();
31428
31429                function loadEmbedVideo() {
31430                    var videoId = urlService.parseVideoUrl(vm.url);
31431        
31432                    if ((vm.url.toLowerCase().indexOf('youtube') !== -1) || (vm.url.toLowerCase().indexOf('youtu.be') !== -1)) {
31433                        videoPlayer.prepend(`<iframe src="//www.youtube.com/embed/${videoId}" width="${vm.width}" height="${vm.height}" frameborder="0" allowfullscreen></iframe>`);        
31434                    } /*else if (url.toLowerCase().indexOf('vimeo') != -1) {
31435                        return String.format('<iframe id="videoPlayer" src="//player.vimeo.com/video/{0}?portrait=0" width="{1}" height="{2}" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>', Utilities.parseVideoUrl(url), width, height);
31436        
31437                    } else if (url.toLowerCase().indexOf('dailymotion') != -1) {
31438                        return String.format('<iframe id="videoPlayer" src="//www.dailymotion.com/embed/video/{0}" width="{1}" height="{2}" frameborder="0"></iframe>', Utilities.parseVideoUrl(url), width, height);
31439        
31440                    } else if ((url.toLowerCase().indexOf('kreezee') != -1) || 
31441                        (url.toLowerCase().indexOf('localhost') != -1)) {
31442                        return String.format('<iframe id="videoPlayer" src="/embed/{0}" width="{1}" height="{2}" frameborder="0"></iframe>', videoId, width, height);
31443                    } else {
31444                        return '';
31445                    }*/
31446                }
31447            }
31448        };
31449    }
31450})();;
31451(function () {
31452    'use strict';
31453
31454    angular
31455        .module('app.directives')
31456        .controller('VideoWidgetWidgetController', VideoWidgetWidgetController);
31457
31458    VideoWidgetWidgetController.$inject = ['$scope', '$rootScope', '$sce', 'WebsiteEditorService'];
31459
31460    function VideoWidgetWidgetController($scope, $rootScope, $sce, websiteEditorService) {
31461        var vm = this;
31462
31463        // Apply website values to view model object.
31464        vm.widget = angular.fromJson(widgets[$scope.widget]);
31465        vm.title = "";
31466        vm.showTitle = false;
31467        vm.link = "";
31468        vm.autoplay = false;
31469        vm.widgetTransparency = false;
31470
31471        for (var parameter in vm.widget.parameters) {
31472            switch (vm.widget.parameters[parameter].id) {
31473                case 'title':
31474                    vm.title = vm.widget.parameters[parameter].value;
31475                    break;
31476
31477                case 'showTitle':
31478                    vm.showTitle = vm.widget.parameters[parameter].value === 'true';
31479                    break;
31480
31481                case 'link':
31482                    vm.link = vm.widget.parameters[parameter].value;
31483                    break;
31484
31485                case 'autoplay':
31486                    vm.autoplay = vm.widget.parameters[parameter].value === 'true';
31487                    break;
31488
31489                case 'widgetTransparency':
31490                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
31491                    break;
31492            }
31493        }
31494
31495        vm.link = extractYoutubeLink(vm.link);
31496
31497        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
31498            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
31499                .then(function (response) {
31500                    for (var parameter in vm.widget.parameters) {
31501                        switch (vm.widget.parameters[parameter].id) {
31502                            case 'title':
31503                                vm.widget.parameters[parameter].value = data.title;
31504                                vm.title = data.title;
31505                                break;
31506
31507                            case 'showTitle':
31508                                vm.widget.parameters[parameter].value = data.showTitle.toString();
31509                                vm.showTitle = data.showTitle;
31510                                break;
31511
31512                            case 'link':
31513                                vm.widget.parameters[parameter].value = data.link;
31514                                vm.link = data.link;
31515                                break;
31516
31517                            case 'autoplay':
31518                                vm.widget.parameters[parameter].value = data.autoplay.toString();
31519                                vm.autoplay = data.autoplay;
31520                                break;
31521                                
31522                            case 'widgetTransparency':
31523                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
31524                                vm.widgetTransparency = data.widgetTransparency;
31525                                break;
31526                        }
31527                    }
31528
31529                    widgets[$scope.widget] = angular.toJson(vm.widget);
31530                    vm.link = extractYoutubeLink(vm.link);
31531                })
31532                .catch(function (error) {
31533                    bugsnag.notify(error);
31534                });
31535        });
31536
31537        $scope.$on('$destroy', listener);
31538
31539        //Helpers
31540        //https://stackoverflow.com/questions/3452546/how-do-i-get-the-youtube-video-id-from-a-url
31541        function extractYoutubeLink(url) {
31542            var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(shorts\/)|(watch\?))\??v?=?([^#&?]*).*/;
31543            var match = url.match(regExp);
31544            var finalResult = "";
31545            if (match) {
31546                if (match[7] && match[7].length == 11) {
31547                    finalResult = "https://www.youtube.com/embed/" + match[7];
31548                } else if (match[8] && match[8].length == 11) {
31549                    //youtube shorts url shared link format
31550                    finalResult = "https://www.youtube.com/embed/" + match[8];
31551                }
31552                if (vm.autoplay) {
31553                    finalResult += "?autoplay=1&mute=1";
31554                }
31555            }
31556            return $sce.trustAsResourceUrl(finalResult);
31557        }
31558    }
31559})();
31560;
31561(function () {
31562    'use strict';
31563
31564    angular
31565        .module('app.directives')
31566        .directive('videoWidget', videoWidget)
31567
31568    videoWidget.$inject = [];
31569
31570    function videoWidget() {
31571        return {
31572            restrict: 'E',
31573            scope: {
31574                widget: '='
31575            },
31576            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/video/widget/video-widget.tpl.html',
31577            controller: 'VideoWidgetWidgetController',
31578            controllerAs: 'videoWidget'
31579        };
31580    }
31581})();;
31582(function () {
31583    'use strict';
31584
31585    angular
31586        .module('app.directives')
31587        .controller('LeaderboardWidgetController', LeaderboardWidgetController);
31588
31589    LeaderboardWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$translate', 'HashService', 'WebsiteEditorService'];
31590
31591    function LeaderboardWidgetController($rootScope, $scope, $localStorage, $translate, hashService, websiteEditorService) {
31592        //State variables ----------
31593        var vm = this;
31594
31595        vm.tabs = hashService.STATISTICS_TABS;
31596        vm.selectedDirectly = false;
31597        vm.activeTab = vm.tabs.PLAYERS;
31598        vm.sportId = $localStorage.solution.sportId;
31599        vm.embedSrc = `<iframe src="${location.origin}/?iframe=true&pageId=${location.pathname.substring(1)}" width="100%" height="800"></iframe>`;
31600
31601        //// TODO Get stats to displayed.
31602        //// TODO => widget...
31603        //// TODO Get parameter of the widget....
31604        vm.widget = angular.fromJson(widgets[$scope.widget]);
31605
31606        
31607        ////State functions ----------
31608        vm.clickTab = function (tab) {
31609            vm.selectedDirectly = true;
31610            vm.activeTab = vm.tabs[tab];
31611            hashService.setParams({ tab: vm.tabs[tab] }, true);
31612        }
31613
31614        vm.isActive = function (tab) {
31615            return vm.activeTab === vm.tabs[tab];
31616        }
31617
31618        // Set view model parameters.
31619        for (var parameter in vm.widget.parameters) {
31620            switch (vm.widget.parameters[parameter].id) {
31621                case 'seasonId':
31622                    vm.seasonId = vm.widget.parameters[parameter].value;
31623                    break;
31624                case 'showPlayers':
31625                    vm.showPlayers = (vm.widget.parameters[parameter].value === 'true');
31626                    break;
31627                case 'showLeaders':
31628                    vm.showLeaders = (vm.widget.parameters[parameter].value === 'true');
31629                    break;
31630                case 'showTeams':
31631                    vm.showTeams = (vm.widget.parameters[parameter].value === 'true');
31632                    break;
31633                case 'showGoalies':
31634                    vm.showGoalies = (vm.widget.parameters[parameter].value === 'true');
31635                    break;
31636                case 'showPitchers':                    
31637                    vm.showPitchers = (vm.widget.parameters[parameter].value === 'true');
31638                    break;
31639                case 'showDefense':
31640                    vm.showDefense = (vm.widget.parameters[parameter].value === 'true');
31641                    break;
31642                case 'showSuspensions':
31643                    vm.showSuspensions = (vm.widget.parameters[parameter].value === 'true');
31644                    break;
31645                case 'nbPlayersDisplayedPerPage':
31646                    vm.nbPlayersDisplayedPerPage = vm.widget.parameters[parameter].value;
31647                    break;
31648                case 'nbGoalersDisplayedPerPage':
31649                    vm.nbGoalersDisplayedPerPage = vm.widget.parameters[parameter].value;
31650                    break;
31651                case 'columnsDisplaySelectPlayers':
31652                    vm.playersColumns = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));                    
31653                    vm.playerLeaderStatistics = _.reduce(_.filter(vm.playersColumns || [], function (stat) { return stat.visibleDesktop || stat.visibleMobile }), function (list, stat) { list.push(stat.id); return list }, [])                    
31654                    break;
31655                case 'columnsDisplaySelectGoalies':
31656                    vm.goaliesColumns = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
31657                    break;
31658                case 'columnsDisplaySelectTeams':
31659                    vm.teamsColumns = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));                    
31660                    break;
31661                case 'columnsDisplaySelectPitchers':
31662                    vm.pitchersColumns = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
31663                    vm.pitchersLeaderStatistics = _.reduce(_.filter(vm.pitchersColumns || [], function (stat) { return stat.visibleDesktop || stat.visibleMobile }), function (list, stat) { list.push(stat.id); return list }, [])
31664                    break;
31665                case 'columnsDisplaySelectDefense':
31666                    vm.defenseColumns = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
31667                    vm.defenseLeaderStatistics = _.reduce(_.filter(vm.defenseColumns || [], function (stat) { return stat.visibleDesktop || stat.visibleMobile }), function (list, stat) { list.push(stat.id); return list }, [])                    
31668                    break;
31669            }
31670
31671        }
31672
31673        ////On component mount ----------
31674        locationChange();
31675
31676        ////Listeners ----------
31677
31678        ///*
31679        //Trigger locationChange() when tab changed
31680        
31681        $scope.$on('$locationChangeSuccess', function (event, newUrl, oldUrl) {
31682            if (hashService.hasStatisticsTabsChanged(newUrl, oldUrl)) {
31683                locationChange();
31684            }
31685        });
31686
31687        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
31688            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
31689                .then(function (response) {
31690                    for (var parameter in vm.widget.parameters) {
31691                        switch (vm.widget.parameters[parameter].id) {
31692                            case 'showPlayers':
31693                                vm.widget.parameters[parameter].value = data.showPlayers.toString();
31694                                vm.showPlayers = data.showPlayers;
31695                                break;
31696                            case 'showLeaders':
31697                                vm.widget.parameters[parameter].value = data.showLeaders.toString();
31698                                vm.showLeaders = data.showLeaders;
31699                                break;
31700                            case 'showTeams':
31701                                vm.widget.parameters[parameter].value = data.showTeams.toString();
31702                                vm.showTeams = data.showTeams;
31703                                break;
31704                            case 'showGoalies':
31705                                vm.widget.parameters[parameter].value = data.showGoalies.toString();
31706                                vm.showGoalies = data.showGoalies;
31707                                break;
31708                            case 'showPitchers':
31709                                vm.widget.parameters[parameter].value = data.showPitchers.toString();
31710                                vm.showPitchers = data.showPitchers;
31711                                break;
31712                            case 'showDefense':
31713                                vm.widget.parameters[parameter].value = data.showDefense.toString();
31714                                vm.showDefense = data.showDefense;
31715                                break;
31716                            case 'showSuspensions':
31717                                vm.widget.parameters[parameter].value = data.showSuspensions.toString();
31718                                vm.showSuspensions = data.showSuspensions;
31719                                break;
31720                            case 'columnsDisplaySelectTeams':
31721                                vm.widget.parameters[parameter].value = data.columnsDisplaySelectTeams;
31722                                vm.teamsColumns= angular.fromJson(data.columnsDisplaySelectTeams.replace(/\'/g, '"'));
31723                                break;
31724                            case 'columnsDisplaySelectPlayers':
31725                                vm.widget.parameters[parameter].value = data.columnsDisplaySelectPlayers;
31726                                vm.playersColumns = angular.fromJson(data.columnsDisplaySelectPlayers.replace(/\'/g, '"'));
31727                                break;
31728                            case 'columnsDisplaySelectGoalies':
31729                                vm.widget.parameters[parameter].value = data.columnsDisplaySelectGoalies;
31730                                vm.goaliesColumns = angular.fromJson(data.columnsDisplaySelectGoalies.replace(/\'/g, '"'));
31731                                break;
31732                            case 'columnsDisplaySelectPitchers':
31733                                vm.widget.parameters[parameter].value = data.columnsDisplaySelectPitchers;
31734                                vm.pitchersColumns = angular.fromJson(data.columnsDisplaySelectPitchers.replace(/\'/g, '"'));
31735                                break;
31736                            case 'columnsDisplaySelectDefense':
31737                                vm.widget.parameters[parameter].value = data.columnsDisplaySelectDefense;
31738                                vm.defenseColumns = angular.fromJson(data.columnsDisplaySelectDefense.replace(/\'/g, '"'));
31739                                break;
31740
31741                        }
31742                    }
31743                    widgets[$scope.widget] = angular.toJson(vm.widget);
31744                })
31745                .catch(function (error) {
31746                    bugsnag.notify(error);
31747                });
31748        });
31749
31750
31751        $scope.$on('$destroy', listener);
31752
31753        function locationChange() {
31754            if (!vm.selectedDirectly) {
31755                const filtersUrl = hashService.getParams();
31756
31757                const activeKey = Object.keys(vm.tabs).find(function (tab) {
31758                    return vm.tabs[tab] === filtersUrl.tab;
31759                })
31760
31761                if (activeKey) {
31762                    vm.activeTab = vm.tabs[activeKey];
31763                } else {
31764                    vm.activeTab = vm.tabs.PLAYERS;
31765                }
31766            }
31767            vm.selectedDirectly = false;
31768        }
31769    }
31770})();
31771;
31772(function () {
31773    'use strict';
31774
31775    angular
31776        .module('app.directives')
31777        .directive('leaderboard', leaderboard)
31778
31779    leaderboard.$inject = [];
31780
31781    function leaderboard() {
31782        return {
31783            restrict: 'E',
31784            scope: {                
31785                widget: '='
31786            },
31787            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/leaderboard/leaderboard.tpl.html',
31788            controller: 'LeaderboardWidgetController',
31789            controllerAs: 'leaderboard'
31790        };
31791    }
31792})();;
31793(function () {
31794    'use strict';
31795
31796    angular
31797        .module('app.directives')
31798        .controller('LeaderboardLeadersWidgetController', LeaderboardLeadersWidgetController);
31799
31800    LeaderboardLeadersWidgetController.$inject = ['$scope'];
31801
31802    function LeaderboardLeadersWidgetController($scope) {
31803        var vm = this;
31804
31805        vm.season = $scope.seasonId;
31806        vm.division = undefined;
31807
31808        vm.filter = function(filter) {            
31809            vm.division = filter.division;
31810        };
31811    }
31812})();
31813;
31814(function () {
31815    'use strict';
31816
31817    angular
31818        .module('app.directives')
31819        .directive('leaderboardLeaders', leaderboardLeaders)
31820
31821    leaderboardLeaders.$inject = [];
31822
31823    function leaderboardLeaders() {
31824        return {
31825            restrict: 'E',
31826            scope: {                
31827                widget: '=',
31828                statistics: '=',
31829                seasonId: '=',
31830            },
31831            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/leaderboard/leaders/leaderboard-leaders.tpl.html',
31832            controller: 'LeaderboardLeadersWidgetController',
31833            controllerAs: 'leaderboardLeaders'
31834        };
31835    }
31836})();;
31837(function () {
31838    'use strict';
31839
31840    angular
31841        .module('app.directives')
31842        .controller('LeaderboardLeadersViewWidgetController', LeaderboardLeadersViewWidgetController);
31843
31844    LeaderboardLeadersViewWidgetController.$inject = ['$scope', '$localStorage', 'StatisticService'];
31845
31846    function LeaderboardLeadersViewWidgetController($scope, $localStorage, statisticService) {
31847        var vm = this;
31848        vm.options = {};
31849        vm.statistics = $scope.statistics;
31850        vm.sportId = $localStorage.solution.sportId;
31851        
31852        $scope.$watch('[season, division]', function () {
31853            if ($scope.season && $scope.division) {
31854                vm.options = {
31855                    seasonTypeId: 1, //filter.calendar,
31856                    seasonId: $scope.season
31857                };
31858
31859                if ($scope.division !== 'general' && $scope.division !== 'divisions') {
31860                    // Set the division identifier.
31861                    vm.options.divisionId = $scope.division;
31862                } else {
31863                    // Remove the property from options.
31864                    delete vm.options.divisionId;
31865                }
31866                // Update leaders list.
31867                getLeaders();
31868            }
31869        });
31870
31871        function getLeaders() {
31872            vm.options.statisticIds = vm.statistics;
31873
31874            // Players
31875            statisticService.getPlayerLeadersByStatisticId(__solutionId__, vm.options)
31876                .then(function (response) {
31877                    vm.playerStatistics = [];
31878                    _.forEach(response.data, function (statistic) {
31879                        vm.playerStatistics.push({
31880                            id: statistic.StatTypeId,
31881                            name: statisticService.getPlayerStatisticByStatId(statistic.StatTypeId).name,
31882                            players: formatValues(statistic.StatTypeId, statistic.Players
31882)
31883                        });
31884                    });
31885                })
31886                .catch(function (error) {
31887                    bugsnag.notify(error);
31888                });
31889        }
31890
31891        function formatValues(statisticId, players) {
31892            switch (statisticId) {
31893                case 30: // Save Percentage
31894                    _.forEach(players, function (player) {
31895                        player.Value = parseFloat(player.Value / 1000).toFixed(3);
31896                    });
31897                    break;
31898
31899                case 31: // Points per game
31900                case 32: // Points per game
31901                    _.forEach(players, function (player) {
31902                        player.Value = parseFloat(player.Value / 100).toFixed(2);
31903                    });
31904                    break;
31905            }
31906
31907            return players;
31908        }
31909    }
31910})();
31911;
31912(function () {
31913    'use strict';
31914
31915    angular
31916        .module('app.directives')
31917        .directive('leaderboardLeadersView', leaderboardLeadersView)
31918
31919    leaderboardLeadersView.$inject = [];
31920
31921    function leaderboardLeadersView() {
31922        return {
31923            restrict: 'E',
31924            scope: {
31925                season: '=',
31926                division: '=',
31927                statistics: '='
31928            },
31929            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/leaderboard/leaders/view/leaderboard-leaders-view.tpl.html',
31930            controller: 'LeaderboardLeadersViewWidgetController',
31931            controllerAs: 'leaderboardLeadersView'
31932        };
31933    }
31934})();;
31935(function () {
31936    'use strict';
31937
31938    angular
31939        .module('app.directives')
31940        .controller('FaqWidgetController', FaqWidgetController);
31941
31942    FaqWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$sce', 'WebsiteEditorService', 'StyleService'];
31943
31944    function FaqWidgetController($rootScope, $scope, $localStorage, $sce, websiteEditorService, styleService) {
31945        var vm = this;
31946
31947        // Apply website values to view model object.
31948        vm.widget = angular.fromJson(widgets[$scope.widget]);
31949        vm.sections = $scope.sections;
31950        
31951        vm.background = { image: '', position: '' };
31952        vm.iconStyle = {};
31953                
31954        vm.selectedLanguage = angular.isUndefined($localStorage.currentLanguage)
31955            ? __defaultLanguage__
31956            : $localStorage.currentLanguage.culture;
31957
31958        vm.getLocalizedValue = function (array, isHtml) {
31959            var value = "";
31960            
31961            if (array && vm.selectedLanguage) {
31962
31963                var localizedText = _.find(array, { culture: vm.selectedLanguage });
31964                if (localizedText) {
31965                    value = localizedText.value;
31966                }
31967                else {
31968                    value = (array[0] || {}).value || "";
31969                }
31970            }
31971
31972            if (isHtml) {
31973                return $sce.trustAsHtml(value);
31974            }
31975
31976            return value;
31977        }
31978        
31979        // Set view model parameters.
31980        for (var parameter in vm.widget.parameters) {
31981            switch (vm.widget.parameters[parameter].id) {
31982                case 'faq':
31983                    vm.sections = angular.fromJson(unescape(vm.widget.parameters[parameter].value));
31984                    break;
31985                                
31986                case 'widgetTransparency':
31987                    vm.widgetTransparency = vm.widget.parameters[parameter].value === 'true';
31988                    break;
31989
31990                case 'backgroundColor':
31991                    vm.backgroundColor = vm.widget.parameters[parameter].value;
31992                    break;
31993
31994                case 'border':
31995                    vm.border = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
31996                    break;
31997
31998                case 'backgroundImage':
31999                    vm.background.image = vm.widget.parameters[parameter].value;
32000                    break;
32001
32002                case 'backgroundImagePosition':
32003                    vm.background.position = vm.widget.parameters[parameter].value;
32004                    break;
32005
32006                case 'iconSize':
32007                    vm.iconStyle['font-size'] = vm.widget.parameters[parameter].value + 'px';
32008					break;
32009
32010                case 'iconColor':
32011                    vm.iconStyle['color'] = vm.widget.parameters[parameter].value;
32012					break;
32013
32014                case 'iconSpacing':
32015                    vm.iconStyle['margin-right'] = vm.widget.parameters[parameter].value + 'px';                    
32016					break;
32017
32018                case 'sectionFont':
32019                    vm.sectionFont = styleService.fontSettingToStyle(angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"')));                    
32020					break;
32021
32022                case 'sectionBackgroundColor':
32023                    vm.sectionBackgroundColor = vm.widget.parameters[parameter].value;
32024					break;
32025
32026                case 'sectionBorder':
32027                    vm.sectionBorder = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
32028					break;
32029
32030                case 'questionFont':
32031                    vm.questionFont = styleService.fontSettingToStyle(angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"')));
32032					break;
32033
32034                case 'questionBackgroundColor':
32035                    vm.questionBackgroundColor = vm.widget.parameters[parameter].value;
32036					break;
32037
32038                case 'questionBorder':
32039                    vm.questionBorder = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
32040					break;
32041
32042                case 'questionSpacingHorizontal':
32043                    vm.questionSpacingHorizontal = vm.widget.parameters[parameter].value;
32044					break;
32045
32046                case 'questionVerticalSpacing':
32047                    vm.questionVerticalSpacing = vm.widget.parameters[parameter].value;
32048					break;
32049
32050                case 'questionIconSize':
32051                    vm.questionIconSize = vm.widget.parameters[parameter].value;
32052					break;
32053
32054                case 'questionIconColor':
32055                    vm.questionIconColor = vm.widget.parameters[parameter].value;
32056					break;
32057
32058                case 'answerBackgroundColor':
32059                    vm.answerBackgroundColor = vm.widget.parameters[parameter].value;
32060					break;
32061            }
32062        }
32063
32064        vm.questionPadding = `${vm.questionVerticalSpacing}px ${vm.questionSpacingHorizontal}px`;
32065
32066        vm.getStyle = function () {
32067            var style = {};
32068            if (!vm.widgetTransparency) {
32069                style['background-color'] = vm.backgroundColor;
32070                style['border-color'] = vm.border.color;
32071
32072                if (vm.background && vm.background.image) {
32073                    style['background-image'] = `url("${vm.background.image}")`;
32074                    style['background-repeat'] = 'no-repeat';
32075                    style['background-position'] = vm.background.position || 'center center';
32076                }
32077
32078           }
32079
32080            style['border-width'] = `${vm.border.width}px`;
32081            style['border-color'] = vm.border.color;
32082            style['border-radius'] = `${vm.border.radius}px`;
32083
32084            return style;
32085        }
32086
32087        vm.widgetStyle = vm.getStyle();
32088        
32089        // Triggered when parameters are changed.
32090        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {            
32091            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
32092                .then(function (response) {
32093                    // Save parameters.
32094                    
32095                    for (var parameter in vm.widget.parameters) {
32096                        switch (vm.widget.parameters[parameter].id) {
32097                            case 'faq':
32098                                vm.widget.parameters[parameter].value = data.faq;
32099                                vm.sections = angular.fromJson(unescape(data.faq));
32100                                break;
32101
32102                            case 'widgetTransparency':                                
32103                                vm.widget.parameters[parameter].value = data.widgetTransparency.toString();
32104                                vm.widgetTransparency = data.widgetTransparency;                                
32105                                break;
32106
32107                            case 'backgroundColor':
32108                                vm.widget.parameters[parameter].value = data.backgroundColor.toString();
32109                                vm.backgroundColor = data.backgroundColor;
32110                                break;
32111
32112                            case 'border':
32113                                vm.widget.parameters[parameter].value = data.border;
32114                                vm.border = angular.fromJson(data.border.replace(/\'/g, '"'));
32115                                break;
32116
32117                            case 'backgroundImage':
32118                                vm.widget.parameters[parameter].value = data.backgroundImage.toString();
32119                                vm.background.image = data.backgroundImage;
32120                                break;
32121
32122                            case 'backgroundImagePosition':
32123                                vm.widget.parameters[parameter].value = data.backgroundImagePosition.toString();
32124                                vm.background.position = data.backgroundImagePosition;
32125                                break;
32126
32127                            case 'iconSize':
32128                                vm.widget.parameters[parameter].value = data.iconSize.toString();
32129                                vm.iconStyle['font-size'] = data.iconSize + 'px';
32130                                break;
32131
32132                            case 'iconColor':
32133                                vm.widget.parameters[parameter].value = data.iconColor.toString();
32134                                vm.iconStyle['color'] = data.iconColor;
32135                                break;
32136
32137                            case 'iconSpacing':
32138                                vm.widget.parameters[parameter].value = data.iconSpacing.toString();
32139                                vm.iconStyle['margin-right'] = data.iconSpacing + 'px';
32140                                break;
32141
32142                            case 'sectionFont':
32143                                vm.widget.parameters[parameter].value = data.sectionFont;
32144                                vm.sectionFont = styleService.fontSettingToStyle(angular.fromJson(data.sectionFont.replace(/\'/g, '"')));
32145                                break;
32146
32147                            case 'sectionBackgroundColor':
32148                                vm.widget.parameters[parameter].value = data.sectionBackgroundColor.toString();
32149                                vm.sectionBackgroundColor = data.sectionBackgroundColor;
32150                                break;
32151
32152                            case 'sectionBorder':
32153                                vm.widget.parameters[parameter].value = data.sectionBorder;
32154                                vm.sectionBorder = angular.fromJson(data.sectionBorder.replace(/\'/g, '"'));
32155                                break;
32156
32157                            case 'questionFont':
32158                                vm.widget.parameters[parameter].value = data.questionFont;
32159                                vm.questionFont = styleService.fontSettingToStyle(angular.fromJson(data.questionFont.replace(/\'/g, '"')));
32160                                break;
32161
32162                            case 'questionBackgroundColor':
32163                                vm.widget.parameters[parameter].value = data.questionBackgroundColor.toString();
32164                                vm.questionBackgroundColor = data.questionBackgroundColor;
32165                                break;
32166
32167                            case 'questionBorder':
32168                                vm.widget.parameters[parameter].value = data.questionBorder;
32169                                vm.questionBorder = angular.fromJson(data.questionBorder.replace(/\'/g, '"'));
32170                                break;
32171
32172                            case 'questionSpacingHorizontal':
32173                                vm.widget.parameters[parameter].value = data.questionSpacingHorizontal.toString();
32174                                vm.questionSpacingHorizontal = data.questionSpacingHorizontal;
32175                                break;
32176
32177                            case 'questionVerticalSpacing':
32178                                vm.widget.parameters[parameter].value = data.questionVerticalSpacing.toString();
32179                                vm.questionVerticalSpacing = data.questionVerticalSpacing;
32180                                break;
32181
32182                            case 'questionIconSize':
32183                                vm.widget.parameters[parameter].value = data.questionIconSize.toString();
32184                                vm.questionIconSize = data.questionIconSize;
32185                                break;
32186
32187                            case 'questionIconColor':
32188                                vm.widget.parameters[parameter].value = data.questionIconColor.toString();
32189                                vm.questionIconColor = data.questionIconColor;
32190                                break;
32191
32192                            case 'answerBackgroundColor':
32193                                vm.widget.parameters[parameter].value = data.answerBackgroundColor.toString();
32194                                vm.answerBackgroundColor = data.answerBackgroundColor;
32195                                break;
32196                        }
32197                    }
32198
32199                    vm.questionPadding = `${vm.questionVerticalSpacing}px ${vm.questionSpacingHorizontal}px`;
32200                    vm.widgetStyle = vm.getStyle();
32201
32202                    // Update the variable.
32203                    widgets[$scope.widget] = angular.toJson(vm.widget); 
32204                })
32205                .catch(function (error) {
32206                    bugsnag.notify(error);
32207                });
32208        });
32209
32210        $scope.$on('$destroy', listener);
32211    }
32212})();
32213;
32214(function () {
32215    'use strict';
32216
32217    angular
32218        .module('app.directives')
32219        .directive('faq', faq)
32220
32221    faq.$inject = [];
32222
32223    function faq() {
32224        return {
32225            restrict: 'E',
32226            scope: {                
32227                widget: '='
32228            },
32229            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/faq/faq.tpl.html',
32230            controller: 'FaqWidgetController',
32231            controllerAs: 'faqController'
32232        };
32233    }
32234})();;
32235(function () {
32236    'use strict';
32237
32238    angular
32239        .module('app.directives')
32240        .controller('PlayerStatsMultipleSeasonsWidgetController', PlayerStatsMultipleSeasonsWidgetController);
32241
32242    PlayerStatsMultipleSeasonsWidgetController.$inject = ['$rootScope', '$scope', '$localStorage', '$window', '$translate', 'StatisticService', 'DivisionService', 'WebsiteEditorService', 'PositionService', 'SeasonService'];
32243
32244    function PlayerStatsMultipleSeasonsWidgetController($rootScope, $scope, $localStorage, $window, $translate, statisticService, divisionService, websiteEditorService, positionService, seasonService) {
32245        var vm = this;
32246
32247        //State variables
32248        vm.widget = angular.fromJson(widgets[$scope.widget]);
32249        vm.categoryId = _.get(_.find(vm.widget.properties, { key: "categoryId" }), "value");
32250        vm.getPosition = positionService.getPosition;
32251        
32252        vm.options = {
32253            page: 1,
32254            sortStatId: 15,
32255            sortOrder: 'DESC',
32256            block: 'current',
32257            pageSize: 50,
32258            categoryType: vm.categoryId
32259        };
32260
32261        vm.applyMoreFilters = function (filter) {
32262            vm.division = filter.division;
32263            vm.startDate = filter.startDate;
32264            vm.endDate = filter.endDate;
32265            vm.position = filter.position;
32266            getStatistics();
32267        };
32268
32269        vm.filter = function (filter) {
32270            vm.division = filter.division;
32271            vm.position = filter.position;
32272            getStatistics();
32273        };
32274       
32275        //Component mount.
32276        for (var parameter in vm.widget.parameters) {
32277            switch (vm.widget.parameters[parameter].id) {
32278                case 'nbPlayersDisplayed':
32279                    vm.options.pageSize = vm.widget.parameters[parameter].value;
32280                    break;
32281
32282                case 'sortDirection':
32283                    vm.options.sortOrder = vm.widget.parameters[parameter].value;
32284                    break;
32285
32286                case 'sortStat':
32287                    vm.options.sortStatId = vm.widget.parameters[parameter].value;
32288                    break;
32289
32290                case 'sortBlock':
32291                    vm.options.block = vm.widget.parameters[parameter].value;
32292                    break;
32293
32294                case 'secondBlock':
32295                    vm.secondBlock = vm.widget.parameters[parameter].value === 'true';
32296                    break;
32297
32298                case 'thirdBlock':
32299                    vm.thirdBlock = vm.widget.parameters[parameter].value === 'true';
32300                    break;
32301
32302                case 'nameBlock1':
32303                    vm.nameBlock1 = vm.widget.parameters[parameter].value;
32304                    break;
32305
32306                case 'nameBlock1fr':
32307                    vm.nameBlock1fr = vm.widget.parameters[parameter].value;
32308                    break;
32309
32310                case 'seasonsBlock1':
32311                    vm.seasonsBlock1 = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
32312                    console.log(vm.seasonsBlock1);
32313                    break;
32314
32315                case 'columnsDisplaySelectBlock1':
32316                    vm.columnsDisplaySelectBlock1 = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
32317                    break;
32318
32319                case 'nameBlock2':
32320                    vm.nameBlock2 = vm.widget.parameters[parameter].value;
32321                    break;
32322
32323                case 'nameBlock2fr':
32324                    vm.nameBlock2fr = vm.widget.parameters[parameter].value;
32325                    break;
32326
32327                case 'seasonsBlock2':
32328                    vm.seasonsBlock2 = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));;
32329                    break;
32330
32331                case 'columnsDisplaySelectBlock2':
32332                    vm.columnsDisplaySelectBlock2 = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
32333                    break;
32334
32335                case 'nameBlock3':
32336                    vm.nameBlock3 = vm.widget.parameters[parameter].value;
32337                    break;
32338
32339                case 'nameBlock3fr':
32340                    vm.nameBlock3fr = vm.widget.parameters[parameter].value;
32341                    break;
32342
32343                case 'columnsDisplaySelectBlock3':
32344                    vm.columnsDisplaySelectBlock3 = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
32345                    break;
32346            }
32347        }
32348
32349        getMostRecentSeason();
32350        // Listener
32351        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
32352            websiteEditorService.updatePage(__solutionId__, __pageId__, { uuid: vm.widget.uuid, parameters: data })
32353                .then(function () {
32354                    for (var parameter in vm.widget.parameters) {
32355                        switch (vm.widget.parameters[parameter].id) {                            
32356                            case 'nbPlayersDisplayed':
32357                                vm.widget.parameters[parameter].value = data.nbPlayersDisplayed;
32358                                vm.options.nbPlayersDisplayed = data.nbPlayersDisplayed;
32359                            break;
32360                            case 'sortDirection':
32361                                vm.widget.parameters[parameter].value = data.sortDirection;
32362                                vm.options.sortOrder = data.sortDirection;
32363                                break;
32364
32365                            case 'sortStat':
32366                                vm.widget.parameters[parameter].value = data.sortStat;
32367                                vm.options.sortStatId = data.sortStat;
32368                                break;
32369
32370                            case 'sortBlock':
32371                                vm.widget.parameters[parameter].value = data.sortBlock;
32372                                vm.options.block = data.sortBlock;
32373                                break;
32374
32375                            case 'secondBlock':
32376                                vm.widget.parameters[parameter].value = data.secondBlock.toString();
32377                                vm.secondBlock = data.secondBlock;
32378                                break;
32379
32380                            case 'thirdBlock':
32381                                vm.widget.parameters[parameter].value = data.thirdBlock.toString();
32382                                vm.thirdBlock = data.thirdBlock;
32383                                break;
32384
32385                            case 'nameBlock1':
32386                                vm.widget.parameters[parameter].value = data.nameBlock1;
32387                                vm.nameBlock1 = data.nameBlock1;
32388                                break;
32389
32390                            case 'nameBlock1fr':
32391                                vm.widget.parameters[parameter].value = data.nameBlock1fr;
32392                                vm.nameBlock1fr = data.nameBlock1fr;
32393                                break;
32394
32395                            case 'seasonsBlock1':
32396                                vm.widget.parameters[parameter].value = data.seasonsBlock1;
32397                                vm.seasonsBlock1 = angular.fromJson(data.seasonsBlock1.replace(/\'/g, '"'));
32398                                break;
32399
32400                            case 'columnsDisplaySelectBlock1':
32401                                vm.widget.parameters[parameter].value = data.columnsDisplaySelectBlock1;
32402                                vm.columnsDisplaySelectBlock1 = angular.fromJson(data.columnsDisplaySelectBlock1.replace(/\'/g, '"'));
32403                                break;
32404
32405                            case 'nameBlock2':
32406                                vm.widget.parameters[parameter].value = data.nameBlock2;
32407                                vm.nameBlock2 = data.nameBlock2;
32408                                break;
32409
32410                            case 'nameBlock2fr':
32411                                vm.widget.parameters[parameter].value = data.nameBlock2fr;
32412                                vm.nameBlock2fr = data.nameBlock2fr;
32413                                break;
32414
32415                            case 'seasonsBlock2':
32416                                vm.widget.parameters[parameter].value = data.seasonsBlock2;
32417                                vm.seasonsBlock2 = angular.fromJson(data.seasonsBlock2.replace(/\'/g, '"'));
32418                                break;
32419
32420                            case 'columnsDisplaySelectBlock2':
32421                                vm.widget.parameters[parameter].value = data.columnsDisplaySelectBlock2;
32422                                vm.columnsDisplaySelectBlock2 = angular.fromJson(data.columnsDisplaySelectBlock2.replace(/\'/g, '"'));
32423                                break;
32424
32425                            case 'nameBlock3':
32426                                vm.widget.parameters[parameter].value = data.nameBlock3;
32427                                vm.nameBlock3 = data.nameBlock3;
32428                                break;
32429
32430                            case 'nameBlock3fr':
32431                                vm.widget.parameters[parameter].value = data.nameBlock3fr;
32432                                vm.nameBlock3fr = data.nameBlock3fr;
32433                                break;
32434
32435                            case 'columnsDisplaySelectBlock3':
32436                                vm.widget.parameters[parameter].value = data.columnsDisplaySelectBlock3;
32437                                vm.columnsDisplaySelectBlock3 = angular.fromJson(data.columnsDisplaySelectBlock3.replace(/\'/g, '"'));
32438                                break;
32439                            
32440                        }
32441                    }
32442
32443                    vm.columns = buildColumns(vm.columnsDisplaySelectBlock1);
32444                    vm.columnsMultiSeasons = buildColumns(vm.columnsDisplaySelectBlock2);
32445                    vm.columnsTotal = buildColumns(vm.columnsDisplaySelectBlock3);
32446
32447                    formatColumns();
32448                    getMostRecentSeason();
32449                    getStatistics();
32450                    widgets[$scope.widget] = angular.toJson(vm.widget);
32451                })
32452                .catch(function (error) {
32453                    bugsnag.notify(error);
32454                });
32455        });
32456
32457        vm.columns = [];
32458
32459        //Component mount.
32460        vm.columns = buildColumns(vm.columnsDisplaySelectBlock1);
32461        vm.columnsMultiSeasons = buildColumns(vm.columnsDisplaySelectBlock2);
32462        vm.columnsTotal = buildColumns(vm.columnsDisplaySelectBlock3);
32463
32464        formatColumns();
32465        
32466        vm.sort = function (column, block) {
32467            // Reset columns sort.
32468            _.forEach(vm.columns, function (_column) {
32469                if (_column.id !== column.id) {
32470                    _column.sort = '';
32471                }
32472            });
32473            _.forEach(vm.columnsMultiSeasons, function (_column) {
32474                if (_column.id !== column.id) {
32475                    _column.sort = '';
32476                }
32477            });
32478            _.forEach(vm.columnsTotal, function (_column) {
32479                if (_column.id !== column.id) {
32480                    _column.sort = '';
32481                }
32482            });
32483
32484            if (angular.isUndefined(column.sort)) {
32485                column.sort = 'desc';
32486            } else {
32487                // Toggle sort order.
32488                column.sort = column.sort === 'desc'
32489                    ? column.sort = 'asc'
32490                    : column.sort = 'desc';
32491            }
32492
32493            // Get the statistics order by column selected.
32494            vm.options.sortStatId = column.id;
32495            vm.options.sortOrder = column.sort;
32496            vm.options.block = block;
32497            
32498            getStatistics();
32499        };
32500
32501        vm.getLabel = function (block) {
32502            var language = $translate.use();
32503            var propertyName = `nameBlock${block}`;
32504            if (language.contains('fr')) {
32505                propertyName += 'fr';
32506            }
32507
32508            return vm[propertyName];
32509        }
32510
32511
32512        vm.columnsLength = function (columns) {
32513            return columns.filter(function (column) { return vm.showStat(column) }).length;
32514        }
32515
32516        vm.getStatisticValue = function (player, statisticId, block )   {
32517            try {
32518                var array = player.currentStats;
32519                if (block == 'multiSeason') {
32520                    array = player.multiSeasonStats;
32521                }
32522                else if (block == 'total') {
32523                    array = player.totalStats;
32524                }
32525
32526                return _.find(array, function (statistic) {
32527                    return statistic.statTypeId === statisticId;
32528                }).displayValue;
32529            }
32530            catch (error) {
32531                return 0;
32532            }
32533        };
32534
32535        vm.showStat = function (column) {
32536            if (isMobile() && column.visibleMobile) {
32537                return true;
32538            } else if (!isMobile() && column.visibleDesktop) {
32539                return true;
32540            }
32541            return false;
32542        }
32543
32544        //Functions
32545        function formatColumns() {
32546            var columns = [];
32547            switch (vm.options.block) {
32548                case 'current':
32549                    columns = vm.columns;
32550                    break;
32551                case 'multiSeason':
32552                    columns = vm.columnsMultiSeasons;
32553                    break;
32554                case 'total':
32555                    columns = vm.columnsTotal;
32556			}
32557            
32558            columns.forEach(function (col) {
32559                if (col.id == vm.options.sortStatId) {
32560                    col.sort = vm.options.sortOrder;
32561                }
32562            })
32563            
32564        }
32565
32566        function buildColumns(columnsToDisplay) {
32567            var columns = [];
32568            columnsToDisplay.forEach(function (col) {
32569                var stat = statisticService.getPlayerStatisticByStatId(col.id);
32570                columns.push({
32571                    id: col.id,
32572                    visibleDesktop: col.visibleDesktop,
32573                    visibleMobile: col.visibleMobile,
32574                    name: stat.name,
32575                    abbreviation: stat.abbreviation
32576                })
32577            });
32578
32579            return columns;
32580        }
32581
32582        getStatistics();
32583        function getStatistics() {
32584            var leaderboardSettings = {};
32585            leaderboardSettings.bloc = vm.options.block ;
32586            leaderboardSettings.currentSeasonList = vm.seasonsBlock1 || [];
32587            leaderboardSettings.multiSeasonList = vm.seasonsBlock2 || [];
32588
32589            if (vm.seasonsBlock1.length > 0 && (vm.seasonsBlock2.length > 0 || !vm.showPast)) {
32590                if (vm.division && vm.division != 'divisions') {
32591                    vm.options.divisionId = vm.division;
32592                }
32593                if (vm.position && vm.position != 'all') {
32594                    vm.options.positionId = vm.position;
32595				}
32596
32597                statisticService.getPlayerLeaderBySeasons(__solutionId__, leaderboardSettings, vm.options).then(function (response) {
32598                    vm.players = response.data.playerLeader;                    
32599                })
32600            }
32601        }
32602
32603        function isMobile() {
32604            return $window.innerWidth <= 600;
32605        }
32606
32607        function getMostRecentSeason() {
32608            seasonService.getSeasonsBySolutionId(__solutionId__).then(function (seasons) {  
32609                var seasonsList = vm.seasonsBlock1;
32610                var allSeasons = seasons.data;
32611                var seasonsBlock1Data = [];
32612                seasonsList.forEach(function (seasonId) {
32613                    var season = _.find(allSeasons, { Id: seasonId });
32614                    if (season) {
32615                        seasonsBlock1Data.push(season);
32616                    }
32617                })
32618                var mostRecent = null;
32619                seasonsBlock1Data.forEach(function (season) {
32620                    if (mostRecent == null || mostRecent.date < season.StartingDate) {
32621                        mostRecent = { id: season.Id, date: season.StartingDate };
32622                    }
32623                })
32624                vm.mostRecentSeason = mostRecent ? mostRecent.id : null;
32625            })
32626        }
32627
32628        $scope.$on('$destroy', listener);
32629
32630    }
32631})();
32632;
32633(function () {
32634    'use strict';
32635
32636    angular
32637        .module('app.directives')
32638        .directive('playerStatsMultipleSeasons', playerStatsMultipleSeasons);
32639
32640    playerStatsMultipleSeasons.$inject = [];
32641
32642    function playerStatsMultipleSeasons() {
32643        return {
32644            restrict: 'E',
32645            scope: {                
32646                widget: '='
32647            },
32648            templateUrl: 'public/v2/app/core/directives/toolbox/widgets/player/stats-multiple-seasons/player
32648-stats-multiple-seasons.tpl.html',
32649            controller: 'PlayerStatsMultipleSeasonsWidgetController',
32650            controllerAs: 'playerStatsMultipleSeasons'
32651        };
32652    }
32653})();;
32654(function () {
32655    'use strict';
32656
32657    angular
32658        .module('app.directives')
32659        .controller('WidgetController', WidgetController);
32660
32661    WidgetController.$inject = ['$rootScope', '$scope', 'WebsiteEditorService'];
32662
32663    function WidgetController($rootScope, $scope, websiteEditorService) {
32664        var vm = this;
32665        vm.isEditMode = false;
32666        vm.showWidget = true; 
32667
32668        if (!widgets[$scope.widget]) {
32669            vm.showWidget = false;
32670        }
32671
32672        $scope.$watch(function () { return websiteEditorService.isEditMode(); }, function (newVal) {            
32673            if (newVal === undefined) return;
32674            vm.isEditMode = newVal;
32675        }, true);
32676
32677        var listenerDelete = $rootScope.$on('delete-widget', function (event, data) {
32678            if (data.widgetId === $scope.widget) {
32679                delete widgets[data.widgetId];
32680                vm.showWidget = false;
32681            }
32682        });
32683
32684        $scope.$on('$destroy', listenerDelete);
32685
32686        var listenerAdd = $rootScope.$on('add-widget', function (event, data) {
32687            if (data.widgetId === $scope.widget) {
32688                widgets[$scope.widget] = angular.toJson(data.widget);
32689                vm.showWidget = true;
32690            }
32691        });
32692
32693        $scope.$on('$destroy', listenerAdd);
32694    }
32695})();
32696;
32697(function () {
32698    'use strict';
32699
32700    angular
32701        .module('app.directives')
32702        .directive('widget', widget);
32703
32704    widget.$inject = [];
32705
32706    function widget() {
32707        return {
32708            restrict: 'E',
32709            scope: {          
32710                section: '=',      
32711                widget: '='
32712            },
32713            templateUrl: 'public/v2/app/core/directives/widget/widget.tpl.html',
32714            controller: 'WidgetController',
32715            controllerAs: 'widgetContainer'
32716        };
32717    }
32718})();;
32719(function () {
32720    'use strict';
32721
32722    angular
32723        .module('app.directives')
32724        .controller('WidgetContentController', WidgetContentController);
32725
32726    WidgetContentController.$inject = ['$scope', 'WebsiteEditorService'];
32727
32728    function WidgetContentController($scope, websiteEditorService) {
32729        var vm = this;
32730        
32731        vm.isEditMode = false;
32732        
32733        $scope.$watch(function () { return websiteEditorService.isEditMode(); }, function (newVal) {
32734            if (angular.isUndefined(newVal)) return;
32735            
32736            vm.isEditMode = newVal;
32737        }, true);
32738    }
32739})();
32740;
32741(function () {
32742    'use strict';
32743
32744    angular
32745        .module('app.directives')
32746        .directive('widgetContent', widgetContent)
32747
32748        widgetContent.$inject = ['$compile'];
32749
32750    function widgetContent($compile) {
32751        return {
32752            restrict: 'E',
32753            scope: {                
32754                widget: '=',
32755                section: '=',
32756            },
32757            templateUrl: 'public/v2/app/core/directives/widget/content/widget-content.tpl.html',
32758            controller: 'WidgetContentController',
32759            controllerAs: 'widgetContent',
32760            link: function (scope, element) {
32761                // Find widget content element.
32762                var widgetContent = element.find('.widget-content');
32763                var widgetToRender = angular.fromJson(widgets[scope.widget]);
32764
32765                // Check if a preview is available for the widget selected.
32766                // TODO ...
32767                /*if (scope.widget.preview) {
32768                    // Create & compile the DOM element.
32769                    widgetToRender = $compile(scope.widget.directive)(scope);
32770                } else {
32771                    // Display «preview unavailable» message.
32772                    widgetToRender = $compile('<div class="preview-unavailable"><span>preview unavailable</span></div>')(scope)
32773                }        */        
32774
32775                // Render the widget container with the proper directive identifier.                
32776                widgetToRender = $compile(`<${widgetToRender.id} section="\'${scope.section}\'" widget="\'${scope.widget}\'"></${widgetToRender.id}>`)(scope);
32777                
32778                // Add the DOM element to the zone.
32779                widgetContent.append(widgetToRender);
32780            }
32781        };
32782    }
32783})();;
32784(function () {
32785    'use strict';
32786
32787    angular
32788        .module('app.directives')
32789        .controller('WidgetSectionController', WidgetSectionController);
32790
32791    WidgetSectionController.$inject = ['$rootScope', '$scope', '$timeout', 'WebsiteEditorService', 'SecurityService'];
32792
32793    function WidgetSectionController($rootScope, $scope, $timeout, websiteEditorService, securityService) {
32794        var vm = this;
32795        vm.isEditMode = false;  
32796        
32797        vm.resizeColumnsAccess = function () {
32798            return securityService.getAccess().resizeColumns;
32799        }
32800
32801        $scope.$watch(function () { return websiteEditorService.isEditMode(); }, function (newVal) {            
32802            if (newVal === undefined) return;
32803
32804            vm.isEditMode = newVal;
32805
32806            if (vm.isEditMode) {
32807                $timeout($scope.bindDrag, 0);
32808            }
32809        }, true);
32810    }
32811})();
32812;
32813(function () {
32814    'use strict';
32815
32816    angular
32817        .module('app.directives')
32818        .directive('widgetSection', widgetSection);
32819
32820    widgetSection.$inject = ['$document', '$rootScope'];
32821
32822    function widgetSection($document, $rootScope) {
32823        return {
32824            restrict: 'E',
32825            transclude: true,
32826            templateUrl: 'public/v2/app/core/directives/widget/section/widget-section.tpl.html',
32827            controller: 'WidgetSectionController',
32828            controllerAs: 'widgetSection',
32829            require: '^widgetRow',
32830            transclude: true,
32831            replace: true,
32832            scope: {
32833                sectionId: "="
32834            },
32835            link: function (scope, element, attribute, rowController, transclude) {                
32836                var vm = rowController;
32837                var position = {};
32838                var dimension = {};
32839                var mode = "horizontal";
32840                var containerWidth = '';      
32841                var rowId = rowController.rowId;
32842                var row = _.find(page.rows, { uuid: rowId });
32843                var section = _.find(row.sections, { uuid: scope.sectionId });
32844                
32845                var width = section.md || section.sm;
32846
32847                var section = {
32848                    sectionId: scope.sectionId,
32849                    columnWidth: width
32850                }             
32851                                
32852                setSectionGutters(rowController.padding);
32853                scope.$watch(function () { return rowController.padding }, function (_padding) {
32854                    setSectionGutters(_padding);
32855                })
32856
32857                scope.bindDrag = function () {
32858                    var draggableHandle = element.find('.handle');    
32859                    draggableHandle[0].onmousedown = function ($event) {                        
32860                        $event.stopImmediatePropagation();
32861                        position.x = $event.clientX;
32862                        position.y = $event.clientY;
32863                        containerWidth = element.closest('.row-container').outerWidth();
32864                        dimension.width = element.prop('offsetWidth');
32865                        dimension.height = element.prop('offsetHeight');
32866                        $document.bind('mousemove', mousemove);
32867                        $document.bind('mouseup', mouseup);
32868                        return false;
32869
32870                    };
32871                    function mousemove($event) {
32872                        var deltaWidth = dimension.width - (position.x - $event.clientX);
32873                        var deltaHeight = dimension.height - (position.y - $event.clientY);
32874                        var newDimensions = {};
32875                        var elementWidth = element.innerWidth();
32876                        var oldColumnWidth = section.columnWidth;                            
32877
32878                        if (mode == 'horizontal') {
32879                            newDimensions = {
32880                                width: deltaWidth
32881                            };
32882                        }
32883                        else if (mode == 'vertical') {
32884                            newDimensions = {
32885                                height: deltaHeight
32886                            };
32887                        }
32888                        else {
32889                            newDimensions = {
32890                                width: deltaWidth,
32891                                height: deltaHeight
32892                            };
32893                        }
32894                        
32895                        var columnWidth = Math.ceil((newDimensions.width / containerWidth) * 12);
32896                        columnWidth = columnWidth > 12 ? 12 : columnWidth;
32897                        columnWidth = columnWidth <= 1 ? 1 : columnWidth;
32898                                                
32899                        if (columnWidth != oldColumnWidth && rowController.allowResize(scope.sectionId, columnWidth)) {
32900                            
32901                            var classAttr = element.attr('class');
32902                            section.columnWidth = columnWidth;
32903
32904                            if (classAttr.match(/col-md-\d+/)) {
32905                                element.attr('class', classAttr.replace(/col-md-\d+/, 'col-md-' + columnWidth));
32906                            }
32907                            else {
32908                                element.attr('class', `${classAttr} col-md-${columnWidth}`);                            
32909                            }
32910                            
32911                            rowController.resizeChild(scope.sectionId, columnWidth);
32912                            
32913                        }                        
32914
32915                        return false;
32916                    }
32917                    function mouseup() {
32918                        $document.unbind('mousemove', mousemove);
32919                        $document.unbind('mouseup', mouseup);
32920                    }
32921                }
32922
32923                function setSectionGutters(padding) {
32924                    if (padding === undefined || padding === null) {
32925                        padding = 15;
32926                    }
32927
32928                    element.css('padding-left', padding + 'px');
32929                    element.css('padding-right', padding + 'px');
32930                    element.find('widget:not(:first-of-type)').css('margin-top', (pad
32930ding * 2) + 'px');
32931                }
32932
32933                rowController.addSection(section);
32934
32935                $rootScope.$on(`onDeleteSection-${scope.sectionId}`, function (sectionId) {
32936                    rowController.removeSection(scope.sectionId);
32937                });
32938            }     
32939        };
32940    }
32941})();;
32942(function () {
32943    'use strict';
32944
32945    angular
32946        .module('app.directives')
32947        .controller('WidgetRowController', WidgetRowController);
32948
32949    WidgetRowController.$inject = ['$rootScope', '$scope', '$localStorage', 'WebsiteEditorService', 'PlanService', 'SecurityService'];
32950
32951    function WidgetRowController($rootScope, $scope, $localStorage, websiteEditorService, planService, securityService) {
32952        var vm = this;
32953        var sections = [];
32954        var row = _.find(page.rows, { uuid: $scope.rowId });
32955
32956        vm.isEditMode = false;
32957        vm.rowId = $scope.rowId;          
32958        vm.showModal = false;
32959        vm.showSettings = false;
32960        vm.padding = row.padding;
32961        vm.fullWidth = row.fullwidth;
32962        vm.backgroundTransparent = row.backgroundTransparent;
32963        vm.backgroundColor = row.backgroundColor;
32964        vm.backgroundImage = row.backgroundImage;
32965        vm.borderWidth = row.borderWidth;
32966        vm.borderColor = row.borderColor;
32967        vm.borderRadius = row.borderRadius;
32968        vm.videoBackground = row.videoBackground;        
32969        vm.verticalAlign = row.verticalAlign || 'top';
32970        vm.alignToTop = row.alignToTop || false;        
32971
32972        vm.getVerticalAlignCss = function () {
32973            var verticalAlignCss = 'flex-start';
32974
32975            if (vm.verticalAlign == 'center') {
32976                verticalAlignCss = 'center';
32977            }
32978            else if (vm.verticalAlign == 'bottom') {
32979                verticalAlignCss = 'flex-end';
32980            }
32981
32982            return verticalAlignCss;
32983        }
32984        vm.isIframe = __iframe__;
32985
32986        if (vm.backgroundTransparent === null) {
32987            vm.backgroundTransparent = true;
32988        }
32989        if (vm.backgroundColor === null) {
32990            vm.backgroundColor = '#fff';
32991        }
32992        if (vm.borderColor === null) {
32993            vm.borderColor = '#000';
32994        }
32995
32996        $scope.$watch(function () { return websiteEditorService.isEditMode(); }, function (newVal) {            
32997            if (newVal === undefined) return;
32998
32999            vm.isEditMode = newVal;
33000
33001            if (vm.isEditMode) {
33002                $scope.resizeBuffer();
33003            }
33004            else {
33005                $scope.removeBuffer();
33006            }
33007        }, true);
33008
33009        vm.widgets = [];
33010
33011        vm.allowResize = function (sectionId, newColumnSize) {
33012            var row = _.find(page.rows, { uuid: vm.rowId });
33013            var section = _.find(row.sections, { uuid: sectionId });
33014            var widgets = section.widgets;
33015            var minWidth = 0;
33016             
33017            widgets.forEach(function (widget) {
33018                if ((widget.minwidth || 0) > minWidth) {
33019                    minWidth = widget.minwidth;                                                 
33020                }
33021            });
33022
33023            var newTotalSize = sections.reduce(function (total, section) {
33024                if (section.sectionId == sectionId) {
33025                    return total + newColumnSize;
33026                }
33027                return total + section.columnWidth
33028            }, 0);
33029                        
33030            return newTotalSize <= 12 && newColumnSize >= minWidth;
33031        }
33032
33033        vm.addWidgetAccess = function () {
33034            return securityService.getAccess().addWidget;
33035        }
33036
33037        vm.addSection = function (section) {            
33038            sections.push(section);
33039            var totalRowWidth = sections.reduce(function (total, section) { return total + section.columnWidth }, 0);
33040            $scope.resizeBuffer(12 - totalRowWidth);
33041        }
33042
33043        vm.save = function (options) {
33044            websiteEditorService.updatePage(__solutionId__, __pageId__, page, options)
33045                .then(function (response) {                    
33046                    vm.showModal = false;
33047                })
33048                .catch(function (error) {
33049                    bugsnag.notify(error);
33050                });
33051        };
33052
33053        vm.resizeChild = function (sectionId, columnWidth) {
33054            var section = _.find(sections, { sectionId: sectionId });
33055            section.columnWidth = columnWidth;
33056            var totalRowWidth = sections.reduce(function (total, section) { return total + section.columnWidth }, 0);
33057            $scope.resizeBuffer(12 - totalRowWidth);
33058            
33059            var row = _.find(page.rows, { uuid: $scope.rowId });
33060            var section = _.find(row.sections, { uuid: sectionId });
33061            section.md = columnWidth;
33062
33063            vm.save();
33064        }
33065
33066
33067        vm.showWidgets = function () {            
33068            vm.showModal = true;
33069        };
33070
33071        vm.removeSection = function (sectionId) {
33072            _.remove(sections, { sectionId: sectionId });
33073            var totalRowWidth = sections.reduce(function (total, section) { return total + section.columnWidth }, 0);
33074            $scope.removeSection(sectionId);
33075            $scope.resizeBuffer(12 - totalRowWidth);
33076
33077        }
33078    }
33079})();
33080;
33081(function () {
33082    'use strict';
33083
33084    angular
33085        .module('app.directives')
33086        .directive('widgetRow', widgetRow);
33087
33088    widgetRow.$inject = ['$document', '$compile', 'GuidService',];
33089
33090    function widgetRow($document, $compile, guidService) {
33091        return {
33092            restrict: 'E',           
33093            templateUrl: 'public/v2/app/core/directives/widget/row/widget-row.tpl.html',
33094            controller: 'WidgetRowController',
33095            controllerAs: 'widgetRow',      
33096            scope: {
33097                rowId: '='
33098            },
33099            transclude: true,
33100            replace: true,
33101            link: function (scope, element, attribute, vm, transclude) {
33102                var sections = [];
33103                var rowElement = element.find('.row');
33104
33105                vm.isFirstRow = element.index() === 0;
33106                vm.bufferSize = 0;
33107
33108                transclude(scope, function (clone) {
33109                    element.find('.row').append(clone);
33110                })
33111
33112                vm.getMetaData = function (event) {
33113                    var video = event.currentTarget;
33114                    vm.videoDimension = { aspectRatio: video.videoWidth / video.videoHeight, width: video.videoWidth, height: video.videoHeight }
33115                    
33116                    angular.element(rowElement).css('aspect-ratio', vm.videoDimension.aspectRatio.toString()).css('height', 'auto');                    
33117                }
33118
33119                scope.resizeBuffer = function (newSize) {
33120                    if (newSize === undefined) {
33121                        newSize = vm.bufferSize; 
33122                    }
33123
33124                    vm.bufferSize = newSize;
33125                    var bufferElement = $compile(`<div class="buffer col-md-${newSize}">
33126                        <div class="buffer-zone" ng-if="widgetRow.addWidgetAccess()">
33127                            <button type="button" class="btn btn-primary btn-lg" ng-click="widgetRow.showWidgets()">Add widget</button>
33128                        </div>
33129                    </div>`)(scope);
33130                    rowElement.find('.buffer').remove();
33131
33132                    if (newSize > 0 && vm.isEditMode) {
33133                        rowElement.append(bufferElement);
33134                    }                    
33135                }
33136
33137                scope.removeBuffer = function () {
33138                    rowElement.find('.buffer').remove();
33139                }
33140
33141                scope.removeSection = function(sectionId) {
33142                    rowElement.find(`#${sectionId}.widget-section`).remove();
33143                }
33144
33145                vm.addWidget = function (widget) {
33146                    // Get the section.                    
33147                    var newSectionId = guidService.getGuid();
33148                    var colClass = `col-md-` + vm.bufferSize;
33149                    var section = angular.element(`<widget-section id="${newSectionId}" section-id="'${newSectionId}'" class="${colClass}">`);
33150                    var widgetZone = $compile(`<widget-zone section="'${newSectionId}'"></widget-zone>`)(scope);
33151                                        
33152                    section.append(widgetZone);
33153                    
33154                    var widgetZone = section.find('widget-zone');
33155
33156                    // Get the widget information.
33157                    var widget = _.cloneDeep(widget);
33158
33159                    // Generate a new widget id.
33160                    widget.uuid = guidService.getGuid();
33161
33162                    // Create the widget variable.
33163                    widgets[widget.uuid] = angular.toJson(widget);
33164
33165                    var newScope = scope.$new(true);
33166
33167                    // Compile the new widget directive.
33168                    var widgetDOM = $compile(`<widget section="'${newSectionId}'" widget="'${widget.uuid}'"></widget>`)(newScope);
33169
33170                    // Insert the new widget just before the widget zone component.
33171                    widgetZone.before(widgetDOM);
33172
33173                    //// Update website layout.
33174                    //addWidgetToSectionLayout(scope.section, widget);
33175                    var newSection = {
33176                        md: vm.bufferSize,
33177                        sm: 12,
33178                        uuid: newSectionId,
33179                        widgets: [
33180                            widget
33181                        ]
33182                    }
33183
33184                    var pageRow = _.find(page.rows, { uuid: scope.rowId });
33185                    pageRow.sections.push(newSection);
33186                    rowElement.find('.buffer').replaceWith($compile(section)(scope));
33187                    scope.resizeBuffer(0);
33188
33189
33190                    // Save website layout.
33191                    vm.save({ uuid: widget.uuid, parameters: [] });
33192                };
33193            }
33194        };
33195    }
33196})();;
33197(function () {
33198    'use strict';
33199
33200    angular
33201        .module('app.directives')
33202        .controller('WidgetRowSettingsWidgetController', WidgetRowSettingsWidgetController);
33203
33204    WidgetRowSettingsWidgetController.$inject = ['$scope'];
33205
33206    function WidgetRowSettingsWidgetController($scope) {
33207        var vm = this;
33208
33209        vm.isFirstRow = function () {
33210            return _.findIndex(page.rows, { uuid: $scope.widgetRow.rowId }) === 0;
33211        }
33212
33213        vm.onSave = function () {            
33214            vm.form.$setSubmitted();
33215
33216            if (vm.form.$valid) {
33217                if ($scope.onSave) {
33218                    $scope.onSave($scope.widgetRow);
33219                }
33220            }
33221        }
33222
33223        vm.onCancel = function () {
33224            if ($scope.onCancel) {
33225                $scope.onCancel();
33226            }
33227        }
33228    }
33229})();
33230;
33231(function () {
33232    'use strict';
33233
33234    angular
33235        .module('app.directives')
33236        .directive('widgetRowSettings', widgetRowSettings)
33237
33238    widgetRowSettings.$inject = [];
33239
33240    function widgetRowSettings() {
33241        return {
33242            restrict: 'E',
33243            scope: {
33244                widgetRow: '=',
33245                onCancel: '=',
33246                onSave: '='
33247            },
33248            templateUrl: 'public/v2/app/core/directives/widget/row/widget-row-settings.tpl.html',
33249            controller: 'WidgetRowSettingsWidgetController',
33250            controllerAs: 'widgetRowSettings'
33251        };
33252    }
33253})();;
33254(function () {
33255    'use strict';
33256
33257    angular
33258        .module('app.directives')
33259        .controller('WidgetRowToolbarController', WidgetRowToolbarController);
33260
33261    WidgetRowToolbarController.$inject = ['$scope', 'WebsiteEditorService', '$localStorage', 'SecurityService'];
33262
33263    function WidgetRowToolbarController($scope, websiteEditorService, $localStorage, securityService) {
33264        var vm = this;
33265        vm.widgetRow = $scope.widgetRow;
33266        vm.displaySettingsWindow = false;
33267        vm.firstRow = $scope.firstRow
33268
33269        vm.getName = function(names) {
33270            const name = _.find(names, function(name) {
33271                return name.culture === $localStorage.currentLanguage.culture;
33272            });
33273            if (name && name.text) {
33274                return name.text;
33275            }
33276            return "";
33277        };
33278
33279        vm.showSettings = function () {            
33280            vm.displaySettingsWindow = !vm.displaySettingsWindow;
33281        };
33282
33283        vm.onSettingsSave = function (widgetRow) {            
33284            var row = _.find(page.rows, { uuid: vm.widgetRow.rowId });
33285            row.padding = widgetRow.padding;
33286            row.fullWidth = widgetRow.fullWidth;
33287            row.backgroundTransparent = widgetRow.backgroundTransparent;
33288            row.backgroundColor = widgetRow.backgroundColor;
33289            row.backgroundImage = widgetRow.backgroundImage;
33290            row.borderWidth = widgetRow.borderWidth;
33291            row.borderColor = widgetRow.borderColor;
33292            row.borderRadius = widgetRow.borderRadius;
33293            row.videoBackground = widgetRow.videoBackground;
33294            row.verticalAlign = widgetRow.verticalAlign;
33295            row.alignToTop = widgetRow.alignToTop;
33296            vm.save();
33297            vm.displaySettingsWindow = false;
33298        }
33299
33300        vm.closeSettings = function () {            
33301            var row = _.find(page.rows, { uuid: vm.widgetRow.rowId });
33302            
33303            $scope.widgetRow.padding = row.padding;
33304            $scope.widgetRow.fullWidth = row.fullwidth;
33305            $scope.widgetRow.backgroundTransparent = row.backgroundTransparent;
33306            $scope.widgetRow.backgroundColor = row.backgroundColor;
33307            $scope.widgetRow.backgroundImage = row.backgroundImage;
33308            $scope.widgetRow.borderWidth = row.borderWidth;
33309            $scope.widgetRow.borderColor = row.borderColor;
33310            $scope.widgetRow.borderRadius = row.borderRadius;
33311            $scope.widgetRow.verticalAlign = row.verticalAlign;
33312            $scope.widgetRow.alignToTop = row.alignToTop;
33313            vm.displaySettingsWindow = false;
33314        };
33315
33316        vm.save = function (options) {
33317            websiteEditorService.updatePage(__solutionId__, __pageId__, page, options)
33318                .then(function (response) {
33319                    vm.showModal = false;
33320                })
33321                .catch(function (error) {
33322                    bugsnag.notify(error);
33323                });
33324        };
33325
33326        vm.editRowAccess = function () {
33327            return securityService.getAccess().editRow;
33328        }
33329
33330        vm.moveRowAccess = function () {
33331            return securityService.getAccess().moveRow;
33332        }
33333        
33334        vm.deleteRowAccess = function () {
33335            return securityService.getAccess().deleteRow;
33336        }
33337    }
33338})();;
33339(function () {
33340    'use strict';
33341
33342    angular
33343        .module('app.directives')
33344        .directive('widgetRowToolbar', WidgetRowToolbar)
33345
33346    WidgetRowToolbar.$inject = ['$compile', '$rootScope'];
33347
33348    function WidgetRowToolbar($compile, $rootScope) {
33349        return {
33350            restrict: 'E',
33351            scope: {                
33352                widgetRow: '=',
33353            },
33354            templateUrl: 'public/v2/app/core/directives/widget/row/toolbar/widget-row-toolbar.tpl.html',
33355            controller: 'WidgetRowToolbarController',
33356            controllerAs: 'widgetRowToolbar',
33357            link: function (scope, element, attribute, controller) {
33358                var vm = controller;
33359
33360                vm.move = function (direction) {
33361                    var rowContainer = element.closest('.widget-row-list');
33362                    var row = element.closest('.widget-row');
33363                    
33364                    var allRows = angular.element(rowContainer).find('.widget-row');
33365
33366                    //// Get the row index.
33367                    //// TODO Do the same to enabled/disabled arrows in toolbar.
33368                    var rowIndex = _.findIndex(allRows, function (row) {
33369                        return row.attributes.getNamedItem('row-id').value.indexOf(scope.widgetRow.rowId) !== -1;
33370                    });
33371                     
33372                    if ((rowIndex > 0) ||
33373                        (rowIndex < allRows.length - 1)) {
33374                        // Get the widget to move.
33375                        var rowToMove = allRows[rowIndex];
33376
33377                        switch (direction) {
33378                            case 'up':                                
33379                                swapWidgetFromSectionLayout(scope.widgetRow.rowId, angular.element(allRows[rowIndex - 1]).attr('row-id').replace(/'/g, ''));
33380                                angular.element(allRows[rowIndex - 1]).before(angular.element(rowToMove));
33381
33382                                break;
33383
33384                            case 'down':
33385                                swapWidgetFromSectionLayout(scope.widgetRow.rowId, angular.element(allRows[rowIndex + 1]).attr('row-id').replace(/'/g, ''));
33386                                angular.element(allRows[rowIndex + 1]).after(angular.element(rowToMove));   
33387
33388                                break;
33389
33390                        }
33391
33392                        // Save the current layout.
33393                        vm.save();
33394                    }
33395                };
33396
33397                vm.showConfirm = function () {                    
33398                    element.find('#confirmationWindow').modal('show');                    
33399                }
33400
33401                vm.showEdit = function () {
33402                    element.find(`#editWindow-${scope.widgetRow}`).modal('show');
33403                }
33404
33405
33406                vm.onDelete = function () {
33407                    _.remove(page.rows, { uuid: vm.widgetRow.rowId });
33408
33409                    var modal = element.find('#confirmationWindow').modal('hide');
33410                    
33411                    modal.on('hidden.bs.modal', function (e) {
33412                        modal.modal('dispose');
33413                        element.closest('.widget-row').remove();                    
33414                    })
33415
33416                    modal.find('#confirmationWindow').modal('hide')
33417                    
33418                    vm.save();
33419                }
33420
33421            }
33422        };
33423    }
33424     
33425    function swapWidgetFromSectionLayout(row1, row2) {
33426        var rows = page.rows
33427        var rowIndex1 = findRowIndex(rows, row1);
33428        var rowIndex2 = findRowIndex(rows, row2);
33429        
33430        var temp = rows[rowIndex1];
33431        rows[rowIndex1] = rows[rowIndex2];
33432        rows[rowIndex2] = temp;
33433    }
33434
33435    function findRowIndex(rows, uuid) {
33436        return _.findIndex(rows, function (row) {            
33437            return row.uuid === uuid;
33438        });
33439    }
33440})();;
33441(function () {
33442    'use strict';
33443
33444    angular
33445        .module('app.directives')
33446        .controller('WidgetRowContainerController', WidgetRowContainerController);
33447
33448    WidgetRowContainerController.$inject = ['$rootScope', '$scope', '$localStorage', 'WebsiteEditorService', 'PlanService', 'SecurityService'];
33449
33450    function WidgetRowContainerController($rootScope, $scope, $localStorage, websiteEditorService, planService, securityService) {
33451        var vm = this;
33452
33453        vm.isEditMode = false;
33454
33455
33456        $scope.$watch(function () { return websiteEditorService.isEditMode(); }, function (newVal) {
33457            if (newVal === undefined) return;
33458
33459            vm.isEditMode = newVal;
33460        }, true);
33461
33462        vm.save = function (options) {
33463            websiteEditorService.updatePage(__solutionId__, __pageId__, page, options)
33464                .then(function (response) {                    
33465                    vm.showModal = false;
33466                })
33467                .catch(function (error) {
33468                    bugsnag.notify(error);
33469                });
33470        };
33471
33472        vm.addRowAccess = function () {
33473            return securityService.getAccess().addRow;
33474        }
33475    }
33476})();
33477;
33478(function () {
33479    'use strict';
33480
33481    angular
33482        .module('app.directives')
33483        .directive('widgetRowContainer', widgetRowContainer);
33484
33485    widgetRowContainer.$inject = ['$document', '$compile', 'GuidService',];
33486    
33487    function widgetRowContainer($document, $compile, guidService) {
33488        return {
33489            restrict: 'E',           
33490            templateUrl: 'public/v2/app/core/directives/widget/row/container/widget-row-container.tpl.html',
33491            controller: 'WidgetRowContainerController',
33492            controllerAs: 'widgetRowContainer',      
33493            scope: {
33494                rowId: '='
33495            },
33496            transclude: true,
33497            replace: true,
33498            link: function (scope, element, attribute, vm, transclude) {                
33499                console.log(page);
33500                vm.addRow = function (widget) {                    
33501                    // Get the section.                    
33502                    var newSection = { uuid: guidService.getGuid(), widgets: [], md: 12 };
33503                    var newRowId = guidService.getGuid();                    
33504                    var pageRow = _.find(page.rows, { uuid: scope.rowId });
33505                    page.rows.push({ sections: [newSection], uuid: newRowId });
33506
33507
33508                    var row = angular.element(`<widget-row row-id="'${newRowId}'" class=\"page-content position-relative\">`);
33509                    var section = angular.element(`<widget-section id="${newSection.uuid}" section-id="'${newSection.uuid}'" class="col-md-${newSection.md}">`);
33510                    var widgetZone = angular.element(`<widget-zone section="'${newSection.uuid}'"></widget-zone>`);
33511
33512                    var newScope = scope.$new(true);                    
33513
33514                    section.append(widgetZone);
33515                    row.append(section);
33516
33517                    element.find('.widget-row-list').append($compile(row)(newScope));
33518                                                            
33519                    vm.save();
33520                };
33521            }
33522        };
33523    }
33524})();;
33525(function () {
33526    'use strict';
33527
33528    angular
33529        .module('app.directives')
33530        .controller('WidgetSettingsController', WidgetSettingsController);
33531
33532    WidgetSettingsController.$inject = ['$q', '$scope', '$localStorage', 'StatisticService', 'TextService'];
33533
33534    function WidgetSettingsController($q, $scope, $localStorage, statisticService, textService) {
33535        var vm = this;
33536        vm.widget = angular.fromJson(widgets[$scope.widget]);
33537
33538        // Initialise the model with widget parameters definition.
33539        vm.model = {};
33540        vm.data = {};
33541
33542        for (var parameter in vm.widget.parameters) {
33543            // TODO Support section
33544            switch (vm.widget.parameters[parameter].type) {
33545                case 'arrayOfImages':
33546                    vm.model[vm.widget.parameters[parameter].id] = angular.fromJson(vm.widget.parameters[parameter].value.replace(/'/g, '"'));
33547                    vm.model[`${vm.widget.parameters[parameter].id}Url`] = '';
33548                    break;
33549
33550                case 'checkbox':
33551                    vm.model[vm.widget.parameters[parameter].id] = (vm.widget.parameters[parameter].value === 'true');
33552                    break;
33553
33554                case 'short':
33555                    vm.model[vm.widget.parameters[parameter].id] = parseInt(vm.widget.parameters[parameter].value);
33556                    break;
33557
33558                case 'text':
33559                case 'tiktokAccount':
33560                case 'instagramAccount':
33561                case 'facebookAccount':
33562                case 'facebookPage':
33563                    vm.model[vm.widget.parameters[parameter].id] = vm.widget.parameters[parameter].value;
33564                    break;
33565
33566                case 'ckeditor':
33567                    vm.model[vm.widget.parameters[parameter].id] = vm.widget.parameters[parameter].value;
33568                    break;
33569
33570                case 'seasonDivisionSelect':
33571                    if (vm.widget.parameters[parameter].value !== 'default') {
33572                        vm.model[vm.widget.parameters[parameter].id] = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\\\\\'/g, "\\\"").replace(/'/g, '"'));
33573                    } else {
33574                        vm.model[vm.widget.parameters[parameter].id] = vm.widget.parameters[parameter].value;
33575                    }
33576                    break;
33577
33578                case 'multipleImageUpload':
33579                case 'columnsDisplay':
33580                case 'columnsDisplayList':
33581                case 'tagsinput':
33582                case 'border':
33583                case 'font':
33584                case 'templateItems':
33585                case 'headerBarCustomization':
33586                case 'html':
33587                case 'filters':
33588                    vm.model[vm.widget.parameters[parameter].id] = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\\\\\'/g, "\\\"").replace(/'/g, '"'));
33589                    break;
33590
33591                case 'html-admin':
33592                case 'faqEditor':
33593                case 'html-admin-translatable':
33594                    vm.model[vm.widget.parameters[parameter].id] = angular.fromJson(unescape(vm.widget.parameters[parameter].value));
33595                    break;                    
33596
33597                default:
33598                    vm.model[vm.widget.parameters[parameter].id] = vm.widget.parameters[parameter].value;
33599                    break;
33600            }
33601        }
33602
33603        vm.language = $scope.language;
33604
33605        vm.onUpdateLanguage = function (language) {
33606            vm.language = language;
33607        }
33608
33609        vm.addImage = function (parameterId) {
33610            // Push an empty slut to add an image.
33611            vm.model[parameterId].push({ url: vm.model[`${vm.widget.parameters[parameter].id}Url`] });
33612
33613            // Clear the input field.
33614            vm.model[`${vm.widget.parameters[parameter].id}Url`] = '';
33615        };
33616
33617        vm.removeImage = function (parameterId, $index) {
33618            vm.model[parameterId].splice($index, 1);
33619        };
33620
33621        vm.checkColumnVisible = function (column) {
33622            column.visible = !column.visible;
33623        };
33624
33625        //Functions to execute before saving configuration (like image upload)
33626        vm.beforeSave = {}
33627
33628        vm.save = function () {
33629            if (vm.beforeSave.uploadImage) {
33630                vm.uploading = true;
33631                var images = _.map(vm.beforeSave.uploadImage, function (image) { return image });
33632                $q.all(images).then(onSave);
33633                vm.beforeSave = {} // Reset functions
33634            } else {
33635                onSave();
33636            }
33637        };
33638
33639        function onSave() {
33640            vm.form.$setSubmitted();
33641
33642            if (vm.form.$valid) {
33643                // Transform each array parameters to string.
33644                var index = 0;
33645                for (parameter in vm.model) {
33646                    if (angular.isArray(vm.model[parameter]) || angular.isObject(vm.model[parameter])) {
33647                        var type = vm.widget.parameters[index].type;
33648                        if (type == 'faqEditor' || type == 'html-admin') {
33649                            var value = angular.toJson(vm.model[parameter]);
33650                            value = value.replace(/'/g, escape("'"));
33651                            value = value.replace(/"/g, escape('"'));
33652                            value = value.replace(/\\/g, escape('\\'));
33653                            vm.model[parameter] = value;
33654                        }
33655                        else if (type === 'html-admin-translatable') {
33656                            var data = vm.model[parameter];
33657                            data.data = textService.btoa(angular.toJson(data.data));
33658                            var value = angular.toJson(data);
33659                            vm.model[parameter] = value;
33660                        }
33661                        else {
33662                            vm.model[parameter] = angular.toJson(vm.model[parameter]).replace(/\\\"/g, '\\\\\'').replace(/"/g, '\'')
33663                        }
33664                    }
33665                    index++;
33666                }
33667
33668                // Propagate the new values to the widget.
33669                $scope.$emit(`onParametersChange-${$scope.widget}`, vm.model);
33670            }
33671
33672            vm.uploading = false;
33673            $scope.onSaveSettings();
33674        }
33675    }
33676})();
33677;
33678(function () {
33679    'use strict';
33680
33681    angular
33682        .module('app.directives')
33683        .directive('widgetSettings', widgetSettings)
33684
33685    widgetSettings.$inject = ['$compile', '$localStorage', 'GuidService', 'TemplateService', 'ListService'];
33686
33687    function widgetSettings($compile, $localStorage, guidService, templateService, listService) {
33688        return {
33689            restrict: 'E',
33690            scope: {
33691                widget: '=',
33692                onSaveSettings: '&onSave',
33693                onCancelSettings: '&onCancel'
33694            },
33695            templateUrl: 'public/v2/app/core/directives/widget/settings/widget-settings.tpl.html',
33696            controller: 'WidgetSettingsController',
33697            controllerAs: 'widgetSettings',
33698            link: function (scope, element, attributes, controller) {
33699                var vm = controller;
33700
33701                function getName(names, culture) {
33702                    return angular.isUndefinedOrNull(names)
33703                        ? ''
33704                        : _.find(names, function (name) {
33705                            return name.culture === culture;
33706                        }).text;
33707                }
33708
33709                function getProperties(properties) {
33710                    var obj = {};
33711                    if (properties) {
33712                        properties.forEach(function (item) {
33713                            obj[item.key] = item.value;
33714                        });
33715                    }
33716                    return obj;
33717                }
33718
33719                function renderInput(parameter, sportId) {
33720                    var parameterId = parameter.id;
33721                    var parameterName = getName(parameter.name, $localStorage.currentLanguage.culture);
33722                    var typeOfInput = getTypeOfInput(parameter.type);
33723                    var required = isRequired(parameter) === true ? 'required' : '';
33724                    var properties = getProperties(parameter.properties);
33725
33726                    // Render the input control.
33727                    switch (typeOfInput) {
33728                        case 'checkbox':
33729                            inputsToRender = `
33730                                <div class="form-group form-check">
33731                                    <input type="${typeOfInput}" name="widgetSettings.model.${parameterId}" ng-model="widgetSettings.model.${parameterId}" id="${parameterId}" class="form-check-input"></input>
33732                                    <label for="${parameterId}" class="form-check-label">${parameterName}</label>`;
33733                            break;
33734
33735                        case 'number':
33736                            var max = getValidation(parameter, 'max');
33737                            var min = getValidation(parameter, 'min');
33738
33739                            inputsToRender = `
33740                                <div class="form-group">
33741                                    <label for="${parameterId}">${parameterName}</label>
33742                                    <input type="${typeOfInput}" name="widgetSettings.model.${parameterId}" ng-model="widgetSettings.model.${parameterId}" class="form-control" ${(max ? `max="${max.value}"` : '')} ${min ? `min="${min.value}"` : ''} ${required}></input>`;
33743                            break;
33744                        case 'multipleSeasonsSelect':
33745                            inputsToRender = `
33746                                <div class="form-group">
33747                                    <label for="${parameterId}">${parameterName}</label>
33748                                    <multiple-seasons-select id="${parameterId}" parameter-name="${parameterId}" ng-model="widgetSettings.model"></multiple-seasons-select>
33749                            `;
33750                            break;
33751
33752                        case 'tieBreakersSelect':
33753                            inputsToRender = `
33754                                <div class="form-group">
33755                                    <label for="${parameterId}">${parameterName}</label>
33756                                    <tie-breakers-select sport-id="${sportId}" id="${parameterId}" parameter-name="${parameterId}" ng-model="widgetSettings.model"></tie-breakers-select>
33757                            `;
33758                            break;
33759                        case 'text':
33760                        case 'url':
33761                            inputsToRender = `
33762                                <div class="form-group">
33763                                    <label for="${parameterId}">${parameterName}</label>
33764                                    <input type="${typeOfInput}" name="widgetSettings.model.${parameterId}" ng-model="widgetSettings.model.${parameterId}" class="form-control" ${required}></input>`;
33765                            break;
33766                        case 'ckeditor':
33767                            inputsToRender = `
33768                                <div class="form-group">
33769                                    <label>${parameterName}</label>
33770                                    <ckeditor ng-model="widgetSettings.model.${parameterId}"></ckeditor>
33771                            `;
33772                            break;
33773                        case 'arrayOfImages':
33774                            inputsToRender = `
33775                                <div class="form-group">
33776                                    <label for="${parameterId}">${parameterName}</label>
33777                                    <div class="input-group mb-3">
33778                                        <input type="text" 
33779                                            name="widgetSettings.model.${parameterId}Url" 
33780                                            ng-model="widgetSettings.model.${parameterId}Url" 
33781                                            class="form-control" placeholder="Lien de l'image"></input>
33782                                            <!-- ADD URL VALIDATION -->
33783                                        <div class="input-group-append">
33784                                            <button type="button" 
33785                                                ng-click="widgetSettings.addImage('${parameterId}')"
33786                                                ng-disabled="widgetSettings.model.${parameterId}Url.length === 0"
33787                                                translate="directives.widget.settings.buttons.add"
33788                                                class="btn btn-outline-primary"></button>
33789                                        </div>
33790                                    </div>            
33791                                    <!-- ADD RANGE VALIDATION -->                        
33792                                    <ul class="image-list">
33793                                        <li ng-repeat="image in widgetSettings.model.${parameterId}">
33794                                            <a ng-href="{{image.url}}" target="_blank">{{image.url}}</a>
33795                                            <a href ng-click="widgetSettings.removeImage('${parameterId}', $index)">
33796                                                <span class="mdi mdi-delete-forever"></span>    
33797                                            </a>
33798                                        </li>
33799                                    </ul>`;
33800
33801                            break;
33802
33803                        case 'columnsDisplay':
33804                            var columnsId = null;
33805                            if (properties.columnsId) {
33806                                columnsId = properties.columnsId;
33807                            }
33808
33809                            var columnsIdType = null;
33810                            if (properties.columnsIdType) {
33811                                columnsIdType = properties.columnsIdType;
33812                            }
33813
33814                            var showMinimumStats = false;
33815                            if (properties.showMinimumStats) {
33816                                showMinimumStats = properties.showMinimumStats;
33817                            }
33818
33819                            inputsToRender = `
33820                                <div class="form-group">
33821                                    <label for="${parameterId}">${parameterName}</label>
33822                                    <columns-display-select id="${parameterId}" show-minimum-stats="${showMinimumStats}" sport-id="${sportId}" category="'${properties.category}'" type="'${properties.type}'" ng-model="widgetSettings.model.${parameterId}" columns-id="${columnsId}" columns-id-type="'${columnsIdType}'"></columns-display-select>
33823                            `;
33824                            break;
33825
33826                        case 'columnsDisplayList':
33827                            inputsToRender = `
33828                                <div class="form-group">
33829                                    <label for="${parameterId}">${parameterName}</label>
33830                                    <columns-display-select-list id="${parameterId}" sport-id="${sportId}" type="'${properties.type}'" show-player-properties="${properties.showPlayerProperties}" ng-model="widgetSettings.model.${parameterId}"></columns-display-select-list>
33831                            `;
33832                            break;
33833
33834                        case 'fileUpload':
33835                            inputsToRender = `<div class="form-group">`;
33836                            if (parameterName) {
33837                                inputsToRender += `<label for="${parameterId}">${parameterName}</label>`
33838                            }
33839
33840                            inputsToRender += `<file-upload before-save="widgetSettings.beforeSave" widget="${scope.widget}" id="${parameterId}" ng-model="widgetSettings.model.${parameterId}"></file-upload>`;
33841                            break;
33842
33843                        case 'multipleImageUpload':
33844                            inputsToRender = `<div class="form-group"><multiple-image-upload ng-model="widgetSettings.model.${parameterId}" max="${properties.max}"></multiple-image-upload>`;
33845                            break;
33846
33847                        case 'seasonSelect':
33848                            inputsToRender = `
33849                            <div class="form-group">
33850                            <label for="${parameterId}">${parameterName}</label>
33851                            <season-select id="${parameterId}" parameter-name="${parameterId}" ng-model="widgetSettings.model"></season-select>`;
33852                            break;
33853
33854                        case 'seasonDivisionSelect':
33855                            inputsToRender = `
33856                                <div class="form-group">
33857                                <season-division-select id="${parameterId}" ng-model="widgetSettings.model.${parameterId}"></season-division-select>`;
33858                            break;
33859
33860                        case 'tiktokAccount':
33861                            inputsToRender = `
33862                                <div class="form-group">
33863                                  <label for="${parameterId}">${parameterName}</label>
33864                                  <tiktok-account id="${parameterId}" ng-model="widgetSettings.model.${parameterId}" widget="${scope.widget}"></tiktok-account>`;
33865                            break;
33866
33867                        case 'instagramAccount':
33868                            inputsToRender = `
33869                                <div class="form-group">
33870                                  <label for="${parameterId}">${parameterName}</label>
33871                                  <instagram-account id="${parameterId}" ng-model="widgetSettings.model.${parameterId}" widget="${scope.widget}"></instagram-account>`;
33872                            break;
33873
33874                        case 'facebookAccount':
33875                            inputsToRender = `
33876                                <div class="form-group">
33877                                  <label for="${parameterId}">${parameterName}</label>
33878                                  <facebook-account id="${parameterId}" ng-model="widgetSettings.model.${parameterId}" widget="${scope.widget}"></facebook-account>`;
33879                            break;
33880
33881                        case 'facebookPage':
33882                            inputsToRender = `
33883                                <div class="form-group">                                  
33884                                  <facebook-page parameter-name="${parameterName}" parameter-id="${parameterId}" ng-model="widgetSettings.model" widget="${scope.widget}"></facebook-page>`;
33885                            break;
33886
33887                        case 'scheduleView':
33888                            inputsToRender = `
33889                            <div class="form-group">
33890                                <label for="${parameterId}">${parameterName}</label>
33891                                <calendar-type-select id="${parameterId}" ng-model="widgetSettings.model.${parameterId}"></calendar-type-select>`;
33892                            break;
33893
33894                        case "statsSelect":
33895                            inputsToRender = `
33896                            <div class="form-group">
33897                                <label for="${parameterId}">${parameterName}</label>
33898                                <stats-select id="${parameterId}" sport-id="${sportId}" category-id="${properties.categoryId}" ng-model="widgetSettings.model.${parameterId}"></stats-select>`;
33899                            break;
33900
33901                        case "tagsinput":
33902                            var guid = guidService.getGuid();
33903                            var options = '';
33904                            vm.model[parameterId].forEach(function (tag) {
33905                                options += `<option value="${tag}">${tag}</option>`
33906                            })
33907                            inputsToRender = `<div class="form-group">
33908                                <label for="${parameterId}">${parameterName}</label>
33909                                <select multiple data-role="tagsinput" id="${guid}" type="${typeOfInput}" name="widgetSettings.model.${parameterId}" ng-model="widgetSettings.model.${parameterId}" class="form-control" ${required}>${options}</select>
33910                                <script>
33911                                    $("#${guid}").tagsinput('refresh');
33912                                </script>
33913                            `;
33914                            break;
33915
33916                        case "simpleSelect":
33917                            inputsToRender = `
33918                            <div class="form-group">
33919                                <label for="${parameterId}">${parameterName}</label>
33920                                <simple-select id="${parameterId}" list="${properties.list}" ng-model="widgetSettings.model.${parameterId}"></stats-select>`;
33921                            break;
33922
33923                        case "color":
33924                            inputsToRender = `
33925                            <div class="form-group">
33926                                <label for="${parameterId}">${parameterName}</label>
33927                                <div class="input-group">
33928                                    <div class="input-group-prepend" ng-style="{ 'background-color': widgetSettings.model.${parameterId} }" style="background-color: rgb(75, 74, 154);"></div>
33929                                    <input name="widgetSettings.model.${parameterId}" color-picker color-picker-model="widgetSettings.model.${parameterId}" class="form-control" />
33930                                </div>
33931                            `;
33932                            break;
33933
33934                        case "border":
33935                            vm.blurInput = function (value) {
33936                                if (!vm.model[parameterId][value]) {
33937                                    vm.model[parameterId][value] = 0;
33938                                }
33939                            }
33940
33941                            inputsToRender = `
33942                            <div class="form-group">
33943                                <label for="${parameterId}">${parameterName}</label>
33944                                <div>
33945                                    <div class="d-flex">
33946                                        <div class="number-group">
33947                                            <label translate="directives.widget.settings.border.parameters.width"></label>
33948                                            <input type="number" name="widgetSettings.model.${parameterId}" ng-model="widgetSettings.model.${parameterId}['width']" ng-blur="widgetSettings.blurInput('width')" class="form-control" />
33949                                        </div>
33950                                        <div class="flex-fill mx-2">
33951                                            <label translate="directives.widget.settings.border.parameters.color"></label>
33952                                            <div class="input-group">
33953                                                <div class="input-group-prepend" ng-style="{ 'background-color': widgetSettings.model.${parameterId}['color'] }" style="background-color: rgb(75, 74, 154);"></div>
33954                                                <input name="widgetSettings.model.${parameterId}" color-picker color-picker-model="widgetSettings.model.${parameterId}['color']" class="form-control" />
33955                                            </div>
33956                                        </div>  
33957                                        <div class="number-group">
33958                                            <label translate="directives.widget.settings.border.parameters.radius"></label>
33959                                            <input type="number" min="0" max="40" ng-model="widgetSettings.model.${parameterId}['radius']" ng-blur="widgetSettings.blurInput('radius')" name="widgetSettings.model.${parameterId}" class="form-control" />
33960                                        </div>
33961                                    </div>
33962                                    <div ng-show="widgetSettings.form.$submitted || widgetSettings.form[\'widgetSettings.model.${parameterId}\'].$touched">
33963                                        <span ng-show="widgetSettings.form[\'widgetSettings.model.${parameterId}\'].$error.max || widgetSettings.form[\'widgetSettings.model.${parameterId}\'].$error.min" class="ng-invalid error" >{{ 'directives.widget.settings.border.validation.radius' | translate: { min: 0, max: 40 } }}</span>
33964                                    </div>
33965                                </div>
33966                            `;
33967                            break;
33968                        case "template":
33969                            var listProperty = properties.list;
33970                            var templateParameter = parameter;
33971                            var templateItemsParameter = properties.items;
33972
33973                            vm.data[parameterId] = { templateList: [] };
33974
33975                            templateService.getCardWidgetTemplates(__solutionId__).then(function (templates) {
33976                                var templateList = [];
33977                                var filteredTemplates = _.filter(templates.data, { type: listProperty });
33978
33979                                filteredTemplates.forEach(function (template) {
33980                                    templateList.push(angular.fromJson(template.value))
33981                                })
33982
33983                                vm.data[parameterId] = { templateList: templateList };
33984                            });
33985
33986                            inputsToRender = `
33987                                <div class="form-group">
33988                                    <label for="${parameterId}">${parameterName}</label>
33989                                    <div style="overflow-x: scroll;white-space: nowrap;">
33990                                        <img ng-repeat="template in widgetSettings.data.${parameterId}.templateList" ng-class="{ 'template-active': widgetSettings.model.${parameterId} == template.id }" ng-click="widgetSettings.model.${parameterId} = template.id; widgetSettings.data.${templateItemsParameter}.templateId = template.id" ng-src="{{template.image}}"/>
33991                                    </div>
33992                            `;
33993
33994                            break;
33995                        case "templateItems":
33996                            var templateParameterId = properties.templateParameter;
33997                            var templateParameter = _.find(widget.parameters, { id: templateParameterId });
33998                            var selectedTemplate = templateParameter;
33999                            var listProperty = properties.listParameter;
34000                            var list = '';
34001
34002                            if (listProperty) {
34003                                list = `list="widgetSettings.data.${listProperty}.list" selected-list="widgetSettings.model.${listProperty}"`;
34004                            }
34005
34006                            vm.data[parameterId] = { templateId: templateParameter.value, getTemplate: function () { return _.find(vm.data[templateParameterId].templateList, { id: vm.data[parameterId].templateId }) } };
34007
34008                            inputsToRender = `<div class="form-group">
34009                                 <label for="${parameterId}">${parameterName}</label>
34010                                <template-editor ${list} template="widgetSettings.data.${parameterId}.getTemplate()" template-items="widgetSettings.model.${parameterId}" before-save="widgetSettings.beforeSave"></template-editor>`;
34011                            break;
34012
34013                        case "list":
34014                            listService.getListsBySolutionId(__solutionId__).then(function (lists) {
34015                                vm.data[parameterId].list = lists.data;
34016                            })
34017
34018                            vm.data[parameterId] = { list: [] };
34019
34020                            inputsToRender = `<div class="form-group">
34021                                 <label for="${parameterId}">${parameterName}</label>
34022                                 <select ng-model="widgetSettings.model.${parameterId}" class="form-control">
34023		                            <option ng-repeat="item in widgetSettings.data['${parameterId}'].list track by $index" value="{{item.id}}">{{item.name}}</option>
34024                        	     </select>`;
34025                            break;
34026                        case 'filters':
34027                            var listProperty = properties.listParameter;
34028                            inputsToRender = `<div class="form-group">
34029                                 <label for="${parameterId}">${parameterName}</label>
34030                                 <div>
34031                                    <list-filters filters="widgetSettings.model.${parameterId}" list="widgetSettings.data.${listProperty}.list" selected-list="widgetSettings.model.${listProperty}"></list-filters>
34032                                </div>`
34033                            break;
34034                        case "headerBarCustomization":
34035                            inputsToRender = `<div class="form-group"><header-bar-customization ng-model="widgetSettings.model.${parameterId}"></header-bar-customization>`;
34036                            break;
34037
34038                        case "formSelect":
34039                            inputsToRender = `<div class="form-group">
34040                                <label for="${parameterId}">${parameterName}</label>
34041                                <form-select id="${parameterId}" parameter-name="${parameterId}" ng-model="widgetSettings.model"></form-select>`;
34042                            break;
34043
34044                        case "faqEditor":
34045                            inputsToRender = `<div class="form-group">
34046                                <faq-editor language="widgetSettings.language" sections="widgetSettings.model.${parameterId}" ></faq-editor>
34047                            `;
34048                            break;
34049
34050                        case "backgroundPosition":
34051                            inputsToRender = `<div class="form-group">
34052                                <label for="${parameterId}">${parameterName}</label>
34053                                <div class="d-flex flex-column">
34054                                    <div class="d-flex flex-row">
34055                                        <button class="btn m-1" ng-click="widgetSettings.model.${parameterId} = 'top left'" ng-class="{ 'btn-primary': widgetSettings.model.${parameterId} == 'top left'}"><span class="mdi mdi-arrow-top-left"></span></button>
34056                                        <button class="btn m-1" ng-click="widgetSettings.model.${parameterId} = 'top center'" ng-class="{ 'btn-primary': widgetSettings.model.${parameterId} == 'top center'}"><span class="mdi mdi-arrow-up"></span></button>
34057                                        <button class="btn m-1" ng-click="widgetSettings.model.${parameterId} = 'top right'" ng-class="{ 'btn-primary': widgetSettings.model.${parameterId} == 'top right'}"><span class="mdi mdi-arrow-top-right"></span></button>
34058                                    </div>
34059                                    <div class="d-flex flex-row">
34060                                        <button class="btn m-1" ng-click="widgetSettings.model.${parameterId} = 'center left'" ng-class="{ 'btn-primary': widgetSettings.model.${parameterId} == 'center left'}"><span class="mdi mdi-arrow-left"></span></button>
34061                                        <button class="btn m-1" ng-click="widgetSettings.model.${parameterId} = 'center center'" ng-class="{ 'btn-primary': widgetSettings.model.${parameterId} == 'center center'}"><span class="mdi mdi-circle-outline"></span></button>
34062                                        <button class="btn m-1" ng-click="widgetSettings.model.${parameterId} = 'center right'" ng-class="{ 'btn-primary': widgetSettings.model.${parameterId} == 'center right'}"><span class="mdi mdi-arrow-right"></span></button>
34063                                    </div>
34064                                    <div class="d-flex flex-row">
34065                                        <button class="btn m-1" ng-click="widgetSettings.model.${parameterId} = 'bottom left'" ng-class="{ 'btn-primary': widgetSettings.model.${parameterId} == 'bottom left'}"><span class="mdi mdi-arrow-bottom-left"></span></button>
34066                                        <button class="btn m-1" ng-click="widgetSettings.model.${parameterId} = 'bottom center'" ng-class="{ 'btn-primary': widgetSettings.model.${parameterId} == 'bottom center'}"><span class="mdi mdi-arrow-down"></span></button>
34067                                        <button class="btn m-1" ng-click="widgetSettings.model.${parameterId} = 'bottom right'" ng-class="{ 'btn-primary': widgetSettings.model.${parameterId} == 'bottom right'}"><span class="mdi mdi-arrow-bottom-right"></span></button>
34068                                    </div>
34069                                </div>`
34070                            break;
34071                        case "html":
34072                            inputsToRender = `<div class="form-group"><html-widget-editor ng-model="widgetSettings.model.${parameterId}"></html-widget-editor>`;
34073                            break;
34074                        case "html-admin":
34075                            inputsToRender = `<div class="form-group"><html-widget-editor ng-model="widgetSettings.model.${parameterId}" is-admin='true'></html-widget-editor>`;
34076                            break;
34077                        case "html-admin-translatable":
34078                            inputsToRender = `<div class="form-group"><html-widget-editor-translatable language="widgetSettings.language" ng-model="widgetSettings.model.${parameterId}" is-admin='true'></html-widget-editor>`;
34079                            break;
34080
34081                        case "font":
34082                            vm.blurInput = function (value) {
34083                                if (!vm.model[parameterId][value]) {
34084                                    vm.model[parameterId][value] = 0;
34085                                }
34086                            }
34087
34088                            inputsToRender = `
34089                            <div class="form-group">
34090                                <label for="${parameterId}">${parameterName}</label>
34091                                <div>
34092                                    <div class="d-flex">
34093                                        <div class="number-group">
34094                                            <label translate="directives.widget.settings.font.parameters.size"></label>
34095                                            <input type="number" name="widgetSettings.model.${parameterId}" ng-model="widgetSettings.model.${parameterId}['size']" ng-blur="widgetSettings.blurInput('size')" class="form-control" />
34096                                        </div>
34097                                        <div class="flex-fill mx-2">
34098                                            <label translate="directives.widget.settings.font.parameters.color"></label>
34099                                            <div class="input-group">
34100                                                <div class="input-group-prepend" ng-style="{ 'background-color': widgetSettings.model.${parameterId}['color'] }" style="background-color: rgb(75, 74, 154);"></div>
34101                                                <input name="widgetSettings.model.${parameterId}" color-picker color-picker-model="widgetSettings.model.${parameterId}['color']" class="form-control" />
34102                                            </div>
34103                                        </div>
34104                                        <div class="number-group mx-2">
34105                                            <label translate="directives.widget.settings.font.parameters.bold"></label>
34106                                            <div class="d-flex justify-content-center align-item-center" style="height: 33px">
34107                                                <input type="checkbox" ng-model="widgetSettings.model.${parameterId}['bold']" name="widgetSettings.model.${parameterId}"  />
34108                                            </div>
34109                                        </div>
34110                                        <div class="number-group mx-2">
34111                                            <label translate="directives.widget.settings.font.parameters.italic"></label>
34112                                            <div class="d-flex justify-content-center align-item-center" style="height: 33px">
34113                                                <input type="checkbox" ng-model="widgetSettings.model.${parameterId}['italic']" name="widgetSettings.model.${parameterId}"  />
34114                                            </div>
34115                                        </div>
34116                                        <div class="number-group mx-2">
34117                                            <label style="white-space: nowrap" translate="directives.widget.settings.font.parameters.underline"></label>
34118                                            <div class="d-flex justify-content-center align-item-center" style="height: 33px">
34119                                                <input type="checkbox" ng-model="widgetSettings.model.${parameterId}['underline']" name="widgetSettings.model.${parameterId}"/>
34120                                            </div>
34121                                        </div>
34122                                    </div>
34123                                </div>
34124                            `;
34125                            break;
34126
34127                    }
34128
34129                    // Check if the parameter have validation.
34130                    if (parameter.validations.length > 0) {
34131                        inputsToRender += `<div ng-show="widgetSettings.form.$submitted || widgetSettings.form[\'widgetSettings.model.${parameterId}\'].$touched">`;
34132
34133                        for (var validation in parameter.validations) {
34134                            // Get the validation type.
34135                            var validationType = parameter.validations[validation].type.toLowerCase();
34136
34137                            // Set the error message. 
34138                            var errorMessage = 'Not set';
34139
34140                            // TODO Use $translate with parameter
34141                            switch (validationType) {
34142                                case 'url':
34143                                    // TODO Add error message
34144                                    errorMessage = 'L\'url est invalide';
34145                                    break;
34146
34147                                case 'required':
34148                                    // TODO Add error message
34149                                    errorMessage = 'Le paramètre est requis';
34150                                    break;
34151
34152                                case 'max':
34153                                    errorMessage = `Doit être plus petit que ${parameter.validations[validation].value}`;
34154                                    break;
34155
34156                                case 'min':
34157                                    errorMessage = `Doit être plus grand que ${parameter.validations[validation].value}`;
34158                                    break;
34159                            }
34160
34161                            inputsToRender += `<span ng-show="widgetSettings.form[\'widgetSettings.model.${parameterId}\'].$error.${validationType}" class="ng-invalid error" translate="">${errorMessage}</span>`;
34162                        }
34163                        inputsToRender += '</div>';
34164                    }
34165
34166                    inputsToRender += '</div>';
34167
34168                    return inputsToRender;
34169                }
34170                // Get widget definition.                
34171                var widget = angular.fromJson(widgets[scope.widget]);
34172
34173                var parametersSection = element.find('.parameters');
34174                var inputsToRender = '';
34175
34176                var groups = _.groupBy(_.filter(widget.parameters, 'group'), 'group');
34177                groups = _.mapValues(groups, function (group) { return { added: false, items: group } })
34178                var parameters = [];
34179                widget.parameters.forEach(function (parameter) {
34180                    if (!parameter.group) {
34181                        parameters.push(parameter);
34182                    }
34183                    else if (!groups[parameter.group].added) {
34184                        parameters.push({ type: 'group', id: parameter.group, items: groups[parameter.group].items, definition: _.find(widget.parameterGroups, { id: parameter.group }), collapsed: true })
34185                        groups[parameter.group].added = true;
34186                    }
34187                })
34188
34189                vm.parameters = parameters;
34190
34191                for (var parameter in parameters) {
34192                    // Check if the parameter is a section.
34193                    if (parameters[parameter].type.toLowerCase() === 'group') {
34194                        // Get the section name.                        
34195                        if (parameters[parameter].definition) {
34196                            var sectionTitle = getName(parameters[parameter].definition.name, $localStorage.currentLanguage.culture);
34197                            inputsToRender += `<div class="collapsible" ng-click="widgetSettings.parameters[${parameter}].collapsed = !widgetSettings.parameters[${parameter}].collapsed">
34198                                    <span>${sectionTitle}</span>
34199                                    <span ng-if="widgetSettings.parameters[${parameter}].collapsed" class="mdi mdi-plus"></span>
34200                                    <span ng-if="!widgetSettings.parameters[${parameter}].collapsed" class="mdi mdi-minus"></span>
34201                                </div>`;
34202                        }
34203
34204                        // Render all the section parameters.
34205                        inputsToRender += `<div ng-if="!widgetSettings.parameters[${parameter}].collapsed">`;
34206                        for (var sectionParameter in parameters[parameter].items) {
34207                            inputsToRender += renderInput(parameters[parameter].items[sectionParameter], widget.sportId);
34208                        }
34209                        inputsToRender += '</div>';
34210
34211                    } else {
34212                        // Render the input control.
34213                        inputsToRender += renderInput(parameters[parameter], widget.sportId);
34214                    }
34215                }
34216
34217                var parametersElement = angular.element(inputsToRender)
34218                parametersSection.append(parametersElement);
34219                $compile(parametersElement)(scope);
34220
34221                scope.onSave = function () {
34222                    if (typeof (scope.onSaveSettings) == 'function') {
34223                        vm.save();
34224                    }
34225                };
34226
34227                scope.onCancel = function () {
34228                    if (typeof (scope.onCancelSettings) == 'function') {
34229                        scope.onCancelSettings();
34230                    }
34231                };
34232
34233                function getTypeOfInput(type) {
34234                    switch (type) {
34235                        case 'arrayOfImages': // boolean ???
34236                            return 'arrayOfImages';
34237
34238                        case 'checkbox': // boolean ???
34239                            return 'checkbox';
34240
34241                        case 'image':
34242                            return 'fileUpload';
34243
34244                        case 'multipleImageUpload':
34245                            return 'multipleImageUpload';
34246
34247                        case 'short': // short
34248                            return 'number';
34249
34250                        case 'url':
34251                            return 'url';
34252
34253                        case 'seasonSelect':
34254                            return 'seasonSelect';
34255
34256                        case 'multipleSeasonsSelect':
34257                            return 'multipleSeasonsSelect';
34258
34259                        case 'tieBreakersSelect':
34260                            return 'tieBreakersSelect';
34261
34262                        case 'seasonDivisionSelect':
34263                            return 'seasonDivisionSelect';
34264
34265                        case 'tiktokAccount':
34266                            return 'tiktokAccount';
34267
34268                        case 'instagramAccount':
34269                            return 'instagramAccount';
34270
34271                        case 'facebookAccount':
34272                            return 'facebookAccount';
34273
34274                        case 'facebookPage':
34275                            return 'facebookPage';
34276
34277                        case 'statsSelect':
34278                            return 'statsSelect';
34279
34280                        case 'scheduleView':
34281                            return 'scheduleView'
34282
34283                        case 'tagsinput':
34284                            return 'tagsinput';
34285
34286                        case 'columnsDisplay':
34287                            return 'columnsDisplay';
34288
34289                        case 'columnsDisplayList':
34290                            return 'columnsDisplayList';
34291
34292                        case 'simpleSelect':
34293                            return 'simpleSelect';
34294
34295                        case 'formSelect':
34296                            return 'formSelect';
34297
34298                        case 'ckeditor':
34299                            return 'ckeditor';
34300                        case 'color':
34301                            return 'color';
34302
34303                        case 'border':
34304                            return 'border';
34305
34306                        case 'font':
34307                            return 'font';
34308
34309                        case 'template':
34310                            return 'template';
34311
34312                        case 'templateItems':
34313                            return 'templateItems';
34314
34315                        case 'list':
34316                            return 'list';
34317
34318                        case 'backgroundPosition':
34319                            return 'backgroundPosition';
34320
34321                        case 'filters':
34322                            return 'filters';
34323
34324                        case 'headerBarCustomization':
34325                            return 'headerBarCustomization';
34326
34327                        case 'html':
34328                            return 'html';
34329
34330                        case 'html-admin':
34331                            return 'html-admin';
34332
34333                        case 'html-admin-translatable':
34334                            return 'html-admin-translatable';
34335
34336                        case 'faqEditor':
34337                            return 'faqEditor';
34338
34339                        default:
34340                            return 'text';
34341                    }
34342                }
34343
34344                function isRequired(parameter) {
34345                    for (var validation in parameter.validations) {
34346                        if (parameter.validations[validation].type === 'required') {
34347                            return true;
34348                        }
34349                    }
34350
34351                    return false;
34352                }
34353
34354                function getValidation(parameter, type) {
34355                    for (var validation in parameter.validations) {
34356                        if (parameter.validations[validation].type === type) {
34357                            return parameter.validations[validation];
34358                        }
34359                    }
34360
34361                    return undefined;
34362                }
34363
34364            }
34365        };
34366    }
34367})();;
34368(function () {
34369    'use strict';
34370
34371    angular
34372        .module('app.directives')
34373        .controller('WidgetContainerController', WidgetContainerController);
34374
34375    WidgetContainerController.$inject = ['$scope', '$localStorage', 'StatisticService'];
34376
34377    function WidgetContainerController($scope, $localStorage, statisticService) {
34378        var vm = this;
34379    }
34380})();
34381;
34382(function () {
34383    'use strict';
34384
34385    angular
34386        .module('app.directives')
34387        .directive('widgetContainer', widgetContainer)
34388
34389    widgetContainer.$inject = ['$compile'];
34390
34391    function widgetContainer($compile) {
34392        return {
34393            restrict: 'E',
34394            scope: {
34395                widget: '='
34396            },
34397            templateUrl: 'public/v2/app/core/directives/widget/container/widget-container.tpl.html',
34398            controller: 'WidgetContainerController',
34399            controllerAs: 'widgetContainer',
34400            link: function (scope, element, attributes, controller) {
34401                var widgetContent = element.find('#widget-container');
34402                var widgetToRender = angular.fromJson(widgets[scope.widget]).edit;
34403
34404                // Render the widget container with the proper directive identifier.
34405                var widgetToCompile = $compile(`<${widgetToRender} widget="\'${scope.widget}\'"></${widgetToRender}>`)(scope);
34406
34407                // Add the DOM element to the zone.
34408                widgetContent.append(widgetToCompile);
34409            }
34410        };
34411    }
34412})();;
34413(function () {
34414    'use strict';
34415
34416    angular
34417        .module('app.directives')
34418        .controller('WidgetToolbarController', WidgetToolbarController);
34419
34420    WidgetToolbarController.$inject = ['$scope', 'WebsiteEditorService', '$localStorage', 'SecurityService'];
34421
34422    function WidgetToolbarController($scope, websiteEditorService, $localStorage, securityService) {
34423        var vm = this;
34424        vm.widget = angular.fromJson(widgets[$scope.widget]);
34425        vm.displaySettingsWindow = false;
34426        vm.editable = isWidgetEditable(vm.widget);
34427        vm.isDataEditable = vm.widget.edit;
34428        vm.isWidgetEditable = isWidgetEditable;
34429        vm.isFullscreen = false;
34430
34431        vm.getName = function(names) {
34432            const name = _.find(names, function(name) {
34433                return name.culture === $localStorage.currentLanguage.culture;
34434            });
34435            if (name && name.text) {
34436                return name.text;
34437            }
34438            return "";
34439        };
34440
34441        vm.showSettings = function() {
34442            vm.displaySettingsWindow = !vm.displaySettingsWindow;
34443        };
34444
34445        vm.saveSettings = function() {
34446            vm.displaySettingsWindow = false;
34447        };
34448
34449        vm.closeSettings = function() {
34450            vm.displaySettingsWindow = false;
34451        };
34452
34453        vm.save = function (options) {
34454            websiteEditorService.updatePage(__solutionId__, __pageId__, options)
34455                .then(function(response) {
34456                    
34457                })
34458                .catch(function(error) {
34459                    bugsnag.notify(error);
34460                });     
34461        };
34462
34463        vm.editWidgetAccess = function () {
34464            return securityService.getAccess().editWidget;
34465        }
34466
34467        vm.moveWidgetAccess = function () {
34468            return securityService.getAccess().moveWidget;
34469        }
34470        
34471        vm.deleteWidgetAccess = function () {
34472            return securityService.getAccess().deleteWidget;
34473        }
34474
34475        vm.scoreboardAccess = function () {
34476            return securityService.getAccess().scoreboard;
34477        }
34478
34479        function isWidgetEditable(widget) {
34480            return ($localStorage.__KreezeeSession__.Session.CurrentUser.IsAdminKreezee && widget.availableKreezeeAdminOnly) || !widget.availableKreezeeAdminOnly;
34481        }
34482    }
34483})();;
34484(function () {
34485    'use strict';
34486
34487    angular
34488        .module('app.directives')
34489        .directive('widgetToolbar', widgetToolbar)
34490
34491    widgetToolbar.$inject = ['$compile', '$rootScope', '$timeout', 'ModalService'];
34492
34493    function widgetToolbar($compile, $rootScope, $timeout, modalService) {
34494        return {
34495            restrict: 'E',
34496            scope: {
34497                section: '=',
34498                widget: '=',
34499                onDelete: '&onDelete'
34500            },
34501            templateUrl: 'public/v2/app/core/directives/widget/toolbar/widget-toolbar.tpl.html',
34502            controller: 'WidgetToolbarController',
34503            controllerAs: 'widgetToolbar',
34504            link: function (scope, element, attribute, controller) {
34505                var vm = controller;
34506                var widgetContainer = element.closest('.widget');
34507                var draggableHandle = element.find('#draggable-handle');
34508                var editModal = null;
34509
34510                $timeout(function () {
34511                    editModal = modalService.init(element.find(`#editWindow-${scope.widget}`));                    
34512                })
34513
34514                draggableHandle[0].onmousedown = function (e) {
34515                    e.target.closest('.widget-container').setAttribute('draggable', 'true');
34516                };
34517
34518                widgetContainer[0].ondragstart = function (e) {
34519                    e.dataTransfer.setData('widget', angular.toJson(scope.widget));
34520                };
34521
34522                widgetContainer[0].ondragend = function (e) {
34523                    e.target.closest('.widget-container').setAttribute('draggable', 'false')
34524                };
34525
34526                vm.move = function (direction) {
34527                    // Get the current section element.
34528                    var section = angular.element.find(`#${scope.section}`);
34529
34530                    // Find all widgets in the current section.
34531                    var widgetsUI = angular.element(section).find('widget');
34532
34533                    // Get the widget index.
34534                    // TODO Do the same to enabled/disabled arrows in toolbar.
34535                    var widgetIndex = _.findIndex(widgetsUI, function (widget) {
34536                        return widget.attributes.getNamedItem('widget').value.indexOf(scope.widget) !== -1;
34537                    });
34538
34539                    if (widgetIndex >= 0 && widgetIndex < widgetsUI.length) {
34540                        // Get the widget to move.
34541                        var widgetToMove = widgetsUI[widgetIndex];
34542
34543                        switch (direction) {
34544                            case 'up':
34545                                if (widgetIndex > 0) {
34546                                    function swapWidgetsTop(widget) {
34547                                        if (vm.isWidgetEditable(widget)) {
34548                                            angular.element(widgetsUI[widgetIndex - 1]).before(angular.element(widgetToMove));
34549                                            return true;
34550                                        }
34551                                        return false;
34552                                    }
34553
34554                                    // Swap the element in section layout variable.
34555                                    swapWidgetFromSectionLayout(scope.section, scope.widget, angular.element(widgetsUI[widgetIndex - 1]).attr('widget').replace(/'/g, ''), swapWidgetsTop);
34556                                }
34557                                break;
34558
34559                            case 'down':
34560                                if (widgetIndex < widgetsUI.length - 1) {
34561                                    function swapWidgetsDown(widget) {
34562                                        if (vm.isWidgetEditable(widget)) {
34563                                            angular.element(widgetsUI[widgetIndex + 1]).after(angular.element(widgetToMove));
34564                                            return true;
34565                                        }
34566                                        return false;
34567                                    }
34568
34569                                    // Swap the element in section layout variable.
34570                                    swapWidgetFromSectionLayout(scope.section, scope.widget, angular.element(widgetsUI[widgetIndex + 1]).attr('widget').replace(/'/g, ''), swapWidgetsDown);
34571                                }
34572                                break;
34573
34574                            case 'right':
34575                            case 'left':
34576                                var sourceSection = scope.section;
34577                                var row = getSectionRow(scope.section);
34578                                var sourceIndex = _.findIndex(row.sections, { uuid: scope.section });
34579                                if (vm.isWidgetEditable(row.sections[sourceIndex].widgets[widgetIndex])) {
34580                                    var destIndex = sourceIndex + (direction == 'right' ? 1 : -1);
34581                                    var destSection = null;
34582
34583                                    if (row.sections.length > destIndex && destIndex >= 0) {
34584                                        destSection = row.sections[destIndex].uuid;
34585                                    }
34586
34587                                    if (sourceSection && destSection) {
34588                                        addWidgetToSectionLayout(destSection, row.sections[sourceIndex].widgets[widgetIndex])
34589                                        removeWidgetFromSectionLayout(sourceSection, scope.widget);
34590
34591                                        var destSectionElement = angular.element.find(`#${destSection}>div`);
34592                                        widgetToMove.remove();
34593                                        destSectionElement[0].prepend(widgetToMove);
34594
34595                                        scope.section = destSection;
34596                                    }
34597                                }
34598
34599                                break;
34600                        }
34601
34602                        // Save the current layout.
34603                        vm.save();
34604                    }
34605                };
34606
34607                vm.onDelete = function () {
34608                    // Check if the widget is lock.
34609                    if (!vm.widget.lock) {
34610                        element.find('#confirmationWindow').modal('hide').on('hidden.bs.modal', function () {
34611                            // Destroy the current scope.
34612                            scope.$destroy();
34613
34614                            // Destroy the DOM container of the directive.
34615                            $(`widget[widget="'${scope.widget}'"]`).remove();
34616                                                        
34617                            // Remove widget from layout.
34618                            removeWidgetFromSectionLayout(scope.section, vm.widget.uuid);
34619                            removeWidgetFromWidgets(vm.widget.uuid);
34620                            if (removeSectionIfEmpty(scope.section)) {
34621                                $rootScope.$emit(`onDeleteSection-${scope.section}`);
34622                            };                            
34623                            
34624                            // Save page layout.
34625                            vm.save({ uuid: vm.widget.uuid, parameters: [] });
34626                        });
34627
34628                    }
34629                };
34630
34631                vm.showConfirm = function () {
34632                    if (!vm.widget.lock) {
34633                        element.find('#confirmationWindow').modal('show');
34634                    }
34635                }
34636
34637                vm.showEdit = function () {
34638                    editModal.show();
34639                }
34640
34641                vm.goFullscreen = function (fullscreen) {                    
34642                    vm.isFullscreen = fullscreen;
34643				}
34644            }
34645        };
34646    }
34647
34648    function getSectionRow(sectionId) {
34649        for (var row in page.rows) {
34650            var sections = page.rows[row].sections;
34651
34652            for (var section in sections) {
34653                if (sections[section].uuid === sectionId) {
34654                    return page.rows[row];
34655                }
34656            }
34657        }
34658
34659        return null;
34660    }
34661
34662    function addWidgetToSectionLayout(sectionId, widget) {
34663        for (var row in page.rows) {
34664            var sections = page.rows[row].sections;
34665
34666            for (var section in sections) {
34667                if (sections[section].uuid === sectionId) {
34668                    sections[section].widgets = [widget].concat(sections[section].widgets);
34669
34670                    return;
34671                }
34672            }
34673        }
34674    }
34675
34676    function removeWidgetFromWidgets(widgetId) {
34677        delete widgets[widgetId];
34678    }
34679
34680    function removeWidgetFromSectionLayout(sectionId, widgetId) {
34681        for (var row in page.rows) {
34682            var sections = page.rows[row].sections;
34683
34684            for (var section in sections) {
34685                if (sections[section].uuid === sectionId) {
34686                    _.remove(sections[section].widgets, {
34687                        uuid: widgetId
34688                    });
34689
34690                    return;
34691                }
34692            }
34693        }
34694    }
34695
34696    function removeSectionIfEmpty(sectionId) {        
34697        for (var row in page.rows) {
34698            var sections = page.rows[row].sections;
34699
34700            for (var section in sections) {
34701                if (sections[section].uuid === sectionId) {
34702                    if (sections[section].widgets.length == 0) {
34703                        _.remove(page.rows[row].sections, { uuid: sectionId });
34704                        return true;
34705                    }                    
34706
34707                    return;
34708                }
34709            }
34710        }
34711    }
34712
34713    function swapWidgetFromSectionLayout(sectionId, widgetId1, widgetId2, verification) {
34714        for (var row in page.rows) {
34715            var sections = page.rows[row].sections;
34716
34717            for (var section in sections) {
34718                if (sections[section].uuid === sectionId) {
34719                    var widgetIndex1 = findWidgetIndex(sections[section].widgets, widgetId1);
34720                    var widgetIndex2 = findWidgetIndex(sections[section].widgets, widgetId2);
34721
34722                    // Swap widget in the section.
34723                    if (verification(sections[section].widgets[widgetIndex2])) {
34724                        var temp = sections[section].widgets[widgetIndex1];
34725                        sections[section].widgets[widgetIndex1] = sections[section].widgets[widgetIndex2];
34726                        sections[section].widgets[widgetIndex2] = temp;
34727                    }
34728                    break;
34729                }
34730            }
34731        }
34732    }
34733
34734    function findWidgetIndex(widgets, uuid) {
34735        return _.findIndex(widgets, function (widget) {
34736            return widget.uuid === uuid;
34737        });
34738    }
34739})();;
34740(function () {
34741    'use strict';
34742
34743    angular
34744        .module('app.directives')
34745        .controller('WidgetModalController', WidgetModalController);
34746
34747    WidgetModalController.$inject = ['$scope', 'WebsiteEditorService', '$translate', '$localStorage', 'PlanService'];
34748
34749    function WidgetModalController($scope, websiteEditorService, $translate, $localStorage, planService) {
34750        var vm = this;
34751
34752        //State variables
34753        vm.section = $scope.section;
34754        vm.isEditMode = false;
34755        vm.widgets = [];
34756
34757
34758        vm.addWidget = function (widget) {
34759            if ($scope.onAddWidget) {
34760                $scope.onAddWidget(widget);
34761            }
34762        }
34763
34764        vm.getWidgets = getWidgets;
34765
34766        //Helpers
34767        function getWidgets() {
34768            vm.widgets = [];
34769            vm.specificWidgets = []
34770            vm.generalWidgets = []
34771            vm.mediaWidgets = []
34772            vm.newsWidgets = []
34773            vm.advancedWidgets = [];
34774            vm.generalIsOpened = true
34775            vm.specificIsOpened = false
34776            vm.mediaIsOpened = false
34777            vm.newsIsOpened = false
34778            vm.statsIsOpened = false;
34779            vm.advancedIsOpened = false;
34780
34781            websiteEditorService.getWidgets()
34782                .then(function (response) {
34783                    vm.widgets = response.data; // All widgets available 
34784                    // Display only widgets available
34785                    vm.widgets = _.filter(vm.widgets, function (widget) {
34786                        return widget.available === true
34787                            && (!widget.sportId || widget.sportId == $localStorage.solution.sportId)
34788                            && (!widget.sportListId || widget.sportListId.length === 0 || widget.sportListId.includes($localStorage.solution.sportId))
34789                            && (!widget.availableKreezeeAdminOnly || (widget.availableKreezeeAdminOnly && $localStorage.__KreezeeSession__.Session.CurrentUser.IsAdminKreezee))
34790                            && (!widget.pageId || widget.pageId.length === 0 || widget.pageId.includes(__pageId__))
34791                    });
34792
34793                    _.forEach(vm.widgets, function (widget) {
34794                        switch (widget.group) {
34795                            case 'media':
34796                                vm.mediaWidgets.push(widget)
34797                                break;
34798                            case 'general':
34799                                vm.generalWidgets.push(widget)
34800                                break;
34801                            case 'news':
34802                                vm.newsWidgets.push(widget)
34803                                break;
34804                            case 'stats':
34805                                vm.statsWidgets.push(widget)
34806                                break;
34807                            case 'advanced':
34808                                vm.advancedWidgets.push(widget);
34809                                break;
34810                            default:
34811                                if (widget.pageId && widget.pageId.includes(__pageId__)) {
34812                                    vm.specificWidgets.push(widget)
34813                                } else {
34814                                    vm.generalWidgets.push(widget)
34815                                }
34816                                break;
34817                        }
34818
34819                    })
34820
34821                    var currentPlan = planService.getPlanFromLocalStorage();
34822                    vm.widgets.forEach(function (widget) {
34823                        widget.check = checkWidget(widget.id);
34824                        widget.text = getName(widget.name);
34825                        widget.planLocked = currentPlan.id < widget.planId;
34826                        widget.oversized = widget.minwidth > $scope.availableSpace;
34827                        widget.planName = planService.getPlanFromId(widget.planId).text;
34828                    });
34829
34830
34831                    vm.widgets.sort(function (a, b) {
34832                        var nameA = a.text.toLowerCase();
34833                        var nameB = b.text.toLowerCase();
34834                        var planA = a.planId;
34835                        var planB = b.planId;
34836                        if (nameA <= nameB && planA <= planB) {
34837                            return -1;
34838                        }
34839                        if (nameA >= nameB && planA >= planB) {
34840                            return 1;
34841                        }
34842                        if (nameA <= nameB && planA > planB) {
34843                            return 1;
34844                        }
34845                        if (nameA >= nameB && planA < planB) {
34846                            return -1;
34847                        }
34848                        return 0;
34849                    });
34850                })
34851                .catch(function (error) {
34852                    bugsnag.notify(error);
34853                });
34854        }
34855
34856        function checkWidget(widgetId) {
34857            for (const [key, entry] of Object.entries(widgets)) {
34858                const widget = angular.fromJson(entry);
34859                if (widget.id === widgetId) {
34860                    return true;
34861                }
34862            }
34863            return false;
34864        }
34865
34866        function getName(names) {
34867            return _.find(names, function (name) {
34868                return name.culture === $localStorage.currentLanguage.culture;
34869            }).text;
34870        };
34871
34872    }
34873})();
34874;
34875(function () {
34876    'use strict';
34877
34878    angular
34879        .module('app.directives')
34880        .directive('widgetModal', widgetModal);
34881
34882    widgetModal.$inject = ['$rootScope', '$compile', 'GuidService'];
34883
34884    function widgetModal($rootScope, $compile, guidService) {
34885        return {
34886            restrict: 'E',
34887            scope: {                
34888                onAddWidget: '=',
34889                id: '=',
34890                isShown: '=',
34891                modalId: '@',
34892                availableSpace: '='
34893            },
34894            templateUrl: 'public/v2/app/core/directives/widget/modal/widget-modal.tpl.html',
34895            controller: 'WidgetModalController',
34896            controllerAs: 'widgetModal',
34897            link: function (scope, element, attribute, controller) {
34898                var vm = controller;
34899                var fromEvent = true;
34900                                
34901                vm.modalId = scope.modalId;
34902
34903                scope.$watch(function () { return scope.isShown; }, function (newVal) {                    
34904                    fromEvent = false;
34905                    if (newVal) {
34906                        controller.getWidgets();
34907                        $('[role="dialog"]', element).modal('show');
34908                    }
34909                    else {
34910                        $('[role="dialog"]', element).modal('hide');
34911                    }                    
34912                }, true);
34913
34914                $('[role="dialog"]', element).on('show.bs.modal', function () {
34915                    if (fromEvent) {     
34916                        $rootScope.$apply(function () { scope.isShown = true });
34917                    }
34918                    fromEvent = true;
34919                });
34920                $('[role="dialog"]', element).on('hide.bs.modal', function () {
34921                    if (fromEvent) {     
34922                        $rootScope.$apply(function () { scope.isShown = false });
34923                    }
34924                    fromEvent = true;
34925                    
34926                });
34927            }
34928        };
34929    }
34930
34931})();;
34932(function () {
34933    'use strict';
34934
34935    angular
34936        .module('app.directives')
34937        .controller('WidgetZoneController', WidgetZoneController);
34938
34939    WidgetZoneController.$inject = ['$scope', 'WebsiteEditorService', '$translate', '$localStorage', 'PlanService', 'SecurityService'];
34940
34941    function WidgetZoneController($scope, websiteEditorService, $translate, $localStorage, planService, securityService) {
34942        var vm = this;
34943
34944        //State variables
34945        vm.section = $scope.section;
34946        vm.isEditMode = false;
34947        vm.showModal = false;
34948        vm.availableSpace = 0;
34949        vm.widgets = [];
34950
34951        //State functions
34952        // TODO Create utility lib
34953        vm.getModalId = function () {
34954            return `widgetsList-${vm.section}`;
34955        };
34956
34957        vm.sectionWidth = function() {
34958            for (var row in page.rows) {
34959                var sections = page.rows[row].sections;
34960
34961                for (var section in sections) {
34962                    if (sections[section].uuid === vm.section) {
34963                        return sections[section].md;
34964                    }
34965                }
34966            }
34967            return 0;
34968        }
34969
34970        vm.addWidgetAccess = function () {
34971            return securityService.getAccess().addWidget;
34972        }
34973
34974        vm.showWidgets = function () {            
34975            var sections = _.reduce(page.rows, function (result, value) { return result.concat(value.sections) }, []);
34976            var section = _.find(sections, { uuid: vm.section });
34977            vm.availableSpace = section.md;            
34978            vm.showModal = true;
34979        };
34980
34981        vm.save = function (options) {
34982            websiteEditorService.updatePage(__solutionId__, __pageId__, page, options)
34983                .then(function (response) {
34984                    vm.showModal = false;                    
34985                })
34986                .catch(function (error) {
34987                    bugsnag.notify(error);
34988                });
34989        };
34990
34991        //Listeners
34992        $scope.$watch(function () { return websiteEditorService.isEditMode(); }, function (newVal) {
34993            if (newVal === undefined) return;
34994            vm.isEditMode = newVal;
34995        }, true);
34996
34997    }
34998})();
34999;
35000(function () {
35001    'use strict';
35002
35003    angular
35004        .module('app.directives')
35005        .directive('widgetZone', widgetZone);
35006
35007    widgetZone.$inject = ['$compile', 'GuidService'];
35008
35009    function widgetZone($compile, guidService) {
35010        return {
35011            restrict: 'E',
35012            scope: {                
35013                section: '='
35014            },
35015            templateUrl: 'public/v2/app/core/directives/widget/zone/widget-zone.tpl.html',
35016            controller: 'WidgetZoneController',
35017            controllerAs: 'widgetZone',
35018            link: function (scope, element, attribute, controller) {
35019                var vm = controller;
35020
35021                vm.addWidget = function (widget) {
35022                    // Get the section.
35023                    var section = angular.element(`#${scope.section}`);
35024
35025                    // Find the widget zone component.
35026                    var widgetZone = section.find('widget-zone');
35027
35028                    // Get the widget information.
35029                    var widget = _.cloneDeep(widget);
35030
35031                    // Generate a new widget id.
35032                    widget.uuid = guidService.getGuid();
35033
35034                    // Create the widget variable.
35035                    widgets[widget.uuid] = angular.toJson(widget);
35036
35037                    var newScope = scope.$new(true);
35038
35039                    // Compile the new widget directive.
35040                    var widgetDOM = $compile(`<widget section="'${scope.section}'" widget="'${widget.uuid}'"></widget>`)(newScope);
35041
35042                    // Insert the new widget just before the widget zone component.
35043                    widgetZone.before(widgetDOM);
35044                    
35045                    // Update website layout.
35046                    addWidgetToSectionLayout(scope.section, widget);
35047
35048                    // Save website layout.
35049                    vm.save({ uuid: widget.uuid, parameters: [] });
35050                };
35051            }
35052        };
35053    }
35054
35055    function addWidgetToSectionLayout(sectionId, widget) {
35056        for(var row in page.rows) {
35057            var sections = page.rows[row].sections;
35058    
35059            for(var section in sections) {
35060                if (sections[section].uuid === sectionId) {
35061                    return sections[section].widgets.push(widget);
35062                }                
35063            }
35064        }
35065    }    
35066})();;
35067(function () {
35068    'use strict';
35069
35070    angular
35071        .module('app.filters', [])
35072        .config(config);
35073
35074    config.$inject = ['$translatePartialLoaderProvider'];
35075
35076    function config($translatePartialLoaderProvider) {
35077        if (__environment__ !== 'local') {
35078            $translatePartialLoaderProvider.addPart('app');
35079
35080        } else {
35081            $translatePartialLoaderProvider.addPart('app/core/filters');
35082        }
35083    }
35084})();;
35085(function () {
35086    'use strict';
35087
35088    angular
35089        .module('app.filters')
35090        .filter('htmlToText', function() {            
35091            return function(html) {            
35092                html = String(html).replaceAll('&amp;', '&');
35093                html = String(html).replaceAll('&eacute;', 'é');
35094                html = String(html).replaceAll('&Eacute;', 'É');                
35095                html = String(html).replaceAll('&egrave;', 'è');
35096                html = String(html).replaceAll('&Egrave;', 'È');
35097                html = String(html).replaceAll('&ecirc;', 'ê'); 
35098                html = String(html).replaceAll('&Ecirc;', 'Ê');
35099                html = String(html).replaceAll('&euml;', 'ë'); 
35100                html = String(html).replaceAll('&Euml;', 'Ë');
35101                html = String(html).replaceAll('&agrave;', 'à');
35102                html = String(html).replaceAll('&Agrave;', 'À');  
35103                html = String(html).replaceAll('&acirc;', 'â');
35104                html = String(html).replaceAll('&Acirc;', 'Â');                
35105                html = String(html).replaceAll('&ocirc;', 'ô'); 
35106                html = String(html).replaceAll('&Ocirc;', 'Ô');
35107                html = String(html).replaceAll('&icirc;', 'î'); 
35108                html = String(html).replaceAll('&Icirc;', 'Î'); 
35109                html = String(html).replaceAll('&iuml;', 'ï'); 
35110                html = String(html).replaceAll('&Iuml;', 'Ï'); 
35111                html = String(html).replaceAll('&ugrave;', 'ù'); 
35112                html = String(html).replaceAll('&Ugrave;', 'Ù'); 
35113                html = String(html).replaceAll('&ucirc;', 'û'); 
35114                html = String(html).replaceAll('&Ucirc;', 'Û');
35115                html = String(html).replaceAll('&uuml;', 'ü'); 
35116                html = String(html).replaceAll('&Uuml;', 'Ü');
35117                html = String(html).replaceAll('&yuml;', 'ÿ'); 
35118                html = String(html).replaceAll('&ccedil;', 'ç'); 
35119                html = String(html).replaceAll('&Ccedil;', 'Ç');                   
35120                html = String(html).replaceAll('&rsquo;', '’');
35121                html = String(html).replaceAll('&nbsp;', ' '); 
35122                html = String(html).replaceAll('&ndash;', '–'); 
35123                html = String(html).replaceAll('&#39;', '\'');                  
35124                
35125                return  html ? String(html).replace(/<[^>]+>/gm, ' ') : '';
35126            };
35127        });
35128})();;
35129(function () {
35130    'use strict';
35131
35132    angular
35133        .module('app.filters')
35134        .filter('ordinal', ordinal);
35135        
35136        ordinal.$inject = ['$translate'];
35137
35138        function ordinal($translate) {
35139            return function(number, feminine) {            
35140                if (isNaN(number) || number < 1) {
35141                    return number;
35142                }
35143                else if (number == 1) {
35144                    return feminine
35145                        ? `${number}${$translate.instant('filters.ordinal.labels.firstFeminine')}`
35146                        : `${number}${$translate.instant('filters.ordinal.labels.first')}`;
35147                }
35148                else {
35149                    var lastDigit = number % 10;
35150                    var last2Digit = number % 100;
35151                    if (last2Digit != 11 && last2Digit != 12 && last2Digit != 13 && lastDigit === 1){
35152                        return `${number}${$translate.instant('filters.ordinal.labels.st')}`;
35153                    } else if (last2Digit != 11 && last2Digit != 12 && last2Digit != 13 && lastDigit === 2){
35154                        return `${number}${$translate.instant('filters.ordinal.labels.nd')}`;
35155                    } else if (last2Digit != 11 && last2Digit != 12 && last2Digit != 13 && lastDigit === 3){
35156                        return `${number}${$translate.instant('filters.ordinal.labels.rd')}`;
35157                    } else {
35158                        return `${number}${$translate.instant('filters.ordinal.labels.th')}`;
35159                    }
35160                }
35161            };
35162        }
35163})();;
35164(function () {
35165    'use strict';
35166
35167    angular
35168        .module('app.filters')
35169        .filter('time', time);
35170        
35171        time.$inject = ['$translate'];
35172
35173        function time() {
35174            return function(time) {     
35175                return time.slice(-5);                
35176            };
35177        }
35178})();;
35179(function () {
35180    'use strict';
35181
35182    angular
35183        .module('app.layout', [])
35184        .config(config);
35185
35186    config.$inject = ['$translatePartialLoaderProvider'];
35187
35188    function config($translatePartialLoaderProvider) {
35189        if (__environment__ !== 'local') {
35190            $translatePartialLoaderProvider.addPart('app');
35191
35192        } else {
35193            $translatePartialLoaderProvider.addPart('app/core/layout/toolbar');
35194            $translatePartialLoaderProvider.addPart('app/core/layout/topbar');
35195            $translatePartialLoaderProvider.addPart('app/core/layout/top'); 
35196        }
35197    }
35198})();;
35199(function () {
35200    'use strict';
35201
35202    angular
35203        .module('app.layout')
35204        .controller('FooterLayoutController', FooterLayoutController);
35205
35206    FooterLayoutController.$inject = ['$rootScope', '$scope'];
35207
35208    function FooterLayoutController($rootScope, $scope) {
35209        var vm = this;
35210        
35211        vm.fullYear = new Date().getFullYear();
35212        
35213        /*$scope.$watch(function () { return globalServcie.getWebsiteMode(); }, function (newVal) {
35214            if (newVal === undefined) return;
35215                vm.nbItems = newVal;
35216        }, true);*/
35217    }
35218})();;
35219(function () {
35220    'use strict';
35221
35222    angular
35223        .module('app.layout')
35224        .directive('footerLayout', FooterLayout)
35225
35226    FooterLayout.$inject = [];
35227
35228    function FooterLayout() {
35229        return {
35230            restrict: 'E',
35231            scope: {                
35232
35233            },
35234            templateUrl: `/public/v2/app/themes/${__theme__}/layout/footer-layout.tpl.html`,
35235            controller: 'FooterLayoutController',
35236            controllerAs: 'footerLayout'
35237        };
35238    }
35239})();;
35240(function () {
35241    'use strict';
35242
35243    angular
35244        .module('app.layout')
35245        .controller('ToolbarLayoutController', ToolbarLayoutController);
35246
35247    ToolbarLayoutController.$inject = ['$scope', '$translate', '$localStorage', 'GoogleWebFontsService', 'WebsiteEditorService', 'TranslationService'];
35248
35249    function ToolbarLayoutController($scope, $translate, $localStorage, googleWebFontsService, websiteEditorService, translationService) {
35250        var vm = this;
35251        var start = null;
35252
35253        vm.isAuthenticated = angular.isDefined($localStorage.__KreezeeSession__);
35254        vm.isEditMode = websiteEditorService.isEditMode;
35255        // Get solution name & abbreviation.
35256        vm.solutionName = __solutionName__;
35257        vm.solutionAbbreviation = __solutionAbbreviation__;        
35258
35259        vm.translation = translationService;
35260
35261        // Apply website values to view model object.
35262        Object.assign(vm, angular.fromJson(website));
35263        
35264        // Filter displayed items.
35265        vm.menu = {
35266            items: _.filter(vm.toolbar.menu.items, function (item) {
35267                if (item) {
35268                    return item.visible;
35269                }
35270                return false;
35271            })
35272        };
35273
35274        // Handling menu overflow
35275        vm.isOverflow = false;
35276        vm.overflow = {
35277            items: []
35278        };
35279
35280        vm.disabledMenuBar = vm.toolbar.menu.disabled !== undefined ? vm.toolbar.menu.disabled : false;
35281        vm.overlayMenuBar = function () {
35282            return page.rows[0].alignToTop;
35283        };
35284        
35285        vm.submit = false;
35286        vm.webFonts = [];
35287        vm.webFont = '';
35288        vm.selectedWebFont = getCssVariable('--toolbar-font-family');
35289        vm.webFontVariants = [];
35290        vm.webFontCategory = '';
35291        vm.selectedWebFontVariant = 'regular';
35292
35293        // todo get value from variable, directive method 
35294
35295        // Background colors
35296        vm.backgroundColorGradient = vm.toolbar.background.gradient != null && vm.toolbar.background.gradient.colors.length > 0;
35297        vm.backgroundColor1 = vm.toolbar.background.color;
35298        vm.backgroundColor2 = vm.backgroundColorGradient ? vm.toolbar.background.gradient.colors[1] : null;
35299
35300        vm.menuItemColor = getCssVariable('--toolbar-color');
35301        vm.menuItemActiveBackgroundColor = getCssVariable('--toolbar-menu-item-active-background-color');
35302        vm.menuItemActiveColor = getCssVariable('--toolbar-menu-item-active-color');
35303
35304        vm.showSolutionName = vm.toolbar.mobile.showName;
35305
35306        vm.borders = vm.toolbar.innerBorder !== null || vm.toolbar.outerBorder !== null;
35307
35308        $scope.$watch(function () { return websiteEditorService.isEditMode(); }, function (editMode) {
35309            if (editMode === undefined) return;
35310            vm.isEditMode = editMode;
35311        }, true);
35312
35313        $scope.$watch(function () { return website.toolbar.mobile.showName }, function (value) {
35314            vm.showSolutionName = value;
35315		})
35316
35317        $scope.$on('update-menu', function (event, data) {
35318            vm.disabledMenuBar = vm.toolbar.menu.disabled !== undefined ? vm.toolbar.menu.disabled : false;
35319            vm.overlayMenuBar = vm.toolbar.menu.overlay || false;            
35320            vm.menu.items = _.filter(vm.toolbar.menu.items, function (item) {
35321                return item.visible;
35322            });
35323        })
35324
35325        $scope.$on('update-menu-colors', function (event, data) {
35326            if (vm.toolbar.background.gradient) {
35327                vm.backgroundColorGradient = true;
35328                vm.backgroundColor1 = vm.toolbar.background.gradient.colors[0];
35329                vm.backgroundColor2 = vm.toolbar.background.gradient.colors[1];
35330            }
35331            else {
35332                vm.backgroundColorGradient = false;
35333            }
35334
35335            vm.menuItemColor = vm.toolbar.color;
35336            vm.menuItemActiveBackgroundColor = vm.toolbar.menu.active.background.color;
35337            vm.menuItemActiveColor = vm.toolbar.menu.active.color;            
35338
35339            vm.setToolbarHeight();
35340            vm.setBorders();
35341            vm.setBackgroundColor();
35342            vm.setMenuItemColor();       
35343
35344            vm.setFont(vm.toolbar.font);
35345        });
35346
35347        vm.getName = function (menuItem) {
35348            return angular.isDefined(menuItem.type)
35349                ? _.find(menuItem.name, function (name) { return name.culture === 'fr-CA'; }).text
35350                : $translate.instant(menuItem.name);
35351        };
35352
35353        vm.getUrl = function (menuItem) {
35354            return angular.isDefined(menuItem.type)
35355                ? _.find(menuItem.name, function (name) { return name.culture === 'fr-CA'; }).url
35356                : $translate.instant(menuItem.url);
35357        };
35358
35359        vm.showToolbarSettings = function () {
35360            // TODO Move API Key in web.config.
35361            googleWebFontsService.getWebFonts('alpha')
35362                .then(function (response) {
35363                    vm.webFonts.push.apply(vm.webFonts, response.data.items); // All Google web fonts                
35364
35365                    $('#toolbarSettings').modal('show');
35366                })
35367                .catch(function (error) {
35368                    bugsnag.notify(error);
35369                });
35370        };
35371
35372        vm.getWebFontVariants = function () {
35373            vm.webFont = _.find(vm.webFonts, function (webfont) {
35374                return vm.selectedWebFont === webfont.family;
35375            });
35376
35377            // Reinitialise the variant selected.
35378            vm.selectedWebFontVariant = 'regular';
35379
35380            // Update (override) the current Google Web Font.
35381            // TODO Support weight change
35382            vm.googleWebFontsUrl = `https://fonts.googleapis.com/css?family=${vm.webFont.family}`; //:900`;
35383
35384            vm.webFontCategory = getCategory(vm.webFont.category);
35385
35386            // Update the toolbar font family.
35387            $scope.updateToolbar('--toolbar-font-family', `\'${vm.webFont.family}\', ${vm.toolbar.font.fallback} ${vm.webFontCategory}`);
35388
35389            // All Google web font variations available.
35390            vm.webFontVariants = vm.webFont.variants;
35391        };
35392
35393        vm.loadedFonts = {};
35394        vm.setFont = function (font) {                                                
35395            var fontId = _.camelCase(font.family);
35396            vm.googleWebFontsUrl = `https://fonts.googleapis.com/css?family=${font.family}`; //:900`;
35397
35398            if ($(`#${fontId}`).length == 0) {
35399                let link = document.createElement('link');
35400                link.type = 'text/css';
35401                link.rel = 'stylesheet';
35402                link.onload = function () {
35403                    vm.loadedFonts[fontId] = font.family;
35404                    $scope.updateToolbar('--toolbar-font-family', `\'${font.family}\', ${font.fallback} ${font.type}`);
35405                };
35406                link.href = vm.googleWebFontsUrl;
35407                link.id = fontId;
35408
35409                $('head').append(link);
35410            }
35411            else if(vm.loadedFonts[fontId]) {
35412                $scope.updateToolbar('--toolbar-font-family', `\'${font.family}\', ${font.fallback} ${font.type}`);
35413            }
35414                        
35415            $scope.updateToolbar('--toolbar-font-size', `${vm.toolbar.font.size}px`);
35416            $scope.updateToolbar('--toolbar-font-weight', `${vm.toolbar.font.weight}`);
35417        }
35418
35419        vm.edit = function () {
35420            websiteEditorService.validateAuthorization()
35421                .then(function () {
35422                    websiteEditorService.editMode(true);
35423                })
35424                .catch(function (error) {
35425                    bugsnag.notify(error);
35426                })
35427        };
35428
35429        vm.stopEditing = function () {
35430            websiteEditorService.editMode(false);
35431        };
35432
35433
35434        vm.setWebFontVariant = function() {
35435            // TODO Update Google url.
35436
35437            $scope.updateToolbar('--toolbar-font-weight', vm.selectedWebFontVariant);            
35438        };
35439
35440        vm.formatWebFontVariant = function(value) {
35441            var numberPattern = /\d+/g;
35442            var stylePattern = /[a-z]+/g;
35443            var weight = value.match(numberPattern);
35444            var style = value.match(stylePattern);
35445
35446            if (((weight !== null) && (weight.length > 0)) && 
35447                ((style !== null) && (style.length > 0))) {                
35448                return `${weight[0]} ${style[0]}`;
35449
35450            } else if (((weight !== null) && (weight.length > 0)) && (style === null)) { 
35451                return `${weight[0]}`;
35452
35453            } else if ((weight === null) &&  ((style !== null) && (style.length > 0))) {  
35454                return `${style[0]}`;           
35455            }
35456        }
35457        
35458        vm.setBackgroundColor = function () {
35459            if (!vm.backgroundColorGradient) {
35460                $scope.updateToolbar('--toolbar-background-color', vm.toolbar.background.color);
35461                $scope.updateToolbar('--toolbar-background-image', 'initial');
35462            } else {
35463                $scope.updateToolbar('--toolbar-background-image', `linear-gradient(${vm.toolbar.background.gradient.angle}deg, ${vm.backgroundColor1}, ${vm.backgroundColor2})`);
35464            }            
35465        };
35466
35467        vm.setMenuItemColor = function() {
35468            $scope.updateToolbar('--toolbar-color', vm.menuItemColor);
35469            $scope.updateToolbar('--toolbar-menu-item-active-background-color', vm.menuItemActiveBackgroundColor);
35470            $scope.updateToolbar('--toolbar-menu-item-active-color', vm.menuItemActiveColor);              
35471        };
35472
35473        vm.checkBorders = function() {
35474            if (!vm.borders) {
35475                vm.toolbar.innerBorder = null;
35476                vm.toolbar.outerBorder = null;
35477
35478                $scope.updateToolbar('--toolbar-inner-border-color', 'initial');
35479                $scope.updateToolbar('--toolbar-inner-border-height', 'initial');
35480                $scope.updateToolbar('--toolbar-outer-border-color', 'initial');       
35481                $scope.updateToolbar('--toolbar-outer-border-height', 'initial');  
35482
35483            } else {                
35484                vm.toolbar.innerBorder = website.toolbar.innerBorder;
35485                vm.toolbar.outerBorder = website.toolbar.outerBorder;
35486            }
35487        };
35488
35489        vm.setToolbarHeight = function () {                        
35490            $scope.updateToolbar('--toolbar-height', `${vm.toolbar.height}px`);        
35491        }
35492
35493        vm.setBorders = function () {                        
35494            $scope.updateToolbar('--toolbar-inner-border-color', vm.toolbar.innerBorder.color);
35495            $scope.updateToolbar('--toolbar-inner-border-height', `${vm.toolbar.innerBorder.height}px`);
35496            $scope.updateToolbar('--toolbar-outer-border-color', vm.toolbar.outerBorder.color);       
35497            $scope.updateToolbar('--toolbar-outer-border-height', `${vm.toolbar.outerBorder.height}px`);            
35498        }
35499
35500        vm.save = function() {
35501            vm.form.$setSubmitted();
35502
35503            // Check if the form is valid.
35504            if (vm.form.$valid) {  
35505                // Submit on going.  
35506                vm.submit = true;
35507
35508                // Update the data.
35509                website.toolbar.font.size = vm.toolbar.font.size;
35510
35511                website.toolbar.background.color = vm.toolbar.background.color;
35512                website.toolbar.background.gradient = vm.backgroundColorGradient 
35513                                                                ? { angle: 180, colors: [vm.backgroundColor1, vm.backgroundColor2] }
35514                                                                : null;            
35515
35516                // Save the data.
35517                websiteEditorService.updateWebsite(__solutionId__, website)
35518                    .then(function(response) {
35519                        $('#toolbarSettings').modal('hide');
35520                    }) 
35521                    .catch(function(error) {
35522                        bugsnag.notify(error);
35523                    });            
35524            }            
35525        };
35526
35527        function getCssVariable(variable) {                  
35528            switch (variable) {
35529                case '--toolbar-font-family':
35530                    var fontFamily = getComputedStyle(document.documentElement).getPropertyValue('--toolbar-font-family').split(',');
35531                    return fontFamily[0].replace(/["' ]/g, '');
35532
35533                default:
35534                    return getComputedStyle(document.documentElement).getPropertyValue(variable).trim();
35535            }
35536        }
35537        
35538        function getCategory(category) {
35539            switch (category) {
35540                case 'serif':
35541                case 'sans-serif':
35542                case 'monospace':
35543                    return category;
35544
35545                case 'display':
35546                case 'handwriting':
35547                    return 'cursive';
35548            }
35549        }
35550    }
35551})();;
35552(function () {
35553    'use strict';
35554
35555    angular
35556        .module('app.layout')
35557        .directive('toolbarLayout', ToolbarLayout)
35558
35559    ToolbarLayout.$inject = ['$window', '$timeout', '$log'];
35560
35561    function ToolbarLayout($window, $timeout, $log) {
35562        return {
35563            restrict: 'E',
35564            scope: {                
35565
35566            },
35567            replace: true,
35568            templateUrl: 'public/v2/app/core/layout/toolbar/toolbar-layout.tpl.html',
35569            controller: 'ToolbarLayoutController',
35570            controllerAs: 'toolbarLayout',
35571            link : function(scope, element, attribute, controller) {
35572                var vm = controller;
35573                
35574                angular.element('.collapse').on('show.bs.collapse', function() {
35575                    element.find('.hamburger').addClass('is-active');
35576                });
35577                
35578                angular.element('.collapse').on('hide.bs.collapse', function() {
35579                    element.find('.hamburger').removeClass('is-active');
35580                });
35581
35582                $timeout(function() {
35583                    // TODO Add class to identified the real from the preview...
35584                    var toolbar = angular.element('.navbar-collapse')[0];
35585                    var toolbarItems = $(toolbar).find('.nav-link');
35586                    var maxWidth = angular.element('.container')[0].offsetWidth - 60;
35587
35588                    if (maxWidth > 0) {
35589                        var toolbarItemsWidth = 0;
35590                        for(var toolbarItem in toolbarItems) {
35591                            var toolbarItemIndex = parseInt(toolbarItem, 10);
35592                            
35593                            if (toolbarItemIndex >= 0) {
35594                                toolbarItemsWidth += toolbarItems[toolbarItemIndex].clientWidth;
35595
35596                                // Check if the toolbar overflow.
35597                                if (toolbarItemsWidth > maxWidth) {
35598                                    // Set overflow flag at true.
35599                                    vm.isOverflow = true;
35600
35601                                    // Remove overflow items from toolbar.
35602                                    var overflowItems = vm.menu.items.slice(toolbarItemIndex, vm.menu.items.length);
35603                                    vm.menu.items.splice(toolbarItemIndex, vm.menu.items.length - toolbarItemIndex);
35604
35605                                    // Add overflow elements to dropdown menu.
35606                                    vm.overflow.items = overflowItems;
35607                                    break;
35608                                }
35609                            }                        
35610                        }
35611                    }                    
35612                }, 200);
35613
35614                angular.element($window).bind('resize', function(){
35615                    // TODO recalculate overflow.                    
35616                    $log.debug('resize');
35617                    
35618                    // manuall $digest required as resize event
35619                    // is outside of angular
35620                    scope.$digest();
35621                  });
35622
35623                scope.updateToolbar = function (cssVariable, value) {
35624                    document.documentElement.style.setProperty(cssVariable, value);
35625                }                               
35626            }
35627        };
35628    }
35629})();;
35630(function () {
35631	'use strict';
35632
35633	angular
35634		.module('app.layout')
35635		.controller('ToolbarDesktopController', ToolbarDesktopController);
35636
35637	ToolbarDesktopController.$inject = ['$scope', 'TranslationService'];
35638
35639	function ToolbarDesktopController($scope, translationService) {
35640		var vm = this;
35641		vm.translation = translationService;
35642		vm.items = $scope.items;
35643		vm.overflow = {
35644			items: []
35645		}
35646		vm.moreMenu = false;
35647		vm.clickedKey = undefined;
35648
35649		vm.clickMoreMenu = function () {
35650			if ($scope.isHover) {
35651				return;
35652			}
35653			vm.moreMenu = !vm.moreMenu;
35654			vm.clickedKey = undefined;
35655		}
35656
35657		vm.clickItem = function (item, resetMoreMenu) {
35658			if ($scope.isHover) {
35659				return;
35660			}
35661			if (resetMoreMenu) {
35662				vm.moreMenu = false;
35663			}
35664
35665			var clickedOnActiveItem = false;
35666			if (vm.clickedKey == item['$$hashKey'] || hasChildWithKey(item)) {
35667				clickedOnActiveItem = true;
35668			}
35669
35670			if (clickedOnActiveItem) {
35671				vm.clickedKey = getParentKey(item['$$hashKey'], { $$hashKey: undefined, items: $scope.items });
35672			} else {
35673				vm.clickedKey = item['$$hashKey'];
35674			}
35675		}
35676
35677		vm.getLiClass = function (item) {
35678			if ($scope.isHover) {
35679				return false;
35680			}
35681			if (vm.clickedKey == item['$$hashKey'] || hasChildWithKey(item)) {
35682				return { 'li-active': true };
35683			}
35684			return false;
35685		}
35686
35687		vm.getUlClass = function (item) {
35688			if ($scope.isHover) {
35689				return { 'hover-trigger': true, 'show-ul': false };
35690			}
35691			if (vm.clickedKey == item['$$hashKey'] || hasChildWithKey(item)) {
35692				return { 'show-ul': true, 'hover-trigger': false };
35693			}
35694			return false;
35695		}
35696
35697		vm.getToolbarClass = function() {
35698			if ($scope.alignment === 'center' && (!vm.overflow.items || vm.overflow.items.length === 0)) {
35699				return { 'd-lg-flex justify-content-center': true };
35700			}
35701			return { 'd-lg-block': true };
35702		}
35703
35704		function getParentKey(key, item) {
35705			if (item) {
35706				var items = item.items;
35707				if (items && items.length > 0) {
35708					for (let i = 0; i < items.length; i++) {
35709						if (items[i]['$$hashKey'] == key) {
35710							return item['$$hashKey'];
35711						} else {
35712							const thekey = getParentKey(key, items[i]);
35713							if (thekey) {
35714								return thekey;
35715							}
35716						}
35717					}
35718				}
35719			}
35720			return false;
35721		}
35722
35723		function hasChildWithKey(item) {
35724			if (item) {
35725				var items = item.items;
35726				if (items && items.length > 0) {
35727					return items.some(function (menuitem) {
35728						if (menuitem['$$hashKey'] == vm.clickedKey) {
35729							return true;
35730						} else if (hasChildWithKey(menuitem)) {
35731							return true;
35732						}
35733					})
35734				}
35735			}
35736			return false;
35737		}
35738	}
35739})();;
35740(function () {
35741	'use strict';
35742
35743	angular
35744		.module('app.layout')
35745		.directive('toolbarDesktop', ToolbarDesktop)
35746
35747	ToolbarDesktop.$inject = ['$window', '$timeout'];
35748
35749	function ToolbarDesktop($window, $timeout) {
35750		return {
35751			restrict: 'E',
35752			scope: {
35753				items: '=',
35754				isHover: '=',
35755				alignment: '=',
35756				logoDisplay: '=',
35757				logoUrl: '=',
35758				logo: '='
35759			},
35760			templateUrl: 'public/v2/app/core/layout/toolbar/toolbar-desktop/toolbar-desktop.tpl.html',
35761			controller: 'ToolbarDesktopController',
35762			controllerAs: 'toolbarDesktop',
35763			link: function (scope, element, attribute, controller) {
35764				var vm = controller;
35765				
35766				imgLoad();
35767
35768				/* When scope.items change */
35769				var initializing = true
35770				scope.$watch('items', function (newValue, oldValue) {
35771					$timeout(function () {
35772						if (initializing) {
35773							initializing = false;
35774						} else {
35775							vm.items = newValue;
35776							vm.overflow.items = [];
35777							vm.moreMenu = false;
35778							vm.clickedKey = undefined;
35779
35780							resizeToolbar();
35781
35782						}
35783					});
35784				});
35785
35786				/* When logo change */
35787				scope.$watch('[logoDisplay, logoUrl]', function (newValue, oldValue) {
35788					$timeout(function () {
35789						resizeToolbar();
35790					});
35791					imgLoad();
35792				});
35793
35794				/* Resize toolbar when img finished loading */
35795				function imgLoad() {
35796					$timeout(function () {
35797						if (scope.logoUrl && (scope.logoDisplay === 'toolbar' || scope.logoDisplay === 'bannerandlogo')) {
35798							$('.toolbar-desktop-logo > img').on('load', function () {
35799								resizeToolbar();
35800							});
35801						}
35802					});
35803				}
35804
35805				/* When container width change */
35806				scope.$watch(function () {
35807					return angular.element('.container')[0].offsetWidth;
35808				}, function () {
35809					$timeout(function () {
35810						resizeToolbar();
35811					});
35812				});
35813
35814				/* When clicking outside the menu, hide it */
35815				$(angular.element($window.document)).mouseup(function (e) {
35816					var container = $(".top-level-menu > li");
35817					if (!container.is(e.target) && container.has(e.target).length === 0) {
35818						vm.clickedKey = undefined;
35819						vm.moreMenu = false;
35820						scope.$digest();
35821					}
35822				});
35823
35824				/* Resize toolbar function */
35825				function resizeToolbar() {
35826					var allitems = vm.items.concat(vm.overflow.items);
35827					vm.items = allitems;
35828					vm.overflow.items = [];
35829					scope.$digest();
35830
35831					var toolbar = angular.element('.navbar-desktop')[0];
35832					var toolbarItems = $(toolbar).find('.navbar-desktop-item');
35833					var maxWidth = angular.element('.container.navbar-desktop ')[0].offsetWidth - 80;					
35834
35835					if (maxWidth > 0) {
35836						var toolbarItemsWidth = 0;
35837						if (scope.logoUrl && (scope.logoDisplay === 'toolbar' || scope.logoDisplay === 'bannerandlogo')) {
35838							toolbarItemsWidth = angular.element('.toolbar-desktop-logo')[0].offsetWidth; //start at width of logo if any
35839						}
35840						
35841						for (var toolbarItem in toolbarItems) {
35842							var toolbarItemIndex = parseInt(toolbarItem, 10);
35843
35844							if (toolbarItemIndex >= 0) {
35845								toolbarItemsWidth += toolbarItems[toolbarItemIndex].clientWidth;
35846
35847								if (toolbarItemsWidth > maxWidth) {
35848									var overflowItems = allitems.slice(toolbarItemIndex, allitems.length);
35849									allitems.splice(toolbarItemIndex, allitems.length - toolbarItemIndex);
35850
35851									vm.overflow.items = overflowItems;
35852									vm.items = allitems;
35853									break;
35854								}
35855							}
35856						}
35857					}
35858
35859					scope.$digest();
35860				}
35861			}
35862		};
35863	}
35864})();;
35865(function () {
35866    'use strict';
35867
35868    angular
35869        .module('app.layout')
35870        .controller('TopLayoutController', TopLayoutController);
35871
35872    TopLayoutController.$inject = ['$rootScope', '$scope'];
35873
35874    function TopLayoutController($rootScope, $scope) {
35875        var vm = this;
35876        
35877    }
35878})();
35879;
35880(function () {
35881    'use strict';
35882
35883    angular
35884        .module('app.layout')
35885        .directive('topLayout', TopLayout)
35886
35887    TopLayout.$inject = [];
35888
35889    function TopLayout() {
35890        return {
35891            restrict: 'E',
35892            scope: {                
35893
35894            },
35895            templateUrl: `/public/v2/app/themes/${__theme__}/layout/top-layout.tpl.html`,
35896            controller: 'TopLayoutController',
35897            controllerAs: 'topLayout'
35898        };
35899    }
35900})();;
35901(function () {
35902    'use strict';
35903
35904    angular
35905        .module('app.layout')
35906        .controller('TopbarLayoutController', TopbarLayoutController);
35907
35908    TopbarLayoutController.$inject = ['$scope', '$rootScope', '$localStorage', 'WebsiteEditorService', 'AuthenticationService'];
35909
35910    function TopbarLayoutController($scope, $rootScope, $localStorage, websiteEditorService, authenticationService) {
35911        var vm = this;
35912        vm.isAuthenticated = angular.isDefined($localStorage.__KreezeeSession__);
35913        vm.widget = angular.fromJson(widgets[$scope.widget]);
35914        vm.theme = __theme__;
35915        vm.showLogo = vm.theme === "default" || vm.theme === "no-kreezee-gamebar";
35916        vm.defaultBar = {
35917            'activateShadows': false,
35918            'backgroundColor': '#222222',
35919            'backgroundColor1': '#0055FF',
35920            'backgroundColor2': '#000000',
35921            'backgroundGradient': false,
35922            'backgroundTransparent': false,
35923            'borderBottomColor': '#000',
35924            'borderBottomWidth': 0,
35925            'height': 60,
35926            'hyperlink': '',
35927            'hyperlinkColor': '#FFF',
35928            'hyperlinkFontSize': 18,
35929            'hyperlinkText': '',
35930            'showHeaderBar': true,
35931            'showHyperlink': false,
35932            'textColor': '#FFF',
35933            'selectedTextColor':'#0864ae',
35934            'resetParams': false,
35935            'fullWidth': false
35936        }
35937
35938        if (vm.isAuthenticated) {
35939            // Get user account information.
35940            vm.account = {
35941                name: `${$localStorage.__KreezeeSession__.Session.CurrentUser.FirstName} ${$localStorage.__KreezeeSession__.Session.CurrentUser.LastName}`
35942            };
35943        }
35944
35945        $scope.$watch(function () { return websiteEditorService.isEditMode(); }, function (newVal) {
35946            if (angular.isUndefined(newVal)) return;
35947
35948            vm.isEditMode = newVal;
35949        }, true);
35950
35951        vm.edit = function () {
35952            websiteEditorService.validateAuthorization()
35953                .then(function () {
35954                    websiteEditorService.editMode(true);
35955                })
35956                .catch(function (error) {
35957                    bugsnag.notify(error);
35958                })
35959        };
35960
35961        vm.stopEditing = function () {
35962            websiteEditorService.editMode(false);
35963        };
35964
35965        vm.logout = function () {
35966            var sessionToken = $localStorage.__KreezeeSession__;
35967            $localStorage.__KreezeeSession__ = undefined;
35968            authenticationService.logout(sessionToken)
35969                .then(function () {
35970                    window.location.href = "/";
35971                })
35972                .catch(function (error) {
35973                    bugsnag.notify(error);
35974                    window.location.href = "/";
35975                })
35976        }
35977
35978        //On component mount
35979        for (var parameter in vm.widget.parameters) {
35980            switch (vm.widget.parameters[parameter].id) {
35981                case 'headerBarCustomization':
35982                    vm.customization = angular.fromJson(vm.widget.parameters[parameter].value.replace(/\'/g, '"'));
35983                    if (vm.customization.backgroundTransparent) {
35984                        vm.customization['borderBottomWidth'] = 0
35985                    }
35986                    break;
35987            }
35988        }
35989
35990        //Listener
35991        var listener = $rootScope.$on(`onParametersChange-${$scope.widget}`, function (event, data) {
35992            for (var parameter in vm.widget.parameters) {
35993                switch (vm.widget.parameters[parameter].id) {
35994                    case 'headerBarCustomization':
35995                        vm.widget.parameters[parameter].value = data.headerBarCustomization;
35996                        vm.customization = angular.fromJson(data.headerBarCustomization.replace(/\'/g, '"'));
35997                        if (vm.customization.backgroundTransparent) {
35998                            vm.customization['borderBottomWidth'] = 0
35999                        }
36000                        if (vm.customization.resetParams) {
36001                            vm.customization = vm.defaultBar
36002                            vm.widget.parameters[parameter].value = angular.toJson(vm.defaultBar).replace(/\"/g, "'")
36003                        }
36004                        break;
36005                }
36006            }
36007            const index = _.findIndex(website.widgets, function (widget) {
36008                return widget.id === vm.widget.id;
36009            });
36010            website.widgets[index] = vm.widget;
36011            websiteEditorService.updateWebsite(__solutionId__, website)
36012                .then(function () {
36013                    widgets[$scope.widget] = angular.toJson(vm.widget);
36014                })
36015                .catch(function (error) {
36016                    bugsnag.notify(error);
36017                });
36018        });
36019
36020        $scope.$on('$destroy', listener);
36021    }
36022})();
36023;
36024(function () {
36025    'use strict';
36026
36027    angular
36028        .module('app.layout')
36029        .directive('topbarLayout', TopbarLayout)
36030
36031    TopbarLayout.$inject = [];
36032
36033    function TopbarLayout() {
36034        return {
36035            restrict: 'E',
36036            scope: {
36037                widget: '='
36038            },
36039            templateUrl: `/public/v2/app/core/layout/topbar/topbar-layout.tpl.html`,
36040            controller: 'TopbarLayoutController',
36041            controllerAs: 'topbarLayout'
36042        };
36043    }
36044})();;

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.